Skip to content

Commit 0e5b9c0

Browse files
James MorseMarc Zyngier
authored andcommitted
KVM: arm64: Consume pending SError as early as possible
On systems with v8.2 we switch the 'vaxorcism' of guest SError with an alternative sequence that uses the ESB-instruction, then reads DISR_EL1. This saves the unmasking and remasking of asynchronous exceptions. We do this after we've saved the guest registers and restored the host's. Any SError that becomes pending due to this will be accounted to the guest, when it actually occurred during host-execution. Move the ESB-instruction as early as possible. Any guest SError will become pending due to this ESB-instruction and then consumed to DISR_EL1 before the host touches anything. This lets us account for host/guest SError precisely on the guest exit exception boundary. Because the ESB-instruction now lands in the preamble section of the vectors, we need to add it to the unpatched indirect vectors too, and to any sequence that may be patched in over the top. The ESB-instruction always lives in the head of the vectors, to be before any memory write. Whereas the register-store always lives in the tail. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
1 parent 5d99437 commit 0e5b9c0

File tree

3 files changed

+8
-5
lines changed

3 files changed

+8
-5
lines changed

arch/arm64/include/asm/kvm_asm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
* Size of the HYP vectors preamble. kvm_patch_vector_branch() generates code
3535
* that jumps over this.
3636
*/
37-
#define KVM_VECTOR_PREAMBLE (1 * AARCH64_INSN_SIZE)
37+
#define KVM_VECTOR_PREAMBLE (2 * AARCH64_INSN_SIZE)
3838

3939
#ifndef __ASSEMBLY__
4040

arch/arm64/kvm/hyp/entry.S

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ ENTRY(__guest_exit)
127127

128128
alternative_if ARM64_HAS_RAS_EXTN
129129
// If we have the RAS extensions we can consume a pending error
130-
// without an unmask-SError and isb.
131-
esb
130+
// without an unmask-SError and isb. The ESB-instruction consumed any
131+
// pending guest error when we took the exception from the guest.
132132
mrs_s x2, SYS_DISR_EL1
133133
str x2, [x1, #(VCPU_FAULT_DISR - VCPU_CONTEXT)]
134134
cbz x2, 1f
@@ -146,7 +146,6 @@ alternative_else
146146
mov x5, x0
147147

148148
dsb sy // Synchronize against in-flight ld/st
149-
nop
150149
msr daifclr, #4 // Unmask aborts
151150
alternative_endif
152151

arch/arm64/kvm/hyp/hyp-entry.S

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ ENDPROC(\label)
226226
.macro valid_vect target
227227
.align 7
228228
661:
229+
esb
229230
stp x0, x1, [sp, #-16]!
230231
662:
231232
b \target
@@ -237,6 +238,7 @@ check_preamble_length 661b, 662b
237238
.align 7
238239
661:
239240
b \target
241+
nop
240242
662:
241243
ldp x0, x1, [sp], #16
242244
b \target
@@ -269,7 +271,8 @@ ENDPROC(__kvm_hyp_vector)
269271
#ifdef CONFIG_KVM_INDIRECT_VECTORS
270272
.macro hyp_ventry
271273
.align 7
272-
1: .rept 27
274+
1: esb
275+
.rept 26
273276
nop
274277
.endr
275278
/*
@@ -317,6 +320,7 @@ ENTRY(__bp_harden_hyp_vecs_end)
317320
.popsection
318321

319322
ENTRY(__smccc_workaround_1_smc_start)
323+
esb
320324
sub sp, sp, #(8 * 4)
321325
stp x2, x3, [sp, #(8 * 0)]
322326
stp x0, x1, [sp, #(8 * 2)]

0 commit comments

Comments
 (0)