Skip to content

Commit cef6c8c

Browse files
committed
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Will Deacon: "Two important arm64 fixes ahead of the 6.16 release. The first fixes a regression introduced during the merge window where the KVM UUID (which is used to advertise KVM-specific hypercalls for things like time synchronisation in the guest) was corrupted thanks to an endianness bug introduced when converting the code to use the UUID_INIT() helper. The second fixes a stack-pointer corruption issue during context-switch which has been observed in the wild when taking a pseudo-NMI with shadow call stack enabled. Summary: - Fix broken UUID value for the KVM/arm64 hypervisor SMCCC interface - Fix stack corruption on context-switch, primarily seen on (but not limited to) configurations with both pNMI and SCS enabled" * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64/entry: Mask DAIF in cpu_switch_to(), call_on_irq_stack() arm64: kvm, smccc: Fix vendor uuid
2 parents 407c114 + d42e6c2 commit cef6c8c

File tree

3 files changed

+12
-1
lines changed

3 files changed

+12
-1
lines changed

arch/arm64/include/asm/assembler.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
/*
4242
* Save/restore interrupts.
4343
*/
44+
.macro save_and_disable_daif, flags
45+
mrs \flags, daif
46+
msr daifset, #0xf
47+
.endm
48+
4449
.macro save_and_disable_irq, flags
4550
mrs \flags, daif
4651
msr daifset, #3

arch/arm64/kernel/entry.S

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,7 @@ SYM_CODE_END(__bp_harden_el1_vectors)
825825
*
826826
*/
827827
SYM_FUNC_START(cpu_switch_to)
828+
save_and_disable_daif x11
828829
mov x10, #THREAD_CPU_CONTEXT
829830
add x8, x0, x10
830831
mov x9, sp
@@ -848,6 +849,7 @@ SYM_FUNC_START(cpu_switch_to)
848849
ptrauth_keys_install_kernel x1, x8, x9, x10
849850
scs_save x0
850851
scs_load_current
852+
restore_irq x11
851853
ret
852854
SYM_FUNC_END(cpu_switch_to)
853855
NOKPROBE(cpu_switch_to)
@@ -874,6 +876,7 @@ NOKPROBE(ret_from_fork)
874876
* Calls func(regs) using this CPU's irq stack and shadow irq stack.
875877
*/
876878
SYM_FUNC_START(call_on_irq_stack)
879+
save_and_disable_daif x9
877880
#ifdef CONFIG_SHADOW_CALL_STACK
878881
get_current_task x16
879882
scs_save x16
@@ -888,15 +891,18 @@ SYM_FUNC_START(call_on_irq_stack)
888891

889892
/* Move to the new stack and call the function there */
890893
add sp, x16, #IRQ_STACK_SIZE
894+
restore_irq x9
891895
blr x1
892896

897+
save_and_disable_daif x9
893898
/*
894899
* Restore the SP from the FP, and restore the FP and LR from the frame
895900
* record.
896901
*/
897902
mov sp, x29
898903
ldp x29, x30, [sp], #16
899904
scs_load_current
905+
restore_irq x9
900906
ret
901907
SYM_FUNC_END(call_on_irq_stack)
902908
NOKPROBE(call_on_irq_stack)

include/linux/arm-smccc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113

114114
/* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
115115
#define ARM_SMCCC_VENDOR_HYP_UID_KVM UUID_INIT(\
116-
0xb66fb428, 0xc52e, 0xe911, \
116+
0x28b46fb6, 0x2ec5, 0x11e9, \
117117
0xa9, 0xca, 0x4b, 0x56, \
118118
0x4d, 0x00, 0x3a, 0x74)
119119

0 commit comments

Comments
 (0)