xen/arm: Allow to discover and use SMCCC_ARCH_WORKAROUND_3

Allow guest to discover whether or not SMCCC_ARCH_WORKAROUND_3 is
supported and create a fastpath in the code to handle guests request to
do the workaround.

The function SMCCC_ARCH_WORKAROUND_3 will be called by the guest for
flushing the branch history. So we want the handling to be as fast as
possible.

As the mitigation is applied on every guest exit, we can check for the
call before saving all context and return very early.

This is part of XSA-398 / CVE-2022-23960.

Signed-off-by: Bertrand Marquis <bertrand.marquis@arm.com>
Reviewed-by: Julien Grall <julien@xen.org>
This commit is contained in:
Bertrand Marquis authored and Andrew Cooper committed 2022-03-08 16:38:02 +00:00
1 parent 62c91eb66a
commit c0a56ea0fd
2 files changed
+19 -7

No files matched your search

+14 -7
View File
@@ -365,16 +365,26 @@ guest_sync:
cbnz x1, guest_sync_slowpath /* should be 0 for HVC #0 */
/*
* Fastest path possible for ARM_SMCCC_ARCH_WORKAROUND_1.
* The workaround has already been applied on the exception
* Fastest path possible for ARM_SMCCC_ARCH_WORKAROUND_1 and
* ARM_SMCCC_ARCH_WORKAROUND_3.
* The workaround needed has already been applied on the exception
* entry from the guest, so let's quickly get back to the guest.
*
* Note that eor is used because the function identifier cannot
* be encoded as an immediate for cmp.
*/
eor w0, w0, #ARM_SMCCC_ARCH_WORKAROUND_1_FID
cbnz w0, check_wa2
cbz w0, fastpath_out_workaround
/* ARM_SMCCC_ARCH_WORKAROUND_2 handling */
eor w0, w0, #(ARM_SMCCC_ARCH_WORKAROUND_1_FID ^ ARM_SMCCC_ARCH_WORKAROUND_2_FID)
cbz w0, wa2_ssbd
/* Fastpath out for ARM_SMCCC_ARCH_WORKAROUND_3 */
eor w0, w0, #(ARM_SMCCC_ARCH_WORKAROUND_2_FID ^ ARM_SMCCC_ARCH_WORKAROUND_3_FID)
cbnz w0, guest_sync_slowpath
fastpath_out_workaround:
/*
* Clobber both x0 and x1 to prevent leakage. Note that thanks
* the eor, x0 = 0.
@@ -383,10 +393,7 @@ guest_sync:
eret
sb
check_wa2:
/* ARM_SMCCC_ARCH_WORKAROUND_2 handling */
eor w0, w0, #(ARM_SMCCC_ARCH_WORKAROUND_1_FID ^ ARM_SMCCC_ARCH_WORKAROUND_2_FID)
cbnz w0, guest_sync_slowpath
wa2_ssbd:
#ifdef CONFIG_ARM_SSBD
alternative_cb arm_enable_wa2_handling
b wa2_end
+5
View File
@@ -124,6 +124,10 @@ static bool handle_arch(struct cpu_user_regs *regs)
break;
}
break;
case ARM_SMCCC_ARCH_WORKAROUND_3_FID:
if ( cpus_have_cap(ARM_WORKAROUND_BHB_SMCC_3) )
ret = 0;
break;
}
set_user_reg(regs, 0, ret);
@@ -132,6 +136,7 @@ static bool handle_arch(struct cpu_user_regs *regs)
}
case ARM_SMCCC_ARCH_WORKAROUND_1_FID:
case ARM_SMCCC_ARCH_WORKAROUND_3_FID:
/* No return value */
return true;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.