diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-09-26 23:11:30 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-09-26 23:11:30 -0500 |
| commit | a9fb6013db52e231fa2446fd8c512f5e5e92e4d3 (patch) | |
| tree | 189e260a2b6c557abea7822fd834e02dcec73355 /website-emu/src/lib.rs | |
| parent | 976de377d14aa69f74cd9856b58d6491c7dae0af (diff) | |
Diffstat (limited to 'website-emu/src/lib.rs')
| -rw-r--r-- | website-emu/src/lib.rs | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/website-emu/src/lib.rs b/website-emu/src/lib.rs index b29c901..9abffa0 100644 --- a/website-emu/src/lib.rs +++ b/website-emu/src/lib.rs @@ -21,6 +21,22 @@ extern "C" { fn uart_push_line(line: &str); } +#[repr(C)] +#[derive(Clone,Copy)] +struct BootArgs { + cmd_line: u32, + devices: u32 +} + +#[repr(C)] +#[derive(Clone,Copy)] +struct Device { + device_type: u8, + start: u32, + size: u32, + next: u32 +} + pub struct Uart { pub addr: u32, pub value: u8, @@ -36,6 +52,7 @@ impl MemoryDevice for Uart { } } + //noinspection ALL fn write(&mut self, address: u32, value: u8) -> Result<(), ()> { if address == self.addr { self.value = value; @@ -105,10 +122,66 @@ pub fn boot(image: &[u8], initrd: &[u8], memory: &[u8]) { ); let mut state = CpuState::new(cpu_memory); + let cmd_line = format!( + "mmu=false initrd=initramfs.cpio,{} image=vmwebkrnl.bin,{} iomem=relaxed", + INITRD_LOAD, + OS_LOAD + ); + + + let args_size = size_of::<BootArgs>() as u32; + let device_size = size_of::<Device>() as u32; + + let dram_device = Device { + device_type: 0, // DRAM + start: DRAM_LOAD, + size: memory_len as u32, + next: DRAM_LOAD + args_size + device_size + }; + let uart_device = Device { + device_type: 1, // UART + start: CONSOLE_LOAD, + size: 1, + next: 0 + }; + let args = BootArgs { + cmd_line: DRAM_LOAD + args_size + device_size * 2, + devices: DRAM_LOAD + args_size + }; + + let args_bytes: &[u8] = unsafe { + std::slice::from_raw_parts( + &args as *const BootArgs as *const u8, + size_of::<BootArgs>(), + ) + }; + let dram_bytes: &[u8] = unsafe { + std::slice::from_raw_parts( + &dram_device as *const Device as *const u8, + size_of::<Device>(), + ) + }; + let uart_bytes: &[u8] = unsafe { + std::slice::from_raw_parts( + &uart_device as *const Device as *const u8, + size_of::<Device>(), + ) + }; + let cmd_line_bytes = cmd_line.as_bytes(); + for i in 0..args_size { + state.memory.write(DRAM_LOAD + i, args_bytes[i as usize]).unwrap(); + } + for i in 0..device_size { + state.memory.write(DRAM_LOAD + args_size + i, dram_bytes[i as usize]).unwrap(); + state.memory.write(DRAM_LOAD + args_size + device_size + i, uart_bytes[i as usize]).unwrap(); + } + for i in 0..cmd_line.len() as u32 { + state.memory.write(DRAM_LOAD + args_size + device_size * 2 + i, cmd_line_bytes[i as usize]).unwrap(); + } state.pc = 0x80000000; state.registers[10] = 0; - state.registers[2] = DRAM_LOAD + memory_len as u32; + state.registers[11] = DRAM_LOAD; while state.on { { |
