-
Notifications
You must be signed in to change notification settings - Fork 54.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KVM: arm/arm64: Context-switch ptrauth registers
When pointer authentication is supported, a guest may wish to use it. This patch adds the necessary KVM infrastructure for this to work, with a semi-lazy context switch of the pointer auth state. Pointer authentication feature is only enabled when VHE is built in the kernel and present in the CPU implementation so only VHE code paths are modified. When we schedule a vcpu, we disable guest usage of pointer authentication instructions and accesses to the keys. While these are disabled, we avoid context-switching the keys. When we trap the guest trying to use pointer authentication functionality, we change to eagerly context-switching the keys, and enable the feature. The next time the vcpu is scheduled out/in, we start again. However the host key save is optimized and implemented inside ptrauth instruction/register access trap. Pointer authentication consists of address authentication and generic authentication, and CPUs in a system might have varied support for either. Where support for either feature is not uniform, it is hidden from guests via ID register emulation, as a result of the cpufeature framework in the host. Unfortunately, address authentication and generic authentication cannot be trapped separately, as the architecture provides a single EL2 trap covering both. If we wish to expose one without the other, we cannot prevent a (badly-written) guest from intermittently using a feature which is not uniformly supported (when scheduled on a physical CPU which supports the relevant feature). Hence, this patch expects both type of authentication to be present in a cpu. This switch of key is done from guest enter/exit assembly as preparation for the upcoming in-kernel pointer authentication support. Hence, these key switching routines are not implemented in C code as they may cause pointer authentication key signing error in some situations. Signed-off-by: Mark Rutland <[email protected]> [Only VHE, key switch in full assembly, vcpu_has_ptrauth checks , save host key in ptrauth exception trap] Signed-off-by: Amit Daniel Kachhap <[email protected]> Reviewed-by: Julien Thierry <[email protected]> Cc: Christoffer Dall <[email protected]> Cc: [email protected] [maz: various fixups] Signed-off-by: Marc Zyngier <[email protected]>
- Loading branch information
Mark Rutland
authored and
Marc Zyngier
committed
Apr 24, 2019
1 parent
b890d75
commit 384b40c
Showing
10 changed files
with
240 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* arch/arm64/include/asm/kvm_ptrauth.h: Guest/host ptrauth save/restore | ||
* Copyright 2019 Arm Limited | ||
* Authors: Mark Rutland <[email protected]> | ||
* Amit Daniel Kachhap <[email protected]> | ||
*/ | ||
|
||
#ifndef __ASM_KVM_PTRAUTH_H | ||
#define __ASM_KVM_PTRAUTH_H | ||
|
||
#ifdef __ASSEMBLY__ | ||
|
||
#include <asm/sysreg.h> | ||
|
||
#ifdef CONFIG_ARM64_PTR_AUTH | ||
|
||
#define PTRAUTH_REG_OFFSET(x) (x - CPU_APIAKEYLO_EL1) | ||
|
||
/* | ||
* CPU_AP*_EL1 values exceed immediate offset range (512) for stp | ||
* instruction so below macros takes CPU_APIAKEYLO_EL1 as base and | ||
* calculates the offset of the keys from this base to avoid an extra add | ||
* instruction. These macros assumes the keys offsets follow the order of | ||
* the sysreg enum in kvm_host.h. | ||
*/ | ||
.macro ptrauth_save_state base, reg1, reg2 | ||
mrs_s \reg1, SYS_APIAKEYLO_EL1 | ||
mrs_s \reg2, SYS_APIAKEYHI_EL1 | ||
stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)] | ||
mrs_s \reg1, SYS_APIBKEYLO_EL1 | ||
mrs_s \reg2, SYS_APIBKEYHI_EL1 | ||
stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)] | ||
mrs_s \reg1, SYS_APDAKEYLO_EL1 | ||
mrs_s \reg2, SYS_APDAKEYHI_EL1 | ||
stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)] | ||
mrs_s \reg1, SYS_APDBKEYLO_EL1 | ||
mrs_s \reg2, SYS_APDBKEYHI_EL1 | ||
stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)] | ||
mrs_s \reg1, SYS_APGAKEYLO_EL1 | ||
mrs_s \reg2, SYS_APGAKEYHI_EL1 | ||
stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)] | ||
.endm | ||
|
||
.macro ptrauth_restore_state base, reg1, reg2 | ||
ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)] | ||
msr_s SYS_APIAKEYLO_EL1, \reg1 | ||
msr_s SYS_APIAKEYHI_EL1, \reg2 | ||
ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)] | ||
msr_s SYS_APIBKEYLO_EL1, \reg1 | ||
msr_s SYS_APIBKEYHI_EL1, \reg2 | ||
ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)] | ||
msr_s SYS_APDAKEYLO_EL1, \reg1 | ||
msr_s SYS_APDAKEYHI_EL1, \reg2 | ||
ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)] | ||
msr_s SYS_APDBKEYLO_EL1, \reg1 | ||
msr_s SYS_APDBKEYHI_EL1, \reg2 | ||
ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)] | ||
msr_s SYS_APGAKEYLO_EL1, \reg1 | ||
msr_s SYS_APGAKEYHI_EL1, \reg2 | ||
.endm | ||
|
||
/* | ||
* Both ptrauth_switch_to_guest and ptrauth_switch_to_host macros will | ||
* check for the presence of one of the cpufeature flag | ||
* ARM64_HAS_ADDRESS_AUTH_ARCH or ARM64_HAS_ADDRESS_AUTH_IMP_DEF and | ||
* then proceed ahead with the save/restore of Pointer Authentication | ||
* key registers. | ||
*/ | ||
.macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3 | ||
alternative_if ARM64_HAS_ADDRESS_AUTH_ARCH | ||
b 1000f | ||
alternative_else_nop_endif | ||
alternative_if_not ARM64_HAS_ADDRESS_AUTH_IMP_DEF | ||
b 1001f | ||
alternative_else_nop_endif | ||
1000: | ||
ldr \reg1, [\g_ctxt, #(VCPU_HCR_EL2 - VCPU_CONTEXT)] | ||
and \reg1, \reg1, #(HCR_API | HCR_APK) | ||
cbz \reg1, 1001f | ||
add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1 | ||
ptrauth_restore_state \reg1, \reg2, \reg3 | ||
1001: | ||
.endm | ||
|
||
.macro ptrauth_switch_to_host g_ctxt, h_ctxt, reg1, reg2, reg3 | ||
alternative_if ARM64_HAS_ADDRESS_AUTH_ARCH | ||
b 2000f | ||
alternative_else_nop_endif | ||
alternative_if_not ARM64_HAS_ADDRESS_AUTH_IMP_DEF | ||
b 2001f | ||
alternative_else_nop_endif | ||
2000: | ||
ldr \reg1, [\g_ctxt, #(VCPU_HCR_EL2 - VCPU_CONTEXT)] | ||
and \reg1, \reg1, #(HCR_API | HCR_APK) | ||
cbz \reg1, 2001f | ||
add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1 | ||
ptrauth_save_state \reg1, \reg2, \reg3 | ||
add \reg1, \h_ctxt, #CPU_APIAKEYLO_EL1 | ||
ptrauth_restore_state \reg1, \reg2, \reg3 | ||
isb | ||
2001: | ||
.endm | ||
|
||
#else /* !CONFIG_ARM64_PTR_AUTH */ | ||
.macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3 | ||
.endm | ||
.macro ptrauth_switch_to_host g_ctxt, h_ctxt, reg1, reg2, reg3 | ||
.endm | ||
#endif /* CONFIG_ARM64_PTR_AUTH */ | ||
#endif /* __ASSEMBLY__ */ | ||
#endif /* __ASM_KVM_PTRAUTH_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters