rv64: implement signal handling
This commit is contained in:
parent
8ff0f03989
commit
6aa3e7f6be
@ -1,11 +1,6 @@
|
||||
use core::arch::global_asm;
|
||||
|
||||
use abi::{
|
||||
arch::SavedFrame,
|
||||
primitive_enum,
|
||||
process::{ExitCode, Signal},
|
||||
SyscallFunction,
|
||||
};
|
||||
use abi::{arch::SavedFrame, primitive_enum, process::Signal, SyscallFunction};
|
||||
use kernel_arch::task::TaskFrame;
|
||||
use libk::{device::external_interrupt_controller, task::thread::Thread};
|
||||
use tock_registers::interfaces::ReadWriteable;
|
||||
@ -17,7 +12,7 @@ use crate::syscall;
|
||||
use super::{smp, timer};
|
||||
|
||||
primitive_enum! {
|
||||
pub enum Cause: u64 {
|
||||
pub enum Cause: usize {
|
||||
MisalignedInstruction = 0,
|
||||
InstructionAccessFault = 1,
|
||||
IllegalInstruction = 2,
|
||||
@ -39,18 +34,18 @@ primitive_enum! {
|
||||
#[repr(C)]
|
||||
pub struct TrapFrame {
|
||||
// General-purpose
|
||||
pub ra: u64,
|
||||
pub gp: u64,
|
||||
pub tn: [u64; 7],
|
||||
pub sn: [u64; 12],
|
||||
pub ra: usize,
|
||||
pub gp: usize,
|
||||
pub tn: [usize; 7],
|
||||
pub sn: [usize; 12],
|
||||
pub an: [usize; 8],
|
||||
// Special
|
||||
pub sp: u64,
|
||||
pub sstatus: u64,
|
||||
pub sepc: u64,
|
||||
pub stval: u64,
|
||||
pub scause: u64,
|
||||
pub tp: u64,
|
||||
pub sp: usize,
|
||||
pub sstatus: usize,
|
||||
pub sepc: usize,
|
||||
pub stval: usize,
|
||||
pub scause: usize,
|
||||
pub tp: usize,
|
||||
}
|
||||
|
||||
pub fn init_smode_exceptions() {
|
||||
@ -82,7 +77,10 @@ unsafe fn umode_exception_handler(frame: &mut TrapFrame) {
|
||||
Some(Cause::EcallUmode) => {
|
||||
let func = frame.an[0];
|
||||
if func == usize::from(SyscallFunction::ExitSignal) {
|
||||
todo!()
|
||||
unsafe {
|
||||
syscall::handle_signal_exit(frame);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
let args = &frame.an[1..];
|
||||
@ -112,7 +110,7 @@ unsafe fn umode_exception_handler(frame: &mut TrapFrame) {
|
||||
log::warn!("Of process {} ({:?})", process.id, process.name);
|
||||
|
||||
if dump_tval {
|
||||
let translation = process.space().translate(frame.stval as usize).ok();
|
||||
let translation = process.space().translate(frame.stval).ok();
|
||||
|
||||
if let Some(physical) = translation {
|
||||
log::warn!(" * tval translates to {physical:#x}");
|
||||
@ -120,8 +118,6 @@ unsafe fn umode_exception_handler(frame: &mut TrapFrame) {
|
||||
log::warn!(" * tval does not translate");
|
||||
}
|
||||
}
|
||||
|
||||
thread.exit_process(ExitCode::BySignal(Ok(Signal::MemoryAccessViolation)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -146,7 +142,7 @@ unsafe fn smode_exception_handler(frame: &mut TrapFrame) {
|
||||
.and_then(|t| t.try_get_process())
|
||||
.map(|p| p.space())
|
||||
{
|
||||
space.translate(frame.stval as usize).ok()
|
||||
space.translate(frame.stval).ok()
|
||||
} else {
|
||||
None
|
||||
};
|
||||
@ -206,39 +202,53 @@ unsafe extern "C" fn smode_general_trap_handler(frame: *mut TrapFrame) {
|
||||
|
||||
impl TaskFrame for TrapFrame {
|
||||
fn store(&self) -> SavedFrame {
|
||||
todo!()
|
||||
SavedFrame {
|
||||
ra: self.ra,
|
||||
gp: self.gp,
|
||||
tn: self.tn,
|
||||
sn: self.sn,
|
||||
an: self.an,
|
||||
|
||||
sp: self.sp,
|
||||
ip: self.sepc,
|
||||
tp: self.tp,
|
||||
}
|
||||
}
|
||||
|
||||
fn restore(&mut self, saved: &SavedFrame) {
|
||||
let _ = saved;
|
||||
todo!()
|
||||
self.ra = saved.ra;
|
||||
self.gp = saved.gp;
|
||||
self.tn = saved.tn;
|
||||
self.sn = saved.sn;
|
||||
self.an = saved.an;
|
||||
|
||||
self.sp = saved.sp;
|
||||
self.sepc = saved.ip;
|
||||
self.tp = saved.tp;
|
||||
}
|
||||
|
||||
fn user_sp(&self) -> usize {
|
||||
todo!()
|
||||
self.sp
|
||||
}
|
||||
|
||||
fn user_ip(&self) -> usize {
|
||||
todo!()
|
||||
self.sepc
|
||||
}
|
||||
|
||||
fn argument(&self) -> u64 {
|
||||
todo!()
|
||||
self.an[0] as u64
|
||||
}
|
||||
|
||||
fn set_user_sp(&mut self, value: usize) {
|
||||
let _ = value;
|
||||
todo!()
|
||||
self.sp = value;
|
||||
}
|
||||
|
||||
fn set_user_ip(&mut self, value: usize) {
|
||||
let _ = value;
|
||||
todo!()
|
||||
self.sepc = value;
|
||||
}
|
||||
|
||||
fn set_argument(&mut self, value: u64) {
|
||||
let _ = value;
|
||||
todo!()
|
||||
self.an[0] = value as usize;
|
||||
}
|
||||
|
||||
fn set_single_step(&mut self, step: bool) {
|
||||
@ -247,8 +257,7 @@ impl TaskFrame for TrapFrame {
|
||||
}
|
||||
|
||||
fn set_return_value(&mut self, value: u64) {
|
||||
let _ = value;
|
||||
todo!()
|
||||
self.an[0] = value as usize;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,18 @@ use super::FrameOps;
|
||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||
#[derive(Clone, Debug, Default)]
|
||||
#[repr(C)]
|
||||
pub struct SavedFrame {}
|
||||
pub struct SavedFrame {
|
||||
// General-purpose
|
||||
pub ra: usize,
|
||||
pub gp: usize,
|
||||
pub tn: [usize; 7],
|
||||
pub sn: [usize; 12],
|
||||
pub an: [usize; 8],
|
||||
// Special
|
||||
pub sp: usize,
|
||||
pub ip: usize,
|
||||
pub tp: usize,
|
||||
}
|
||||
|
||||
impl FrameOps for SavedFrame {
|
||||
fn set_user_ip(&mut self, value: usize) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user