diff --git a/.gitmodules b/.gitmodules index 26a2583..b12d272 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "user/init"] path = user/init url = git@github.com:XunilGroup/xunil-init.git +[submodule "user/apps/badapple"] + path = user/apps/badapple + url = https://github.com/XunilGroup/xunil_badapple.git diff --git a/GNUmakefile b/GNUmakefile index 19e5341..72f6f3b 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -10,15 +10,9 @@ override IMAGE_NAME := XunilOS-$(KARCH) .PHONY: all all: $(IMAGE_NAME).iso -.PHONY: all-hdd -all-hdd: $(IMAGE_NAME).hdd - .PHONY: run run: run-$(KARCH) -.PHONY: run-hdd -run-hdd: run-hdd-$(KARCH) - .PHONY: run-x86_64 run-x86_64: edk2-ovmf $(IMAGE_NAME).iso qemu-system-$(KARCH) \ @@ -35,15 +29,7 @@ debug-x86_64: edk2-ovmf $(IMAGE_NAME).iso -serial stdio \ -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ -cdrom $(IMAGE_NAME).iso \ - -d in_asm,int,mmu -D /tmp/qemu_trace.log 2>/dev/null \ - $(QEMUFLAGS) - -.PHONY: run-hdd-x86_64 -run-hdd-x86_64: edk2-ovmf $(IMAGE_NAME).hdd - qemu-system-$(KARCH) \ - -M q35 \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -hda $(IMAGE_NAME).hdd \ + -d in_asm,int,mmu -dfilter 0xffffffff80000000..0xffffffff80010000 -D /tmp/qemu_trace.log 2>/dev/null \ $(QEMUFLAGS) .PHONY: run-aarch64 @@ -78,88 +64,7 @@ debug-aarch64: edk2-ovmf $(IMAGE_NAME).iso -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ -cdrom $(IMAGE_NAME).iso \ -semihosting-config enable=on,target=native \ - -d in_asm,int,mmu -D /tmp/qemu_trace.log 2>/dev/null - $(QEMUFLAGS) - -.PHONY: run-hdd-aarch64 -run-hdd-aarch64: edk2-ovmf $(IMAGE_NAME).hdd - qemu-system-$(KARCH) \ - -M virt \ - -cpu cortex-a72 \ - -device ramfb \ - -device qemu-xhci \ - -device usb-kbd \ - -device usb-mouse \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -hda $(IMAGE_NAME).hdd \ - $(QEMUFLAGS) - -.PHONY: run-riscv64 -run-riscv64: edk2-ovmf $(IMAGE_NAME).iso - qemu-system-$(KARCH) \ - -M virt \ - -cpu rv64 \ - -device ramfb \ - -device qemu-xhci \ - -device usb-kbd \ - -device usb-mouse \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -cdrom $(IMAGE_NAME).iso \ - $(QEMUFLAGS) - -.PHONY: run-hdd-riscv64 -run-hdd-riscv64: edk2-ovmf $(IMAGE_NAME).hdd - qemu-system-$(KARCH) \ - -M virt \ - -cpu rv64 \ - -device ramfb \ - -device qemu-xhci \ - -device usb-kbd \ - -device usb-mouse \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -hda $(IMAGE_NAME).hdd \ - $(QEMUFLAGS) - -.PHONY: run-loongarch64 -run-loongarch64: edk2-ovmf $(IMAGE_NAME).iso - qemu-system-$(KARCH) \ - -M virt \ - -cpu la464 \ - -device ramfb \ - -device qemu-xhci \ - -device usb-kbd \ - -device usb-mouse \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -cdrom $(IMAGE_NAME).iso \ - $(QEMUFLAGS) - -.PHONY: run-hdd-loongarch64 -run-hdd-loongarch64: edk2-ovmf $(IMAGE_NAME).hdd - qemu-system-$(KARCH) \ - -M virt \ - -cpu la464 \ - -device ramfb \ - -device qemu-xhci \ - -device usb-kbd \ - -device usb-mouse \ - -drive if=pflash,unit=0,format=raw,file=edk2-ovmf/ovmf-code-$(KARCH).fd,readonly=on \ - -hda $(IMAGE_NAME).hdd \ - $(QEMUFLAGS) - - -.PHONY: run-bios -run-bios: $(IMAGE_NAME).iso - qemu-system-$(KARCH) \ - -M q35 \ - -cdrom $(IMAGE_NAME).iso \ - -boot d \ - $(QEMUFLAGS) - -.PHONY: run-hdd-bios -run-hdd-bios: $(IMAGE_NAME).hdd - qemu-system-$(KARCH) \ - -M q35 \ - -hda $(IMAGE_NAME).hdd \ + -d in_asm,int,mmu -dfilter 0xffffffff80000000..0xffffffff80010000 -D /tmp/qemu_trace.log 2>/dev/null \ $(QEMUFLAGS) edk2-ovmf: @@ -218,36 +123,10 @@ ifeq ($(KARCH),loongarch64) endif rm -rf iso_root -$(IMAGE_NAME).hdd: limine/limine kernel - rm -f $(IMAGE_NAME).hdd - dd if=/dev/zero bs=1M count=0 seek=64 of=$(IMAGE_NAME).hdd - sgdisk $(IMAGE_NAME).hdd -n 1:2048 -t 1:ef00 -ifeq ($(KARCH),x86_64) - ./limine/limine bios-install $(IMAGE_NAME).hdd -endif - mformat -i $(IMAGE_NAME).hdd@@1M - mmd -i $(IMAGE_NAME).hdd@@1M ::/EFI ::/EFI/BOOT ::/boot ::/boot/limine - mcopy -i $(IMAGE_NAME).hdd@@1M kernel/bin-$(KARCH)/kernel ::/boot - mcopy -i $(IMAGE_NAME).hdd@@1M limine.conf ::/boot/limine -ifeq ($(KARCH),x86_64) - mcopy -i $(IMAGE_NAME).hdd@@1M limine/limine-bios.sys ::/boot/limine - mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTX64.EFI ::/EFI/BOOT - mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTIA32.EFI ::/EFI/BOOT -endif -ifeq ($(KARCH),aarch64) - mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTAA64.EFI ::/EFI/BOOT -endif -ifeq ($(KARCH),riscv64) - mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTRISCV64.EFI ::/EFI/BOOT -endif -ifeq ($(KARCH),loongarch64) - mcopy -i $(IMAGE_NAME).hdd@@1M limine/BOOTLOONGARCH64.EFI ::/EFI/BOOT -endif - .PHONY: clean clean: $(MAKE) -C kernel clean - rm -rf iso_root $(IMAGE_NAME).iso $(IMAGE_NAME).hdd + rm -rf iso_root $(IMAGE_NAME).iso .PHONY: distclean distclean: clean diff --git a/assets/.gitignore b/assets/.gitignore index ed163ad..9505710 100644 --- a/assets/.gitignore +++ b/assets/.gitignore @@ -1,3 +1,4 @@ doomgeneric* init helloworld* +badapple* diff --git a/build_and_run.sh b/build_and_run.sh new file mode 100644 index 0000000..cdc709f --- /dev/null +++ b/build_and_run.sh @@ -0,0 +1,7 @@ +export KARCH=x86_64 +bash build_libxunil.sh +bash build_init.sh +bash build_doomgeneric.sh +bash build_helloworld.sh +bash build_badapple.sh +make run diff --git a/build_badapple.sh b/build_badapple.sh new file mode 100644 index 0000000..2f9d32e --- /dev/null +++ b/build_badapple.sh @@ -0,0 +1,5 @@ +bash build_libxunil.sh +cd user/apps/badapple +cargo build --target $KARCH-unknown-none --release --config profile.release.debug=true +cp ./target/$KARCH-unknown-none/release/badapple ../../../assets/$KARCH/badapple +cd ../../.. diff --git a/config.mk b/config.mk index 152d679..2e45572 100644 --- a/config.mk +++ b/config.mk @@ -1,4 +1,4 @@ -export KARCH ?= aarch64 +export KARCH ?= x86_64 export OUTPUT ?= kernel -export MEMORY ?= 1G +export MEMORY ?= 4G export TIMER_FREQUENCY_HZ ?= 1000 diff --git a/kernel/build.rs b/kernel/build.rs index cf93bfa..f257f64 100644 --- a/kernel/build.rs +++ b/kernel/build.rs @@ -3,15 +3,25 @@ use std::fs; use std::path::PathBuf; fn main() { - let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap(); + let arch = std::env::var("TARGET") + .unwrap_or_else(|_| { + std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_else(|_| "x86_64".to_string()) + }) + .split('-') + .next() + .unwrap() + .to_string(); let timer_frequency_hz = env::var("TIMER_FREQUENCY_HZ").unwrap_or_else(|_| "1000".to_string()); - let karch = env::var("KARCH").unwrap_or_else(|_| "x86_64".to_string()); + let karch = env::var("KARCH").unwrap_or_else(|_| arch.clone()); let out_dir = PathBuf::from("src"); fs::write( out_dir.join("config.rs"), - format!("pub const TIMER_FREQUENCY_HZ: usize = {timer_frequency_hz};\npub const KARCH: &str = \"{karch}\";"), + format!( + "pub const TIMER_FREQUENCY_HZ: usize = {timer_frequency_hz};\n\ + pub const KARCH: &str = \"{karch}\";" + ), ) .unwrap(); @@ -19,7 +29,13 @@ fn main() { fs::write( out_dir.join("assets.rs"), - format!("pub static INIT_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/init\");\npub static DOOM_WAD: &[u8] = include_bytes!(\"../../../../../assets/doom1.wad\");\npub static DOOM_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/doomgeneric\");\npub static HELLOWORLD_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/helloworld.elf\");"), + format!( + "pub static INIT_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/init\");\n\ + pub static DOOM_WAD: &[u8] = include_bytes!(\"../../../../../assets/doom1.wad\");\n\ + pub static DOOM_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/doomgeneric\");\n\ + pub static HELLOWORLD_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/helloworld.elf\");\n\ + pub static BADAPPLE_ELF: &[u8] = include_bytes!(\"../../../../../assets/{karch}/badapple\");" + ), ) .unwrap(); diff --git a/kernel/src/arch/aarch64/paging.rs b/kernel/src/arch/aarch64/paging.rs index c3f6252..5310276 100644 --- a/kernel/src/arch/aarch64/paging.rs +++ b/kernel/src/arch/aarch64/paging.rs @@ -1,12 +1,8 @@ use core::sync::atomic::Ordering; -use crate::{ - arch::{ - aarch64::init::KERNEL_STACK, - arch::{HHDM_OFFSET, XunilFrameAllocator, safe_lock, serial_print}, - }, - driver::graphics::framebuffer::USER_FB_BASE, - util::U64Buf, +use crate::arch::{ + aarch64::init::KERNEL_STACK, + arch::{HHDM_OFFSET, XunilFrameAllocator, safe_lock}, }; use limine::{ memory_map::EntryType, diff --git a/kernel/src/arch/syscall.rs b/kernel/src/arch/syscall.rs index 2fee96d..bd8f719 100644 --- a/kernel/src/arch/syscall.rs +++ b/kernel/src/arch/syscall.rs @@ -455,11 +455,6 @@ pub unsafe extern "C" fn syscall_dispatch( ) -> isize { #[cfg(target_arch = "x86_64")] interrupts::enable(); - // if num != 1 { - // serial_print("syscall num="); - // serial_print(U64Buf::new(num as u64).as_str()); - // serial_print("\n"); - // } set_reschedule(match num { BRK => false, diff --git a/kernel/src/arch/x86_64/heap.rs b/kernel/src/arch/x86_64/heap.rs index 9a498ac..733daca 100644 --- a/kernel/src/arch/x86_64/heap.rs +++ b/kernel/src/arch/x86_64/heap.rs @@ -9,7 +9,7 @@ use x86_64::structures::paging::{ pub static ALLOCATOR: Locked = Locked::new(LinkedListAllocator::new()); pub const HEAP_START: usize = 0xffffffff90000000; -pub const HEAP_SIZE: usize = 4 * 1024 * 1024; // 64 MiB +pub const HEAP_SIZE: usize = 64 * 1024 * 1024; // 64 MiB pub fn init_heap(mapper: &mut OffsetPageTable) -> Result<(), MapToError> { let page_count = HEAP_SIZE / 4096; diff --git a/kernel/src/arch/x86_64/paging.rs b/kernel/src/arch/x86_64/paging.rs index 18b358d..695ed8a 100644 --- a/kernel/src/arch/x86_64/paging.rs +++ b/kernel/src/arch/x86_64/paging.rs @@ -8,7 +8,10 @@ use x86_64::{ }, }; -use crate::arch::arch::{HHDM_OFFSET, XunilFrameAllocator}; +use crate::{ + arch::arch::{HHDM_OFFSET, XunilFrameAllocator, serial_print}, + println, +}; unsafe fn active_level_4_table(mem_offset: VirtAddr) -> &'static mut PageTable { let (level_4_table, _) = Cr3::read(); diff --git a/kernel/src/driver/io/fs/assets.rs b/kernel/src/driver/io/fs/assets.rs index 4ef93a3..fe6a6ed 100644 --- a/kernel/src/driver/io/fs/assets.rs +++ b/kernel/src/driver/io/fs/assets.rs @@ -1,4 +1,5 @@ -pub static INIT_ELF: &[u8] = include_bytes!("../../../../../assets/aarch64/init"); +pub static INIT_ELF: &[u8] = include_bytes!("../../../../../assets/x86_64/init"); pub static DOOM_WAD: &[u8] = include_bytes!("../../../../../assets/doom1.wad"); -pub static DOOM_ELF: &[u8] = include_bytes!("../../../../../assets/aarch64/doomgeneric"); -pub static HELLOWORLD_ELF: &[u8] = include_bytes!("../../../../../assets/aarch64/helloworld.elf"); +pub static DOOM_ELF: &[u8] = include_bytes!("../../../../../assets/x86_64/doomgeneric"); +pub static HELLOWORLD_ELF: &[u8] = include_bytes!("../../../../../assets/x86_64/helloworld.elf"); +pub static BADAPPLE_ELF: &[u8] = include_bytes!("../../../../../assets/x86_64/badapple"); \ No newline at end of file diff --git a/kernel/src/driver/io/fs/vfs.rs b/kernel/src/driver/io/fs/vfs.rs index 5cd8921..9494e88 100644 --- a/kernel/src/driver/io/fs/vfs.rs +++ b/kernel/src/driver/io/fs/vfs.rs @@ -48,6 +48,10 @@ static FILES: &[FakeFileEntry] = &[ name: "helloworld.elf", data: HELLOWORLD_ELF, }, + FakeFileEntry { + name: "badapple", + data: BADAPPLE_ELF, + }, FakeFileEntry { name: "doomgeneric", data: DOOM_ELF, diff --git a/kernel/src/driver/serial.rs b/kernel/src/driver/serial.rs index 123cae0..9ef5a4d 100644 --- a/kernel/src/driver/serial.rs +++ b/kernel/src/driver/serial.rs @@ -15,7 +15,6 @@ pub struct ConsoleWriter<'a> { impl Write for ConsoleWriter<'_> { fn write_str(&mut self, s: &str) -> fmt::Result { - serial_print(s); self.console.print(s, self.fb); Ok(()) } @@ -31,12 +30,17 @@ impl SerialConsole { pub fn new() -> SerialConsole { SerialConsole { text: String::new(), - font_size: 2, + font_size: 1, dirty: false, } } pub fn print(&mut self, text: &str, fb: &mut Framebuffer) { + if text == "\x1b[2J" { + self.text.clear(); + return; + } + let max_height = fb.height / (12 * self.font_size); let max_width = fb.width / (8 * self.font_size); diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 3c1ba43..3c56f78 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -180,10 +180,11 @@ pub unsafe extern "C" fn kernel_main_aarch64(mapper: &mut AArchPageTable) -> ! { init_framebuffer(&limine_framebuffer); with_framebuffer(|fb| fb.setup_aarch64()); } else { - serial_print("no framebuffers found"); + panic!("no framebuffers found"); } + } else { + panic!("no framebuffers found"); } - init_serial_console(); init_keyboard(); @@ -193,7 +194,6 @@ pub unsafe extern "C" fn kernel_main_aarch64(mapper: &mut AArchPageTable) -> ! { } else { println!("Could not get date at boot. Will default to 0.") } - DAIF.write(DAIF::D::Masked + DAIF::A::Masked + DAIF::I::Unmasked + DAIF::F::Masked); run_elf(INIT_ELF, false, true); diff --git a/user/libxunil b/user/libxunil index 6025f75..e029139 160000 --- a/user/libxunil +++ b/user/libxunil @@ -1 +1 @@ -Subproject commit 6025f75ab3c295b7f178429349c67457511ec3b9 +Subproject commit e029139d657b338a59c6ab33a1f2ba88c78d92da