feat: 支持在rv64下,运行rust编写的helloworld程序 (#1125)

* 添加 riscv_rust_init 这个helloworld程序

Signed-off-by: longjin <longjin@DragonOS.org>

* feat: 支持在riscv下启动rust编写的hello world程序

TODO: 支持sys ppoll

Signed-off-by: longjin <longjin@DragonOS.org>

* chore: 更新构建容器版本至v1.9

Signed-off-by: longjin <longjin@DragonOS.org>

* 1

---------

Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
LoGin
2025-03-30 01:28:41 +08:00
committed by GitHub
parent 55833537f1
commit 03015e2559
17 changed files with 152 additions and 38 deletions

2
kernel/Cargo.lock generated
View File

@ -1839,7 +1839,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "virtio-drivers"
version = "0.7.2"
source = "git+https://git.mirrors.dragonos.org.cn/DragonOS-Community/virtio-drivers?rev=f91c807965#f91c8079658dbc7cc230bf041325b94a0ab2e301"
source = "git+https://git.mirrors.dragonos.org.cn/DragonOS-Community/virtio-drivers?rev=415ab38ff9#415ab38ff99f3c8e150269c04f65d684ba9d1365"
dependencies = [
"bitflags 2.9.0",
"log",

View File

@ -151,10 +151,18 @@ fn do_trap_insn_page_fault(trap_frame: &mut TrapFrame) -> Result<(), SystemError
let vaddr = trap_frame.badaddr;
let cause = trap_frame.cause;
let epc = trap_frame.epc;
error!(
"riscv64_do_irq: do_insn_page_fault vaddr: {:#x}, cause: {:?} epc: {:#x}",
vaddr, cause, epc
);
if trap_frame.is_from_user() {
error!(
"riscv64_do_irq: do_trap_insn_page_fault(user mode): epc: {epc:#x}, vaddr={:#x}, cause={:?}",
vaddr, cause
);
} else {
panic!(
"riscv64_do_irq: do_trap_insn_page_fault(kernel mode): epc: {epc:#x}, vaddr={:#x}, cause={:?}",
vaddr, cause
);
}
loop {
spin_loop();
}
@ -165,10 +173,17 @@ fn do_trap_load_page_fault(trap_frame: &mut TrapFrame) -> Result<(), SystemError
let vaddr = trap_frame.badaddr;
let cause = trap_frame.cause;
let epc = trap_frame.epc;
error!(
"riscv64_do_irq: do_trap_load_page_fault: epc: {epc:#x}, vaddr={:#x}, cause={:?}",
vaddr, cause
);
if trap_frame.is_from_user() {
error!(
"riscv64_do_irq: do_trap_load_page_fault(user mode): epc: {epc:#x}, vaddr={:#x}, cause={:?}",
vaddr, cause
);
} else {
panic!(
"riscv64_do_irq: do_trap_load_page_fault(kernel mode): epc: {epc:#x}, vaddr={:#x}, cause={:?}",
vaddr, cause
);
}
loop {
spin_loop();

View File

@ -649,7 +649,7 @@ pub(super) fn do_plic_irq(trap_frame: &mut TrapFrame) {
if claim == 0 {
break;
}
debug!("plic: claim: {claim:?}");
// debug!("plic: claim: {claim:?}");
let hwirq = HardwareIrqNumber::new(claim);
if let Err(e) = GenericIrqHandler::handle_domain_irq(domain.clone(), hwirq, trap_frame) {

View File

@ -321,6 +321,7 @@ impl KernelCmdlineManager {
continue;
}
log::debug!("cmdline: argument: {:?} ", argument);
let (node, option, value) = match self.split_arg(argument) {
Some(v) => v,
None => continue,

View File

@ -128,6 +128,7 @@ fn try_to_run_init_process(
ext_args: &Option<&str>,
trap_frame: &mut TrapFrame,
) -> Result<(), SystemError> {
log::debug!("Trying to run init process at {:?}", path);
let mut args_to_insert = alloc::vec::Vec::new();
args_to_insert.push(CString::new(path).unwrap());

View File

@ -885,6 +885,11 @@ impl Syscall {
Self::poll(fds, nfds, timeout)
}
SYS_PPOLL => {
log::warn!("SYS_PPOLL has not yet been implemented");
Ok(0)
}
SYS_SETPGID => {
warn!("SYS_SETPGID has not yet been implemented");
Ok(0)