mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-28 11:53:24 +00:00
Extract x86-specific exception handling in aster-nix
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
a997d9f0b0
commit
4d36dd541f
@ -11,7 +11,7 @@ use id_alloc::IdAlloc;
|
||||
use ostd::{
|
||||
arch::{
|
||||
timer::{self, TIMER_FREQ},
|
||||
x86::trap::is_kernel_interrupted,
|
||||
trap::is_kernel_interrupted,
|
||||
},
|
||||
sync::Mutex,
|
||||
};
|
||||
|
@ -1,16 +1,11 @@
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
use ostd::cpu::{
|
||||
CpuException, CpuExceptionInfo, ALIGNMENT_CHECK, BOUND_RANGE_EXCEEDED, DIVIDE_BY_ZERO,
|
||||
GENERAL_PROTECTION_FAULT, INVALID_OPCODE, PAGE_FAULT, SIMD_FLOATING_POINT_EXCEPTION,
|
||||
X87_FLOATING_POINT_EXCEPTION,
|
||||
};
|
||||
|
||||
use super::Signal;
|
||||
use crate::{
|
||||
prelude::*,
|
||||
process::signal::{c_types::siginfo_t, constants::*, sig_num::SigNum},
|
||||
process::signal::{c_types::siginfo_t, sig_num::SigNum},
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
pub struct FaultSignal {
|
||||
num: SigNum,
|
||||
@ -19,30 +14,7 @@ pub struct FaultSignal {
|
||||
}
|
||||
|
||||
impl FaultSignal {
|
||||
pub fn new(trap_info: &CpuExceptionInfo) -> FaultSignal {
|
||||
debug!("Trap id: {}", trap_info.id);
|
||||
let exception = CpuException::to_cpu_exception(trap_info.id as u16).unwrap();
|
||||
let (num, code, addr) = match *exception {
|
||||
DIVIDE_BY_ZERO => (SIGFPE, FPE_INTDIV, None),
|
||||
X87_FLOATING_POINT_EXCEPTION | SIMD_FLOATING_POINT_EXCEPTION => {
|
||||
(SIGFPE, FPE_FLTDIV, None)
|
||||
}
|
||||
BOUND_RANGE_EXCEEDED => (SIGSEGV, SEGV_BNDERR, None),
|
||||
ALIGNMENT_CHECK => (SIGBUS, BUS_ADRALN, None),
|
||||
INVALID_OPCODE => (SIGILL, ILL_ILLOPC, None),
|
||||
GENERAL_PROTECTION_FAULT => (SIGBUS, BUS_ADRERR, None),
|
||||
PAGE_FAULT => {
|
||||
const PF_ERR_FLAG_PRESENT: usize = 1usize << 0;
|
||||
let code = if trap_info.error_code & PF_ERR_FLAG_PRESENT != 0 {
|
||||
SEGV_ACCERR
|
||||
} else {
|
||||
SEGV_MAPERR
|
||||
};
|
||||
let addr = Some(trap_info.page_fault_addr as u64);
|
||||
(SIGSEGV, code, addr)
|
||||
}
|
||||
_ => panic!("Exception cannot be a signal"),
|
||||
};
|
||||
pub fn new(num: SigNum, code: i32, addr: Option<u64>) -> FaultSignal {
|
||||
FaultSignal { num, code, addr }
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user