From 6ed05fcaa4f493f8b9c46e716f5edf5bcecc83e5 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Mon, 7 Feb 2022 16:35:38 -0700
Subject: [PATCH] Set env

---
 src/lib.rs        | 93 +++++++++++++++++++++++++++++------------------
 src/memory_map.rs |  2 -
 2 files changed, 58 insertions(+), 37 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index 46bfe27..feb753f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
-    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: 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");
+    //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);
+    println!("RedoxFS Size: {} MiB", fs.header.1.size / 1024 / 1024);
 
+    let kernel = {
         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,
+    );
 }
diff --git a/src/memory_map.rs b/src/memory_map.rs
index 8aa986f..a288d2f 100644
--- a/src/memory_map.rs
+++ b/src/memory_map.rs
@@ -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 (
-- 
GitLab