Polish trap handler code

This commit is contained in:
Hsy-Intel
2023-09-27 15:09:32 +00:00
committed by Tate, Hongliang Tian
parent f2b2c20967
commit e8a2779bca
3 changed files with 32 additions and 41 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);