From 27a3847c13fb60ac8f8986e5f0f6dc08518f757d Mon Sep 17 00:00:00 2001 From: Julien THILLARD Date: Fri, 13 Feb 2026 17:22:23 +0100 Subject: [PATCH] Try loading code at runtime --- .cargo/config.toml | 2 +- .gitignore | 1 + Cargo.toml | 14 +-- bffs/Cargo.toml | 6 ++ bffs/src/lib.rs | 3 + kernel.svg | 115 ------------------------ kernel/Cargo.toml | 11 +++ build.rs => kernel/build.rs | 0 {src => kernel/src}/boot.rs | 0 {src => kernel/src}/boot/sbi.rs | 0 {src => kernel/src}/critical_section.rs | 0 {src => kernel/src}/interrupt.rs | 3 + {src => kernel/src}/io.rs | 0 {src => kernel/src}/main.rs | 2 +- {src => kernel/src}/panic_handler.rs | 0 {src => kernel/src}/process.rs | 0 {src => kernel/src}/riscv.rs | 0 {src => kernel/src}/scheduler.rs | 0 {src => kernel/src}/syscall.rs | 7 ++ {src => kernel/src}/tests_fat.rs | 0 {src => kernel/src}/time.rs | 0 {src => kernel/src}/uart.rs | 0 kernel/src/user.rs | 26 ++++++ {src => kernel/src}/vga.rs | 0 src/user.rs | 17 ---- test_pic/Cargo.toml | 6 ++ test_pic/build.rs | 3 + test_pic/src/main.rs | 24 +++++ 28 files changed, 96 insertions(+), 144 deletions(-) create mode 100644 bffs/Cargo.toml create mode 100644 bffs/src/lib.rs delete mode 100644 kernel.svg create mode 100644 kernel/Cargo.toml rename build.rs => kernel/build.rs (100%) rename {src => kernel/src}/boot.rs (100%) rename {src => kernel/src}/boot/sbi.rs (100%) rename {src => kernel/src}/critical_section.rs (100%) rename {src => kernel/src}/interrupt.rs (98%) rename {src => kernel/src}/io.rs (100%) rename {src => kernel/src}/main.rs (98%) rename {src => kernel/src}/panic_handler.rs (100%) rename {src => kernel/src}/process.rs (100%) rename {src => kernel/src}/riscv.rs (100%) rename {src => kernel/src}/scheduler.rs (100%) rename {src => kernel/src}/syscall.rs (93%) rename {src => kernel/src}/tests_fat.rs (100%) rename {src => kernel/src}/time.rs (100%) rename {src => kernel/src}/uart.rs (100%) create mode 100644 kernel/src/user.rs rename {src => kernel/src}/vga.rs (100%) delete mode 100644 src/user.rs create mode 100644 test_pic/Cargo.toml create mode 100644 test_pic/build.rs create mode 100644 test_pic/src/main.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 535da60..ce554d4 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -6,4 +6,4 @@ build-std = ["core", "compiler_builtins", "alloc"] build-std-features = ["compiler-builtins-mem"] [target.riscv64] -runner = "qemu-system-riscv64 -machine virt -device bochs-display -bios none -m 512M -device loader,file=/home/julien/ensimag/TPs/kernel/disk.img,addr=0x90000000 -kernel" +runner = "qemu-system-riscv64 -machine virt -device bochs-display -bios none -m 512M -device loader,file=/home/julien/ensimag/TPs/kernel/disk.img,addr=0x90000000 -s -S -kernel" diff --git a/.gitignore b/.gitignore index 0f27428..5e32340 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Cargo.lock disk.img +out.mem diff --git a/Cargo.toml b/Cargo.toml index 23a2856..485655a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ -[package] -name = "kernel-rust" -version = "0.1.0" -edition = "2024" +[workspace] +resolver = "3" +members = ["kernel", "test_pic"] +default-members = ["kernel"] [profile.dev] panic = "abort" @@ -10,9 +10,3 @@ opt-level = 0 [profile.release] panic = "abort" debug = true - -[dependencies] -embedded-alloc = "0.7" -kernel-macros = { path = "kernel-macros" } -log = "0.4" -critical-section = { version = "1", features = ["restore-state-bool"] } diff --git a/bffs/Cargo.toml b/bffs/Cargo.toml new file mode 100644 index 0000000..7687ecf --- /dev/null +++ b/bffs/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "bffs" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/bffs/src/lib.rs b/bffs/src/lib.rs new file mode 100644 index 0000000..f394512 --- /dev/null +++ b/bffs/src/lib.rs @@ -0,0 +1,3 @@ +#![no_std] + +const MAGIC_NUMBER: usize = 0xBFF5; diff --git a/kernel.svg b/kernel.svg deleted file mode 100644 index 4978169..0000000 --- a/kernel.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - Machine - Supervisor - User - - diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml new file mode 100644 index 0000000..fa67d50 --- /dev/null +++ b/kernel/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "kernel-rust" +version = "0.1.0" +edition = "2024" + +[dependencies] +embedded-alloc = "0.7" +kernel-macros = { path = "../kernel-macros" } +log = "0.4" +critical-section = { version = "1", features = ["restore-state-bool"] } +bffs = { path = "../bffs" } diff --git a/build.rs b/kernel/build.rs similarity index 100% rename from build.rs rename to kernel/build.rs diff --git a/src/boot.rs b/kernel/src/boot.rs similarity index 100% rename from src/boot.rs rename to kernel/src/boot.rs diff --git a/src/boot/sbi.rs b/kernel/src/boot/sbi.rs similarity index 100% rename from src/boot/sbi.rs rename to kernel/src/boot/sbi.rs diff --git a/src/critical_section.rs b/kernel/src/critical_section.rs similarity index 100% rename from src/critical_section.rs rename to kernel/src/critical_section.rs diff --git a/src/interrupt.rs b/kernel/src/interrupt.rs similarity index 98% rename from src/interrupt.rs rename to kernel/src/interrupt.rs index b3a12b1..46b9903 100644 --- a/src/interrupt.rs +++ b/kernel/src/interrupt.rs @@ -108,6 +108,9 @@ unsafe extern "C" fn supervisor_trap_handler( str::from_raw_parts(a1 as *const u8, a2 as usize) }) } + SysCall::WriteIntTemp => { + info!("Print from user space int : {}, {:x}", a1, a1) + } SysCall::Unimplemented => { unimplemented!("Syscall {syscall_u64} is not implemented") } diff --git a/src/io.rs b/kernel/src/io.rs similarity index 100% rename from src/io.rs rename to kernel/src/io.rs diff --git a/src/main.rs b/kernel/src/main.rs similarity index 98% rename from src/main.rs rename to kernel/src/main.rs index 5d0abe9..6288e88 100644 --- a/src/main.rs +++ b/kernel/src/main.rs @@ -62,7 +62,7 @@ pub extern "C" fn supervisor_mode_entry() { create_process(test, "proc1"); create_process(proc2, "proc2"); - MemoryDisk::new(); + // MemoryDisk::new(); enable_supervisor_interrupt(); idle(); diff --git a/src/panic_handler.rs b/kernel/src/panic_handler.rs similarity index 100% rename from src/panic_handler.rs rename to kernel/src/panic_handler.rs diff --git a/src/process.rs b/kernel/src/process.rs similarity index 100% rename from src/process.rs rename to kernel/src/process.rs diff --git a/src/riscv.rs b/kernel/src/riscv.rs similarity index 100% rename from src/riscv.rs rename to kernel/src/riscv.rs diff --git a/src/scheduler.rs b/kernel/src/scheduler.rs similarity index 100% rename from src/scheduler.rs rename to kernel/src/scheduler.rs diff --git a/src/syscall.rs b/kernel/src/syscall.rs similarity index 93% rename from src/syscall.rs rename to kernel/src/syscall.rs index aed5995..1b45816 100644 --- a/src/syscall.rs +++ b/kernel/src/syscall.rs @@ -3,6 +3,7 @@ use core::time::Duration; #[repr(u64)] pub enum SysCall { NanoSleep = 101, + WriteIntTemp = 998, WriteTemp = 999, Unimplemented = 1 << 31, } @@ -11,6 +12,7 @@ impl From for SysCall { fn from(value: u64) -> Self { match value { 101 => SysCall::NanoSleep, + 998 => SysCall::WriteIntTemp, 999 => SysCall::WriteTemp, _ => SysCall::Unimplemented, } @@ -89,3 +91,8 @@ pub fn write_string_temp(content: &'static str) { ); } } +pub fn write_int_temp(content: u64) { + unsafe { + syscall!(SysCall::WriteIntTemp, content); + } +} diff --git a/src/tests_fat.rs b/kernel/src/tests_fat.rs similarity index 100% rename from src/tests_fat.rs rename to kernel/src/tests_fat.rs diff --git a/src/time.rs b/kernel/src/time.rs similarity index 100% rename from src/time.rs rename to kernel/src/time.rs diff --git a/src/uart.rs b/kernel/src/uart.rs similarity index 100% rename from src/uart.rs rename to kernel/src/uart.rs diff --git a/kernel/src/user.rs b/kernel/src/user.rs new file mode 100644 index 0000000..884812a --- /dev/null +++ b/kernel/src/user.rs @@ -0,0 +1,26 @@ +use core::{arch::asm, time::Duration}; + +use log::info; + +use crate::syscall::{sleep, write_int_temp, write_string_temp}; + +#[repr(align(32))] +struct Alignement([u8; 132]); + +static PROG: Alignement = Alignement(*include_bytes!("../../out.mem")); + +pub fn test() { + write_int_temp(PROG.0.as_ptr() as u64); + unsafe { core::mem::transmute::<*const u8, extern "C" fn()>(PROG.0.as_ptr())() } + loop { + write_string_temp("test"); + sleep(Duration::new(2, 0)); + } +} + +pub fn proc2() { + loop { + write_string_temp("proc2"); + sleep(Duration::new(3, 0)); + } +} diff --git a/src/vga.rs b/kernel/src/vga.rs similarity index 100% rename from src/vga.rs rename to kernel/src/vga.rs diff --git a/src/user.rs b/src/user.rs deleted file mode 100644 index b3579f2..0000000 --- a/src/user.rs +++ /dev/null @@ -1,17 +0,0 @@ -use core::time::Duration; - -use crate::syscall::{sleep, write_string_temp}; - -pub fn test() { - loop { - write_string_temp("test"); - sleep(Duration::new(2, 0)); - } -} - -pub fn proc2() { - loop { - write_string_temp("proc2"); - sleep(Duration::new(3, 0)); - } -} diff --git a/test_pic/Cargo.toml b/test_pic/Cargo.toml new file mode 100644 index 0000000..d20eb64 --- /dev/null +++ b/test_pic/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "test_pic" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/test_pic/build.rs b/test_pic/build.rs new file mode 100644 index 0000000..7937a93 --- /dev/null +++ b/test_pic/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo::rustc-link-arg=-Tilm.ld"); +} diff --git a/test_pic/src/main.rs b/test_pic/src/main.rs new file mode 100644 index 0000000..00cdcd3 --- /dev/null +++ b/test_pic/src/main.rs @@ -0,0 +1,24 @@ +#![no_std] +#![no_main] + +use core::arch::global_asm; + +#[panic_handler] +fn panic(_panic_info: &core::panic::PanicInfo) -> ! { + loop {} +} + +#[unsafe(no_mangle)] +pub extern "C" fn entry() { + let test = "Hello from user mode"; + unsafe { + core::arch::asm!( + "ecall", + in("a0") 999, + in("a1") test.as_ptr(), + in("a2") test.len(), + clobber_abi("system") + ); + } + loop {} +}