Better user programs with a special std. Sleep and exit are calling scheduler instead of wfi.
This commit is contained in:
228
src/interrupt.rs
228
src/interrupt.rs
@@ -1,15 +1,15 @@
|
||||
use alloc::str;
|
||||
use log::info;
|
||||
use shared::syscall::SysCall;
|
||||
|
||||
use crate::{
|
||||
boot::sbi::{EextensionID, TimerFunctionID},
|
||||
clear_csr, generate_trap_handler,
|
||||
process::{sleep, ExecutionContext},
|
||||
clear_csr,
|
||||
process::{exit_process, sleep, ExecutionContext},
|
||||
read_csr,
|
||||
riscv::disable_interrupt,
|
||||
scheduler::scheduler,
|
||||
scheduler::scheduler_without_ret,
|
||||
set_csr,
|
||||
syscall::SysCall,
|
||||
time::{setup_next_timer_interrupt, IRQ_M_TIMER},
|
||||
write_csr,
|
||||
};
|
||||
@@ -87,7 +87,7 @@ unsafe extern "C" fn machine_trap_handler(
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
unsafe extern "C" fn supervisor_trap_handler(
|
||||
interrupt_state: *mut ExecutionContext,
|
||||
mut interrupt_state: *mut ExecutionContext,
|
||||
scause: u64,
|
||||
_sie: u64,
|
||||
_sip: u64,
|
||||
@@ -96,13 +96,19 @@ unsafe extern "C" fn supervisor_trap_handler(
|
||||
#[allow(clippy::single_match)]
|
||||
match scause & !(1 << 63) {
|
||||
8 => {
|
||||
// Advance sepc to exit the ecall
|
||||
unsafe {
|
||||
(*interrupt_state).mepc = (*interrupt_state).mepc.byte_add(4);
|
||||
}
|
||||
|
||||
// Environment call from S-mode
|
||||
let syscall_u64: u64 = unsafe { (*interrupt_state).a[0] };
|
||||
let a1: u64 = unsafe { (*interrupt_state).a[1] };
|
||||
let a2: u64 = unsafe { (*interrupt_state).a[2] };
|
||||
let syscall: SysCall = syscall_u64.into();
|
||||
match syscall {
|
||||
SysCall::NanoSleep => sleep(Duration::new(a1, a2 as u32)),
|
||||
SysCall::Exit => exit_process(&mut interrupt_state),
|
||||
SysCall::NanoSleep => sleep(Duration::new(a1, a2 as u32), &mut interrupt_state),
|
||||
SysCall::WriteTemp => {
|
||||
info!("Print from user space : {}", unsafe {
|
||||
str::from_raw_parts(a1 as *const u8, a2 as usize)
|
||||
@@ -115,11 +121,6 @@ unsafe extern "C" fn supervisor_trap_handler(
|
||||
unimplemented!("Syscall {syscall_u64} is not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
// Advance sepc to exit the ecall
|
||||
unsafe {
|
||||
(*interrupt_state).mepc = (*interrupt_state).mepc.byte_add(4);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@@ -137,7 +138,7 @@ unsafe extern "C" fn supervisor_trap_handler(
|
||||
);
|
||||
}
|
||||
timer_interrupt();
|
||||
return scheduler(unsafe { *interrupt_state });
|
||||
scheduler_without_ret(&mut interrupt_state);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@@ -207,116 +208,107 @@ unsafe extern "C" fn _machine_mode_trap() {
|
||||
mret"
|
||||
)
|
||||
}
|
||||
generate_trap_handler! {
|
||||
_supervisor_mode_trap, supervisor_trap_handler, s
|
||||
#[unsafe(naked)]
|
||||
#[unsafe(no_mangle)]
|
||||
unsafe extern "C" fn _supervisor_mode_trap() {
|
||||
naked_asm!(concat!(
|
||||
"
|
||||
// Store sp before it gets modified
|
||||
sd sp, 8-264(sp)
|
||||
addi sp, sp, -264
|
||||
|
||||
# Store the current frame
|
||||
sd ra, 0(sp)
|
||||
// sp
|
||||
sd gp, 16(sp)
|
||||
sd tp, 24(sp)
|
||||
sd a0, 32(sp)
|
||||
sd a1, 40(sp)
|
||||
sd a2, 48(sp)
|
||||
sd a3, 56(sp)
|
||||
sd a4, 64(sp)
|
||||
sd a5, 72(sp)
|
||||
sd a6, 80(sp)
|
||||
sd a7, 88(sp)
|
||||
sd t0, 96(sp)
|
||||
sd t1, 104(sp)
|
||||
sd t2, 112(sp)
|
||||
sd t3, 120(sp)
|
||||
sd t4, 128(sp)
|
||||
sd t5, 136(sp)
|
||||
sd t6, 144(sp)
|
||||
sd s0, 152(sp)
|
||||
sd s1, 160(sp)
|
||||
sd s2, 168(sp)
|
||||
sd s3, 176(sp)
|
||||
sd s4, 184(sp)
|
||||
sd s5, 192(sp)
|
||||
sd s6, 200(sp)
|
||||
sd s7, 208(sp)
|
||||
sd s8, 216(sp)
|
||||
sd s9, 224(sp)
|
||||
sd s10, 232(sp)
|
||||
sd s11, 240(sp)
|
||||
csrr t0, sepc
|
||||
sd t0, 248(sp)
|
||||
csrr t0, sstatus
|
||||
sd t0, 256(sp)
|
||||
|
||||
mv a0, sp
|
||||
csrr a1, scause
|
||||
csrr a2, sie
|
||||
csrr a3, sip
|
||||
jal supervisor_trap_handler
|
||||
|
||||
# Restore registers and sret
|
||||
jal restore_context"
|
||||
))
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! generate_trap_handler {
|
||||
($name:ident, $jump_to:ident, $mode:ident) => {
|
||||
#[unsafe(naked)]
|
||||
#[unsafe(no_mangle)]
|
||||
unsafe extern "C" fn $name() {
|
||||
naked_asm!(concat!(
|
||||
"
|
||||
mv t0, sp
|
||||
addi sp, sp, -264
|
||||
#[unsafe(naked)]
|
||||
#[unsafe(no_mangle)]
|
||||
pub unsafe extern "C" fn restore_context(context: *const ExecutionContext) -> ! {
|
||||
naked_asm!(concat!(
|
||||
"
|
||||
ld t0, 248(a0)
|
||||
csrw sepc, t0
|
||||
ld t0, 256(a0)
|
||||
csrw sstatus, t0
|
||||
ld ra, 0(a0)
|
||||
ld sp, 8(a0)
|
||||
ld gp, 16(a0)
|
||||
ld tp, 24(a0)
|
||||
ld a1, 40(a0)
|
||||
ld a2, 48(a0)
|
||||
ld a3, 56(a0)
|
||||
ld a4, 64(a0)
|
||||
ld a5, 72(a0)
|
||||
ld a6, 80(a0)
|
||||
ld a7, 88(a0)
|
||||
ld t0, 96(a0)
|
||||
ld t1, 104(a0)
|
||||
ld t2, 112(a0)
|
||||
ld t3, 120(a0)
|
||||
ld t4, 128(a0)
|
||||
ld t5, 136(a0)
|
||||
ld t6, 144(a0)
|
||||
ld s0, 152(a0)
|
||||
ld s1, 160(a0)
|
||||
ld s2, 168(a0)
|
||||
ld s3, 176(a0)
|
||||
ld s4, 184(a0)
|
||||
ld s5, 192(a0)
|
||||
ld s6, 200(a0)
|
||||
ld s7, 208(a0)
|
||||
ld s8, 216(a0)
|
||||
ld s9, 224(a0)
|
||||
ld s10, 232(a0)
|
||||
ld s11, 240(a0)
|
||||
|
||||
# Store the current frame
|
||||
sd ra, 0(sp)
|
||||
sd t0, 8(sp) // sp
|
||||
sd gp, 16(sp)
|
||||
sd tp, 24(sp)
|
||||
sd a0, 32(sp)
|
||||
sd a1, 40(sp)
|
||||
sd a2, 48(sp)
|
||||
sd a3, 56(sp)
|
||||
sd a4, 64(sp)
|
||||
sd a5, 72(sp)
|
||||
sd a6, 80(sp)
|
||||
sd a7, 88(sp)
|
||||
sd t0, 96(sp)
|
||||
sd t1, 104(sp)
|
||||
sd t2, 112(sp)
|
||||
sd t3, 120(sp)
|
||||
sd t4, 128(sp)
|
||||
sd t5, 136(sp)
|
||||
sd t6, 144(sp)
|
||||
sd s0, 152(sp)
|
||||
sd s1, 160(sp)
|
||||
sd s2, 168(sp)
|
||||
sd s3, 176(sp)
|
||||
sd s4, 184(sp)
|
||||
sd s5, 192(sp)
|
||||
sd s6, 200(sp)
|
||||
sd s7, 208(sp)
|
||||
sd s8, 216(sp)
|
||||
sd s9, 224(sp)
|
||||
sd s10, 232(sp)
|
||||
sd s11, 240(sp)
|
||||
csrr t0, sepc
|
||||
sd t0, 248(sp)
|
||||
csrr t0, sstatus
|
||||
sd t0, 256(sp)
|
||||
ld a0, 32(a0)
|
||||
|
||||
mv a0, sp
|
||||
csrr a1, ",
|
||||
stringify!($mode),
|
||||
"cause
|
||||
csrr a2, ",
|
||||
stringify!($mode),
|
||||
"ie
|
||||
csrr a3, ",
|
||||
stringify!($mode),
|
||||
"ip
|
||||
jal ",
|
||||
stringify!($jump_to),
|
||||
"
|
||||
|
||||
# Restore registers
|
||||
ld t0, 248(a0)
|
||||
csrw sepc, t0
|
||||
ld t0, 256(a0)
|
||||
csrw sstatus, t0
|
||||
ld ra, 0(a0)
|
||||
ld sp, 8(a0)
|
||||
ld gp, 16(a0)
|
||||
ld tp, 24(a0)
|
||||
ld a1, 40(a0)
|
||||
ld a2, 48(a0)
|
||||
ld a3, 56(a0)
|
||||
ld a4, 64(a0)
|
||||
ld a5, 72(a0)
|
||||
ld a6, 80(a0)
|
||||
ld a7, 88(a0)
|
||||
ld t0, 96(a0)
|
||||
ld t1, 104(a0)
|
||||
ld t2, 112(a0)
|
||||
ld t3, 120(a0)
|
||||
ld t4, 128(a0)
|
||||
ld t5, 136(a0)
|
||||
ld t6, 144(a0)
|
||||
ld s0, 152(a0)
|
||||
ld s1, 160(a0)
|
||||
ld s2, 168(a0)
|
||||
ld s3, 176(a0)
|
||||
ld s4, 184(a0)
|
||||
ld s5, 192(a0)
|
||||
ld s6, 200(a0)
|
||||
ld s7, 208(a0)
|
||||
ld s8, 216(a0)
|
||||
ld s9, 224(a0)
|
||||
ld s10, 232(a0)
|
||||
ld s11, 240(a0)
|
||||
|
||||
ld a0, 32(a0)
|
||||
|
||||
",
|
||||
stringify!($mode),
|
||||
"ret"
|
||||
))
|
||||
}
|
||||
};
|
||||
sret"
|
||||
))
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
|
||||
Reference in New Issue
Block a user