Remove unneccessary debug, increase kernel heap to 64mb, add a global

build_and_run script, fix build.rs sometimes using the wrong
architecture, add badapple ELF and change default font size to 1 for it
to work, improve framebuffer errors, remove unnecessary commands from
make and improve debug filtering
This commit is contained in:
csd4ni3l
2026-05-23 17:28:21 +02:00
parent f90d29340a
commit 7070b53355
16 changed files with 67 additions and 153 deletions
+3
View File
@@ -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
+3 -124
View File
@@ -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
+1
View File
@@ -1,3 +1,4 @@
doomgeneric*
init
helloworld*
badapple*
+7
View File
@@ -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
+5
View File
@@ -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 ../../..
+2 -2
View File
@@ -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
+20 -4
View File
@@ -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();
+3 -7
View File
@@ -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,
-5
View File
@@ -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,
+1 -1
View File
@@ -9,7 +9,7 @@ use x86_64::structures::paging::{
pub static ALLOCATOR: Locked<LinkedListAllocator> = 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<Size4KiB>> {
let page_count = HEAP_SIZE / 4096;
+4 -1
View File
@@ -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();
+4 -3
View File
@@ -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");
+4
View File
@@ -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,
+6 -2
View File
@@ -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);
+3 -3
View File
@@ -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);