mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-17 12:47:16 +00:00
Polish trap handler code
This commit is contained in:
parent
f2b2c20967
commit
e8a2779bca
@ -44,51 +44,48 @@ pub struct TrapInformation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "intel_tdx")]
|
#[cfg(feature = "intel_tdx")]
|
||||||
struct VeGeneralRegs<'a>(&'a mut GeneralRegs);
|
impl TdxTrapFrame for GeneralRegs {
|
||||||
|
|
||||||
#[cfg(feature = "intel_tdx")]
|
|
||||||
impl TdxTrapFrame for VeGeneralRegs<'_> {
|
|
||||||
fn rax(&self) -> usize {
|
fn rax(&self) -> usize {
|
||||||
self.0.rax
|
self.rax
|
||||||
}
|
}
|
||||||
fn set_rax(&mut self, rax: usize) {
|
fn set_rax(&mut self, rax: usize) {
|
||||||
self.0.rax = rax;
|
self.rax = rax;
|
||||||
}
|
}
|
||||||
fn rbx(&self) -> usize {
|
fn rbx(&self) -> usize {
|
||||||
self.0.rbx
|
self.rbx
|
||||||
}
|
}
|
||||||
fn set_rbx(&mut self, rbx: usize) {
|
fn set_rbx(&mut self, rbx: usize) {
|
||||||
self.0.rbx = rbx;
|
self.rbx = rbx;
|
||||||
}
|
}
|
||||||
fn rcx(&self) -> usize {
|
fn rcx(&self) -> usize {
|
||||||
self.0.rcx
|
self.rcx
|
||||||
}
|
}
|
||||||
fn set_rcx(&mut self, rcx: usize) {
|
fn set_rcx(&mut self, rcx: usize) {
|
||||||
self.0.rcx = rcx;
|
self.rcx = rcx;
|
||||||
}
|
}
|
||||||
fn rdx(&self) -> usize {
|
fn rdx(&self) -> usize {
|
||||||
self.0.rdx
|
self.rdx
|
||||||
}
|
}
|
||||||
fn set_rdx(&mut self, rdx: usize) {
|
fn set_rdx(&mut self, rdx: usize) {
|
||||||
self.0.rdx = rdx;
|
self.rdx = rdx;
|
||||||
}
|
}
|
||||||
fn rsi(&self) -> usize {
|
fn rsi(&self) -> usize {
|
||||||
self.0.rsi
|
self.rsi
|
||||||
}
|
}
|
||||||
fn set_rsi(&mut self, rsi: usize) {
|
fn set_rsi(&mut self, rsi: usize) {
|
||||||
self.0.rsi = rsi;
|
self.rsi = rsi;
|
||||||
}
|
}
|
||||||
fn rdi(&self) -> usize {
|
fn rdi(&self) -> usize {
|
||||||
self.0.rdi
|
self.rdi
|
||||||
}
|
}
|
||||||
fn set_rdi(&mut self, rdi: usize) {
|
fn set_rdi(&mut self, rdi: usize) {
|
||||||
self.0.rdi = rdi;
|
self.rdi = rdi;
|
||||||
}
|
}
|
||||||
fn rip(&self) -> usize {
|
fn rip(&self) -> usize {
|
||||||
self.0.rip
|
self.rip
|
||||||
}
|
}
|
||||||
fn set_rip(&mut self, rip: usize) {
|
fn set_rip(&mut self, rip: usize) {
|
||||||
self.0.rip = rip;
|
self.rip = rip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,8 +127,7 @@ impl UserContextApiInternal for UserContext {
|
|||||||
if *exception == VIRTUALIZATION_EXCEPTION {
|
if *exception == VIRTUALIZATION_EXCEPTION {
|
||||||
let ve_info =
|
let ve_info =
|
||||||
tdcall::get_veinfo().expect("#VE handler: fail to get VE info\n");
|
tdcall::get_veinfo().expect("#VE handler: fail to get VE info\n");
|
||||||
let mut ve_f = VeGeneralRegs(self.general_regs_mut());
|
handle_virtual_exception(self.general_regs_mut(), &ve_info);
|
||||||
handle_virtual_exception(&mut ve_f, &ve_info);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if exception.typ == CpuExceptionType::FaultOrTrap
|
if exception.typ == CpuExceptionType::FaultOrTrap
|
||||||
|
@ -3,7 +3,6 @@ use tdx_guest::{
|
|||||||
tdvmcall::{cpuid, hlt, rdmsr, wrmsr, IoSize},
|
tdvmcall::{cpuid, hlt, rdmsr, wrmsr, IoSize},
|
||||||
{serial_println, tdcall, tdvmcall, TdxVirtualExceptionType},
|
{serial_println, tdcall, tdvmcall, TdxVirtualExceptionType},
|
||||||
};
|
};
|
||||||
use trapframe::{GeneralRegs, TrapFrame};
|
|
||||||
|
|
||||||
pub trait TdxTrapFrame {
|
pub trait TdxTrapFrame {
|
||||||
fn rax(&self) -> usize;
|
fn rax(&self) -> usize;
|
||||||
|
@ -7,51 +7,48 @@ use tdx_guest::tdcall;
|
|||||||
use trapframe::TrapFrame;
|
use trapframe::TrapFrame;
|
||||||
|
|
||||||
#[cfg(feature = "intel_tdx")]
|
#[cfg(feature = "intel_tdx")]
|
||||||
struct VeTrapFrame<'a>(&'a mut TrapFrame);
|
impl TdxTrapFrame for TrapFrame {
|
||||||
|
|
||||||
#[cfg(feature = "intel_tdx")]
|
|
||||||
impl TdxTrapFrame for VeTrapFrame<'_> {
|
|
||||||
fn rax(&self) -> usize {
|
fn rax(&self) -> usize {
|
||||||
self.0.rax
|
self.rax
|
||||||
}
|
}
|
||||||
fn set_rax(&mut self, rax: usize) {
|
fn set_rax(&mut self, rax: usize) {
|
||||||
self.0.rax = rax;
|
self.rax = rax;
|
||||||
}
|
}
|
||||||
fn rbx(&self) -> usize {
|
fn rbx(&self) -> usize {
|
||||||
self.0.rbx
|
self.rbx
|
||||||
}
|
}
|
||||||
fn set_rbx(&mut self, rbx: usize) {
|
fn set_rbx(&mut self, rbx: usize) {
|
||||||
self.0.rbx = rbx;
|
self.rbx = rbx;
|
||||||
}
|
}
|
||||||
fn rcx(&self) -> usize {
|
fn rcx(&self) -> usize {
|
||||||
self.0.rcx
|
self.rcx
|
||||||
}
|
}
|
||||||
fn set_rcx(&mut self, rcx: usize) {
|
fn set_rcx(&mut self, rcx: usize) {
|
||||||
self.0.rcx = rcx;
|
self.rcx = rcx;
|
||||||
}
|
}
|
||||||
fn rdx(&self) -> usize {
|
fn rdx(&self) -> usize {
|
||||||
self.0.rdx
|
self.rdx
|
||||||
}
|
}
|
||||||
fn set_rdx(&mut self, rdx: usize) {
|
fn set_rdx(&mut self, rdx: usize) {
|
||||||
self.0.rdx = rdx;
|
self.rdx = rdx;
|
||||||
}
|
}
|
||||||
fn rsi(&self) -> usize {
|
fn rsi(&self) -> usize {
|
||||||
self.0.rsi
|
self.rsi
|
||||||
}
|
}
|
||||||
fn set_rsi(&mut self, rsi: usize) {
|
fn set_rsi(&mut self, rsi: usize) {
|
||||||
self.0.rsi = rsi;
|
self.rsi = rsi;
|
||||||
}
|
}
|
||||||
fn rdi(&self) -> usize {
|
fn rdi(&self) -> usize {
|
||||||
self.0.rdi
|
self.rdi
|
||||||
}
|
}
|
||||||
fn set_rdi(&mut self, rdi: usize) {
|
fn set_rdi(&mut self, rdi: usize) {
|
||||||
self.0.rdi = rdi;
|
self.rdi = rdi;
|
||||||
}
|
}
|
||||||
fn rip(&self) -> usize {
|
fn rip(&self) -> usize {
|
||||||
self.0.rip
|
self.rip
|
||||||
}
|
}
|
||||||
fn set_rip(&mut self, rip: usize) {
|
fn set_rip(&mut self, rip: usize) {
|
||||||
self.0.rip = rip;
|
self.rip = rip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,8 +59,7 @@ extern "sysv64" fn trap_handler(f: &mut TrapFrame) {
|
|||||||
#[cfg(feature = "intel_tdx")]
|
#[cfg(feature = "intel_tdx")]
|
||||||
if f.trap_num as u16 == 20 {
|
if f.trap_num as u16 == 20 {
|
||||||
let ve_info = tdcall::get_veinfo().expect("#VE handler: fail to get VE info\n");
|
let ve_info = tdcall::get_veinfo().expect("#VE handler: fail to get VE info\n");
|
||||||
let mut ve_f = VeTrapFrame(f);
|
handle_virtual_exception(f, &ve_info);
|
||||||
handle_virtual_exception(&mut ve_f, &ve_info);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
panic!("cannot handle kernel cpu fault now, information:{:#x?}", f);
|
panic!("cannot handle kernel cpu fault now, information:{:#x?}", f);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user