mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/EFI: Disable CET-IBT around Runtime Services calls
UEFI Runtime services, at the time of writing, aren't CET-IBT compatible.
Work is ongoing to address this. In the meantime, unconditionally disable IBT.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit d37a8a067e)
This commit is contained in:
1 parent
368cffb5be
commit
cf7bd0919f
1 file changed
+18
@@ -21,6 +21,7 @@ struct efi_rs_state {
|
||||
* don't strictly need that.
|
||||
*/
|
||||
unsigned long __aligned(32) cr3;
|
||||
unsigned long msr_s_cet;
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -113,6 +114,19 @@ struct efi_rs_state efi_rs_enter(void)
|
||||
|
||||
switch_cr3_cr4(virt_to_maddr(efi_l4_pgtable), read_cr4());
|
||||
|
||||
/*
|
||||
* At the time of writing (2022), no UEFI firwmare is CET-IBT compatible.
|
||||
* Work is under way to remedy this.
|
||||
*
|
||||
* Stash MSR_S_CET and clobber ENDBR_EN. This is necessary because
|
||||
* SHSTK_EN isn't configured until very late on the BSP.
|
||||
*/
|
||||
if ( cpu_has_xen_ibt )
|
||||
{
|
||||
rdmsrl(MSR_S_CET, state.msr_s_cet);
|
||||
wrmsrl(MSR_S_CET, state.msr_s_cet & ~CET_ENDBR_EN);
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -122,6 +136,10 @@ void efi_rs_leave(struct efi_rs_state *state)
|
||||
|
||||
if ( !state->cr3 )
|
||||
return;
|
||||
|
||||
if ( state->msr_s_cet )
|
||||
wrmsrl(MSR_S_CET, state->msr_s_cet);
|
||||
|
||||
switch_cr3_cr4(state->cr3, read_cr4());
|
||||
if ( is_pv_vcpu(curr) && !is_idle_vcpu(curr) )
|
||||
{
|
||||
|
||||