]> xenbits.xensource.com Git - xen.git/commitdiff
xen/arm: Place a speculation barrier sequence following an eret instruction
authorJulien Grall <julien@xen.org>
Thu, 19 Dec 2019 08:12:21 +0000 (08:12 +0000)
committerJulien Grall <julien@xen.org>
Tue, 14 Jan 2020 14:23:25 +0000 (14:23 +0000)
Some CPUs can speculate past an ERET instruction and potentially perform
speculative accesses to memory before processing the exception return.
Since the register state is often controlled by lower privilege level
at the point of an ERET, this could potentially be used as part of a
side-channel attack.

Newer CPUs may implement a new SB barrier instruction which acts
as an architected speculation barrier. For current CPUs, the sequence
DSB; ISB is known to prevent speculation.

The latter sequence is heavier than SB but it would never be executed
(this is speculation after all!).

Introduce a new macro 'sb' that could be used when a speculation barrier
is required. For now it is using dsb; isb but this could easily be
updated to cater SB in the future.

This is XSA-312.

Signed-off-by: Julien Grall <julien@xen.org>
xen/arch/arm/arm32/entry.S
xen/arch/arm/arm64/entry.S
xen/include/asm-arm/macros.h

index 31ccfb26313b90ca52f6729ca328a9735db482b0..b228d44b190c5233feccce445bc5aecb6ea4f0c0 100644 (file)
@@ -426,6 +426,7 @@ return_to_hypervisor:
         add sp, #(UREGS_SP_usr - UREGS_sp); /* SP, LR, SPSR, PC */
         clrex
         eret
+        sb
 
 /*
  * struct vcpu *__context_switch(struct vcpu *prev, struct vcpu *next)
index d35855af962ed1716a98bf1e77aa48a072d7c539..175ea2981e72ff487a81275ededa67c4e978c64e 100644 (file)
@@ -354,6 +354,7 @@ guest_sync:
          */
         mov     x1, xzr
         eret
+        sb
 
 check_wa2:
         /* ARM_SMCCC_ARCH_WORKAROUND_2 handling */
@@ -393,6 +394,7 @@ wa2_end:
 #endif /* !CONFIG_ARM_SSBD */
         mov     x0, xzr
         eret
+        sb
 guest_sync_slowpath:
         /*
          * x0/x1 may have been scratch by the fast path above, so avoid
@@ -457,6 +459,7 @@ return_from_trap:
         ldr     lr, [sp], #(UREGS_SPSR_el1 - UREGS_LR) /* CPSR, PC, SP, LR */
 
         eret
+        sb
 
 /*
  * Consume pending SError generated by the guest if any.
index 91ea3505e43af49db5b392e696c86da3fe11105e..4833671f4ced26da43f07786f5378f2b7ad9204e 100644 (file)
     .endr
     .endm
 
+    /*
+     * Speculative barrier
+     * XXX: Add support for the 'sb' instruction
+     */
+    .macro sb
+    dsb nsh
+    isb
+    .endm
+
 #endif /* __ASM_ARM_MACROS_H */