diff --git a/litebox_platform_lvbs/src/mshv/mod.rs b/litebox_platform_lvbs/src/mshv/mod.rs index ff2f8ac4e..f797a2000 100644 --- a/litebox_platform_lvbs/src/mshv/mod.rs +++ b/litebox_platform_lvbs/src/mshv/mod.rs @@ -10,7 +10,7 @@ mod hvcall_vp; mod mem_integrity; pub(crate) mod ringbuffer; pub(crate) mod vsm; -mod vsm_intercept; +pub mod vsm_intercept; mod vsm_optee_smc; pub mod vtl1_mem_layout; pub mod vtl_switch; diff --git a/litebox_platform_lvbs/src/mshv/vsm_intercept.rs b/litebox_platform_lvbs/src/mshv/vsm_intercept.rs index 94a27aced..4f8699158 100644 --- a/litebox_platform_lvbs/src/mshv/vsm_intercept.rs +++ b/litebox_platform_lvbs/src/mshv/vsm_intercept.rs @@ -48,6 +48,12 @@ pub enum InterceptedRegisterName { Unknown = 0xffff_ffff, } +/// # Panics +/// +/// Panics if: +/// - Failed to get intercept message type +/// - Failed to raise VTL0 GP fault +/// - Intercepted write to unknown MSR/register pub fn vsm_handle_intercept() { let simp_page = with_per_cpu_variables_mut(|per_cpu_variables| unsafe { &mut *per_cpu_variables.hv_simp_page_as_mut_ptr() @@ -147,7 +153,7 @@ fn advance_vtl0_rip(int_msg_hdr: &HvInterceptMessageHeader) -> Result Result { +pub fn raise_vtl0_gp_fault() -> Result { let mut exception = HvPendingExceptionEvent::new(); exception.set_event_pending(true); exception.set_event_type(0_u8); diff --git a/litebox_platform_lvbs/src/mshv/vtl_switch.rs b/litebox_platform_lvbs/src/mshv/vtl_switch.rs index d3551c5f3..317e2f7e4 100644 --- a/litebox_platform_lvbs/src/mshv/vtl_switch.rs +++ b/litebox_platform_lvbs/src/mshv/vtl_switch.rs @@ -308,6 +308,10 @@ unsafe extern "C" fn vtl_switch_loop_body() { } } +unsafe extern "C" { + pub fn panic_vtl_switch() -> !; +} + fn vtlcall_dispatch(params: &[u64; NUM_VTLCALL_PARAMS]) -> i64 { let func_id = VsmFunction::try_from(u32::try_from(params[0]).unwrap_or(u32::MAX)) .unwrap_or(VsmFunction::Unknown); diff --git a/litebox_runner_lvbs/src/lib.rs b/litebox_runner_lvbs/src/lib.rs index efda12cc6..e275865f6 100644 --- a/litebox_runner_lvbs/src/lib.rs +++ b/litebox_runner_lvbs/src/lib.rs @@ -5,13 +5,14 @@ use core::panic::PanicInfo; use litebox_platform_lvbs::{ - arch::{gdt, get_core_id, instrs::hlt_loop, interrupts}, + arch::{gdt, get_core_id, interrupts}, debug_serial_println, host::{bootparam::get_vtl1_memory_info, per_cpu_variables::allocate_per_cpu_variables}, mm::MemoryProvider, mshv::{ hvcall, - vtl_switch::vtl_switch_loop_entry, + vsm_intercept::raise_vtl0_gp_fault, + vtl_switch::{panic_vtl_switch, vtl_switch_loop_entry}, vtl1_mem_layout::{ PAGE_SIZE, VTL1_INIT_HEAP_SIZE, VTL1_INIT_HEAP_START_PAGE, VTL1_PML4E_PAGE, VTL1_PRE_POPULATED_MEMORY_SIZE, get_heap_start_address, @@ -105,5 +106,6 @@ pub fn run(platform: Option<&'static Platform>) -> ! { #[panic_handler] fn panic(info: &PanicInfo) -> ! { serial_println!("{}", info); - hlt_loop() + let _ = raise_vtl0_gp_fault(); + unsafe { panic_vtl_switch() } }