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 @@
-
-
-
-
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 {}
+}