This commit is contained in:
Jeremy Soller
2022-02-07 16:35:38 -07:00
parent 82e0908abb
commit 6ed05fcaa4
2 changed files with 60 additions and 39 deletions
+60 -37
View File
@@ -6,7 +6,10 @@
#[macro_use]
extern crate alloc;
use alloc::vec::Vec;
use alloc::{
string::String,
vec::Vec,
};
use core::{
alloc::{GlobalAlloc, Layout},
cmp,
@@ -38,11 +41,11 @@ mod vga;
// Real mode memory allocation, for use with thunk
// 0x500 to 0x7BFF is free
const VBE_CARD_INFO_ADDR: usize = 0x500; // 512 bytes, ends at 0x6FF
const VBE_MODE_INFO_ADDR: usize = 0x700; // 256 bytes, ends at 0x7FF
const MEMORY_MAP_ADDR: usize = 0x800; // 24 bytes, ends at 0x817
const DISK_ADDRESS_PACKET_ADDR: usize = 0x0FF0; // 16 bytes, ends at 0x0FFF
const DISK_BIOS_ADDR: usize = 0x1000; // 4096 bytes, ends at 0x1FFF
const VBE_CARD_INFO_ADDR: usize = 0x2000; // 512 bytes, ends at 0x21FF
const VBE_MODE_INFO_ADDR: usize = 0x2200; // 256 bytes, ends at 0x22FF
const MEMORY_MAP_ADDR: usize = 0x2300; // 24 bytes, ends at 0x2317
const DISK_ADDRESS_PACKET_ADDR: usize = 0x2318; // 16 bytes, ends at 0x2327
const THUNK_STACK_ADDR: usize = 0x7C00; // Grows downwards
const VGA_ADDR: usize = 0xB8000;
@@ -126,25 +129,25 @@ pub unsafe extern "C" fn kstart(
ALLOCATOR.lock().init(heap_start, heap_size);
// Locate kernel on RedoxFS
//TODO: ensure boot_disk is 8-bit
println!("BIOS Disk: {:02X}", boot_disk);
let disk = DiskBios::new(boot_disk as u8, thunk13);
//TODO: get block from partition table
let block = 1024 * 1024 / redoxfs::BLOCK_SIZE;
let mut fs = redoxfs::FileSystem::open(disk, Some(block))
.expect("Failed to open RedoxFS");
println!("RedoxFS Size: {} MiB", fs.header.1.size / 1024 / 1024);
let kernel = {
//TODO: ensure boot_disk is 8-bit
println!("BIOS Disk: {:02X}", boot_disk);
let disk = DiskBios::new(boot_disk as u8, thunk13);
//TODO: get block from partition table
let block = 1024 * 1024 / redoxfs::BLOCK_SIZE;
let mut fs = redoxfs::FileSystem::open(disk, Some(block))
.expect("Failed to open RedoxFS");
println!("RedoxFS Size: {} MiB", fs.header.1.size / 1024 / 1024);
let node = fs.find_node("kernel", fs.header.1.root)
.expect("failed to find kernel file");
let size = fs.node_len(node.0)
.expect("failed to read kernel size");
println!("Kernel Size: {} MiB", size / 1024 / 1024);
print!("Kernel: 0/{} MiB", size / 1024 / 1024);
let ptr = ALLOCATOR.alloc_zeroed(
Layout::from_size_align(size as usize, 4096).unwrap()
@@ -160,16 +163,15 @@ pub unsafe extern "C" fn kstart(
let mut i = 0;
for chunk in kernel.chunks_mut(1024 * 1024) {
print!("\rKernel Loading: {}%", i * 100 / size);
print!("\rKernel: {}/{}", i / 1024 / 1024, size / 1024 / 1024);
i += fs.read_node(node.0, i, chunk, 0, 0)
.expect("Failed to read kernel file") as u64;
}
println!("\rKernel Loading: 100%");
println!("\rKernel: {}/{}", i / 1024 / 1024, size / 1024 / 1024);
kernel
};
println!("Kernel Phys: 0x{:X}", kernel.as_ptr() as usize);
let page_phys = paging::paging_create(kernel.as_ptr() as usize)
.expect("Failed to set up paging");
@@ -183,23 +185,7 @@ pub unsafe extern "C" fn kstart(
panic!("Failed to allocate memory for stack");
}
let args = KernelArgs {
kernel_base: kernel.as_ptr() as u64,
kernel_size: kernel.len() as u64,
stack_base: stack_base as u64,
stack_size: stack_size as u64,
env_base: 0,
env_size: 0,
acpi_rsdps_base: 0,
acpi_rsdps_size: 0,
};
kernel_entry(
page_phys,
args.stack_base + args.stack_size + PHYS_OFFSET,
*(kernel.as_ptr().add(0x18) as *const u64),
&args,
);
let mut env = String::with_capacity(4096);
let mut modes = Vec::new();
{
@@ -269,6 +255,7 @@ pub unsafe extern "C" fn kstart(
// Sort modes by pixel area, reversed
modes.sort_by(|a, b| (b.1 * b.2).cmp(&(a.1 * a.2)));
println!();
println!("Arrow keys and enter select mode");
//TODO 0x4F03 VBE function to get current mode
@@ -362,8 +349,44 @@ pub unsafe extern "C" fn kstart(
data.eax = 0x4F02;
data.ebx = selected as u32;
data.with(thunk10);
break;
},
_ => (),
}
}
if let Some(mode_i) = modes.iter().position(|x| x.0 == selected) {
if let Some((mode, w, h, ptr, text)) = modes.get(mode_i) {
env.push_str(&format!("FRAMEBUFFER_ADDR={:016x}\n", ptr));
env.push_str(&format!("FRAMEBUFFER_WIDTH={:016x}\n", w));
env.push_str(&format!("FRAMEBUFFER_HEIGHT={:016x}\n", h));
}
}
env.push_str(&format!("REDOXFS_BLOCK={:016x}\n", fs.block));
env.push_str("REDOXFS_UUID=");
for i in 0..fs.header.1.uuid.len() {
if i == 4 || i == 6 || i == 8 || i == 10 {
env.push('-');
}
env.push_str(&format!("{:>02x}", fs.header.1.uuid[i]));
}
let args = KernelArgs {
kernel_base: kernel.as_ptr() as u64,
kernel_size: kernel.len() as u64,
stack_base: stack_base as u64,
stack_size: stack_size as u64,
env_base: env.as_ptr() as u64,
env_size: env.len() as u64,
acpi_rsdps_base: 0,
acpi_rsdps_size: 0,
};
kernel_entry(
page_phys,
args.stack_base + args.stack_size + PHYS_OFFSET,
*(kernel.as_ptr().add(0x18) as *const u64),
&args,
);
}
-2
View File
@@ -26,8 +26,6 @@ pub unsafe fn memory_map(thunk15: extern "C" fn()) -> Option<(usize, usize)> {
assert_eq!(data.ecx, mem::size_of::<MemoryMapEntry>() as u32);
let entry = ptr::read(crate::MEMORY_MAP_ADDR as *const MemoryMapEntry);
println!("MEM {}: 0x{:016X} 0x{:016X} 0x{:08X}", index, entry.base, entry.length, entry.kind);
//TODO: There is a problem with QEMU crashing if we write at about 8 MiB, so skip to 16
let heap_start = 16 * 1024 * 1024;
if (