Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+12 -1
+5
arch/arm64/include/asm/assembler.h
··· 41 41 /* 42 42 * Save/restore interrupts. 43 43 */ 44 + .macro save_and_disable_daif, flags 45 + mrs \flags, daif 46 + msr daifset, #0xf 47 + .endm 48 + 44 49 .macro save_and_disable_irq, flags 45 50 mrs \flags, daif 46 51 msr daifset, #3
+6
arch/arm64/kernel/entry.S
··· 825 825 * 826 826 */ 827 827 SYM_FUNC_START(cpu_switch_to) 828 + save_and_disable_daif x11 828 829 mov x10, #THREAD_CPU_CONTEXT 829 830 add x8, x0, x10 830 831 mov x9, sp ··· 849 848 ptrauth_keys_install_kernel x1, x8, x9, x10 850 849 scs_save x0 851 850 scs_load_current 851 + restore_irq x11 852 852 ret 853 853 SYM_FUNC_END(cpu_switch_to) 854 854 NOKPROBE(cpu_switch_to) ··· 876 874 * Calls func(regs) using this CPU's irq stack and shadow irq stack. 877 875 */ 878 876 SYM_FUNC_START(call_on_irq_stack) 877 + save_and_disable_daif x9 879 878 #ifdef CONFIG_SHADOW_CALL_STACK 880 879 get_current_task x16 881 880 scs_save x16 ··· 891 888 892 889 /* Move to the new stack and call the function there */ 893 890 add sp, x16, #IRQ_STACK_SIZE 891 + restore_irq x9 894 892 blr x1 895 893 894 + save_and_disable_daif x9 896 895 /* 897 896 * Restore the SP from the FP, and restore the FP and LR from the frame 898 897 * record. ··· 902 897 mov sp, x29 903 898 ldp x29, x30, [sp], #16 904 899 scs_load_current 900 + restore_irq x9 905 901 ret 906 902 SYM_FUNC_END(call_on_irq_stack) 907 903 NOKPROBE(call_on_irq_stack)
+1 -1
include/linux/arm-smccc.h
··· 113 113 114 114 /* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */ 115 115 #define ARM_SMCCC_VENDOR_HYP_UID_KVM UUID_INIT(\ 116 - 0xb66fb428, 0xc52e, 0xe911, \ 116 + 0x28b46fb6, 0x2ec5, 0x11e9, \ 117 117 0xa9, 0xca, 0x4b, 0x56, \ 118 118 0x4d, 0x00, 0x3a, 0x74) 119 119