From 73197257000068a20357251e515172ddfe55ca23 Mon Sep 17 00:00:00 2001 From: fekhesk Date: Wed, 2 Nov 2022 03:37:19 -0700 Subject: [PATCH] initial stuff so we only get expected errors --- .cargo/config | 6 ++++++ Cargo.toml | 21 +++++++++++++------ Makefile | 22 +++++++++++++++++--- arch/ppc32/linker.ld | 46 ++++++++++++++++++++++++++++++++++++++++++ arch/x86_64/limine.cfg | 3 ++- byob/.gitignore | 5 ++++- byob/README.md | 7 ++++++- initwukko/magic.wukk | 1 + ppc32-custom.json | 16 +++++++++++++++ serial.log | 40 ++++++++++++++++++++++++++++++------ src/boot/mod.rs | 22 +++++++++++++++++++- src/main.rs | 36 ++++++++++++++++++++++++++++++++- src/serial/mod.rs | 10 ++++++++- 13 files changed, 214 insertions(+), 21 deletions(-) create mode 100644 .cargo/config create mode 100644 arch/ppc32/linker.ld create mode 100644 initwukko/magic.wukk create mode 100644 ppc32-custom.json diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..4f37b14 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,6 @@ +[target.ppc32-custom.json] +linker = "powerpc-unknown-linux-gnu-gcc" +ar = "powerpc-unknown-linux-gnu-ar" +#rustflags = [ "-C", "link-args=-nostdlib -ffreestanding -fPIC -Ttext 100000 -mbig-endian", "-C", "target-feature=+crt-static"] +# for some reason it wants a string +rustflags = "-C link-args='-nostdlib -ffreestanding -fPIC -Ttext 100000 -mbig-endian' -C target-feature=+crt-static" \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 2885847..eed6828 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,19 +5,28 @@ edition = "2021" [dependencies] spin = "0.9.1" -x86_64 = "0.14.10" -x2apic = "0.4.1" rlibc = "1.0" -limine = { version = "0.1.9", optional = true } -acpi = { version = "4.1.1", optional = true } -linked_list_allocator = { version = "0.9.0", optional = true } pc-keyboard = "0.6.1" +cstr_core = { version = "0.2.6", features = ["alloc"] } +libfar = { git = "https://github.com/realmicrosoft/libfar_nostd" } +linked_list_allocator = { version = "0.9.0", optional = true } [dependencies.lazy_static] version = "1.4.0" features = ["spin_no_std"] +# x86_64 specific dependencies +[target.'cfg(target_arch = "x86_64")'.dependencies] +x86_64 = "0.14.10" +x2apic = "0.4.1" +acpi = { version = "4.1.1", optional = true } +limine = { version = "0.1.9", optional = true } + +# powerpc (32) specific dependencies +[target.'cfg(target_arch = "powerpc")'.dependencies] +openfirmware-sys = { git = "https://github.com/realmicrosoft/openfirmware-sys.git" } + [features] -default = ["f_limine", "f_ll_alloc"]#, "f_debug_verbose"] +default = ["f_limine", "f_ll_alloc", "f_debug_verbose"] f_debug_verbose = [] f_limine = ["dep:limine", "dep:acpi"] f_ll_alloc = ["dep:linked_list_allocator"] \ No newline at end of file diff --git a/Makefile b/Makefile index 6e17c0e..c2d5fce 100644 --- a/Makefile +++ b/Makefile @@ -3,9 +3,14 @@ kernel := target/$(arch)-custom/debug/wukkOS iso := build/arch/$(arch)/wukkOS.iso target ?= $(arch)-custom final := build/arch/$(arch)/wukkOS.bin +initwukko := byob/initwukko.far +initwukko_from := initwukko efi_bios := build/arch/$(arch)/OVMF-pure-efi.fd +kernel_flags := +RUST_FLAGS := gcc ?= gcc ld ?= ld +far-rs ?= $(shell which far-rs) linker_script := arch/$(arch)/linker.ld bootloader_cfg := arch/$(arch)/limine.cfg @@ -13,6 +18,13 @@ assembly_source_files := $(wildcard arch/$(arch)/*.asm) assembly_object_files := $(patsubst arch/$(arch)/%.asm, \ build/arch/$(arch)/%.o, $(assembly_source_files)) + +ifeq "$(arch)" "x86_64" +kernel_flags += --features "f_limine" +endif +ifeq "$(arch)" "ppc32" +endif + .PHONY: all clean run iso quick_invalidate build_no_iso all: $(final) $(iso) @@ -40,7 +52,7 @@ $(iso): $(final) $(grub_cfg) @mkdir -p isodir/boot @cp $(final) isodir/boot/wukkOS.bin @cp $(bootloader_cfg) isodir/boot/limine.cfg - @cp byob/limine.sys byob/limine-cd.bin byob/limine-cd-efi.bin isodir/boot/ + @cp byob/limine.sys byob/limine-cd.bin byob/limine-cd-efi.bin $(initwukko) isodir/boot/ @xorriso -as mkisofs -b boot/limine-cd.bin \ -no-emul-boot -boot-load-size 4 -boot-info-table \ --efi-boot boot/limine-cd-efi.bin \ @@ -49,14 +61,18 @@ $(iso): $(final) $(grub_cfg) @rm -rf isodir @byob/limine-deploy $(iso) -$(final): $(kernel) $(linker_script) $(assembly_object_files) +$(final): $(kernel) $(linker_script) $(initwukko) @mkdir -p $(shell dirname $@) @cp $(kernel) $(final) #@$(ld) -n -T $(linker_script) -o $(final) $(kernel) \ # --gc-sections $(kernel): - @RUST_TARGET_PATH=$(shell pwd) xargo build --target $(target) -Zbuild-std=core,alloc --features "f_limine" + @RUSTFLAGS="$(RUST_FLAGS)" RUST_TARGET_PATH="$(shell pwd)" cargo +nightly build --target $(target) -Zbuild-std=core,alloc $(kernel_flags) + +$(initwukko): + @mkdir -p $(shell dirname $@) + @$(far-rs) create $(initwukko) initwukko/* build/arch/$(arch)/%.o: arch/$(arch)/%.asm @mkdir -p $(shell dirname $@) diff --git a/arch/ppc32/linker.ld b/arch/ppc32/linker.ld new file mode 100644 index 0000000..436dd0d --- /dev/null +++ b/arch/ppc32/linker.ld @@ -0,0 +1,46 @@ +OUTPUT_FORMAT(elf32-powerpc) +OUTPUT_ARCH(powerpc) + +ENTRY(kernel_main) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions */ +PHDRS +{ + null PT_NULL FLAGS(0) ; /* Null segment */ + text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */ + rodata PT_LOAD FLAGS((1 << 2)) ; /* Read only */ + data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */ +} + +SECTIONS +{ + /* We wanna be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + .text : { + *(.text .text.*) + } :text + + /* Move to the next memory page for .rodata */ + . += CONSTANT(MAXPAGESIZE); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Move to the next memory page for .data */ + . += CONSTANT(MAXPAGESIZE); + + .data : { + *(.data .data.*) + } :data + + .bss : { + *(COMMON) + *(.bss .bss.*) + } :data +} \ No newline at end of file diff --git a/arch/x86_64/limine.cfg b/arch/x86_64/limine.cfg index 2af48f4..bbb2582 100644 --- a/arch/x86_64/limine.cfg +++ b/arch/x86_64/limine.cfg @@ -2,4 +2,5 @@ TIMEOUT=0 :wukkOS PROTOCOL=limine - KERNEL_PATH=boot:///boot/wukkOS.bin \ No newline at end of file + KERNEL_PATH=boot:///boot/wukkOS.bin + MODULE_PATH=boot:///boot/initwukko.far \ No newline at end of file diff --git a/byob/.gitignore b/byob/.gitignore index c219351..7885f88 100644 --- a/byob/.gitignore +++ b/byob/.gitignore @@ -2,4 +2,7 @@ limine.sys limine-cd.bin limine-cd-efi.bin -limine-deploy \ No newline at end of file +limine-deploy + +# initrd +initwukko.far \ No newline at end of file diff --git a/byob/README.md b/byob/README.md index 5d33010..6480c44 100644 --- a/byob/README.md +++ b/byob/README.md @@ -6,4 +6,9 @@ currently the binaries are: - limine.sys - limine-cd.bin - limine-cd-efi.bin -- limine-deploy (should be for your current system) \ No newline at end of file +- limine-deploy (should be for your current system) + +you also need to supply an initramfs, which is a tar archive located at +`byob/initwukko.tar` +for now, this is supplied from the `initwukko/` folder, which will automatically add +all included files to the tar archive. \ No newline at end of file diff --git a/initwukko/magic.wukk b/initwukko/magic.wukk new file mode 100644 index 0000000..a0395d8 --- /dev/null +++ b/initwukko/magic.wukk @@ -0,0 +1 @@ +WUKKOS_COMPLIANT_RAMDISK \ No newline at end of file diff --git a/ppc32-custom.json b/ppc32-custom.json new file mode 100644 index 0000000..346c8e1 --- /dev/null +++ b/ppc32-custom.json @@ -0,0 +1,16 @@ +{ + "llvm-target": "powerpc-unknown-linux-gnu", + "data-layout": "E-m:e-p:32:32-i64:64-n32", + "arch": "powerpc", + "target-endian": "big", + "target-pointer-width": "32", + "target-c-int-width": "32", + "os": "none", + "panic-strategy": "abort", + "pre-link-args": { + "ld.lld": [ + "--gc-sections", + "--script=arch/ppc32/linker.ld" + ] + } +} \ No newline at end of file diff --git a/serial.log b/serial.log index d191a2c..2e5c80b 100644 --- a/serial.log +++ b/serial.log @@ -12,14 +12,42 @@ debug: IDT loaded welcome to wukkOS! (c) 2022 Real Microsoft, LLC -initialising mapper...[OK] +initialising mapper...[debug] kernel physical address: 0x19a35000 +[debug] kernel virtual address: 0xffffffff80000000 +[OK] initialising frame allocator...[OK] initialising heap...[OK] testing heap...[OK] checking for apic compatibility...[OK] -initialising apic...[OK] -setting up apic interrupts...[OK] +initialising apic...[debug] mapping physical region: 1fb7e014 - 1fb7e038 +[debug] mapping physical region: 1fb7d0e8 - 1fb7d10c +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb7d0e8 - 1fb7d134 +[debug] mapping physical region: 1fb7a000 - 1fb7a024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb7a000 - 1fb7a114 +[debug] mapping physical region: 1fb7b000 - 1fb7b024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb79000 - 1fb79024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb78000 - 1fb78024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb77000 - 1fb77024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb76000 - 1fb76024 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] mapping physical region: 1fb7a000 - 1fb7a074 +[debug] mapping physical region: 1fb79000 - 1fb79078 +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[debug] (THIS IS NORMAL) failed to unmap physical region: ParentEntryHugePage +[OK] +setting up apic interrupts...[debug] ioapicaddr: 0xfec00000 +[OK] +loading initwukko...[debug] initwukko path: /boot/initwukko.far +[debug] magic: WUKKOS_COMPLIANT_RAMDISK +[OK] -hello world i am typing this using the legacy keyboard driver thingy in the apic from ioapic irq 1! -wukkOS moment, probably gonna swap this out for a real keyboard driver eventually but this is funny so (: -top ten wukkooOS moments \ No newline at end of file +hello i love sex 123 123 69 lol \ No newline at end of file diff --git a/src/boot/mod.rs b/src/boot/mod.rs index 7a5905d..96301a5 100644 --- a/src/boot/mod.rs +++ b/src/boot/mod.rs @@ -1,10 +1,12 @@ +use alloc::boxed::Box; use alloc::sync::Arc; use alloc::vec::Vec; use core::marker::PhantomData; use core::ptr::NonNull; use acpi::{AcpiHandler, AcpiTables, InterruptModel, PhysicalMapping}; use acpi::platform::interrupt::InterruptSourceOverride; -use limine::{LimineBootInfoRequest, LimineKernelAddressRequest, LimineMemmapRequest, LimineTerminalRequest, LimineTerminalResponse, LimineRsdpRequest, LimineSmpRequest}; +use cstr_core::CString; +use limine::{LimineBootInfoRequest, LimineKernelAddressRequest, LimineMemmapRequest, LimineTerminalRequest, LimineTerminalResponse, LimineRsdpRequest, LimineSmpRequest, LimineModuleRequest}; use crate::{debug, println}; #[cfg(feature = "f_multiboot2")] @@ -20,6 +22,7 @@ pub static MEM_MAP: LimineMemmapRequest = LimineMemmapRequest::new(0); pub static RSDP_REQUEST: LimineRsdpRequest = LimineRsdpRequest::new(0); pub static KERNEL_ADDRESS: LimineKernelAddressRequest = LimineKernelAddressRequest::new(0); pub static SMP_REQUEST: LimineSmpRequest = LimineSmpRequest::new(0); +pub static MOD_REQUEST: LimineModuleRequest = LimineModuleRequest::new(0); #[derive(Clone)] struct Handler; @@ -85,4 +88,21 @@ pub fn get_ioapic_info() -> (u32, Vec) { let address = ioapic.address; let overrides = apic.interrupt_source_overrides; (address, overrides) +} + +pub fn get_initwukko() -> Vec { + let mut response = MOD_REQUEST.get_response().get_mut().unwrap(); + let module = &response.modules()[0]; + let path_cstr = module.path.as_ptr().unwrap(); + let path = unsafe { CString::from_raw(path_cstr as *mut _) }; + debug!("initwukko path: {}", path.to_str().unwrap()); + let start = module.base.get().unwrap() as *const _ as usize; + let size = module.length as usize; + let end = start + size; + let mut data = Vec::new(); + for i in start..end { + let byte = unsafe { *(i as *const u8) }; + data.push(byte); + } + data } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6ea16a7..3b3e254 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,11 +11,16 @@ extern crate rlibc; extern crate alloc; +use alloc::boxed::Box; use alloc::rc::Rc; +use alloc::string::{String, ToString}; use alloc::vec; +use alloc::vec::Vec; use core::arch::asm; use lazy_static::lazy_static; use core::panic::PanicInfo; +use libfar::farlib; +use libfar::farlib::{FarArchive, FarFileInfo}; use limine::{LimineBootInfoRequest, LimineMemmapRequest, LimineTerminalRequest}; use spin::Mutex; use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; @@ -24,7 +29,7 @@ use x86_64::structures::tss::TaskStateSegment; use x86_64::{PhysAddr, set_general_handler, VirtAddr}; use x86_64::registers::segmentation::{CS, Segment, SS}; use x86_64::structures::paging::Translate; -use crate::boot::{get_ioapic_info, KERNEL_ADDRESS}; +use crate::boot::{get_initwukko, get_ioapic_info, KERNEL_ADDRESS}; use crate::internals::WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood::*; use crate::memory::{FRAME_ALLOC, MEM_MAPPER}; use crate::serial::terminal::ST; @@ -37,6 +42,8 @@ mod boot; mod memory; mod macros; +pub type InitWukko = FarArchive; + lazy_static! { //pub static ref KERN_INFO: Mutex> = Mutex::new(None); static ref GDT: Mutex = { @@ -58,6 +65,8 @@ lazy_static! { } idt }; + + static ref INITWUKKO: Mutex> = Mutex::new(None); } @@ -290,6 +299,31 @@ pub extern "C" fn kernel_main() -> ! { //x86_64::instructions::interrupts::enable(); } + // initwukko stuff + { + print!("loading initwukko..."); + let initwukko_raw = get_initwukko(); + let ar = farlib::test(&initwukko_raw).expect("invalid initwukko"); + let ar = ar.load_file_data(&initwukko_raw); + let mut initwukko_magic = None; + for entry in &ar.file_data { + let entry_name = &entry.name; + if entry_name == "magic.wukk" { + initwukko_magic = Some(entry.data.clone()); + debug!("magic: {}", String::from_utf8_lossy(&entry.data)); + break; + } + } + const CORRECT_MAGIC: &[u8; 24] = b"WUKKOS_COMPLIANT_RAMDISK"; + if initwukko_magic.as_ref().unwrap_or(&vec![])[..CORRECT_MAGIC.len()] != CORRECT_MAGIC[..] { + debug!("initwukko magic: {:?}", initwukko_magic); + println!("[FAIL]"); + panic!("invalid initwukko"); + } + println!("[OK]"); + } + + loop { x86_64::instructions::hlt(); } diff --git a/src/serial/mod.rs b/src/serial/mod.rs index 7d37aab..a21e16e 100644 --- a/src/serial/mod.rs +++ b/src/serial/mod.rs @@ -152,7 +152,15 @@ pub fn test_port(port: potential_serial_ports) -> bool { pub fn init_serial() -> SerialPorts { // this is so fucking cursed - let mut ports_tmp : [Port; 8] = [Port { base: potential_serial_ports::COM1 }, Port { base: potential_serial_ports::COM2 }, Port { base: potential_serial_ports::COM3 }, Port { base: potential_serial_ports::COM4 }, Port { base: potential_serial_ports::COM5 }, Port { base: potential_serial_ports::COM6 }, Port { base: potential_serial_ports::COM7 }, Port { base: potential_serial_ports::COM8 }]; + let mut ports_tmp : [Port; 8] = [ + Port { base: potential_serial_ports::COM1 }, + Port { base: potential_serial_ports::COM2 }, + Port { base: potential_serial_ports::COM3 }, + Port { base: potential_serial_ports::COM4 }, + Port { base: potential_serial_ports::COM5 }, + Port { base: potential_serial_ports::COM6 }, + Port { base: potential_serial_ports::COM7 }, + Port { base: potential_serial_ports::COM8 }]; let mut ports_enabled_tmp : [bool; 8] = [false; 8]; for i in 0..8 { if test_port(ports_tmp[i].base) {