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

Merge tag 'kvmarm-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD

KVM/arm64 updates for 7.0

- Add support for FEAT_IDST, allowing ID registers that are not
implemented to be reported as a normal trap rather than as an UNDEF
exception.

- Add sanitisation of the VTCR_EL2 register, fixing a number of
UXN/PXN/XN bugs in the process.

- Full handling of RESx bits, instead of only RES0, and resulting in
SCTLR_EL2 being added to the list of sanitised registers.

- More pKVM fixes for features that are not supposed to be exposed to
guests.

- Make sure that MTE being disabled on the pKVM host doesn't give it
the ability to attack the hypervisor.

- Allow pKVM's host stage-2 mappings to use the Force Write Back
version of the memory attributes by using the "pass-through'
encoding.

- Fix trapping of ICC_DIR_EL1 on GICv5 hosts emulating GICv3 for the
guest.

- Preliminary work for guest GICv5 support.

- A bunch of debugfs fixes, removing pointless custom iterators stored
in guest data structures.

- A small set of FPSIMD cleanups.

- Selftest fixes addressing the incorrect alignment of page
allocation.

- Other assorted low-impact fixes and spelling fixes.

+1512 -928
+12
Documentation/arch/arm64/booting.rst
··· 556 556 557 557 - MDCR_EL3.TPM (bit 6) must be initialized to 0b0 558 558 559 + For CPUs with support for 64-byte loads and stores without status (FEAT_LS64): 560 + 561 + - If the kernel is entered at EL1 and EL2 is present: 562 + 563 + - HCRX_EL2.EnALS (bit 1) must be initialised to 0b1. 564 + 565 + For CPUs with support for 64-byte stores with status (FEAT_LS64_V): 566 + 567 + - If the kernel is entered at EL1 and EL2 is present: 568 + 569 + - HCRX_EL2.EnASR (bit 2) must be initialised to 0b1. 570 + 559 571 The requirements described above for CPU mode, caches, MMUs, architected 560 572 timers, coherency and system registers apply to all CPUs. All CPUs must 561 573 enter the kernel in the same exception level. Where the values documented
+7
Documentation/arch/arm64/elf_hwcaps.rst
··· 444 444 HWCAP3_LSFE 445 445 Functionality implied by ID_AA64ISAR3_EL1.LSFE == 0b0001 446 446 447 + HWCAP3_LS64 448 + Functionality implied by ID_AA64ISAR1_EL1.LS64 == 0b0001. Note that 449 + the function of instruction ld64b/st64b requires support by CPU, system 450 + and target (device) memory location and HWCAP3_LS64 implies the support 451 + of CPU. User should only use ld64b/st64b on supported target (device) 452 + memory location, otherwise fallback to the non-atomic alternatives. 453 + 447 454 448 455 4. Unused AT_HWCAP bits 449 456 -----------------------
+36 -7
Documentation/virt/kvm/api.rst
··· 1303 1303 information or because there is no device mapped at the accessed IPA, then 1304 1304 userspace can ask the kernel to inject an external abort using the address 1305 1305 from the exiting fault on the VCPU. It is a programming error to set 1306 - ext_dabt_pending after an exit which was not either KVM_EXIT_MMIO or 1307 - KVM_EXIT_ARM_NISV. This feature is only available if the system supports 1308 - KVM_CAP_ARM_INJECT_EXT_DABT. This is a helper which provides commonality in 1309 - how userspace reports accesses for the above cases to guests, across different 1310 - userspace implementations. Nevertheless, userspace can still emulate all Arm 1311 - exceptions by manipulating individual registers using the KVM_SET_ONE_REG API. 1306 + ext_dabt_pending after an exit which was not either KVM_EXIT_MMIO, 1307 + KVM_EXIT_ARM_NISV, or KVM_EXIT_ARM_LDST64B. This feature is only available if 1308 + the system supports KVM_CAP_ARM_INJECT_EXT_DABT. This is a helper which 1309 + provides commonality in how userspace reports accesses for the above cases to 1310 + guests, across different userspace implementations. Nevertheless, userspace 1311 + can still emulate all Arm exceptions by manipulating individual registers 1312 + using the KVM_SET_ONE_REG API. 1312 1313 1313 1314 See KVM_GET_VCPU_EVENTS for the data structure. 1314 1315 ··· 7051 7050 7052 7051 :: 7053 7052 7054 - /* KVM_EXIT_ARM_NISV */ 7053 + /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */ 7055 7054 struct { 7056 7055 __u64 esr_iss; 7057 7056 __u64 fault_ipa; 7058 7057 } arm_nisv; 7058 + 7059 + - KVM_EXIT_ARM_NISV: 7059 7060 7060 7061 Used on arm64 systems. If a guest accesses memory not in a memslot, 7061 7062 KVM will typically return to userspace and ask it to do MMIO emulation on its ··· 7091 7088 Note that although KVM_CAP_ARM_NISV_TO_USER will be reported if 7092 7089 queried outside of a protected VM context, the feature will not be 7093 7090 exposed if queried on a protected VM file descriptor. 7091 + 7092 + - KVM_EXIT_ARM_LDST64B: 7093 + 7094 + Used on arm64 systems. When a guest using a LD64B, ST64B, ST64BV, ST64BV0, 7095 + outside of a memslot, KVM will return to userspace with KVM_EXIT_ARM_LDST64B, 7096 + exposing the relevant ESR_EL2 information and faulting IPA, similarly to 7097 + KVM_EXIT_ARM_NISV. 7098 + 7099 + Userspace is supposed to fully emulate the instructions, which includes: 7100 + 7101 + - fetch of the operands for a store, including ACCDATA_EL1 in the case 7102 + of a ST64BV0 instruction 7103 + - deal with the endianness if the guest is big-endian 7104 + - emulate the access, including the delivery of an exception if the 7105 + access didn't succeed 7106 + - provide a return value in the case of ST64BV/ST64BV0 7107 + - return the data in the case of a load 7108 + - increment PC if the instruction was successfully executed 7109 + 7110 + Note that there is no expectation of performance for this emulation, as it 7111 + involves a large number of interaction with the guest state. It is, however, 7112 + expected that the instruction's semantics are preserved, specially the 7113 + single-copy atomicity property of the 64 byte access. 7114 + 7115 + This exit reason must be handled if userspace sets ID_AA64ISAR1_EL1.LS64 to a 7116 + non-zero value, indicating that FEAT_LS64* is enabled. 7094 7117 7095 7118 :: 7096 7119
-33
arch/arm64/Kconfig
··· 1680 1680 config ARM64_SW_TTBR0_PAN 1681 1681 bool "Emulate Privileged Access Never using TTBR0_EL1 switching" 1682 1682 depends on !KCSAN 1683 - select ARM64_PAN 1684 1683 help 1685 1684 Enabling this option prevents the kernel from accessing 1686 1685 user-space memory directly by pointing TTBR0_EL1 to a reserved ··· 1857 1858 Kernels built with this configuration option enabled continue 1858 1859 to work on pre-ARMv8.1 hardware and the performance impact is 1859 1860 minimal. If unsure, say Y. 1860 - 1861 - config ARM64_PAN 1862 - bool "Enable support for Privileged Access Never (PAN)" 1863 - default y 1864 - help 1865 - Privileged Access Never (PAN; part of the ARMv8.1 Extensions) 1866 - prevents the kernel or hypervisor from accessing user-space (EL0) 1867 - memory directly. 1868 - 1869 - Choosing this option will cause any unprotected (not using 1870 - copy_to_user et al) memory access to fail with a permission fault. 1871 - 1872 - The feature is detected at runtime, and will remain as a 'nop' 1873 - instruction if the cpu does not implement the feature. 1874 - 1875 - config ARM64_LSE_ATOMICS 1876 - bool 1877 - default ARM64_USE_LSE_ATOMICS 1878 - 1879 - config ARM64_USE_LSE_ATOMICS 1880 - bool "Atomic instructions" 1881 - default y 1882 - help 1883 - As part of the Large System Extensions, ARMv8.1 introduces new 1884 - atomic instructions that are designed specifically to scale in 1885 - very large systems. 1886 - 1887 - Say Y here to make use of these instructions for the in-kernel 1888 - atomic routines. This incurs a small overhead on CPUs that do 1889 - not support these instructions. 1890 1861 1891 1862 endmenu # "ARMv8.1 architectural features" 1892 1863 ··· 2094 2125 depends on ARM64_AS_HAS_MTE && ARM64_TAGGED_ADDR_ABI 2095 2126 depends on AS_HAS_ARMV8_5 2096 2127 # Required for tag checking in the uaccess routines 2097 - select ARM64_PAN 2098 2128 select ARCH_HAS_SUBPAGE_FAULTS 2099 2129 select ARCH_USES_HIGH_VMA_FLAGS 2100 2130 select ARCH_USES_PG_ARCH_2 ··· 2125 2157 config ARM64_EPAN 2126 2158 bool "Enable support for Enhanced Privileged Access Never (EPAN)" 2127 2159 default y 2128 - depends on ARM64_PAN 2129 2160 help 2130 2161 Enhanced Privileged Access Never (EPAN) allows Privileged 2131 2162 Access Never to be used with Execute-only mappings.
-2
arch/arm64/include/asm/cpucaps.h
··· 19 19 "cap must be < ARM64_NCAPS"); 20 20 21 21 switch (cap) { 22 - case ARM64_HAS_PAN: 23 - return IS_ENABLED(CONFIG_ARM64_PAN); 24 22 case ARM64_HAS_EPAN: 25 23 return IS_ENABLED(CONFIG_ARM64_EPAN); 26 24 case ARM64_SVE:
+11 -2
arch/arm64/include/asm/el2_setup.h
··· 83 83 /* Enable GCS if supported */ 84 84 mrs_s x1, SYS_ID_AA64PFR1_EL1 85 85 ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 86 - cbz x1, .Lset_hcrx_\@ 86 + cbz x1, .Lskip_gcs_hcrx_\@ 87 87 orr x0, x0, #HCRX_EL2_GCSEn 88 + 89 + .Lskip_gcs_hcrx_\@: 90 + /* Enable LS64, LS64_V if supported */ 91 + mrs_s x1, SYS_ID_AA64ISAR1_EL1 92 + ubfx x1, x1, #ID_AA64ISAR1_EL1_LS64_SHIFT, #4 93 + cbz x1, .Lset_hcrx_\@ 94 + orr x0, x0, #HCRX_EL2_EnALS 95 + cmp x1, #ID_AA64ISAR1_EL1_LS64_LS64_V 96 + b.lt .Lset_hcrx_\@ 97 + orr x0, x0, #HCRX_EL2_EnASR 88 98 89 99 .Lset_hcrx_\@: 90 100 msr_s SYS_HCRX_EL2, x0 ··· 235 225 ICH_HFGRTR_EL2_ICC_ICSR_EL1 | \ 236 226 ICH_HFGRTR_EL2_ICC_PCR_EL1 | \ 237 227 ICH_HFGRTR_EL2_ICC_HPPIR_EL1 | \ 238 - ICH_HFGRTR_EL2_ICC_HAPR_EL1 | \ 239 228 ICH_HFGRTR_EL2_ICC_CR0_EL1 | \ 240 229 ICH_HFGRTR_EL2_ICC_IDRn_EL1 | \ 241 230 ICH_HFGRTR_EL2_ICC_APR_EL1)
+8
arch/arm64/include/asm/esr.h
··· 124 124 #define ESR_ELx_FSC_SEA_TTW(n) (0x14 + (n)) 125 125 #define ESR_ELx_FSC_SECC (0x18) 126 126 #define ESR_ELx_FSC_SECC_TTW(n) (0x1c + (n)) 127 + #define ESR_ELx_FSC_EXCL_ATOMIC (0x35) 127 128 #define ESR_ELx_FSC_ADDRSZ (0x00) 128 129 129 130 /* ··· 487 486 (esr == ESR_ELx_FSC_ACCESS_L(2)) || 488 487 (esr == ESR_ELx_FSC_ACCESS_L(1)) || 489 488 (esr == ESR_ELx_FSC_ACCESS_L(0)); 489 + } 490 + 491 + static inline bool esr_fsc_is_excl_atomic_fault(unsigned long esr) 492 + { 493 + esr = esr & ESR_ELx_FSC; 494 + 495 + return esr == ESR_ELx_FSC_EXCL_ATOMIC; 490 496 } 491 497 492 498 static inline bool esr_fsc_is_addr_sz_fault(unsigned long esr)
+1
arch/arm64/include/asm/hwcap.h
··· 179 179 #define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR) 180 180 #define KERNEL_HWCAP_MTE_STORE_ONLY __khwcap3_feature(MTE_STORE_ONLY) 181 181 #define KERNEL_HWCAP_LSFE __khwcap3_feature(LSFE) 182 + #define KERNEL_HWCAP_LS64 __khwcap3_feature(LS64) 182 183 183 184 /* 184 185 * This yields a mask that user programs can use to figure out what
-23
arch/arm64/include/asm/insn.h
··· 671 671 enum aarch64_insn_register Rn, 672 672 enum aarch64_insn_register Rd, 673 673 u8 lsb); 674 - #ifdef CONFIG_ARM64_LSE_ATOMICS 675 674 u32 aarch64_insn_gen_atomic_ld_op(enum aarch64_insn_register result, 676 675 enum aarch64_insn_register address, 677 676 enum aarch64_insn_register value, ··· 682 683 enum aarch64_insn_register value, 683 684 enum aarch64_insn_size_type size, 684 685 enum aarch64_insn_mem_order_type order); 685 - #else 686 - static inline 687 - u32 aarch64_insn_gen_atomic_ld_op(enum aarch64_insn_register result, 688 - enum aarch64_insn_register address, 689 - enum aarch64_insn_register value, 690 - enum aarch64_insn_size_type size, 691 - enum aarch64_insn_mem_atomic_op op, 692 - enum aarch64_insn_mem_order_type order) 693 - { 694 - return AARCH64_BREAK_FAULT; 695 - } 696 - 697 - static inline 698 - u32 aarch64_insn_gen_cas(enum aarch64_insn_register result, 699 - enum aarch64_insn_register address, 700 - enum aarch64_insn_register value, 701 - enum aarch64_insn_size_type size, 702 - enum aarch64_insn_mem_order_type order) 703 - { 704 - return AARCH64_BREAK_FAULT; 705 - } 706 - #endif 707 686 u32 aarch64_insn_gen_dmb(enum aarch64_insn_mb_type type); 708 687 u32 aarch64_insn_gen_dsb(enum aarch64_insn_mb_type type); 709 688 u32 aarch64_insn_gen_mrs(enum aarch64_insn_register result,
+15 -41
arch/arm64/include/asm/kvm_arm.h
··· 101 101 HCR_BSU_IS | HCR_FB | HCR_TACR | \ 102 102 HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \ 103 103 HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3 | HCR_TID1) 104 - #define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA) 104 + #define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK) 105 105 #define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC) 106 106 #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H | HCR_AMO | HCR_IMO | HCR_FMO) 107 107 ··· 124 124 #define TCR_EL2_MASK (TCR_EL2_TG0_MASK | TCR_EL2_SH0_MASK | \ 125 125 TCR_EL2_ORGN0_MASK | TCR_EL2_IRGN0_MASK) 126 126 127 - /* VTCR_EL2 Registers bits */ 128 - #define VTCR_EL2_DS TCR_EL2_DS 129 - #define VTCR_EL2_RES1 (1U << 31) 130 - #define VTCR_EL2_HD (1 << 22) 131 - #define VTCR_EL2_HA (1 << 21) 132 - #define VTCR_EL2_PS_SHIFT TCR_EL2_PS_SHIFT 133 - #define VTCR_EL2_PS_MASK TCR_EL2_PS_MASK 134 - #define VTCR_EL2_TG0_MASK TCR_TG0_MASK 135 - #define VTCR_EL2_TG0_4K TCR_TG0_4K 136 - #define VTCR_EL2_TG0_16K TCR_TG0_16K 137 - #define VTCR_EL2_TG0_64K TCR_TG0_64K 138 - #define VTCR_EL2_SH0_MASK TCR_SH0_MASK 139 - #define VTCR_EL2_SH0_INNER TCR_SH0_INNER 140 - #define VTCR_EL2_ORGN0_MASK TCR_ORGN0_MASK 141 - #define VTCR_EL2_ORGN0_WBWA TCR_ORGN0_WBWA 142 - #define VTCR_EL2_IRGN0_MASK TCR_IRGN0_MASK 143 - #define VTCR_EL2_IRGN0_WBWA TCR_IRGN0_WBWA 144 - #define VTCR_EL2_SL0_SHIFT 6 145 - #define VTCR_EL2_SL0_MASK (3 << VTCR_EL2_SL0_SHIFT) 146 - #define VTCR_EL2_T0SZ_MASK 0x3f 147 - #define VTCR_EL2_VS_SHIFT 19 148 - #define VTCR_EL2_VS_8BIT (0 << VTCR_EL2_VS_SHIFT) 149 - #define VTCR_EL2_VS_16BIT (1 << VTCR_EL2_VS_SHIFT) 150 - 151 - #define VTCR_EL2_T0SZ(x) TCR_T0SZ(x) 152 - 153 127 /* 154 - * We configure the Stage-2 page tables to always restrict the IPA space to be 155 - * 40 bits wide (T0SZ = 24). Systems with a PARange smaller than 40 bits are 156 - * not known to exist and will break with this configuration. 157 - * 158 128 * The VTCR_EL2 is configured per VM and is initialised in kvm_init_stage2_mmu. 159 129 * 160 130 * Note that when using 4K pages, we concatenate two first level page tables 161 131 * together. With 16K pages, we concatenate 16 first level page tables. 162 132 * 163 133 */ 164 - 165 - #define VTCR_EL2_COMMON_BITS (VTCR_EL2_SH0_INNER | VTCR_EL2_ORGN0_WBWA | \ 166 - VTCR_EL2_IRGN0_WBWA | VTCR_EL2_RES1) 167 134 168 135 /* 169 136 * VTCR_EL2:SL0 indicates the entry level for Stage2 translation. ··· 163 196 */ 164 197 #ifdef CONFIG_ARM64_64K_PAGES 165 198 166 - #define VTCR_EL2_TGRAN VTCR_EL2_TG0_64K 199 + #define VTCR_EL2_TGRAN 64K 167 200 #define VTCR_EL2_TGRAN_SL0_BASE 3UL 168 201 169 202 #elif defined(CONFIG_ARM64_16K_PAGES) 170 203 171 - #define VTCR_EL2_TGRAN VTCR_EL2_TG0_16K 204 + #define VTCR_EL2_TGRAN 16K 172 205 #define VTCR_EL2_TGRAN_SL0_BASE 3UL 173 206 174 207 #else /* 4K */ 175 208 176 - #define VTCR_EL2_TGRAN VTCR_EL2_TG0_4K 209 + #define VTCR_EL2_TGRAN 4K 177 210 #define VTCR_EL2_TGRAN_SL0_BASE 2UL 178 211 179 212 #endif 180 213 181 214 #define VTCR_EL2_LVLS_TO_SL0(levels) \ 182 - ((VTCR_EL2_TGRAN_SL0_BASE - (4 - (levels))) << VTCR_EL2_SL0_SHIFT) 215 + FIELD_PREP(VTCR_EL2_SL0, (VTCR_EL2_TGRAN_SL0_BASE - (4 - (levels)))) 183 216 #define VTCR_EL2_SL0_TO_LVLS(sl0) \ 184 217 ((sl0) + 4 - VTCR_EL2_TGRAN_SL0_BASE) 185 218 #define VTCR_EL2_LVLS(vtcr) \ 186 - VTCR_EL2_SL0_TO_LVLS(((vtcr) & VTCR_EL2_SL0_MASK) >> VTCR_EL2_SL0_SHIFT) 219 + VTCR_EL2_SL0_TO_LVLS(FIELD_GET(VTCR_EL2_SL0, (vtcr))) 187 220 188 - #define VTCR_EL2_FLAGS (VTCR_EL2_COMMON_BITS | VTCR_EL2_TGRAN) 189 - #define VTCR_EL2_IPA(vtcr) (64 - ((vtcr) & VTCR_EL2_T0SZ_MASK)) 221 + #define VTCR_EL2_FLAGS (SYS_FIELD_PREP_ENUM(VTCR_EL2, SH0, INNER) | \ 222 + SYS_FIELD_PREP_ENUM(VTCR_EL2, ORGN0, WBWA) | \ 223 + SYS_FIELD_PREP_ENUM(VTCR_EL2, IRGN0, WBWA) | \ 224 + SYS_FIELD_PREP_ENUM(VTCR_EL2, TG0, VTCR_EL2_TGRAN) | \ 225 + VTCR_EL2_RES1) 226 + 227 + #define VTCR_EL2_IPA(vtcr) (64 - FIELD_GET(VTCR_EL2_T0SZ, (vtcr))) 190 228 191 229 /* 192 230 * ARM VMSAv8-64 defines an algorithm for finding the translation table ··· 315 343 */ 316 344 #define PAR_TO_HPFAR(par) \ 317 345 (((par) & GENMASK_ULL(52 - 1, 12)) >> 8) 346 + 347 + #define FAR_TO_FIPA_OFFSET(far) ((far) & GENMASK_ULL(11, 0)) 318 348 319 349 #define ECN(x) { ESR_ELx_EC_##x, #x } 320 350
-2
arch/arm64/include/asm/kvm_asm.h
··· 300 300 __le32 *origptr, __le32 *updptr, int nr_inst); 301 301 void kvm_compute_final_ctr_el0(struct alt_instr *alt, 302 302 __le32 *origptr, __le32 *updptr, int nr_inst); 303 - void kvm_pan_patch_el2_entry(struct alt_instr *alt, 304 - __le32 *origptr, __le32 *updptr, int nr_inst); 305 303 void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr, u64 elr_virt, 306 304 u64 elr_phys, u64 par, uintptr_t vcpu, u64 far, u64 hpfar); 307 305
+8
arch/arm64/include/asm/kvm_emulate.h
··· 45 45 void kvm_skip_instr32(struct kvm_vcpu *vcpu); 46 46 47 47 void kvm_inject_undefined(struct kvm_vcpu *vcpu); 48 + void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr); 48 49 int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr); 49 50 int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr); 51 + int kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr); 50 52 void kvm_inject_size_fault(struct kvm_vcpu *vcpu); 51 53 52 54 static inline int kvm_inject_sea_dabt(struct kvm_vcpu *vcpu, u64 addr) ··· 680 678 681 679 if (kvm_has_sctlr2(kvm)) 682 680 vcpu->arch.hcrx_el2 |= HCRX_EL2_SCTLR2En; 681 + 682 + if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64)) 683 + vcpu->arch.hcrx_el2 |= HCRX_EL2_EnALS; 684 + 685 + if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_V)) 686 + vcpu->arch.hcrx_el2 |= HCRX_EL2_EnASR; 683 687 } 684 688 } 685 689 #endif /* __ARM64_KVM_EMULATE_H__ */
+42 -16
arch/arm64/include/asm/kvm_host.h
··· 201 201 * host to parse the guest S2. 202 202 * This either contains: 203 203 * - the virtual VTTBR programmed by the guest hypervisor with 204 - * CnP cleared 204 + * CnP cleared 205 205 * - The value 1 (VMID=0, BADDR=0, CnP=1) if invalid 206 206 * 207 207 * We also cache the full VTCR which gets used for TLB invalidation, ··· 373 373 /* Maximum number of counters for the guest */ 374 374 u8 nr_pmu_counters; 375 375 376 - /* Iterator for idreg debugfs */ 377 - u8 idreg_debugfs_iter; 378 - 379 376 /* Hypercall features firmware registers' descriptor */ 380 377 struct kvm_smccc_features smccc_feat; 381 378 struct maple_tree smccc_filter; ··· 492 495 DBGVCR32_EL2, /* Debug Vector Catch Register */ 493 496 494 497 /* EL2 registers */ 495 - SCTLR_EL2, /* System Control Register (EL2) */ 496 498 ACTLR_EL2, /* Auxiliary Control Register (EL2) */ 497 499 CPTR_EL2, /* Architectural Feature Trap Register (EL2) */ 498 500 HACR_EL2, /* Hypervisor Auxiliary Control Register */ ··· 522 526 523 527 /* Anything from this can be RES0/RES1 sanitised */ 524 528 MARKER(__SANITISED_REG_START__), 529 + SCTLR_EL2, /* System Control Register (EL2) */ 525 530 TCR2_EL2, /* Extended Translation Control Register (EL2) */ 526 531 SCTLR2_EL2, /* System Control Register 2 (EL2) */ 527 532 MDCR_EL2, /* Monitor Debug Configuration Register (EL2) */ ··· 623 626 NR_SYS_REGS /* Nothing after this line! */ 624 627 }; 625 628 626 - struct kvm_sysreg_masks { 627 - struct { 628 - u64 res0; 629 - u64 res1; 630 - } mask[NR_SYS_REGS - __SANITISED_REG_START__]; 629 + struct resx { 630 + u64 res0; 631 + u64 res1; 631 632 }; 633 + 634 + struct kvm_sysreg_masks { 635 + struct resx mask[NR_SYS_REGS - __SANITISED_REG_START__]; 636 + }; 637 + 638 + static inline struct resx __kvm_get_sysreg_resx(struct kvm_arch *arch, 639 + enum vcpu_sysreg sr) 640 + { 641 + struct kvm_sysreg_masks *masks; 642 + 643 + masks = arch->sysreg_masks; 644 + if (likely(masks && 645 + sr >= __SANITISED_REG_START__ && sr < NR_SYS_REGS)) 646 + return masks->mask[sr - __SANITISED_REG_START__]; 647 + 648 + return (struct resx){}; 649 + } 650 + 651 + #define kvm_get_sysreg_resx(k, sr) __kvm_get_sysreg_resx(&(k)->arch, (sr)) 652 + 653 + static inline void __kvm_set_sysreg_resx(struct kvm_arch *arch, 654 + enum vcpu_sysreg sr, struct resx resx) 655 + { 656 + arch->sysreg_masks->mask[sr - __SANITISED_REG_START__] = resx; 657 + } 658 + 659 + #define kvm_set_sysreg_resx(k, sr, resx) \ 660 + __kvm_set_sysreg_resx(&(k)->arch, (sr), (resx)) 632 661 633 662 struct fgt_masks { 634 663 const char *str; 635 664 u64 mask; 636 665 u64 nmask; 637 666 u64 res0; 667 + u64 res1; 638 668 }; 639 669 640 670 extern struct fgt_masks hfgrtr_masks; ··· 734 710 struct kvm_host_data { 735 711 #define KVM_HOST_DATA_FLAG_HAS_SPE 0 736 712 #define KVM_HOST_DATA_FLAG_HAS_TRBE 1 737 - #define KVM_HOST_DATA_FLAG_TRBE_ENABLED 4 738 - #define KVM_HOST_DATA_FLAG_EL1_TRACING_CONFIGURED 5 739 - #define KVM_HOST_DATA_FLAG_VCPU_IN_HYP_CONTEXT 6 740 - #define KVM_HOST_DATA_FLAG_L1_VNCR_MAPPED 7 741 - #define KVM_HOST_DATA_FLAG_HAS_BRBE 8 713 + #define KVM_HOST_DATA_FLAG_TRBE_ENABLED 2 714 + #define KVM_HOST_DATA_FLAG_EL1_TRACING_CONFIGURED 3 715 + #define KVM_HOST_DATA_FLAG_VCPU_IN_HYP_CONTEXT 4 716 + #define KVM_HOST_DATA_FLAG_L1_VNCR_MAPPED 5 717 + #define KVM_HOST_DATA_FLAG_HAS_BRBE 6 742 718 unsigned long flags; 743 719 744 720 struct kvm_cpu_context host_ctxt; ··· 1630 1606 } 1631 1607 1632 1608 void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt); 1633 - void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *res1); 1609 + struct resx get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg); 1634 1610 void check_feature_map(void); 1635 1611 void kvm_vcpu_load_fgt(struct kvm_vcpu *vcpu); 1636 1612 ··· 1678 1654 \ 1679 1655 p; \ 1680 1656 }) 1657 + 1658 + long kvm_get_cap_for_kvm_ioctl(unsigned int ioctl, long *ext); 1681 1659 1682 1660 #endif /* __ARM64_KVM_HOST_H__ */
+2 -1
arch/arm64/include/asm/kvm_mmu.h
··· 103 103 void kvm_update_va_mask(struct alt_instr *alt, 104 104 __le32 *origptr, __le32 *updptr, int nr_inst); 105 105 void kvm_compute_layout(void); 106 + u32 kvm_hyp_va_bits(void); 106 107 void kvm_apply_hyp_relocations(void); 107 108 108 109 #define __hyp_pa(x) (((phys_addr_t)(x)) + hyp_physvirt_offset) ··· 186 185 187 186 phys_addr_t kvm_mmu_get_httbr(void); 188 187 phys_addr_t kvm_get_idmap_vector(void); 189 - int __init kvm_mmu_init(u32 *hyp_va_bits); 188 + int __init kvm_mmu_init(u32 hyp_va_bits); 190 189 191 190 static inline void *__kvm_vector_slot2addr(void *base, 192 191 enum arm64_hyp_spectre_vector slot)
+6 -13
arch/arm64/include/asm/kvm_pgtable.h
··· 87 87 88 88 #define KVM_PTE_LEAF_ATTR_HI_SW GENMASK(58, 55) 89 89 90 - #define __KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) 91 - #define __KVM_PTE_LEAF_ATTR_HI_S1_UXN BIT(54) 92 - #define __KVM_PTE_LEAF_ATTR_HI_S1_PXN BIT(53) 93 - 94 - #define KVM_PTE_LEAF_ATTR_HI_S1_XN \ 95 - ({ cpus_have_final_cap(ARM64_KVM_HVHE) ? \ 96 - (__KVM_PTE_LEAF_ATTR_HI_S1_UXN | \ 97 - __KVM_PTE_LEAF_ATTR_HI_S1_PXN) : \ 98 - __KVM_PTE_LEAF_ATTR_HI_S1_XN; }) 90 + #define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) 91 + #define KVM_PTE_LEAF_ATTR_HI_S1_UXN BIT(54) 92 + #define KVM_PTE_LEAF_ATTR_HI_S1_PXN BIT(53) 99 93 100 94 #define KVM_PTE_LEAF_ATTR_HI_S2_XN GENMASK(54, 53) 101 95 ··· 231 237 232 238 /** 233 239 * enum kvm_pgtable_stage2_flags - Stage-2 page-table flags. 234 - * @KVM_PGTABLE_S2_NOFWB: Don't enforce Normal-WB even if the CPUs have 235 - * ARM64_HAS_STAGE2_FWB. 236 240 * @KVM_PGTABLE_S2_IDMAP: Only use identity mappings. 241 + * @KVM_PGTABLE_S2_AS_S1: Final memory attributes are that of Stage-1. 237 242 */ 238 243 enum kvm_pgtable_stage2_flags { 239 - KVM_PGTABLE_S2_NOFWB = BIT(0), 240 - KVM_PGTABLE_S2_IDMAP = BIT(1), 244 + KVM_PGTABLE_S2_IDMAP = BIT(0), 245 + KVM_PGTABLE_S2_AS_S1 = BIT(1), 241 246 }; 242 247 243 248 /**
+28 -4
arch/arm64/include/asm/kvm_pkvm.h
··· 9 9 #include <linux/arm_ffa.h> 10 10 #include <linux/memblock.h> 11 11 #include <linux/scatterlist.h> 12 + #include <asm/kvm_host.h> 12 13 #include <asm/kvm_pgtable.h> 13 14 14 15 /* Maximum number of VMs that can co-exist under pKVM. */ ··· 24 23 int pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu); 25 24 26 25 /* 27 - * This functions as an allow-list of protected VM capabilities. 28 - * Features not explicitly allowed by this function are denied. 26 + * Check whether the specific capability is allowed in pKVM. 27 + * 28 + * Certain features are allowed only for non-protected VMs in pKVM, which is why 29 + * this takes the VM (kvm) as a parameter. 29 30 */ 30 - static inline bool kvm_pvm_ext_allowed(long ext) 31 + static inline bool kvm_pkvm_ext_allowed(struct kvm *kvm, long ext) 31 32 { 32 33 switch (ext) { 33 34 case KVM_CAP_IRQCHIP: ··· 45 42 case KVM_CAP_ARM_PTRAUTH_ADDRESS: 46 43 case KVM_CAP_ARM_PTRAUTH_GENERIC: 47 44 return true; 48 - default: 45 + case KVM_CAP_ARM_MTE: 49 46 return false; 47 + default: 48 + return !kvm || !kvm_vm_is_protected(kvm); 50 49 } 50 + } 51 + 52 + /* 53 + * Check whether the KVM VM IOCTL is allowed in pKVM. 54 + * 55 + * Certain features are allowed only for non-protected VMs in pKVM, which is why 56 + * this takes the VM (kvm) as a parameter. 57 + */ 58 + static inline bool kvm_pkvm_ioctl_allowed(struct kvm *kvm, unsigned int ioctl) 59 + { 60 + long ext; 61 + int r; 62 + 63 + r = kvm_get_cap_for_kvm_ioctl(ioctl, &ext); 64 + 65 + if (WARN_ON_ONCE(r < 0)) 66 + return false; 67 + 68 + return kvm_pkvm_ext_allowed(kvm, ext); 51 69 } 52 70 53 71 extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
-9
arch/arm64/include/asm/lse.h
··· 4 4 5 5 #include <asm/atomic_ll_sc.h> 6 6 7 - #ifdef CONFIG_ARM64_LSE_ATOMICS 8 - 9 7 #define __LSE_PREAMBLE ".arch_extension lse\n" 10 8 11 9 #include <linux/compiler_types.h> ··· 25 27 #define ARM64_LSE_ATOMIC_INSN(llsc, lse) \ 26 28 ALTERNATIVE(llsc, __LSE_PREAMBLE lse, ARM64_HAS_LSE_ATOMICS) 27 29 28 - #else /* CONFIG_ARM64_LSE_ATOMICS */ 29 - 30 - #define __lse_ll_sc_body(op, ...) __ll_sc_##op(__VA_ARGS__) 31 - 32 - #define ARM64_LSE_ATOMIC_INSN(llsc, lse) llsc 33 - 34 - #endif /* CONFIG_ARM64_LSE_ATOMICS */ 35 30 #endif /* __ASM_LSE_H */
+8 -3
arch/arm64/include/asm/memory.h
··· 175 175 #define MT_DEVICE_nGnRE 4 176 176 177 177 /* 178 - * Memory types for Stage-2 translation 178 + * Memory types for Stage-2 translation when HCR_EL2.FWB=0. See R_HMNDG, 179 + * R_TNHFM, R_GQFSF and I_MCQKW for the details on how these attributes get 180 + * combined with Stage-1. 179 181 */ 180 182 #define MT_S2_NORMAL 0xf 181 183 #define MT_S2_NORMAL_NC 0x5 182 184 #define MT_S2_DEVICE_nGnRE 0x1 185 + #define MT_S2_AS_S1 MT_S2_NORMAL 183 186 184 187 /* 185 - * Memory types for Stage-2 translation when ID_AA64MMFR2_EL1.FWB is 0001 186 - * Stage-2 enforces Normal-WB and Device-nGnRE 188 + * Memory types for Stage-2 translation when HCR_EL2.FWB=1. Stage-2 enforces 189 + * Normal-WB and Device-nGnRE, unless we actively say that S1 wins. See 190 + * R_VRJSW and R_RHWZM for details. 187 191 */ 188 192 #define MT_S2_FWB_NORMAL 6 189 193 #define MT_S2_FWB_NORMAL_NC 5 190 194 #define MT_S2_FWB_DEVICE_nGnRE 1 195 + #define MT_S2_FWB_AS_S1 7 191 196 192 197 #ifdef CONFIG_ARM64_4K_PAGES 193 198 #define IOREMAP_MAX_ORDER (PUD_SHIFT)
+2 -2
arch/arm64/include/asm/pgtable-prot.h
··· 109 109 #define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL_EXEC) 110 110 #define PAGE_KERNEL_EXEC_CONT __pgprot(_PAGE_KERNEL_EXEC_CONT) 111 111 112 - #define PAGE_S2_MEMATTR(attr, has_fwb) \ 112 + #define PAGE_S2_MEMATTR(attr) \ 113 113 ({ \ 114 114 u64 __val; \ 115 - if (has_fwb) \ 115 + if (cpus_have_final_cap(ARM64_HAS_STAGE2_FWB)) \ 116 116 __val = PTE_S2_MEMATTR(MT_S2_FWB_ ## attr); \ 117 117 else \ 118 118 __val = PTE_S2_MEMATTR(MT_S2_ ## attr); \
-29
arch/arm64/include/asm/sysreg.h
··· 504 504 #define SYS_VPIDR_EL2 sys_reg(3, 4, 0, 0, 0) 505 505 #define SYS_VMPIDR_EL2 sys_reg(3, 4, 0, 0, 5) 506 506 507 - #define SYS_SCTLR_EL2 sys_reg(3, 4, 1, 0, 0) 508 507 #define SYS_ACTLR_EL2 sys_reg(3, 4, 1, 0, 1) 509 508 #define SYS_SCTLR2_EL2 sys_reg(3, 4, 1, 0, 3) 510 509 #define SYS_HCR_EL2 sys_reg(3, 4, 1, 1, 0) ··· 516 517 #define SYS_TTBR1_EL2 sys_reg(3, 4, 2, 0, 1) 517 518 #define SYS_TCR_EL2 sys_reg(3, 4, 2, 0, 2) 518 519 #define SYS_VTTBR_EL2 sys_reg(3, 4, 2, 1, 0) 519 - #define SYS_VTCR_EL2 sys_reg(3, 4, 2, 1, 2) 520 520 521 521 #define SYS_HAFGRTR_EL2 sys_reg(3, 4, 3, 1, 6) 522 522 #define SYS_SPSR_EL2 sys_reg(3, 4, 4, 0, 0) ··· 559 561 #define SYS_ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5) 560 562 #define SYS_ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3) 561 563 #define SYS_ICH_ELRSR_EL2 sys_reg(3, 4, 12, 11, 5) 562 - #define SYS_ICH_VMCR_EL2 sys_reg(3, 4, 12, 11, 7) 563 564 564 565 #define __SYS__LR0_EL2(x) sys_reg(3, 4, 12, 12, x) 565 566 #define SYS_ICH_LR0_EL2 __SYS__LR0_EL2(0) ··· 835 838 #define SCTLR_ELx_A (BIT(1)) 836 839 #define SCTLR_ELx_M (BIT(0)) 837 840 838 - /* SCTLR_EL2 specific flags. */ 839 - #define SCTLR_EL2_RES1 ((BIT(4)) | (BIT(5)) | (BIT(11)) | (BIT(16)) | \ 840 - (BIT(18)) | (BIT(22)) | (BIT(23)) | (BIT(28)) | \ 841 - (BIT(29))) 842 - 843 - #define SCTLR_EL2_BT (BIT(36)) 844 841 #ifdef CONFIG_CPU_BIG_ENDIAN 845 842 #define ENDIAN_SET_EL2 SCTLR_ELx_EE 846 843 #else ··· 979 988 #define ICH_LR_PHYS_ID_MASK (0x3ffULL << ICH_LR_PHYS_ID_SHIFT) 980 989 #define ICH_LR_PRIORITY_SHIFT 48 981 990 #define ICH_LR_PRIORITY_MASK (0xffULL << ICH_LR_PRIORITY_SHIFT) 982 - 983 - /* ICH_VMCR_EL2 bit definitions */ 984 - #define ICH_VMCR_ACK_CTL_SHIFT 2 985 - #define ICH_VMCR_ACK_CTL_MASK (1 << ICH_VMCR_ACK_CTL_SHIFT) 986 - #define ICH_VMCR_FIQ_EN_SHIFT 3 987 - #define ICH_VMCR_FIQ_EN_MASK (1 << ICH_VMCR_FIQ_EN_SHIFT) 988 - #define ICH_VMCR_CBPR_SHIFT 4 989 - #define ICH_VMCR_CBPR_MASK (1 << ICH_VMCR_CBPR_SHIFT) 990 - #define ICH_VMCR_EOIM_SHIFT 9 991 - #define ICH_VMCR_EOIM_MASK (1 << ICH_VMCR_EOIM_SHIFT) 992 - #define ICH_VMCR_BPR1_SHIFT 18 993 - #define ICH_VMCR_BPR1_MASK (7 << ICH_VMCR_BPR1_SHIFT) 994 - #define ICH_VMCR_BPR0_SHIFT 21 995 - #define ICH_VMCR_BPR0_MASK (7 << ICH_VMCR_BPR0_SHIFT) 996 - #define ICH_VMCR_PMR_SHIFT 24 997 - #define ICH_VMCR_PMR_MASK (0xffUL << ICH_VMCR_PMR_SHIFT) 998 - #define ICH_VMCR_ENG0_SHIFT 0 999 - #define ICH_VMCR_ENG0_MASK (1 << ICH_VMCR_ENG0_SHIFT) 1000 - #define ICH_VMCR_ENG1_SHIFT 1 1001 - #define ICH_VMCR_ENG1_MASK (1 << ICH_VMCR_ENG1_SHIFT) 1002 991 1003 992 /* 1004 993 * Permission Indirection Extension (PIE) permission encodings.
+2 -4
arch/arm64/include/asm/uaccess.h
··· 124 124 125 125 static inline void __uaccess_disable_hw_pan(void) 126 126 { 127 - asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_HAS_PAN, 128 - CONFIG_ARM64_PAN)); 127 + asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_HAS_PAN)); 129 128 } 130 129 131 130 static inline void __uaccess_enable_hw_pan(void) 132 131 { 133 - asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, 134 - CONFIG_ARM64_PAN)); 132 + asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN)); 135 133 } 136 134 137 135 static inline void uaccess_disable_privileged(void)
+1
arch/arm64/include/uapi/asm/hwcap.h
··· 146 146 #define HWCAP3_MTE_FAR (1UL << 0) 147 147 #define HWCAP3_MTE_STORE_ONLY (1UL << 1) 148 148 #define HWCAP3_LSFE (1UL << 2) 149 + #define HWCAP3_LS64 (1UL << 3) 149 150 150 151 #endif /* _UAPI__ASM_HWCAP_H */
+32 -10
arch/arm64/kernel/cpufeature.c
··· 240 240 }; 241 241 242 242 static const struct arm64_ftr_bits ftr_id_aa64isar1[] = { 243 + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_LS64_SHIFT, 4, 0), 243 244 ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_XS_SHIFT, 4, 0), 244 245 ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_I8MM_SHIFT, 4, 0), 245 246 ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR1_EL1_DGH_SHIFT, 4, 0), ··· 2165 2164 return cpu_supports_bbml2_noabort(); 2166 2165 } 2167 2166 2168 - #ifdef CONFIG_ARM64_PAN 2169 2167 static void cpu_enable_pan(const struct arm64_cpu_capabilities *__unused) 2170 2168 { 2171 2169 /* ··· 2176 2176 sysreg_clear_set(sctlr_el1, SCTLR_EL1_SPAN, 0); 2177 2177 set_pstate_pan(1); 2178 2178 } 2179 - #endif /* CONFIG_ARM64_PAN */ 2180 2179 2181 2180 #ifdef CONFIG_ARM64_RAS_EXTN 2182 2181 static void cpu_clear_disr(const struct arm64_cpu_capabilities *__unused) ··· 2259 2260 } 2260 2261 #endif /* CONFIG_ARM64_E0PD */ 2261 2262 2263 + static void cpu_enable_ls64(struct arm64_cpu_capabilities const *cap) 2264 + { 2265 + sysreg_clear_set(sctlr_el1, SCTLR_EL1_EnALS, SCTLR_EL1_EnALS); 2266 + } 2267 + 2268 + static void cpu_enable_ls64_v(struct arm64_cpu_capabilities const *cap) 2269 + { 2270 + sysreg_clear_set(sctlr_el1, SCTLR_EL1_EnASR, 0); 2271 + } 2272 + 2262 2273 #ifdef CONFIG_ARM64_PSEUDO_NMI 2263 2274 static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry, 2264 2275 int scope) ··· 2335 2326 2336 2327 BUILD_BUG_ON(ARM64_HAS_ICH_HCR_EL2_TDIR <= ARM64_HAS_GICV3_CPUIF); 2337 2328 BUILD_BUG_ON(ARM64_HAS_ICH_HCR_EL2_TDIR <= ARM64_HAS_GICV5_LEGACY); 2338 - if (!this_cpu_has_cap(ARM64_HAS_GICV3_CPUIF) && 2339 - !is_midr_in_range_list(has_vgic_v3)) 2340 - return false; 2341 - 2342 2329 if (!is_hyp_mode_available()) 2343 2330 return false; 2344 2331 2345 2332 if (this_cpu_has_cap(ARM64_HAS_GICV5_LEGACY)) 2346 2333 return true; 2334 + 2335 + if (!this_cpu_has_cap(ARM64_HAS_GICV3_CPUIF) && 2336 + !is_midr_in_range_list(has_vgic_v3)) 2337 + return false; 2347 2338 2348 2339 if (is_kernel_in_hyp_mode()) 2349 2340 res.a1 = read_sysreg_s(SYS_ICH_VTR_EL2); ··· 2550 2541 .matches = has_cpuid_feature, 2551 2542 ARM64_CPUID_FIELDS(ID_AA64MMFR0_EL1, ECV, CNTPOFF) 2552 2543 }, 2553 - #ifdef CONFIG_ARM64_PAN 2554 2544 { 2555 2545 .desc = "Privileged Access Never", 2556 2546 .capability = ARM64_HAS_PAN, ··· 2558 2550 .cpu_enable = cpu_enable_pan, 2559 2551 ARM64_CPUID_FIELDS(ID_AA64MMFR1_EL1, PAN, IMP) 2560 2552 }, 2561 - #endif /* CONFIG_ARM64_PAN */ 2562 2553 #ifdef CONFIG_ARM64_EPAN 2563 2554 { 2564 2555 .desc = "Enhanced Privileged Access Never", ··· 2567 2560 ARM64_CPUID_FIELDS(ID_AA64MMFR1_EL1, PAN, PAN3) 2568 2561 }, 2569 2562 #endif /* CONFIG_ARM64_EPAN */ 2570 - #ifdef CONFIG_ARM64_LSE_ATOMICS 2571 2563 { 2572 2564 .desc = "LSE atomic instructions", 2573 2565 .capability = ARM64_HAS_LSE_ATOMICS, ··· 2574 2568 .matches = has_cpuid_feature, 2575 2569 ARM64_CPUID_FIELDS(ID_AA64ISAR0_EL1, ATOMIC, IMP) 2576 2570 }, 2577 - #endif /* CONFIG_ARM64_LSE_ATOMICS */ 2578 2571 { 2579 2572 .desc = "Virtualization Host Extensions", 2580 2573 .capability = ARM64_HAS_VIRT_HOST_EXTN, ··· 3153 3148 .matches = has_cpuid_feature, 3154 3149 ARM64_CPUID_FIELDS(ID_AA64MMFR1_EL1, XNX, IMP) 3155 3150 }, 3151 + { 3152 + .desc = "LS64", 3153 + .capability = ARM64_HAS_LS64, 3154 + .type = ARM64_CPUCAP_SYSTEM_FEATURE, 3155 + .matches = has_cpuid_feature, 3156 + .cpu_enable = cpu_enable_ls64, 3157 + ARM64_CPUID_FIELDS(ID_AA64ISAR1_EL1, LS64, LS64) 3158 + }, 3159 + { 3160 + .desc = "LS64_V", 3161 + .capability = ARM64_HAS_LS64_V, 3162 + .type = ARM64_CPUCAP_SYSTEM_FEATURE, 3163 + .matches = has_cpuid_feature, 3164 + .cpu_enable = cpu_enable_ls64_v, 3165 + ARM64_CPUID_FIELDS(ID_AA64ISAR1_EL1, LS64, LS64_V) 3166 + }, 3156 3167 {}, 3157 3168 }; 3158 3169 ··· 3288 3267 HWCAP_CAP(ID_AA64ISAR1_EL1, BF16, EBF16, CAP_HWCAP, KERNEL_HWCAP_EBF16), 3289 3268 HWCAP_CAP(ID_AA64ISAR1_EL1, DGH, IMP, CAP_HWCAP, KERNEL_HWCAP_DGH), 3290 3269 HWCAP_CAP(ID_AA64ISAR1_EL1, I8MM, IMP, CAP_HWCAP, KERNEL_HWCAP_I8MM), 3270 + HWCAP_CAP(ID_AA64ISAR1_EL1, LS64, LS64, CAP_HWCAP, KERNEL_HWCAP_LS64), 3291 3271 HWCAP_CAP(ID_AA64ISAR2_EL1, LUT, IMP, CAP_HWCAP, KERNEL_HWCAP_LUT), 3292 3272 HWCAP_CAP(ID_AA64ISAR3_EL1, FAMINMAX, IMP, CAP_HWCAP, KERNEL_HWCAP_FAMINMAX), 3293 3273 HWCAP_CAP(ID_AA64ISAR3_EL1, LSFE, IMP, CAP_HWCAP, KERNEL_HWCAP_LSFE),
+1
arch/arm64/kernel/cpuinfo.c
··· 81 81 [KERNEL_HWCAP_PACA] = "paca", 82 82 [KERNEL_HWCAP_PACG] = "pacg", 83 83 [KERNEL_HWCAP_GCS] = "gcs", 84 + [KERNEL_HWCAP_LS64] = "ls64", 84 85 [KERNEL_HWCAP_DCPODP] = "dcpodp", 85 86 [KERNEL_HWCAP_SVE2] = "sve2", 86 87 [KERNEL_HWCAP_SVEAES] = "sveaes",
+1 -1
arch/arm64/kernel/head.S
··· 299 299 isb 300 300 0: 301 301 302 - init_el2_hcr HCR_HOST_NVHE_FLAGS 302 + init_el2_hcr HCR_HOST_NVHE_FLAGS | HCR_ATA 303 303 init_el2_state 304 304 305 305 /* Hypervisor stub */
-1
arch/arm64/kernel/image-vars.h
··· 86 86 KVM_NVHE_ALIAS(kvm_update_va_mask); 87 87 KVM_NVHE_ALIAS(kvm_get_kimage_voffset); 88 88 KVM_NVHE_ALIAS(kvm_compute_final_ctr_el0); 89 - KVM_NVHE_ALIAS(kvm_pan_patch_el2_entry); 90 89 KVM_NVHE_ALIAS(spectre_bhb_patch_loop_iter); 91 90 KVM_NVHE_ALIAS(spectre_bhb_patch_loop_mitigation_enable); 92 91 KVM_NVHE_ALIAS(spectre_bhb_patch_wa3);
+1
arch/arm64/kernel/proton-pack.c
··· 887 887 MIDR_ALL_VERSIONS(MIDR_CORTEX_X2), 888 888 MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2), 889 889 MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1), 890 + MIDR_ALL_VERSIONS(MIDR_HISI_TSV110), 890 891 {}, 891 892 }; 892 893 static const struct midr_range spectre_bhb_k24_list[] = {
+13 -5
arch/arm64/kvm/arch_timer.c
··· 1056 1056 1057 1057 ctxt->timer_id = timerid; 1058 1058 1059 - if (timerid == TIMER_VTIMER) 1060 - ctxt->offset.vm_offset = &kvm->arch.timer_data.voffset; 1061 - else 1062 - ctxt->offset.vm_offset = &kvm->arch.timer_data.poffset; 1059 + if (!kvm_vm_is_protected(vcpu->kvm)) { 1060 + if (timerid == TIMER_VTIMER) 1061 + ctxt->offset.vm_offset = &kvm->arch.timer_data.voffset; 1062 + else 1063 + ctxt->offset.vm_offset = &kvm->arch.timer_data.poffset; 1064 + } else { 1065 + ctxt->offset.vm_offset = NULL; 1066 + } 1063 1067 1064 1068 hrtimer_setup(&ctxt->hrtimer, kvm_hrtimer_expire, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); 1065 1069 ··· 1087 1083 timer_context_init(vcpu, i); 1088 1084 1089 1085 /* Synchronize offsets across timers of a VM if not already provided */ 1090 - if (!test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, &vcpu->kvm->arch.flags)) { 1086 + if (!vcpu_is_protected(vcpu) && 1087 + !test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, &vcpu->kvm->arch.flags)) { 1091 1088 timer_set_offset(vcpu_vtimer(vcpu), kvm_phys_timer_read()); 1092 1089 timer_set_offset(vcpu_ptimer(vcpu), 0); 1093 1090 } ··· 1690 1685 int ret = 0; 1691 1686 1692 1687 if (offset->reserved) 1688 + return -EINVAL; 1689 + 1690 + if (kvm_vm_is_protected(kvm)) 1693 1691 return -EINVAL; 1694 1692 1695 1693 mutex_lock(&kvm->lock);
+59 -4
arch/arm64/kvm/arm.c
··· 40 40 #include <asm/kvm_pkvm.h> 41 41 #include <asm/kvm_ptrauth.h> 42 42 #include <asm/sections.h> 43 + #include <asm/stacktrace/nvhe.h> 43 44 44 45 #include <kvm/arm_hypercalls.h> 45 46 #include <kvm/arm_pmu.h> ··· 58 57 59 58 static enum kvm_wfx_trap_policy kvm_wfi_trap_policy __read_mostly = KVM_WFX_NOTRAP_SINGLE_TASK; 60 59 static enum kvm_wfx_trap_policy kvm_wfe_trap_policy __read_mostly = KVM_WFX_NOTRAP_SINGLE_TASK; 60 + 61 + /* 62 + * Tracks KVM IOCTLs and their associated KVM capabilities. 63 + */ 64 + struct kvm_ioctl_cap_map { 65 + unsigned int ioctl; 66 + long ext; 67 + }; 68 + 69 + /* Make KVM_CAP_NR_VCPUS the reference for features we always supported */ 70 + #define KVM_CAP_ARM_BASIC KVM_CAP_NR_VCPUS 71 + 72 + /* 73 + * Sorted by ioctl to allow for potential binary search, 74 + * though linear scan is sufficient for this size. 75 + */ 76 + static const struct kvm_ioctl_cap_map vm_ioctl_caps[] = { 77 + { KVM_CREATE_IRQCHIP, KVM_CAP_IRQCHIP }, 78 + { KVM_ARM_SET_DEVICE_ADDR, KVM_CAP_ARM_SET_DEVICE_ADDR }, 79 + { KVM_ARM_MTE_COPY_TAGS, KVM_CAP_ARM_MTE }, 80 + { KVM_SET_DEVICE_ATTR, KVM_CAP_DEVICE_CTRL }, 81 + { KVM_GET_DEVICE_ATTR, KVM_CAP_DEVICE_CTRL }, 82 + { KVM_HAS_DEVICE_ATTR, KVM_CAP_DEVICE_CTRL }, 83 + { KVM_ARM_SET_COUNTER_OFFSET, KVM_CAP_COUNTER_OFFSET }, 84 + { KVM_ARM_GET_REG_WRITABLE_MASKS, KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES }, 85 + { KVM_ARM_PREFERRED_TARGET, KVM_CAP_ARM_BASIC }, 86 + }; 87 + 88 + /* 89 + * Set *ext to the capability. 90 + * Return 0 if found, or -EINVAL if no IOCTL matches. 91 + */ 92 + long kvm_get_cap_for_kvm_ioctl(unsigned int ioctl, long *ext) 93 + { 94 + int i; 95 + 96 + for (i = 0; i < ARRAY_SIZE(vm_ioctl_caps); i++) { 97 + if (vm_ioctl_caps[i].ioctl == ioctl) { 98 + *ext = vm_ioctl_caps[i].ext; 99 + return 0; 100 + } 101 + } 102 + 103 + return -EINVAL; 104 + } 61 105 62 106 DECLARE_KVM_HYP_PER_CPU(unsigned long, kvm_hyp_vector); 63 107 ··· 133 87 if (cap->flags) 134 88 return -EINVAL; 135 89 136 - if (kvm_vm_is_protected(kvm) && !kvm_pvm_ext_allowed(cap->cap)) 90 + if (is_protected_kvm_enabled() && !kvm_pkvm_ext_allowed(kvm, cap->cap)) 137 91 return -EINVAL; 138 92 139 93 switch (cap->cap) { ··· 349 303 { 350 304 int r; 351 305 352 - if (kvm && kvm_vm_is_protected(kvm) && !kvm_pvm_ext_allowed(ext)) 306 + if (is_protected_kvm_enabled() && !kvm_pkvm_ext_allowed(kvm, ext)) 353 307 return 0; 354 308 355 309 switch (ext) { ··· 1940 1894 void __user *argp = (void __user *)arg; 1941 1895 struct kvm_device_attr attr; 1942 1896 1897 + if (is_protected_kvm_enabled() && !kvm_pkvm_ioctl_allowed(kvm, ioctl)) 1898 + return -EINVAL; 1899 + 1943 1900 switch (ioctl) { 1944 1901 case KVM_CREATE_IRQCHIP: { 1945 1902 int ret; ··· 2094 2045 params->hcr_el2 = HCR_HOST_NVHE_PROTECTED_FLAGS; 2095 2046 else 2096 2047 params->hcr_el2 = HCR_HOST_NVHE_FLAGS; 2048 + 2049 + if (system_supports_mte()) 2050 + params->hcr_el2 |= HCR_ATA; 2051 + else 2052 + params->hcr_el2 |= HCR_TID5; 2053 + 2097 2054 if (cpus_have_final_cap(ARM64_KVM_HVHE)) 2098 2055 params->hcr_el2 |= HCR_E2H; 2099 2056 params->vttbr = params->vtcr = 0; ··· 2624 2569 /* Inits Hyp-mode on all online CPUs */ 2625 2570 static int __init init_hyp_mode(void) 2626 2571 { 2627 - u32 hyp_va_bits; 2572 + u32 hyp_va_bits = kvm_hyp_va_bits(); 2628 2573 int cpu; 2629 2574 int err = -ENOMEM; 2630 2575 ··· 2638 2583 /* 2639 2584 * Allocate Hyp PGD and setup Hyp identity mapping 2640 2585 */ 2641 - err = kvm_mmu_init(&hyp_va_bits); 2586 + err = kvm_mmu_init(hyp_va_bits); 2642 2587 if (err) 2643 2588 goto out_err; 2644 2589
-7
arch/arm64/kvm/at.c
··· 1704 1704 } 1705 1705 } 1706 1706 1707 - #ifdef CONFIG_ARM64_LSE_ATOMICS 1708 1707 static int __lse_swap_desc(u64 __user *ptep, u64 old, u64 new) 1709 1708 { 1710 1709 u64 tmp = old; ··· 1728 1729 1729 1730 return ret; 1730 1731 } 1731 - #else 1732 - static int __lse_swap_desc(u64 __user *ptep, u64 old, u64 new) 1733 - { 1734 - return -EINVAL; 1735 - } 1736 - #endif 1737 1732 1738 1733 static int __llsc_swap_desc(u64 __user *ptep, u64 old, u64 new) 1739 1734 {
+310 -201
arch/arm64/kvm/config.c
··· 16 16 */ 17 17 struct reg_bits_to_feat_map { 18 18 union { 19 - u64 bits; 20 - u64 *res0p; 19 + u64 bits; 20 + struct fgt_masks *masks; 21 21 }; 22 22 23 23 #define NEVER_FGU BIT(0) /* Can trap, but never UNDEF */ 24 24 #define CALL_FUNC BIT(1) /* Needs to evaluate tons of crap */ 25 - #define FIXED_VALUE BIT(2) /* RAZ/WI or RAO/WI in KVM */ 26 - #define RES0_POINTER BIT(3) /* Pointer to RES0 value instead of bits */ 25 + #define FORCE_RESx BIT(2) /* Unconditional RESx */ 26 + #define MASKS_POINTER BIT(3) /* Pointer to fgt_masks struct instead of bits */ 27 + #define AS_RES1 BIT(4) /* RES1 when not supported */ 28 + #define REQUIRES_E2H1 BIT(5) /* Add HCR_EL2.E2H RES1 as a pre-condition */ 29 + #define RES1_WHEN_E2H0 BIT(6) /* RES1 when E2H=0 and not supported */ 30 + #define RES1_WHEN_E2H1 BIT(7) /* RES1 when E2H=1 and not supported */ 27 31 28 32 unsigned long flags; 29 33 ··· 40 36 s8 lo_lim; 41 37 }; 42 38 bool (*match)(struct kvm *); 43 - bool (*fval)(struct kvm *, u64 *); 44 39 }; 45 40 }; 46 41 ··· 72 69 .lo_lim = id ##_## fld ##_## lim \ 73 70 } 74 71 75 - #define __NEEDS_FEAT_2(m, f, w, fun, dummy) \ 76 - { \ 77 - .w = (m), \ 78 - .flags = (f) | CALL_FUNC, \ 79 - .fval = (fun), \ 80 - } 81 - 82 72 #define __NEEDS_FEAT_1(m, f, w, fun) \ 83 73 { \ 84 74 .w = (m), \ 85 75 .flags = (f) | CALL_FUNC, \ 86 76 .match = (fun), \ 77 + } 78 + 79 + #define __NEEDS_FEAT_0(m, f, w, ...) \ 80 + { \ 81 + .w = (m), \ 82 + .flags = (f), \ 87 83 } 88 84 89 85 #define __NEEDS_FEAT_FLAG(m, f, w, ...) \ ··· 91 89 #define NEEDS_FEAT_FLAG(m, f, ...) \ 92 90 __NEEDS_FEAT_FLAG(m, f, bits, __VA_ARGS__) 93 91 94 - #define NEEDS_FEAT_FIXED(m, ...) \ 95 - __NEEDS_FEAT_FLAG(m, FIXED_VALUE, bits, __VA_ARGS__, 0) 96 - 97 - #define NEEDS_FEAT_RES0(p, ...) \ 98 - __NEEDS_FEAT_FLAG(p, RES0_POINTER, res0p, __VA_ARGS__) 92 + #define NEEDS_FEAT_MASKS(p, ...) \ 93 + __NEEDS_FEAT_FLAG(p, MASKS_POINTER, masks, __VA_ARGS__) 99 94 100 95 /* 101 96 * Declare the dependency between a set of bits and a set of features, ··· 100 101 */ 101 102 #define NEEDS_FEAT(m, ...) NEEDS_FEAT_FLAG(m, 0, __VA_ARGS__) 102 103 104 + /* Declare fixed RESx bits */ 105 + #define FORCE_RES0(m) NEEDS_FEAT_FLAG(m, FORCE_RESx) 106 + #define FORCE_RES1(m) NEEDS_FEAT_FLAG(m, FORCE_RESx | AS_RES1) 107 + 103 108 /* 104 - * Declare the dependency between a non-FGT register, a set of 105 - * feature, and the set of individual bits it contains. This generates 106 - * a struct reg_feat_map_desc. 109 + * Declare the dependency between a non-FGT register, a set of features, 110 + * and the set of individual bits it contains. This generates a struct 111 + * reg_feat_map_desc. 107 112 */ 108 113 #define DECLARE_FEAT_MAP(n, r, m, f) \ 109 114 struct reg_feat_map_desc n = { \ 110 115 .name = #r, \ 111 - .feat_map = NEEDS_FEAT(~r##_RES0, f), \ 116 + .feat_map = NEEDS_FEAT(~(r##_RES0 | \ 117 + r##_RES1), f), \ 112 118 .bit_feat_map = m, \ 113 119 .bit_feat_map_sz = ARRAY_SIZE(m), \ 114 120 } 115 121 116 122 /* 117 123 * Specialised version of the above for FGT registers that have their 118 - * RES0 masks described as struct fgt_masks. 124 + * RESx masks described as struct fgt_masks. 119 125 */ 120 126 #define DECLARE_FEAT_MAP_FGT(n, msk, m, f) \ 121 127 struct reg_feat_map_desc n = { \ 122 128 .name = #msk, \ 123 - .feat_map = NEEDS_FEAT_RES0(&msk.res0, f),\ 129 + .feat_map = NEEDS_FEAT_MASKS(&msk, f), \ 124 130 .bit_feat_map = m, \ 125 131 .bit_feat_map_sz = ARRAY_SIZE(m), \ 126 132 } ··· 144 140 #define FEAT_AA64EL1 ID_AA64PFR0_EL1, EL1, IMP 145 141 #define FEAT_AA64EL2 ID_AA64PFR0_EL1, EL2, IMP 146 142 #define FEAT_AA64EL3 ID_AA64PFR0_EL1, EL3, IMP 143 + #define FEAT_SEL2 ID_AA64PFR0_EL1, SEL2, IMP 147 144 #define FEAT_AIE ID_AA64MMFR3_EL1, AIE, IMP 148 145 #define FEAT_S2POE ID_AA64MMFR3_EL1, S2POE, IMP 149 146 #define FEAT_S1POE ID_AA64MMFR3_EL1, S1POE, IMP ··· 187 182 #define FEAT_RME ID_AA64PFR0_EL1, RME, IMP 188 183 #define FEAT_MPAM ID_AA64PFR0_EL1, MPAM, 1 189 184 #define FEAT_S2FWB ID_AA64MMFR2_EL1, FWB, IMP 190 - #define FEAT_TME ID_AA64ISAR0_EL1, TME, IMP 191 185 #define FEAT_TWED ID_AA64MMFR1_EL1, TWED, IMP 192 186 #define FEAT_E2H0 ID_AA64MMFR4_EL1, E2H0, IMP 193 187 #define FEAT_SRMASK ID_AA64MMFR4_EL1, SRMASK, IMP ··· 205 201 #define FEAT_ASID2 ID_AA64MMFR4_EL1, ASID2, IMP 206 202 #define FEAT_MEC ID_AA64MMFR3_EL1, MEC, IMP 207 203 #define FEAT_HAFT ID_AA64MMFR1_EL1, HAFDBS, HAFT 204 + #define FEAT_HDBSS ID_AA64MMFR1_EL1, HAFDBS, HDBSS 205 + #define FEAT_HPDS2 ID_AA64MMFR1_EL1, HPDS, HPDS2 208 206 #define FEAT_BTI ID_AA64PFR1_EL1, BT, IMP 209 207 #define FEAT_ExS ID_AA64MMFR0_EL1, EXS, IMP 210 208 #define FEAT_IESB ID_AA64MMFR2_EL1, IESB, IMP ··· 224 218 #define FEAT_FGT2 ID_AA64MMFR0_EL1, FGT, FGT2 225 219 #define FEAT_MTPMU ID_AA64DFR0_EL1, MTPMU, IMP 226 220 #define FEAT_HCX ID_AA64MMFR1_EL1, HCX, IMP 221 + #define FEAT_S2PIE ID_AA64MMFR3_EL1, S2PIE, IMP 227 222 228 223 static bool not_feat_aa64el3(struct kvm *kvm) 229 224 { ··· 312 305 (read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_MPAM)); 313 306 } 314 307 315 - static bool feat_asid2_e2h1(struct kvm *kvm) 316 - { 317 - return kvm_has_feat(kvm, FEAT_ASID2) && !kvm_has_feat(kvm, FEAT_E2H0); 318 - } 319 - 320 - static bool feat_d128_e2h1(struct kvm *kvm) 321 - { 322 - return kvm_has_feat(kvm, FEAT_D128) && !kvm_has_feat(kvm, FEAT_E2H0); 323 - } 324 - 325 - static bool feat_mec_e2h1(struct kvm *kvm) 326 - { 327 - return kvm_has_feat(kvm, FEAT_MEC) && !kvm_has_feat(kvm, FEAT_E2H0); 328 - } 329 - 330 308 static bool feat_ebep_pmuv3_ss(struct kvm *kvm) 331 309 { 332 310 return kvm_has_feat(kvm, FEAT_EBEP) || kvm_has_feat(kvm, FEAT_PMUv3_SS); ··· 353 361 return check_pmu_revision(kvm, V3P9); 354 362 } 355 363 356 - static bool compute_hcr_rw(struct kvm *kvm, u64 *bits) 357 - { 358 - /* This is purely academic: AArch32 and NV are mutually exclusive */ 359 - if (bits) { 360 - if (kvm_has_feat(kvm, FEAT_AA32EL1)) 361 - *bits &= ~HCR_EL2_RW; 362 - else 363 - *bits |= HCR_EL2_RW; 364 - } 364 + #define has_feat_s2tgran(k, s) \ 365 + ((kvm_has_feat_enum(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, TGRAN##s) && \ 366 + kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s, IMP)) || \ 367 + kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, IMP)) 365 368 366 - return true; 369 + static bool feat_lpa2(struct kvm *kvm) 370 + { 371 + return ((kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT) || 372 + !kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, IMP)) && 373 + (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT) || 374 + !kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, IMP)) && 375 + (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4_2, 52_BIT) || 376 + !has_feat_s2tgran(kvm, 4)) && 377 + (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16_2, 52_BIT) || 378 + !has_feat_s2tgran(kvm, 16))); 367 379 } 368 380 369 - static bool compute_hcr_e2h(struct kvm *kvm, u64 *bits) 381 + static bool feat_vmid16(struct kvm *kvm) 370 382 { 371 - if (bits) { 372 - if (kvm_has_feat(kvm, FEAT_E2H0)) 373 - *bits &= ~HCR_EL2_E2H; 374 - else 375 - *bits |= HCR_EL2_E2H; 376 - } 377 - 378 - return true; 383 + return kvm_has_feat_enum(kvm, ID_AA64MMFR1_EL1, VMIDBits, 16); 379 384 } 380 385 381 386 static const struct reg_bits_to_feat_map hfgrtr_feat_map[] = { ··· 928 939 929 940 static const struct reg_bits_to_feat_map hcr_feat_map[] = { 930 941 NEEDS_FEAT(HCR_EL2_TID0, FEAT_AA32EL0), 931 - NEEDS_FEAT_FIXED(HCR_EL2_RW, compute_hcr_rw), 942 + NEEDS_FEAT_FLAG(HCR_EL2_RW, AS_RES1, FEAT_AA32EL1), 932 943 NEEDS_FEAT(HCR_EL2_HCD, not_feat_aa64el3), 933 944 NEEDS_FEAT(HCR_EL2_AMO | 934 945 HCR_EL2_BSU | ··· 938 949 HCR_EL2_FMO | 939 950 HCR_EL2_ID | 940 951 HCR_EL2_IMO | 941 - HCR_EL2_MIOCNCE | 942 952 HCR_EL2_PTW | 943 953 HCR_EL2_SWIO | 944 954 HCR_EL2_TACR | ··· 989 1001 NEEDS_FEAT(HCR_EL2_FIEN, feat_rasv1p1), 990 1002 NEEDS_FEAT(HCR_EL2_GPF, FEAT_RME), 991 1003 NEEDS_FEAT(HCR_EL2_FWB, FEAT_S2FWB), 992 - NEEDS_FEAT(HCR_EL2_TME, FEAT_TME), 993 1004 NEEDS_FEAT(HCR_EL2_TWEDEL | 994 1005 HCR_EL2_TWEDEn, 995 1006 FEAT_TWED), 996 - NEEDS_FEAT_FIXED(HCR_EL2_E2H, compute_hcr_e2h), 1007 + NEEDS_FEAT_FLAG(HCR_EL2_E2H, RES1_WHEN_E2H1 | FORCE_RESx), 1008 + FORCE_RES0(HCR_EL2_RES0), 1009 + FORCE_RES1(HCR_EL2_RES1), 997 1010 }; 998 1011 999 1012 static const DECLARE_FEAT_MAP(hcr_desc, HCR_EL2, ··· 1015 1026 SCTLR2_EL1_CPTM | 1016 1027 SCTLR2_EL1_CPTM0, 1017 1028 FEAT_CPA2), 1029 + FORCE_RES0(SCTLR2_EL1_RES0), 1030 + FORCE_RES1(SCTLR2_EL1_RES1), 1018 1031 }; 1019 1032 1020 1033 static const DECLARE_FEAT_MAP(sctlr2_desc, SCTLR2_EL1, 1021 1034 sctlr2_feat_map, FEAT_SCTLR2); 1022 1035 1023 1036 static const struct reg_bits_to_feat_map tcr2_el2_feat_map[] = { 1024 - NEEDS_FEAT(TCR2_EL2_FNG1 | 1025 - TCR2_EL2_FNG0 | 1026 - TCR2_EL2_A2, 1027 - feat_asid2_e2h1), 1028 - NEEDS_FEAT(TCR2_EL2_DisCH1 | 1029 - TCR2_EL2_DisCH0 | 1030 - TCR2_EL2_D128, 1031 - feat_d128_e2h1), 1032 - NEEDS_FEAT(TCR2_EL2_AMEC1, feat_mec_e2h1), 1037 + NEEDS_FEAT_FLAG(TCR2_EL2_FNG1 | 1038 + TCR2_EL2_FNG0 | 1039 + TCR2_EL2_A2, 1040 + REQUIRES_E2H1, FEAT_ASID2), 1041 + NEEDS_FEAT_FLAG(TCR2_EL2_DisCH1 | 1042 + TCR2_EL2_DisCH0 | 1043 + TCR2_EL2_D128, 1044 + REQUIRES_E2H1, FEAT_D128), 1045 + NEEDS_FEAT_FLAG(TCR2_EL2_AMEC1, REQUIRES_E2H1, FEAT_MEC), 1033 1046 NEEDS_FEAT(TCR2_EL2_AMEC0, FEAT_MEC), 1034 1047 NEEDS_FEAT(TCR2_EL2_HAFT, FEAT_HAFT), 1035 1048 NEEDS_FEAT(TCR2_EL2_PTTWI | ··· 1042 1051 TCR2_EL2_E0POE, 1043 1052 FEAT_S1POE), 1044 1053 NEEDS_FEAT(TCR2_EL2_PIE, FEAT_S1PIE), 1054 + FORCE_RES0(TCR2_EL2_RES0), 1055 + FORCE_RES1(TCR2_EL2_RES1), 1045 1056 }; 1046 1057 1047 1058 static const DECLARE_FEAT_MAP(tcr2_el2_desc, TCR2_EL2, 1048 1059 tcr2_el2_feat_map, FEAT_TCR2); 1049 1060 1050 1061 static const struct reg_bits_to_feat_map sctlr_el1_feat_map[] = { 1051 - NEEDS_FEAT(SCTLR_EL1_CP15BEN | 1052 - SCTLR_EL1_ITD | 1053 - SCTLR_EL1_SED, 1054 - FEAT_AA32EL0), 1062 + NEEDS_FEAT(SCTLR_EL1_CP15BEN, FEAT_AA32EL0), 1063 + NEEDS_FEAT_FLAG(SCTLR_EL1_ITD | 1064 + SCTLR_EL1_SED, 1065 + AS_RES1, FEAT_AA32EL0), 1055 1066 NEEDS_FEAT(SCTLR_EL1_BT0 | 1056 1067 SCTLR_EL1_BT1, 1057 1068 FEAT_BTI), 1058 1069 NEEDS_FEAT(SCTLR_EL1_CMOW, FEAT_CMOW), 1059 - NEEDS_FEAT(SCTLR_EL1_TSCXT, feat_csv2_2_csv2_1p2), 1060 - NEEDS_FEAT(SCTLR_EL1_EIS | 1061 - SCTLR_EL1_EOS, 1062 - FEAT_ExS), 1070 + NEEDS_FEAT_FLAG(SCTLR_EL1_TSCXT, 1071 + AS_RES1, feat_csv2_2_csv2_1p2), 1072 + NEEDS_FEAT_FLAG(SCTLR_EL1_EIS | 1073 + SCTLR_EL1_EOS, 1074 + AS_RES1, FEAT_ExS), 1063 1075 NEEDS_FEAT(SCTLR_EL1_EnFPM, FEAT_FPMR), 1064 1076 NEEDS_FEAT(SCTLR_EL1_IESB, FEAT_IESB), 1065 1077 NEEDS_FEAT(SCTLR_EL1_EnALS, FEAT_LS64), 1066 1078 NEEDS_FEAT(SCTLR_EL1_EnAS0, FEAT_LS64_ACCDATA), 1067 1079 NEEDS_FEAT(SCTLR_EL1_EnASR, FEAT_LS64_V), 1068 1080 NEEDS_FEAT(SCTLR_EL1_nAA, FEAT_LSE2), 1069 - NEEDS_FEAT(SCTLR_EL1_LSMAOE | 1070 - SCTLR_EL1_nTLSMD, 1071 - FEAT_LSMAOC), 1081 + NEEDS_FEAT_FLAG(SCTLR_EL1_LSMAOE | 1082 + SCTLR_EL1_nTLSMD, 1083 + AS_RES1, FEAT_LSMAOC), 1072 1084 NEEDS_FEAT(SCTLR_EL1_EE, FEAT_MixedEnd), 1073 1085 NEEDS_FEAT(SCTLR_EL1_E0E, feat_mixedendel0), 1074 1086 NEEDS_FEAT(SCTLR_EL1_MSCEn, FEAT_MOPS), ··· 1087 1093 NEEDS_FEAT(SCTLR_EL1_NMI | 1088 1094 SCTLR_EL1_SPINTMASK, 1089 1095 FEAT_NMI), 1090 - NEEDS_FEAT(SCTLR_EL1_SPAN, FEAT_PAN), 1096 + NEEDS_FEAT_FLAG(SCTLR_EL1_SPAN, 1097 + AS_RES1, FEAT_PAN), 1091 1098 NEEDS_FEAT(SCTLR_EL1_EPAN, FEAT_PAN3), 1092 1099 NEEDS_FEAT(SCTLR_EL1_EnDA | 1093 1100 SCTLR_EL1_EnDB | ··· 1099 1104 NEEDS_FEAT(SCTLR_EL1_EnRCTX, FEAT_SPECRES), 1100 1105 NEEDS_FEAT(SCTLR_EL1_DSSBS, FEAT_SSBS), 1101 1106 NEEDS_FEAT(SCTLR_EL1_TIDCP, FEAT_TIDCP1), 1102 - NEEDS_FEAT(SCTLR_EL1_TME0 | 1103 - SCTLR_EL1_TME | 1104 - SCTLR_EL1_TMT0 | 1105 - SCTLR_EL1_TMT, 1106 - FEAT_TME), 1107 1107 NEEDS_FEAT(SCTLR_EL1_TWEDEL | 1108 1108 SCTLR_EL1_TWEDEn, 1109 1109 FEAT_TWED), 1110 1110 NEEDS_FEAT(SCTLR_EL1_UCI | 1111 - SCTLR_EL1_EE | 1112 - SCTLR_EL1_E0E | 1113 1111 SCTLR_EL1_WXN | 1114 1112 SCTLR_EL1_nTWE | 1115 1113 SCTLR_EL1_nTWI | ··· 1116 1128 SCTLR_EL1_A | 1117 1129 SCTLR_EL1_M, 1118 1130 FEAT_AA64EL1), 1131 + FORCE_RES0(SCTLR_EL1_RES0), 1132 + FORCE_RES1(SCTLR_EL1_RES1), 1119 1133 }; 1120 1134 1121 1135 static const DECLARE_FEAT_MAP(sctlr_el1_desc, SCTLR_EL1, 1122 1136 sctlr_el1_feat_map, FEAT_AA64EL1); 1137 + 1138 + static const struct reg_bits_to_feat_map sctlr_el2_feat_map[] = { 1139 + NEEDS_FEAT_FLAG(SCTLR_EL2_CP15BEN, 1140 + RES1_WHEN_E2H0 | REQUIRES_E2H1, 1141 + FEAT_AA32EL0), 1142 + NEEDS_FEAT_FLAG(SCTLR_EL2_ITD | 1143 + SCTLR_EL2_SED, 1144 + RES1_WHEN_E2H1 | REQUIRES_E2H1, 1145 + FEAT_AA32EL0), 1146 + NEEDS_FEAT_FLAG(SCTLR_EL2_BT0, REQUIRES_E2H1, FEAT_BTI), 1147 + NEEDS_FEAT(SCTLR_EL2_BT, FEAT_BTI), 1148 + NEEDS_FEAT_FLAG(SCTLR_EL2_CMOW, REQUIRES_E2H1, FEAT_CMOW), 1149 + NEEDS_FEAT_FLAG(SCTLR_EL2_TSCXT, 1150 + RES1_WHEN_E2H1 | REQUIRES_E2H1, 1151 + feat_csv2_2_csv2_1p2), 1152 + NEEDS_FEAT_FLAG(SCTLR_EL2_EIS | 1153 + SCTLR_EL2_EOS, 1154 + AS_RES1, FEAT_ExS), 1155 + NEEDS_FEAT(SCTLR_EL2_EnFPM, FEAT_FPMR), 1156 + NEEDS_FEAT(SCTLR_EL2_IESB, FEAT_IESB), 1157 + NEEDS_FEAT_FLAG(SCTLR_EL2_EnALS, REQUIRES_E2H1, FEAT_LS64), 1158 + NEEDS_FEAT_FLAG(SCTLR_EL2_EnAS0, REQUIRES_E2H1, FEAT_LS64_ACCDATA), 1159 + NEEDS_FEAT_FLAG(SCTLR_EL2_EnASR, REQUIRES_E2H1, FEAT_LS64_V), 1160 + NEEDS_FEAT(SCTLR_EL2_nAA, FEAT_LSE2), 1161 + NEEDS_FEAT_FLAG(SCTLR_EL2_LSMAOE | 1162 + SCTLR_EL2_nTLSMD, 1163 + AS_RES1 | REQUIRES_E2H1, FEAT_LSMAOC), 1164 + NEEDS_FEAT(SCTLR_EL2_EE, FEAT_MixedEnd), 1165 + NEEDS_FEAT_FLAG(SCTLR_EL2_E0E, REQUIRES_E2H1, feat_mixedendel0), 1166 + NEEDS_FEAT_FLAG(SCTLR_EL2_MSCEn, REQUIRES_E2H1, FEAT_MOPS), 1167 + NEEDS_FEAT_FLAG(SCTLR_EL2_ATA0 | 1168 + SCTLR_EL2_TCF0, 1169 + REQUIRES_E2H1, FEAT_MTE2), 1170 + NEEDS_FEAT(SCTLR_EL2_ATA | 1171 + SCTLR_EL2_TCF, 1172 + FEAT_MTE2), 1173 + NEEDS_FEAT(SCTLR_EL2_ITFSB, feat_mte_async), 1174 + NEEDS_FEAT_FLAG(SCTLR_EL2_TCSO0, REQUIRES_E2H1, FEAT_MTE_STORE_ONLY), 1175 + NEEDS_FEAT(SCTLR_EL2_TCSO, 1176 + FEAT_MTE_STORE_ONLY), 1177 + NEEDS_FEAT(SCTLR_EL2_NMI | 1178 + SCTLR_EL2_SPINTMASK, 1179 + FEAT_NMI), 1180 + NEEDS_FEAT_FLAG(SCTLR_EL2_SPAN, AS_RES1 | REQUIRES_E2H1, FEAT_PAN), 1181 + NEEDS_FEAT_FLAG(SCTLR_EL2_EPAN, REQUIRES_E2H1, FEAT_PAN3), 1182 + NEEDS_FEAT(SCTLR_EL2_EnDA | 1183 + SCTLR_EL2_EnDB | 1184 + SCTLR_EL2_EnIA | 1185 + SCTLR_EL2_EnIB, 1186 + feat_pauth), 1187 + NEEDS_FEAT_FLAG(SCTLR_EL2_EnTP2, REQUIRES_E2H1, FEAT_SME), 1188 + NEEDS_FEAT(SCTLR_EL2_EnRCTX, FEAT_SPECRES), 1189 + NEEDS_FEAT(SCTLR_EL2_DSSBS, FEAT_SSBS), 1190 + NEEDS_FEAT_FLAG(SCTLR_EL2_TIDCP, REQUIRES_E2H1, FEAT_TIDCP1), 1191 + NEEDS_FEAT_FLAG(SCTLR_EL2_TWEDEL | 1192 + SCTLR_EL2_TWEDEn, 1193 + REQUIRES_E2H1, FEAT_TWED), 1194 + NEEDS_FEAT_FLAG(SCTLR_EL2_nTWE | 1195 + SCTLR_EL2_nTWI, 1196 + AS_RES1 | REQUIRES_E2H1, FEAT_AA64EL2), 1197 + NEEDS_FEAT_FLAG(SCTLR_EL2_UCI | 1198 + SCTLR_EL2_UCT | 1199 + SCTLR_EL2_DZE | 1200 + SCTLR_EL2_SA0, 1201 + REQUIRES_E2H1, FEAT_AA64EL2), 1202 + NEEDS_FEAT(SCTLR_EL2_WXN | 1203 + SCTLR_EL2_I | 1204 + SCTLR_EL2_SA | 1205 + SCTLR_EL2_C | 1206 + SCTLR_EL2_A | 1207 + SCTLR_EL2_M, 1208 + FEAT_AA64EL2), 1209 + FORCE_RES0(SCTLR_EL2_RES0), 1210 + FORCE_RES1(SCTLR_EL2_RES1), 1211 + }; 1212 + 1213 + static const DECLARE_FEAT_MAP(sctlr_el2_desc, SCTLR_EL2, 1214 + sctlr_el2_feat_map, FEAT_AA64EL2); 1123 1215 1124 1216 static const struct reg_bits_to_feat_map mdcr_el2_feat_map[] = { 1125 1217 NEEDS_FEAT(MDCR_EL2_EBWE, FEAT_Debugv8p9), ··· 1230 1162 MDCR_EL2_TDE | 1231 1163 MDCR_EL2_TDRA, 1232 1164 FEAT_AA64EL1), 1165 + FORCE_RES0(MDCR_EL2_RES0), 1166 + FORCE_RES1(MDCR_EL2_RES1), 1233 1167 }; 1234 1168 1235 1169 static const DECLARE_FEAT_MAP(mdcr_el2_desc, MDCR_EL2, 1236 1170 mdcr_el2_feat_map, FEAT_AA64EL2); 1237 1171 1172 + static const struct reg_bits_to_feat_map vtcr_el2_feat_map[] = { 1173 + NEEDS_FEAT(VTCR_EL2_HDBSS, FEAT_HDBSS), 1174 + NEEDS_FEAT(VTCR_EL2_HAFT, FEAT_HAFT), 1175 + NEEDS_FEAT(VTCR_EL2_TL0 | 1176 + VTCR_EL2_TL1 | 1177 + VTCR_EL2_AssuredOnly | 1178 + VTCR_EL2_GCSH, 1179 + FEAT_THE), 1180 + NEEDS_FEAT(VTCR_EL2_D128, FEAT_D128), 1181 + NEEDS_FEAT(VTCR_EL2_S2POE, FEAT_S2POE), 1182 + NEEDS_FEAT(VTCR_EL2_S2PIE, FEAT_S2PIE), 1183 + NEEDS_FEAT(VTCR_EL2_SL2 | 1184 + VTCR_EL2_DS, 1185 + feat_lpa2), 1186 + NEEDS_FEAT(VTCR_EL2_NSA | 1187 + VTCR_EL2_NSW, 1188 + FEAT_SEL2), 1189 + NEEDS_FEAT(VTCR_EL2_HWU62 | 1190 + VTCR_EL2_HWU61 | 1191 + VTCR_EL2_HWU60 | 1192 + VTCR_EL2_HWU59, 1193 + FEAT_HPDS2), 1194 + NEEDS_FEAT(VTCR_EL2_HD, ID_AA64MMFR1_EL1, HAFDBS, DBM), 1195 + NEEDS_FEAT(VTCR_EL2_HA, ID_AA64MMFR1_EL1, HAFDBS, AF), 1196 + NEEDS_FEAT(VTCR_EL2_VS, feat_vmid16), 1197 + NEEDS_FEAT(VTCR_EL2_PS | 1198 + VTCR_EL2_TG0 | 1199 + VTCR_EL2_SH0 | 1200 + VTCR_EL2_ORGN0 | 1201 + VTCR_EL2_IRGN0 | 1202 + VTCR_EL2_SL0 | 1203 + VTCR_EL2_T0SZ, 1204 + FEAT_AA64EL1), 1205 + FORCE_RES0(VTCR_EL2_RES0), 1206 + FORCE_RES1(VTCR_EL2_RES1), 1207 + }; 1208 + 1209 + static const DECLARE_FEAT_MAP(vtcr_el2_desc, VTCR_EL2, 1210 + vtcr_el2_feat_map, FEAT_AA64EL2); 1211 + 1238 1212 static void __init check_feat_map(const struct reg_bits_to_feat_map *map, 1239 - int map_size, u64 res0, const char *str) 1213 + int map_size, u64 resx, const char *str) 1240 1214 { 1241 1215 u64 mask = 0; 1242 1216 1217 + /* 1218 + * Don't account for FORCE_RESx that are architectural, and 1219 + * therefore part of the resx parameter. Other FORCE_RESx bits 1220 + * are implementation choices, and therefore accounted for. 1221 + */ 1243 1222 for (int i = 0; i < map_size; i++) 1244 - mask |= map[i].bits; 1223 + if (!((map[i].flags & FORCE_RESx) && (map[i].bits & resx))) 1224 + mask |= map[i].bits; 1245 1225 1246 - if (mask != ~res0) 1226 + if (mask != ~resx) 1247 1227 kvm_err("Undefined %s behaviour, bits %016llx\n", 1248 - str, mask ^ ~res0); 1228 + str, mask ^ ~resx); 1249 1229 } 1250 1230 1251 1231 static u64 reg_feat_map_bits(const struct reg_bits_to_feat_map *map) 1252 1232 { 1253 - return map->flags & RES0_POINTER ? ~(*map->res0p) : map->bits; 1233 + return map->flags & MASKS_POINTER ? (map->masks->mask | map->masks->nmask) : map->bits; 1254 1234 } 1255 1235 1256 1236 static void __init check_reg_desc(const struct reg_feat_map_desc *r) ··· 1325 1209 check_reg_desc(&sctlr2_desc); 1326 1210 check_reg_desc(&tcr2_el2_desc); 1327 1211 check_reg_desc(&sctlr_el1_desc); 1212 + check_reg_desc(&sctlr_el2_desc); 1328 1213 check_reg_desc(&mdcr_el2_desc); 1214 + check_reg_desc(&vtcr_el2_desc); 1329 1215 } 1330 1216 1331 1217 static bool idreg_feat_match(struct kvm *kvm, const struct reg_bits_to_feat_map *map) ··· 1344 1226 } 1345 1227 } 1346 1228 1347 - static u64 __compute_fixed_bits(struct kvm *kvm, 1348 - const struct reg_bits_to_feat_map *map, 1349 - int map_size, 1350 - u64 *fixed_bits, 1351 - unsigned long require, 1352 - unsigned long exclude) 1229 + static struct resx compute_resx_bits(struct kvm *kvm, 1230 + const struct reg_bits_to_feat_map *map, 1231 + int map_size, 1232 + unsigned long require, 1233 + unsigned long exclude) 1353 1234 { 1354 - u64 val = 0; 1235 + bool e2h0 = kvm_has_feat(kvm, FEAT_E2H0); 1236 + struct resx resx = {}; 1355 1237 1356 1238 for (int i = 0; i < map_size; i++) { 1357 1239 bool match; ··· 1362 1244 if (map[i].flags & exclude) 1363 1245 continue; 1364 1246 1365 - if (map[i].flags & CALL_FUNC) 1366 - match = (map[i].flags & FIXED_VALUE) ? 1367 - map[i].fval(kvm, fixed_bits) : 1368 - map[i].match(kvm); 1247 + if (map[i].flags & FORCE_RESx) 1248 + match = false; 1249 + else if (map[i].flags & CALL_FUNC) 1250 + match = map[i].match(kvm); 1369 1251 else 1370 1252 match = idreg_feat_match(kvm, &map[i]); 1371 1253 1372 - if (!match || (map[i].flags & FIXED_VALUE)) 1373 - val |= reg_feat_map_bits(&map[i]); 1254 + if (map[i].flags & REQUIRES_E2H1) 1255 + match &= !e2h0; 1256 + 1257 + if (!match) { 1258 + u64 bits = reg_feat_map_bits(&map[i]); 1259 + 1260 + if ((map[i].flags & AS_RES1) || 1261 + (e2h0 && (map[i].flags & RES1_WHEN_E2H0)) || 1262 + (!e2h0 && (map[i].flags & RES1_WHEN_E2H1))) 1263 + resx.res1 |= bits; 1264 + else 1265 + resx.res0 |= bits; 1266 + } 1374 1267 } 1375 1268 1376 - return val; 1269 + return resx; 1377 1270 } 1378 1271 1379 - static u64 compute_res0_bits(struct kvm *kvm, 1380 - const struct reg_bits_to_feat_map *map, 1381 - int map_size, 1382 - unsigned long require, 1383 - unsigned long exclude) 1272 + static struct resx compute_reg_resx_bits(struct kvm *kvm, 1273 + const struct reg_feat_map_desc *r, 1274 + unsigned long require, 1275 + unsigned long exclude) 1384 1276 { 1385 - return __compute_fixed_bits(kvm, map, map_size, NULL, 1386 - require, exclude | FIXED_VALUE); 1387 - } 1277 + struct resx resx; 1388 1278 1389 - static u64 compute_reg_res0_bits(struct kvm *kvm, 1390 - const struct reg_feat_map_desc *r, 1391 - unsigned long require, unsigned long exclude) 1392 - 1393 - { 1394 - u64 res0; 1395 - 1396 - res0 = compute_res0_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz, 1279 + resx = compute_resx_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz, 1397 1280 require, exclude); 1398 1281 1399 - /* 1400 - * If computing FGUs, don't take RES0 or register existence 1401 - * into account -- we're not computing bits for the register 1402 - * itself. 1403 - */ 1404 - if (!(exclude & NEVER_FGU)) { 1405 - res0 |= compute_res0_bits(kvm, &r->feat_map, 1, require, exclude); 1406 - res0 |= ~reg_feat_map_bits(&r->feat_map); 1282 + if (r->feat_map.flags & MASKS_POINTER) { 1283 + resx.res0 |= r->feat_map.masks->res0; 1284 + resx.res1 |= r->feat_map.masks->res1; 1407 1285 } 1408 1286 1409 - return res0; 1287 + /* 1288 + * If the register itself was not valid, all the non-RESx bits are 1289 + * now considered RES0 (this matches the behaviour of registers such 1290 + * as SCTLR2 and TCR2). Weed out any potential (though unlikely) 1291 + * overlap with RES1 bits coming from the previous computation. 1292 + */ 1293 + resx.res0 |= compute_resx_bits(kvm, &r->feat_map, 1, require, exclude).res0; 1294 + resx.res1 &= ~resx.res0; 1295 + 1296 + return resx; 1410 1297 } 1411 1298 1412 - static u64 compute_reg_fixed_bits(struct kvm *kvm, 1413 - const struct reg_feat_map_desc *r, 1414 - u64 *fixed_bits, unsigned long require, 1415 - unsigned long exclude) 1299 + static u64 compute_fgu_bits(struct kvm *kvm, const struct reg_feat_map_desc *r) 1416 1300 { 1417 - return __compute_fixed_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz, 1418 - fixed_bits, require | FIXED_VALUE, exclude); 1301 + struct resx resx; 1302 + 1303 + /* 1304 + * If computing FGUs, we collect the unsupported feature bits as 1305 + * RESx bits, but don't take the actual RESx bits or register 1306 + * existence into account -- we're not computing bits for the 1307 + * register itself. 1308 + */ 1309 + resx = compute_resx_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz, 1310 + 0, NEVER_FGU); 1311 + 1312 + return resx.res0 | resx.res1; 1419 1313 } 1420 1314 1421 1315 void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt) ··· 1436 1306 1437 1307 switch (fgt) { 1438 1308 case HFGRTR_GROUP: 1439 - val |= compute_reg_res0_bits(kvm, &hfgrtr_desc, 1440 - 0, NEVER_FGU); 1441 - val |= compute_reg_res0_bits(kvm, &hfgwtr_desc, 1442 - 0, NEVER_FGU); 1309 + val |= compute_fgu_bits(kvm, &hfgrtr_desc); 1310 + val |= compute_fgu_bits(kvm, &hfgwtr_desc); 1443 1311 break; 1444 1312 case HFGITR_GROUP: 1445 - val |= compute_reg_res0_bits(kvm, &hfgitr_desc, 1446 - 0, NEVER_FGU); 1313 + val |= compute_fgu_bits(kvm, &hfgitr_desc); 1447 1314 break; 1448 1315 case HDFGRTR_GROUP: 1449 - val |= compute_reg_res0_bits(kvm, &hdfgrtr_desc, 1450 - 0, NEVER_FGU); 1451 - val |= compute_reg_res0_bits(kvm, &hdfgwtr_desc, 1452 - 0, NEVER_FGU); 1316 + val |= compute_fgu_bits(kvm, &hdfgrtr_desc); 1317 + val |= compute_fgu_bits(kvm, &hdfgwtr_desc); 1453 1318 break; 1454 1319 case HAFGRTR_GROUP: 1455 - val |= compute_reg_res0_bits(kvm, &hafgrtr_desc, 1456 - 0, NEVER_FGU); 1320 + val |= compute_fgu_bits(kvm, &hafgrtr_desc); 1457 1321 break; 1458 1322 case HFGRTR2_GROUP: 1459 - val |= compute_reg_res0_bits(kvm, &hfgrtr2_desc, 1460 - 0, NEVER_FGU); 1461 - val |= compute_reg_res0_bits(kvm, &hfgwtr2_desc, 1462 - 0, NEVER_FGU); 1323 + val |= compute_fgu_bits(kvm, &hfgrtr2_desc); 1324 + val |= compute_fgu_bits(kvm, &hfgwtr2_desc); 1463 1325 break; 1464 1326 case HFGITR2_GROUP: 1465 - val |= compute_reg_res0_bits(kvm, &hfgitr2_desc, 1466 - 0, NEVER_FGU); 1327 + val |= compute_fgu_bits(kvm, &hfgitr2_desc); 1467 1328 break; 1468 1329 case HDFGRTR2_GROUP: 1469 - val |= compute_reg_res0_bits(kvm, &hdfgrtr2_desc, 1470 - 0, NEVER_FGU); 1471 - val |= compute_reg_res0_bits(kvm, &hdfgwtr2_desc, 1472 - 0, NEVER_FGU); 1330 + val |= compute_fgu_bits(kvm, &hdfgrtr2_desc); 1331 + val |= compute_fgu_bits(kvm, &hdfgwtr2_desc); 1473 1332 break; 1474 1333 default: 1475 1334 BUG(); ··· 1467 1348 kvm->arch.fgu[fgt] = val; 1468 1349 } 1469 1350 1470 - void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *res1) 1351 + struct resx get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg) 1471 1352 { 1472 - u64 fixed = 0, mask; 1353 + struct resx resx; 1473 1354 1474 1355 switch (reg) { 1475 1356 case HFGRTR_EL2: 1476 - *res0 = compute_reg_res0_bits(kvm, &hfgrtr_desc, 0, 0); 1477 - *res1 = HFGRTR_EL2_RES1; 1357 + resx = compute_reg_resx_bits(kvm, &hfgrtr_desc, 0, 0); 1478 1358 break; 1479 1359 case HFGWTR_EL2: 1480 - *res0 = compute_reg_res0_bits(kvm, &hfgwtr_desc, 0, 0); 1481 - *res1 = HFGWTR_EL2_RES1; 1360 + resx = compute_reg_resx_bits(kvm, &hfgwtr_desc, 0, 0); 1482 1361 break; 1483 1362 case HFGITR_EL2: 1484 - *res0 = compute_reg_res0_bits(kvm, &hfgitr_desc, 0, 0); 1485 - *res1 = HFGITR_EL2_RES1; 1363 + resx = compute_reg_resx_bits(kvm, &hfgitr_desc, 0, 0); 1486 1364 break; 1487 1365 case HDFGRTR_EL2: 1488 - *res0 = compute_reg_res0_bits(kvm, &hdfgrtr_desc, 0, 0); 1489 - *res1 = HDFGRTR_EL2_RES1; 1366 + resx = compute_reg_resx_bits(kvm, &hdfgrtr_desc, 0, 0); 1490 1367 break; 1491 1368 case HDFGWTR_EL2: 1492 - *res0 = compute_reg_res0_bits(kvm, &hdfgwtr_desc, 0, 0); 1493 - *res1 = HDFGWTR_EL2_RES1; 1369 + resx = compute_reg_resx_bits(kvm, &hdfgwtr_desc, 0, 0); 1494 1370 break; 1495 1371 case HAFGRTR_EL2: 1496 - *res0 = compute_reg_res0_bits(kvm, &hafgrtr_desc, 0, 0); 1497 - *res1 = HAFGRTR_EL2_RES1; 1372 + resx = compute_reg_resx_bits(kvm, &hafgrtr_desc, 0, 0); 1498 1373 break; 1499 1374 case HFGRTR2_EL2: 1500 - *res0 = compute_reg_res0_bits(kvm, &hfgrtr2_desc, 0, 0); 1501 - *res1 = HFGRTR2_EL2_RES1; 1375 + resx = compute_reg_resx_bits(kvm, &hfgrtr2_desc, 0, 0); 1502 1376 break; 1503 1377 case HFGWTR2_EL2: 1504 - *res0 = compute_reg_res0_bits(kvm, &hfgwtr2_desc, 0, 0); 1505 - *res1 = HFGWTR2_EL2_RES1; 1378 + resx = compute_reg_resx_bits(kvm, &hfgwtr2_desc, 0, 0); 1506 1379 break; 1507 1380 case HFGITR2_EL2: 1508 - *res0 = compute_reg_res0_bits(kvm, &hfgitr2_desc, 0, 0); 1509 - *res1 = HFGITR2_EL2_RES1; 1381 + resx = compute_reg_resx_bits(kvm, &hfgitr2_desc, 0, 0); 1510 1382 break; 1511 1383 case HDFGRTR2_EL2: 1512 - *res0 = compute_reg_res0_bits(kvm, &hdfgrtr2_desc, 0, 0); 1513 - *res1 = HDFGRTR2_EL2_RES1; 1384 + resx = compute_reg_resx_bits(kvm, &hdfgrtr2_desc, 0, 0); 1514 1385 break; 1515 1386 case HDFGWTR2_EL2: 1516 - *res0 = compute_reg_res0_bits(kvm, &hdfgwtr2_desc, 0, 0); 1517 - *res1 = HDFGWTR2_EL2_RES1; 1387 + resx = compute_reg_resx_bits(kvm, &hdfgwtr2_desc, 0, 0); 1518 1388 break; 1519 1389 case HCRX_EL2: 1520 - *res0 = compute_reg_res0_bits(kvm, &hcrx_desc, 0, 0); 1521 - *res1 = __HCRX_EL2_RES1; 1390 + resx = compute_reg_resx_bits(kvm, &hcrx_desc, 0, 0); 1391 + resx.res1 |= __HCRX_EL2_RES1; 1522 1392 break; 1523 1393 case HCR_EL2: 1524 - mask = compute_reg_fixed_bits(kvm, &hcr_desc, &fixed, 0, 0); 1525 - *res0 = compute_reg_res0_bits(kvm, &hcr_desc, 0, 0); 1526 - *res0 |= (mask & ~fixed); 1527 - *res1 = HCR_EL2_RES1 | (mask & fixed); 1394 + resx = compute_reg_resx_bits(kvm, &hcr_desc, 0, 0); 1528 1395 break; 1529 1396 case SCTLR2_EL1: 1530 1397 case SCTLR2_EL2: 1531 - *res0 = compute_reg_res0_bits(kvm, &sctlr2_desc, 0, 0); 1532 - *res1 = SCTLR2_EL1_RES1; 1398 + resx = compute_reg_resx_bits(kvm, &sctlr2_desc, 0, 0); 1533 1399 break; 1534 1400 case TCR2_EL2: 1535 - *res0 = compute_reg_res0_bits(kvm, &tcr2_el2_desc, 0, 0); 1536 - *res1 = TCR2_EL2_RES1; 1401 + resx = compute_reg_resx_bits(kvm, &tcr2_el2_desc, 0, 0); 1537 1402 break; 1538 1403 case SCTLR_EL1: 1539 - *res0 = compute_reg_res0_bits(kvm, &sctlr_el1_desc, 0, 0); 1540 - *res1 = SCTLR_EL1_RES1; 1404 + resx = compute_reg_resx_bits(kvm, &sctlr_el1_desc, 0, 0); 1405 + break; 1406 + case SCTLR_EL2: 1407 + resx = compute_reg_resx_bits(kvm, &sctlr_el2_desc, 0, 0); 1541 1408 break; 1542 1409 case MDCR_EL2: 1543 - *res0 = compute_reg_res0_bits(kvm, &mdcr_el2_desc, 0, 0); 1544 - *res1 = MDCR_EL2_RES1; 1410 + resx = compute_reg_resx_bits(kvm, &mdcr_el2_desc, 0, 0); 1411 + break; 1412 + case VTCR_EL2: 1413 + resx = compute_reg_resx_bits(kvm, &vtcr_el2_desc, 0, 0); 1545 1414 break; 1546 1415 default: 1547 1416 WARN_ON_ONCE(1); 1548 - *res0 = *res1 = 0; 1417 + resx = (typeof(resx)){}; 1549 1418 break; 1550 1419 } 1420 + 1421 + return resx; 1551 1422 } 1552 1423 1553 1424 static __always_inline struct fgt_masks *__fgt_reg_to_masks(enum vcpu_sysreg reg)
+62 -41
arch/arm64/kvm/emulate-nested.c
··· 70 70 CGT_HCR_ENSCXT, 71 71 CGT_HCR_TTLBIS, 72 72 CGT_HCR_TTLBOS, 73 + CGT_HCR_TID5, 73 74 74 75 CGT_MDCR_TPMCR, 75 76 CGT_MDCR_TPM, ··· 307 306 .index = HCR_EL2, 308 307 .value = HCR_TTLBOS, 309 308 .mask = HCR_TTLBOS, 309 + .behaviour = BEHAVE_FORWARD_RW, 310 + }, 311 + [CGT_HCR_TID5] = { 312 + .index = HCR_EL2, 313 + .value = HCR_TID5, 314 + .mask = HCR_TID5, 310 315 .behaviour = BEHAVE_FORWARD_RW, 311 316 }, 312 317 [CGT_MDCR_TPMCR] = { ··· 672 665 SR_TRAP(SYS_CCSIDR2_EL1, CGT_HCR_TID2_TID4), 673 666 SR_TRAP(SYS_CLIDR_EL1, CGT_HCR_TID2_TID4), 674 667 SR_TRAP(SYS_CSSELR_EL1, CGT_HCR_TID2_TID4), 668 + SR_TRAP(SYS_GMID_EL1, CGT_HCR_TID5), 675 669 SR_RANGE_TRAP(SYS_ID_PFR0_EL1, 676 670 sys_reg(3, 0, 0, 7, 7), CGT_HCR_TID3), 677 671 SR_TRAP(SYS_ICC_SGI0R_EL1, CGT_HCR_IMO_FMO_ICH_HCR_TC), ··· 1174 1166 SR_TRAP(SYS_DBGWCRn_EL1(12), CGT_MDCR_TDE_TDA), 1175 1167 SR_TRAP(SYS_DBGWCRn_EL1(13), CGT_MDCR_TDE_TDA), 1176 1168 SR_TRAP(SYS_DBGWCRn_EL1(14), CGT_MDCR_TDE_TDA), 1169 + SR_TRAP(SYS_DBGWCRn_EL1(15), CGT_MDCR_TDE_TDA), 1177 1170 SR_TRAP(SYS_DBGCLAIMSET_EL1, CGT_MDCR_TDE_TDA), 1178 1171 SR_TRAP(SYS_DBGCLAIMCLR_EL1, CGT_MDCR_TDE_TDA), 1179 1172 SR_TRAP(SYS_DBGAUTHSTATUS_EL1, CGT_MDCR_TDE_TDA), ··· 2114 2105 } 2115 2106 2116 2107 #define FGT_MASKS(__n, __m) \ 2117 - struct fgt_masks __n = { .str = #__m, .res0 = __m, } 2108 + struct fgt_masks __n = { .str = #__m, .res0 = __m ## _RES0, .res1 = __m ## _RES1 } 2118 2109 2119 - FGT_MASKS(hfgrtr_masks, HFGRTR_EL2_RES0); 2120 - FGT_MASKS(hfgwtr_masks, HFGWTR_EL2_RES0); 2121 - FGT_MASKS(hfgitr_masks, HFGITR_EL2_RES0); 2122 - FGT_MASKS(hdfgrtr_masks, HDFGRTR_EL2_RES0); 2123 - FGT_MASKS(hdfgwtr_masks, HDFGWTR_EL2_RES0); 2124 - FGT_MASKS(hafgrtr_masks, HAFGRTR_EL2_RES0); 2125 - FGT_MASKS(hfgrtr2_masks, HFGRTR2_EL2_RES0); 2126 - FGT_MASKS(hfgwtr2_masks, HFGWTR2_EL2_RES0); 2127 - FGT_MASKS(hfgitr2_masks, HFGITR2_EL2_RES0); 2128 - FGT_MASKS(hdfgrtr2_masks, HDFGRTR2_EL2_RES0); 2129 - FGT_MASKS(hdfgwtr2_masks, HDFGWTR2_EL2_RES0); 2110 + FGT_MASKS(hfgrtr_masks, HFGRTR_EL2); 2111 + FGT_MASKS(hfgwtr_masks, HFGWTR_EL2); 2112 + FGT_MASKS(hfgitr_masks, HFGITR_EL2); 2113 + FGT_MASKS(hdfgrtr_masks, HDFGRTR_EL2); 2114 + FGT_MASKS(hdfgwtr_masks, HDFGWTR_EL2); 2115 + FGT_MASKS(hafgrtr_masks, HAFGRTR_EL2); 2116 + FGT_MASKS(hfgrtr2_masks, HFGRTR2_EL2); 2117 + FGT_MASKS(hfgwtr2_masks, HFGWTR2_EL2); 2118 + FGT_MASKS(hfgitr2_masks, HFGITR2_EL2); 2119 + FGT_MASKS(hdfgrtr2_masks, HDFGRTR2_EL2); 2120 + FGT_MASKS(hdfgwtr2_masks, HDFGWTR2_EL2); 2130 2121 2131 2122 static __init bool aggregate_fgt(union trap_config tc) 2132 2123 { 2133 2124 struct fgt_masks *rmasks, *wmasks; 2125 + u64 rresx, wresx; 2134 2126 2135 2127 switch (tc.fgt) { 2136 2128 case HFGRTR_GROUP: ··· 2164 2154 break; 2165 2155 } 2166 2156 2157 + rresx = rmasks->res0 | rmasks->res1; 2158 + if (wmasks) 2159 + wresx = wmasks->res0 | wmasks->res1; 2160 + 2167 2161 /* 2168 2162 * A bit can be reserved in either the R or W register, but 2169 2163 * not both. 2170 2164 */ 2171 - if ((BIT(tc.bit) & rmasks->res0) && 2172 - (!wmasks || (BIT(tc.bit) & wmasks->res0))) 2165 + if ((BIT(tc.bit) & rresx) && (!wmasks || (BIT(tc.bit) & wresx))) 2173 2166 return false; 2174 2167 2175 2168 if (tc.pol) 2176 - rmasks->mask |= BIT(tc.bit) & ~rmasks->res0; 2169 + rmasks->mask |= BIT(tc.bit) & ~rresx; 2177 2170 else 2178 - rmasks->nmask |= BIT(tc.bit) & ~rmasks->res0; 2171 + rmasks->nmask |= BIT(tc.bit) & ~rresx; 2179 2172 2180 2173 if (wmasks) { 2181 2174 if (tc.pol) 2182 - wmasks->mask |= BIT(tc.bit) & ~wmasks->res0; 2175 + wmasks->mask |= BIT(tc.bit) & ~wresx; 2183 2176 else 2184 - wmasks->nmask |= BIT(tc.bit) & ~wmasks->res0; 2177 + wmasks->nmask |= BIT(tc.bit) & ~wresx; 2185 2178 } 2186 2179 2187 2180 return true; ··· 2193 2180 static __init int check_fgt_masks(struct fgt_masks *masks) 2194 2181 { 2195 2182 unsigned long duplicate = masks->mask & masks->nmask; 2196 - u64 res0 = masks->res0; 2197 2183 int ret = 0; 2198 2184 2199 2185 if (duplicate) { ··· 2206 2194 ret = -EINVAL; 2207 2195 } 2208 2196 2209 - masks->res0 = ~(masks->mask | masks->nmask); 2210 - if (masks->res0 != res0) 2211 - kvm_info("Implicit %s = %016llx, expecting %016llx\n", 2212 - masks->str, masks->res0, res0); 2197 + if ((masks->res0 | masks->res1 | masks->mask | masks->nmask) != GENMASK(63, 0) || 2198 + (masks->res0 & masks->res1) || (masks->res0 & masks->mask) || 2199 + (masks->res0 & masks->nmask) || (masks->res1 & masks->mask) || 2200 + (masks->res1 & masks->nmask) || (masks->mask & masks->nmask)) { 2201 + kvm_info("Inconsistent masks for %s (%016llx, %016llx, %016llx, %016llx)\n", 2202 + masks->str, masks->res0, masks->res1, masks->mask, masks->nmask); 2203 + masks->res0 = ~(masks->res1 | masks->mask | masks->nmask); 2204 + } 2213 2205 2214 2206 return ret; 2215 2207 } ··· 2285 2269 kvm_info("nv: %ld coarse grained trap handlers\n", 2286 2270 ARRAY_SIZE(encoding_to_cgt)); 2287 2271 2288 - if (!cpus_have_final_cap(ARM64_HAS_FGT)) 2289 - goto check_mcb; 2290 - 2291 2272 for (int i = 0; i < ARRAY_SIZE(encoding_to_fgt); i++) { 2292 2273 const struct encoding_to_trap_config *fgt = &encoding_to_fgt[i]; 2293 2274 union trap_config tc; ··· 2304 2291 } 2305 2292 2306 2293 tc.val |= fgt->tc.val; 2294 + 2295 + if (!aggregate_fgt(tc)) { 2296 + ret = -EINVAL; 2297 + print_nv_trap_error(fgt, "FGT bit is reserved", ret); 2298 + } 2299 + 2300 + if (!cpus_have_final_cap(ARM64_HAS_FGT)) 2301 + continue; 2302 + 2307 2303 prev = xa_store(&sr_forward_xa, enc, 2308 2304 xa_mk_value(tc.val), GFP_KERNEL); 2309 2305 2310 2306 if (xa_is_err(prev)) { 2311 2307 ret = xa_err(prev); 2312 2308 print_nv_trap_error(fgt, "Failed FGT insertion", ret); 2313 - } 2314 - 2315 - if (!aggregate_fgt(tc)) { 2316 - ret = -EINVAL; 2317 - print_nv_trap_error(fgt, "FGT bit is reserved", ret); 2318 2309 } 2319 2310 } 2320 2311 } ··· 2335 2318 kvm_info("nv: %ld fine grained trap handlers\n", 2336 2319 ARRAY_SIZE(encoding_to_fgt)); 2337 2320 2338 - check_mcb: 2339 2321 for (int id = __MULTIPLE_CONTROL_BITS__; id < __COMPLEX_CONDITIONS__; id++) { 2340 2322 const enum cgt_group_id *cgids; 2341 2323 ··· 2436 2420 2437 2421 static u64 kvm_get_sysreg_res0(struct kvm *kvm, enum vcpu_sysreg sr) 2438 2422 { 2439 - struct kvm_sysreg_masks *masks; 2440 - 2441 - /* Only handle the VNCR-backed regs for now */ 2442 - if (sr < __VNCR_START__) 2443 - return 0; 2444 - 2445 - masks = kvm->arch.sysreg_masks; 2446 - 2447 - return masks->mask[sr - __VNCR_START__].res0; 2423 + return kvm_get_sysreg_resx(kvm, sr).res0; 2448 2424 } 2449 2425 2450 2426 static bool check_fgt_bit(struct kvm_vcpu *vcpu, enum vcpu_sysreg sr, ··· 2587 2579 struct sys_reg_params params; 2588 2580 2589 2581 params = esr_sys64_to_params(esr); 2582 + 2583 + /* 2584 + * This implements the pseudocode UnimplementedIDRegister() 2585 + * helper for the purpose of dealing with FEAT_IDST. 2586 + */ 2587 + if (in_feat_id_space(&params)) { 2588 + if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, IMP)) 2589 + kvm_inject_sync(vcpu, kvm_vcpu_get_esr(vcpu)); 2590 + else 2591 + kvm_inject_undefined(vcpu); 2592 + 2593 + return true; 2594 + } 2590 2595 2591 2596 /* 2592 2597 * Check for the IMPDEF range, as per DDI0487 J.a,
+1 -3
arch/arm64/kvm/hyp/entry.S
··· 126 126 127 127 add x1, x1, #VCPU_CONTEXT 128 128 129 - alternative_cb ARM64_ALWAYS_SYSTEM, kvm_pan_patch_el2_entry 130 - nop 131 - alternative_cb_end 129 + ALTERNATIVE(nop, SET_PSTATE_PAN(1), ARM64_HAS_PAN) 132 130 133 131 // Store the guest regs x2 and x3 134 132 stp x2, x3, [x1, #CPU_XREG_OFFSET(2)]
+2 -4
arch/arm64/kvm/hyp/include/hyp/switch.h
··· 59 59 * If FP/ASIMD is not implemented, FPEXC is UNDEFINED and any access to 60 60 * it will cause an exception. 61 61 */ 62 - if (vcpu_el1_is_32bit(vcpu) && system_supports_fpsimd()) { 62 + if (vcpu_el1_is_32bit(vcpu) && system_supports_fpsimd()) 63 63 write_sysreg(1 << 30, fpexc32_el2); 64 - isb(); 65 - } 66 64 } 67 65 68 66 static inline void __activate_cptr_traps_nvhe(struct kvm_vcpu *vcpu) ··· 493 495 /* 494 496 * When the guest owns the FP regs, we know that guest+hyp traps for 495 497 * any FPSIMD/SVE/SME features exposed to the guest have been disabled 496 - * by either fpsimd_lazy_switch_to_guest() or kvm_hyp_handle_fpsimd() 498 + * by either __activate_cptr_traps() or kvm_hyp_handle_fpsimd() 497 499 * prior to __guest_entry(). As __guest_entry() guarantees a context 498 500 * synchronization event, we don't need an ISB here to avoid taking 499 501 * traps for anything that was exposed to the guest.
+2 -2
arch/arm64/kvm/hyp/nvhe/ffa.c
··· 792 792 .a0 = FFA_VERSION, 793 793 .a1 = ffa_req_version, 794 794 }, res); 795 - if (res->a0 == FFA_RET_NOT_SUPPORTED) 795 + if ((s32)res->a0 == FFA_RET_NOT_SUPPORTED) 796 796 goto unlock; 797 797 798 798 hyp_ffa_version = ffa_req_version; ··· 943 943 .a0 = FFA_VERSION, 944 944 .a1 = FFA_VERSION_1_2, 945 945 }, &res); 946 - if (res.a0 == FFA_RET_NOT_SUPPORTED) 946 + if ((s32)res.a0 == FFA_RET_NOT_SUPPORTED) 947 947 return 0; 948 948 949 949 /*
-5
arch/arm64/kvm/hyp/nvhe/hyp-init.S
··· 260 260 msr sctlr_el2, x5 261 261 isb 262 262 263 - alternative_if ARM64_KVM_PROTECTED_MODE 264 - mov_q x5, HCR_HOST_NVHE_FLAGS 265 - msr_hcr_el2 x5 266 - alternative_else_nop_endif 267 - 268 263 /* Install stub vectors */ 269 264 adr_l x5, __hyp_stub_vectors 270 265 msr vbar_el2, x5
+67
arch/arm64/kvm/hyp/nvhe/hyp-main.c
··· 690 690 kvm_skip_host_instr(); 691 691 } 692 692 693 + /* 694 + * Inject an Undefined Instruction exception into the host. 695 + * 696 + * This is open-coded to allow control over PSTATE construction without 697 + * complicating the generic exception entry helpers. 698 + */ 699 + static void inject_undef64(void) 700 + { 701 + u64 spsr_mask, vbar, sctlr, old_spsr, new_spsr, esr, offset; 702 + 703 + spsr_mask = PSR_N_BIT | PSR_Z_BIT | PSR_C_BIT | PSR_V_BIT | PSR_DIT_BIT | PSR_PAN_BIT; 704 + 705 + vbar = read_sysreg_el1(SYS_VBAR); 706 + sctlr = read_sysreg_el1(SYS_SCTLR); 707 + old_spsr = read_sysreg_el2(SYS_SPSR); 708 + 709 + new_spsr = old_spsr & spsr_mask; 710 + new_spsr |= PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT; 711 + new_spsr |= PSR_MODE_EL1h; 712 + 713 + if (!(sctlr & SCTLR_EL1_SPAN)) 714 + new_spsr |= PSR_PAN_BIT; 715 + 716 + if (sctlr & SCTLR_ELx_DSSBS) 717 + new_spsr |= PSR_SSBS_BIT; 718 + 719 + if (system_supports_mte()) 720 + new_spsr |= PSR_TCO_BIT; 721 + 722 + esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT) | ESR_ELx_IL; 723 + offset = CURRENT_EL_SP_ELx_VECTOR + except_type_sync; 724 + 725 + write_sysreg_el1(esr, SYS_ESR); 726 + write_sysreg_el1(read_sysreg_el2(SYS_ELR), SYS_ELR); 727 + write_sysreg_el1(old_spsr, SYS_SPSR); 728 + write_sysreg_el2(vbar + offset, SYS_ELR); 729 + write_sysreg_el2(new_spsr, SYS_SPSR); 730 + } 731 + 732 + static bool handle_host_mte(u64 esr) 733 + { 734 + switch (esr_sys64_to_sysreg(esr)) { 735 + case SYS_RGSR_EL1: 736 + case SYS_GCR_EL1: 737 + case SYS_TFSR_EL1: 738 + case SYS_TFSRE0_EL1: 739 + /* If we're here for any reason other than MTE, it's a bug. */ 740 + if (read_sysreg(HCR_EL2) & HCR_ATA) 741 + return false; 742 + break; 743 + case SYS_GMID_EL1: 744 + /* If we're here for any reason other than MTE, it's a bug. */ 745 + if (!(read_sysreg(HCR_EL2) & HCR_TID5)) 746 + return false; 747 + break; 748 + default: 749 + return false; 750 + } 751 + 752 + inject_undef64(); 753 + return true; 754 + } 755 + 693 756 void handle_trap(struct kvm_cpu_context *host_ctxt) 694 757 { 695 758 u64 esr = read_sysreg_el2(SYS_ESR); ··· 768 705 case ESR_ELx_EC_DABT_LOW: 769 706 handle_host_mem_abort(host_ctxt); 770 707 break; 708 + case ESR_ELx_EC_SYS64: 709 + if (handle_host_mte(esr)) 710 + break; 711 + fallthrough; 771 712 default: 772 713 BUG(); 773 714 }
+3 -1
arch/arm64/kvm/hyp/nvhe/mem_protect.c
··· 19 19 #include <nvhe/mem_protect.h> 20 20 #include <nvhe/mm.h> 21 21 22 - #define KVM_HOST_S2_FLAGS (KVM_PGTABLE_S2_NOFWB | KVM_PGTABLE_S2_IDMAP) 22 + #define KVM_HOST_S2_FLAGS (KVM_PGTABLE_S2_AS_S1 | KVM_PGTABLE_S2_IDMAP) 23 23 24 24 struct host_mmu host_mmu; 25 25 ··· 324 324 params->vttbr = kvm_get_vttbr(mmu); 325 325 params->vtcr = mmu->vtcr; 326 326 params->hcr_el2 |= HCR_VM; 327 + if (cpus_have_final_cap(ARM64_HAS_STAGE2_FWB)) 328 + params->hcr_el2 |= HCR_FWB; 327 329 328 330 /* 329 331 * The CMO below not only cleans the updated params to the
+10 -10
arch/arm64/kvm/hyp/nvhe/pkvm.c
··· 82 82 if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, AMU, IMP)) 83 83 val &= ~(HCR_AMVOFFEN); 84 84 85 - if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, MTE, IMP)) { 85 + if (!kvm_has_mte(kvm)) { 86 86 val |= HCR_TID5; 87 87 val &= ~(HCR_DCT | HCR_ATA); 88 88 } ··· 117 117 if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceFilt, IMP)) 118 118 val |= MDCR_EL2_TTRF; 119 119 120 - if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, ExtTrcBuff, IMP)) 121 - val |= MDCR_EL2_E2TB_MASK; 120 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceBuffer, IMP)) 121 + val &= ~MDCR_EL2_E2TB_MASK; 122 122 123 123 /* Trap Debug Communications Channel registers */ 124 124 if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, FGT, IMP)) ··· 339 339 /* Preserve the vgic model so that GICv3 emulation works */ 340 340 hyp_vm->kvm.arch.vgic.vgic_model = host_kvm->arch.vgic.vgic_model; 341 341 342 - if (test_bit(KVM_ARCH_FLAG_MTE_ENABLED, &host_kvm->arch.flags)) 343 - set_bit(KVM_ARCH_FLAG_MTE_ENABLED, &kvm->arch.flags); 344 - 345 342 /* No restrictions for non-protected VMs. */ 346 343 if (!kvm_vm_is_protected(kvm)) { 347 344 hyp_vm->kvm.arch.flags = host_arch_flags; ··· 353 356 return; 354 357 } 355 358 359 + if (kvm_pkvm_ext_allowed(kvm, KVM_CAP_ARM_MTE)) 360 + kvm->arch.flags |= host_arch_flags & BIT(KVM_ARCH_FLAG_MTE_ENABLED); 361 + 356 362 bitmap_zero(allowed_features, KVM_VCPU_MAX_FEATURES); 357 363 358 364 set_bit(KVM_ARM_VCPU_PSCI_0_2, allowed_features); 359 365 360 - if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PMU_V3)) 366 + if (kvm_pkvm_ext_allowed(kvm, KVM_CAP_ARM_PMU_V3)) 361 367 set_bit(KVM_ARM_VCPU_PMU_V3, allowed_features); 362 368 363 - if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PTRAUTH_ADDRESS)) 369 + if (kvm_pkvm_ext_allowed(kvm, KVM_CAP_ARM_PTRAUTH_ADDRESS)) 364 370 set_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, allowed_features); 365 371 366 - if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PTRAUTH_GENERIC)) 372 + if (kvm_pkvm_ext_allowed(kvm, KVM_CAP_ARM_PTRAUTH_GENERIC)) 367 373 set_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, allowed_features); 368 374 369 - if (kvm_pvm_ext_allowed(KVM_CAP_ARM_SVE)) { 375 + if (kvm_pkvm_ext_allowed(kvm, KVM_CAP_ARM_SVE)) { 370 376 set_bit(KVM_ARM_VCPU_SVE, allowed_features); 371 377 kvm->arch.flags |= host_arch_flags & BIT(KVM_ARCH_FLAG_GUEST_HAS_SVE); 372 378 }
+31 -8
arch/arm64/kvm/hyp/nvhe/sys_regs.c
··· 134 134 MAX_FEAT(ID_AA64MMFR2_EL1, UAO, IMP), 135 135 MAX_FEAT(ID_AA64MMFR2_EL1, IESB, IMP), 136 136 MAX_FEAT(ID_AA64MMFR2_EL1, AT, IMP), 137 - MAX_FEAT_ENUM(ID_AA64MMFR2_EL1, IDS, 0x18), 137 + MAX_FEAT(ID_AA64MMFR2_EL1, IDS, IMP), 138 138 MAX_FEAT(ID_AA64MMFR2_EL1, TTL, IMP), 139 139 MAX_FEAT(ID_AA64MMFR2_EL1, BBM, 2), 140 140 MAX_FEAT(ID_AA64MMFR2_EL1, E0PD, IMP), ··· 243 243 } 244 244 } 245 245 246 - /* 247 - * Inject an unknown/undefined exception to an AArch64 guest while most of its 248 - * sysregs are live. 249 - */ 250 - static void inject_undef64(struct kvm_vcpu *vcpu) 246 + static void inject_sync64(struct kvm_vcpu *vcpu, u64 esr) 251 247 { 252 - u64 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT); 253 - 254 248 *vcpu_pc(vcpu) = read_sysreg_el2(SYS_ELR); 255 249 *vcpu_cpsr(vcpu) = read_sysreg_el2(SYS_SPSR); 250 + 251 + /* 252 + * Make sure we have the latest update to VBAR_EL1, as pKVM 253 + * handles traps very early, before sysregs are resync'ed 254 + */ 256 255 __vcpu_assign_sys_reg(vcpu, VBAR_EL1, read_sysreg_el1(SYS_VBAR)); 257 256 258 257 kvm_pend_exception(vcpu, EXCEPT_AA64_EL1_SYNC); ··· 262 263 write_sysreg_el1(read_sysreg_el2(SYS_ELR), SYS_ELR); 263 264 write_sysreg_el2(*vcpu_pc(vcpu), SYS_ELR); 264 265 write_sysreg_el2(*vcpu_cpsr(vcpu), SYS_SPSR); 266 + } 267 + 268 + /* 269 + * Inject an unknown/undefined exception to an AArch64 guest while most of its 270 + * sysregs are live. 271 + */ 272 + static void inject_undef64(struct kvm_vcpu *vcpu) 273 + { 274 + inject_sync64(vcpu, (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT)); 265 275 } 266 276 267 277 static u64 read_id_reg(const struct kvm_vcpu *vcpu, ··· 345 337 p->regval = ICC_SRE_EL1_DIB | ICC_SRE_EL1_DFB | ICC_SRE_EL1_SRE; 346 338 347 339 return true; 340 + } 341 + 342 + static bool pvm_idst_access(struct kvm_vcpu *vcpu, 343 + struct sys_reg_params *p, 344 + const struct sys_reg_desc *r) 345 + { 346 + if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, IMP)) 347 + inject_sync64(vcpu, kvm_vcpu_get_esr(vcpu)); 348 + else 349 + inject_undef64(vcpu); 350 + 351 + return false; 348 352 } 349 353 350 354 /* Mark the specified system register as an AArch32 feature id register. */ ··· 489 469 490 470 HOST_HANDLED(SYS_CCSIDR_EL1), 491 471 HOST_HANDLED(SYS_CLIDR_EL1), 472 + { SYS_DESC(SYS_CCSIDR2_EL1), .access = pvm_idst_access }, 473 + { SYS_DESC(SYS_GMID_EL1), .access = pvm_idst_access }, 474 + { SYS_DESC(SYS_SMIDR_EL1), .access = pvm_idst_access }, 492 475 HOST_HANDLED(SYS_AIDR_EL1), 493 476 HOST_HANDLED(SYS_CSSELR_EL1), 494 477 HOST_HANDLED(SYS_CTR_EL0),
+38 -20
arch/arm64/kvm/hyp/pgtable.c
··· 342 342 if (!(prot & KVM_PGTABLE_PROT_R)) 343 343 return -EINVAL; 344 344 345 + if (!cpus_have_final_cap(ARM64_KVM_HVHE)) 346 + prot &= ~KVM_PGTABLE_PROT_UX; 347 + 345 348 if (prot & KVM_PGTABLE_PROT_X) { 346 349 if (prot & KVM_PGTABLE_PROT_W) 347 350 return -EINVAL; ··· 354 351 355 352 if (system_supports_bti_kernel()) 356 353 attr |= KVM_PTE_LEAF_ATTR_HI_S1_GP; 354 + } 355 + 356 + if (cpus_have_final_cap(ARM64_KVM_HVHE)) { 357 + if (!(prot & KVM_PGTABLE_PROT_PX)) 358 + attr |= KVM_PTE_LEAF_ATTR_HI_S1_PXN; 359 + if (!(prot & KVM_PGTABLE_PROT_UX)) 360 + attr |= KVM_PTE_LEAF_ATTR_HI_S1_UXN; 357 361 } else { 358 - attr |= KVM_PTE_LEAF_ATTR_HI_S1_XN; 362 + if (!(prot & KVM_PGTABLE_PROT_PX)) 363 + attr |= KVM_PTE_LEAF_ATTR_HI_S1_XN; 359 364 } 360 365 361 366 attr |= FIELD_PREP(KVM_PTE_LEAF_ATTR_LO_S1_AP, ap); ··· 384 373 if (!kvm_pte_valid(pte)) 385 374 return prot; 386 375 387 - if (!(pte & KVM_PTE_LEAF_ATTR_HI_S1_XN)) 388 - prot |= KVM_PGTABLE_PROT_X; 376 + if (cpus_have_final_cap(ARM64_KVM_HVHE)) { 377 + if (!(pte & KVM_PTE_LEAF_ATTR_HI_S1_PXN)) 378 + prot |= KVM_PGTABLE_PROT_PX; 379 + if (!(pte & KVM_PTE_LEAF_ATTR_HI_S1_UXN)) 380 + prot |= KVM_PGTABLE_PROT_UX; 381 + } else { 382 + if (!(pte & KVM_PTE_LEAF_ATTR_HI_S1_XN)) 383 + prot |= KVM_PGTABLE_PROT_PX; 384 + } 389 385 390 386 ap = FIELD_GET(KVM_PTE_LEAF_ATTR_LO_S1_AP, pte); 391 387 if (ap == KVM_PTE_LEAF_ATTR_LO_S1_AP_RO) ··· 601 583 u64 vtcr = VTCR_EL2_FLAGS; 602 584 s8 lvls; 603 585 604 - vtcr |= kvm_get_parange(mmfr0) << VTCR_EL2_PS_SHIFT; 605 - vtcr |= VTCR_EL2_T0SZ(phys_shift); 586 + vtcr |= FIELD_PREP(VTCR_EL2_PS, kvm_get_parange(mmfr0)); 587 + vtcr |= FIELD_PREP(VTCR_EL2_T0SZ, (UL(64) - phys_shift)); 606 588 /* 607 589 * Use a minimum 2 level page table to prevent splitting 608 590 * host PMD huge pages at stage2. ··· 642 624 vtcr |= VTCR_EL2_DS; 643 625 644 626 /* Set the vmid bits */ 645 - vtcr |= (get_vmid_bits(mmfr1) == 16) ? 646 - VTCR_EL2_VS_16BIT : 647 - VTCR_EL2_VS_8BIT; 627 + vtcr |= (get_vmid_bits(mmfr1) == 16) ? VTCR_EL2_VS : 0; 648 628 649 629 return vtcr; 650 - } 651 - 652 - static bool stage2_has_fwb(struct kvm_pgtable *pgt) 653 - { 654 - if (!cpus_have_final_cap(ARM64_HAS_STAGE2_FWB)) 655 - return false; 656 - 657 - return !(pgt->flags & KVM_PGTABLE_S2_NOFWB); 658 630 } 659 631 660 632 void kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, ··· 667 659 } 668 660 } 669 661 670 - #define KVM_S2_MEMATTR(pgt, attr) PAGE_S2_MEMATTR(attr, stage2_has_fwb(pgt)) 662 + #define KVM_S2_MEMATTR(pgt, attr) \ 663 + ({ \ 664 + kvm_pte_t __attr; \ 665 + \ 666 + if ((pgt)->flags & KVM_PGTABLE_S2_AS_S1) \ 667 + __attr = PAGE_S2_MEMATTR(AS_S1); \ 668 + else \ 669 + __attr = PAGE_S2_MEMATTR(attr); \ 670 + \ 671 + __attr; \ 672 + }) 671 673 672 674 static int stage2_set_xn_attr(enum kvm_pgtable_prot prot, kvm_pte_t *attr) 673 675 { ··· 886 868 * system supporting FWB as the optimization is entirely 887 869 * pointless when the unmap walker needs to perform CMOs. 888 870 */ 889 - return system_supports_tlb_range() && stage2_has_fwb(pgt); 871 + return system_supports_tlb_range() && cpus_have_final_cap(ARM64_HAS_STAGE2_FWB); 890 872 } 891 873 892 874 static void stage2_unmap_put_pte(const struct kvm_pgtable_visit_ctx *ctx, ··· 1166 1148 if (mm_ops->page_count(childp) != 1) 1167 1149 return 0; 1168 1150 } else if (stage2_pte_cacheable(pgt, ctx->old)) { 1169 - need_flush = !stage2_has_fwb(pgt); 1151 + need_flush = !cpus_have_final_cap(ARM64_HAS_STAGE2_FWB); 1170 1152 } 1171 1153 1172 1154 /* ··· 1397 1379 .arg = pgt, 1398 1380 }; 1399 1381 1400 - if (stage2_has_fwb(pgt)) 1382 + if (cpus_have_final_cap(ARM64_HAS_STAGE2_FWB)) 1401 1383 return 0; 1402 1384 1403 1385 return kvm_pgtable_walk(pgt, addr, size, &walker);
+1 -1
arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c
··· 44 44 45 45 /* Build the full address */ 46 46 fault_ipa = kvm_vcpu_get_fault_ipa(vcpu); 47 - fault_ipa |= kvm_vcpu_get_hfar(vcpu) & GENMASK(11, 0); 47 + fault_ipa |= FAR_TO_FIPA_OFFSET(kvm_vcpu_get_hfar(vcpu)); 48 48 49 49 /* If not for GICV, move on */ 50 50 if (fault_ipa < vgic->vgic_cpu_base ||
+25 -44
arch/arm64/kvm/hyp/vgic-v3-sr.c
··· 569 569 continue; 570 570 571 571 /* Group-0 interrupt, but Group-0 disabled? */ 572 - if (!(val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_ENG0_MASK)) 572 + if (!(val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_EL2_VENG0_MASK)) 573 573 continue; 574 574 575 575 /* Group-1 interrupt, but Group-1 disabled? */ 576 - if ((val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_ENG1_MASK)) 576 + if ((val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_EL2_VENG1_MASK)) 577 577 continue; 578 578 579 579 /* Not the highest priority? */ ··· 646 646 647 647 static unsigned int __vgic_v3_get_bpr0(u32 vmcr) 648 648 { 649 - return (vmcr & ICH_VMCR_BPR0_MASK) >> ICH_VMCR_BPR0_SHIFT; 649 + return FIELD_GET(ICH_VMCR_EL2_VBPR0, vmcr); 650 650 } 651 651 652 652 static unsigned int __vgic_v3_get_bpr1(u32 vmcr) 653 653 { 654 654 unsigned int bpr; 655 655 656 - if (vmcr & ICH_VMCR_CBPR_MASK) { 656 + if (vmcr & ICH_VMCR_EL2_VCBPR_MASK) { 657 657 bpr = __vgic_v3_get_bpr0(vmcr); 658 658 if (bpr < 7) 659 659 bpr++; 660 660 } else { 661 - bpr = (vmcr & ICH_VMCR_BPR1_MASK) >> ICH_VMCR_BPR1_SHIFT; 661 + bpr = FIELD_GET(ICH_VMCR_EL2_VBPR1, vmcr); 662 662 } 663 663 664 664 return bpr; ··· 758 758 if (grp != !!(lr_val & ICH_LR_GROUP)) 759 759 goto spurious; 760 760 761 - pmr = (vmcr & ICH_VMCR_PMR_MASK) >> ICH_VMCR_PMR_SHIFT; 761 + pmr = FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr); 762 762 lr_prio = (lr_val & ICH_LR_PRIORITY_MASK) >> ICH_LR_PRIORITY_SHIFT; 763 763 if (pmr <= lr_prio) 764 764 goto spurious; ··· 806 806 int lr; 807 807 808 808 /* EOImode == 0, nothing to be done here */ 809 - if (!(vmcr & ICH_VMCR_EOIM_MASK)) 809 + if (!(vmcr & ICH_VMCR_EL2_VEOIM_MASK)) 810 810 return 1; 811 811 812 812 /* No deactivate to be performed on an LPI */ ··· 849 849 } 850 850 851 851 /* EOImode == 1 and not an LPI, nothing to be done here */ 852 - if ((vmcr & ICH_VMCR_EOIM_MASK) && !(vid >= VGIC_MIN_LPI)) 852 + if ((vmcr & ICH_VMCR_EL2_VEOIM_MASK) && !(vid >= VGIC_MIN_LPI)) 853 853 return; 854 854 855 855 lr_prio = (lr_val & ICH_LR_PRIORITY_MASK) >> ICH_LR_PRIORITY_SHIFT; ··· 865 865 866 866 static void __vgic_v3_read_igrpen0(struct kvm_vcpu *vcpu, u32 vmcr, int rt) 867 867 { 868 - vcpu_set_reg(vcpu, rt, !!(vmcr & ICH_VMCR_ENG0_MASK)); 868 + vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VENG0, vmcr)); 869 869 } 870 870 871 871 static void __vgic_v3_read_igrpen1(struct kvm_vcpu *vcpu, u32 vmcr, int rt) 872 872 { 873 - vcpu_set_reg(vcpu, rt, !!(vmcr & ICH_VMCR_ENG1_MASK)); 873 + vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VENG1, vmcr)); 874 874 } 875 875 876 876 static void __vgic_v3_write_igrpen0(struct kvm_vcpu *vcpu, u32 vmcr, int rt) 877 877 { 878 878 u64 val = vcpu_get_reg(vcpu, rt); 879 879 880 - if (val & 1) 881 - vmcr |= ICH_VMCR_ENG0_MASK; 882 - else 883 - vmcr &= ~ICH_VMCR_ENG0_MASK; 880 + FIELD_MODIFY(ICH_VMCR_EL2_VENG0, &vmcr, val & 1); 884 881 885 882 __vgic_v3_write_vmcr(vmcr); 886 883 } ··· 886 889 { 887 890 u64 val = vcpu_get_reg(vcpu, rt); 888 891 889 - if (val & 1) 890 - vmcr |= ICH_VMCR_ENG1_MASK; 891 - else 892 - vmcr &= ~ICH_VMCR_ENG1_MASK; 892 + FIELD_MODIFY(ICH_VMCR_EL2_VENG1, &vmcr, val & 1); 893 893 894 894 __vgic_v3_write_vmcr(vmcr); 895 895 } ··· 910 916 if (val < bpr_min) 911 917 val = bpr_min; 912 918 913 - val <<= ICH_VMCR_BPR0_SHIFT; 914 - val &= ICH_VMCR_BPR0_MASK; 915 - vmcr &= ~ICH_VMCR_BPR0_MASK; 916 - vmcr |= val; 919 + FIELD_MODIFY(ICH_VMCR_EL2_VBPR0, &vmcr, val); 917 920 918 921 __vgic_v3_write_vmcr(vmcr); 919 922 } ··· 920 929 u64 val = vcpu_get_reg(vcpu, rt); 921 930 u8 bpr_min = __vgic_v3_bpr_min(); 922 931 923 - if (vmcr & ICH_VMCR_CBPR_MASK) 932 + if (FIELD_GET(ICH_VMCR_EL2_VCBPR, val)) 924 933 return; 925 934 926 935 /* Enforce BPR limiting */ 927 936 if (val < bpr_min) 928 937 val = bpr_min; 929 938 930 - val <<= ICH_VMCR_BPR1_SHIFT; 931 - val &= ICH_VMCR_BPR1_MASK; 932 - vmcr &= ~ICH_VMCR_BPR1_MASK; 933 - vmcr |= val; 939 + FIELD_MODIFY(ICH_VMCR_EL2_VBPR1, &vmcr, val); 934 940 935 941 __vgic_v3_write_vmcr(vmcr); 936 942 } ··· 1017 1029 1018 1030 static void __vgic_v3_read_pmr(struct kvm_vcpu *vcpu, u32 vmcr, int rt) 1019 1031 { 1020 - vmcr &= ICH_VMCR_PMR_MASK; 1021 - vmcr >>= ICH_VMCR_PMR_SHIFT; 1022 - vcpu_set_reg(vcpu, rt, vmcr); 1032 + vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr)); 1023 1033 } 1024 1034 1025 1035 static void __vgic_v3_write_pmr(struct kvm_vcpu *vcpu, u32 vmcr, int rt) 1026 1036 { 1027 1037 u32 val = vcpu_get_reg(vcpu, rt); 1028 1038 1029 - val <<= ICH_VMCR_PMR_SHIFT; 1030 - val &= ICH_VMCR_PMR_MASK; 1031 - vmcr &= ~ICH_VMCR_PMR_MASK; 1032 - vmcr |= val; 1039 + FIELD_MODIFY(ICH_VMCR_EL2_VPMR, &vmcr, val); 1033 1040 1034 1041 write_gicreg(vmcr, ICH_VMCR_EL2); 1035 1042 } ··· 1047 1064 /* A3V */ 1048 1065 val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT; 1049 1066 /* EOImode */ 1050 - val |= ((vmcr & ICH_VMCR_EOIM_MASK) >> ICH_VMCR_EOIM_SHIFT) << ICC_CTLR_EL1_EOImode_SHIFT; 1067 + val |= FIELD_PREP(ICC_CTLR_EL1_EOImode_MASK, 1068 + FIELD_GET(ICH_VMCR_EL2_VEOIM, vmcr)); 1051 1069 /* CBPR */ 1052 - val |= (vmcr & ICH_VMCR_CBPR_MASK) >> ICH_VMCR_CBPR_SHIFT; 1070 + val |= FIELD_PREP(ICC_CTLR_EL1_CBPR_MASK, 1071 + FIELD_GET(ICH_VMCR_EL2_VCBPR, vmcr)); 1053 1072 1054 1073 vcpu_set_reg(vcpu, rt, val); 1055 1074 } ··· 1060 1075 { 1061 1076 u32 val = vcpu_get_reg(vcpu, rt); 1062 1077 1063 - if (val & ICC_CTLR_EL1_CBPR_MASK) 1064 - vmcr |= ICH_VMCR_CBPR_MASK; 1065 - else 1066 - vmcr &= ~ICH_VMCR_CBPR_MASK; 1078 + FIELD_MODIFY(ICH_VMCR_EL2_VCBPR, &vmcr, 1079 + FIELD_GET(ICC_CTLR_EL1_CBPR_MASK, val)); 1067 1080 1068 - if (val & ICC_CTLR_EL1_EOImode_MASK) 1069 - vmcr |= ICH_VMCR_EOIM_MASK; 1070 - else 1071 - vmcr &= ~ICH_VMCR_EOIM_MASK; 1081 + FIELD_MODIFY(ICH_VMCR_EL2_VEOIM, &vmcr, 1082 + FIELD_GET(ICC_CTLR_EL1_EOImode_MASK, val)); 1072 1083 1073 1084 write_gicreg(vmcr, ICH_VMCR_EL2); 1074 1085 }
+1 -1
arch/arm64/kvm/hyp/vhe/sysreg-sr.c
··· 205 205 206 206 /* 207 207 * When running a normal EL1 guest, we only load a new vcpu 208 - * after a context switch, which imvolves a DSB, so all 208 + * after a context switch, which involves a DSB, so all 209 209 * speculative EL1&0 walks will have already completed. 210 210 * If running NV, the vcpu may transition between vEL1 and 211 211 * vEL2 without a context switch, so make sure we complete
+42 -4
arch/arm64/kvm/inject_fault.c
··· 162 162 vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu)); 163 163 } 164 164 165 + void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr) 166 + { 167 + pend_sync_exception(vcpu); 168 + vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu)); 169 + } 170 + 165 171 static void inject_undef64(struct kvm_vcpu *vcpu) 166 172 { 167 173 u64 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT); 168 - 169 - pend_sync_exception(vcpu); 170 174 171 175 /* 172 176 * Build an unknown exception, depending on the instruction ··· 179 175 if (kvm_vcpu_trap_il_is32bit(vcpu)) 180 176 esr |= ESR_ELx_IL; 181 177 182 - vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu)); 178 + kvm_inject_sync(vcpu, esr); 183 179 } 184 180 185 181 #define DFSR_FSC_EXTABT_LPAE 0x10 ··· 257 253 return 1; 258 254 } 259 255 256 + static int kvm_inject_nested_excl_atomic(struct kvm_vcpu *vcpu, u64 addr) 257 + { 258 + u64 esr = FIELD_PREP(ESR_ELx_EC_MASK, ESR_ELx_EC_DABT_LOW) | 259 + FIELD_PREP(ESR_ELx_FSC, ESR_ELx_FSC_EXCL_ATOMIC) | 260 + ESR_ELx_IL; 261 + 262 + vcpu_write_sys_reg(vcpu, addr, FAR_EL2); 263 + return kvm_inject_nested_sync(vcpu, esr); 264 + } 265 + 266 + /** 267 + * kvm_inject_dabt_excl_atomic - inject a data abort for unsupported exclusive 268 + * or atomic access 269 + * @vcpu: The VCPU to receive the data abort 270 + * @addr: The address to report in the DFAR 271 + * 272 + * It is assumed that this code is called from the VCPU thread and that the 273 + * VCPU therefore is not currently executing guest code. 274 + */ 275 + int kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr) 276 + { 277 + u64 esr; 278 + 279 + if (is_nested_ctxt(vcpu) && (vcpu_read_sys_reg(vcpu, HCR_EL2) & HCR_VM)) 280 + return kvm_inject_nested_excl_atomic(vcpu, addr); 281 + 282 + __kvm_inject_sea(vcpu, false, addr); 283 + esr = vcpu_read_sys_reg(vcpu, exception_esr_elx(vcpu)); 284 + esr &= ~ESR_ELx_FSC; 285 + esr |= ESR_ELx_FSC_EXCL_ATOMIC; 286 + vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu)); 287 + return 1; 288 + } 289 + 260 290 void kvm_inject_size_fault(struct kvm_vcpu *vcpu) 261 291 { 262 292 unsigned long addr, esr; 263 293 264 294 addr = kvm_vcpu_get_fault_ipa(vcpu); 265 - addr |= kvm_vcpu_get_hfar(vcpu) & GENMASK(11, 0); 295 + addr |= FAR_TO_FIPA_OFFSET(kvm_vcpu_get_hfar(vcpu)); 266 296 267 297 __kvm_inject_sea(vcpu, kvm_vcpu_trap_is_iabt(vcpu), addr); 268 298
+26 -1
arch/arm64/kvm/mmio.c
··· 159 159 bool is_write; 160 160 int len; 161 161 u8 data_buf[8]; 162 + u64 esr; 163 + 164 + esr = kvm_vcpu_get_esr(vcpu); 162 165 163 166 /* 164 167 * No valid syndrome? Ask userspace for help if it has ··· 171 168 * though, so directly deliver an exception to the guest. 172 169 */ 173 170 if (!kvm_vcpu_dabt_isvalid(vcpu)) { 174 - trace_kvm_mmio_nisv(*vcpu_pc(vcpu), kvm_vcpu_get_esr(vcpu), 171 + trace_kvm_mmio_nisv(*vcpu_pc(vcpu), esr, 175 172 kvm_vcpu_get_hfar(vcpu), fault_ipa); 176 173 177 174 if (vcpu_is_protected(vcpu)) ··· 186 183 } 187 184 188 185 return -ENOSYS; 186 + } 187 + 188 + /* 189 + * When (DFSC == 0b00xxxx || DFSC == 0b10101x) && DFSC != 0b0000xx 190 + * ESR_EL2[12:11] describe the Load/Store Type. This allows us to 191 + * punt the LD64B/ST64B/ST64BV/ST64BV0 instructions to userspace, 192 + * which will have to provide a full emulation of these 4 193 + * instructions. No, we don't expect this do be fast. 194 + * 195 + * We rely on traps being set if the corresponding features are not 196 + * enabled, so if we get here, userspace has promised us to handle 197 + * it already. 198 + */ 199 + switch (kvm_vcpu_trap_get_fault(vcpu)) { 200 + case 0b000100 ... 0b001111: 201 + case 0b101010 ... 0b101011: 202 + if (FIELD_GET(GENMASK(12, 11), esr)) { 203 + run->exit_reason = KVM_EXIT_ARM_LDST64B; 204 + run->arm_nisv.esr_iss = esr & ~(u64)ESR_ELx_FSC; 205 + run->arm_nisv.fault_ipa = fault_ipa; 206 + return 0; 207 + } 189 208 } 190 209 191 210 /*
+19 -27
arch/arm64/kvm/mmu.c
··· 1843 1843 return ret; 1844 1844 } 1845 1845 1846 + /* 1847 + * Guest performs atomic/exclusive operations on memory with unsupported 1848 + * attributes (e.g. ld64b/st64b on normal memory when no FEAT_LS64WB) 1849 + * and trigger the exception here. Since the memslot is valid, inject 1850 + * the fault back to the guest. 1851 + */ 1852 + if (esr_fsc_is_excl_atomic_fault(kvm_vcpu_get_esr(vcpu))) { 1853 + kvm_inject_dabt_excl_atomic(vcpu, kvm_vcpu_get_hfar(vcpu)); 1854 + return 1; 1855 + } 1856 + 1846 1857 if (nested) 1847 1858 adjust_nested_fault_perms(nested, &prot, &writable); 1848 1859 ··· 2079 2068 2080 2069 /* Falls between the IPA range and the PARange? */ 2081 2070 if (fault_ipa >= BIT_ULL(VTCR_EL2_IPA(vcpu->arch.hw_mmu->vtcr))) { 2082 - fault_ipa |= kvm_vcpu_get_hfar(vcpu) & GENMASK(11, 0); 2071 + fault_ipa |= FAR_TO_FIPA_OFFSET(kvm_vcpu_get_hfar(vcpu)); 2083 2072 2084 2073 return kvm_inject_sea(vcpu, is_iabt, fault_ipa); 2085 2074 } ··· 2091 2080 /* Check the stage-2 fault is trans. fault or write fault */ 2092 2081 if (!esr_fsc_is_translation_fault(esr) && 2093 2082 !esr_fsc_is_permission_fault(esr) && 2094 - !esr_fsc_is_access_flag_fault(esr)) { 2083 + !esr_fsc_is_access_flag_fault(esr) && 2084 + !esr_fsc_is_excl_atomic_fault(esr)) { 2095 2085 kvm_err("Unsupported FSC: EC=%#x xFSC=%#lx ESR_EL2=%#lx\n", 2096 2086 kvm_vcpu_trap_get_class(vcpu), 2097 2087 (unsigned long)kvm_vcpu_trap_get_fault(vcpu), ··· 2185 2173 * faulting VA. This is always 12 bits, irrespective 2186 2174 * of the page size. 2187 2175 */ 2188 - ipa |= kvm_vcpu_get_hfar(vcpu) & GENMASK(11, 0); 2176 + ipa |= FAR_TO_FIPA_OFFSET(kvm_vcpu_get_hfar(vcpu)); 2189 2177 ret = io_mem_abort(vcpu, ipa); 2190 2178 goto out_unlock; 2191 2179 } ··· 2294 2282 .virt_to_phys = kvm_host_pa, 2295 2283 }; 2296 2284 2297 - int __init kvm_mmu_init(u32 *hyp_va_bits) 2285 + int __init kvm_mmu_init(u32 hyp_va_bits) 2298 2286 { 2299 2287 int err; 2300 - u32 idmap_bits; 2301 - u32 kernel_bits; 2302 2288 2303 2289 hyp_idmap_start = __pa_symbol(__hyp_idmap_text_start); 2304 2290 hyp_idmap_start = ALIGN_DOWN(hyp_idmap_start, PAGE_SIZE); ··· 2310 2300 */ 2311 2301 BUG_ON((hyp_idmap_start ^ (hyp_idmap_end - 1)) & PAGE_MASK); 2312 2302 2313 - /* 2314 - * The ID map is always configured for 48 bits of translation, which 2315 - * may be fewer than the number of VA bits used by the regular kernel 2316 - * stage 1, when VA_BITS=52. 2317 - * 2318 - * At EL2, there is only one TTBR register, and we can't switch between 2319 - * translation tables *and* update TCR_EL2.T0SZ at the same time. Bottom 2320 - * line: we need to use the extended range with *both* our translation 2321 - * tables. 2322 - * 2323 - * So use the maximum of the idmap VA bits and the regular kernel stage 2324 - * 1 VA bits to assure that the hypervisor can both ID map its code page 2325 - * and map any kernel memory. 2326 - */ 2327 - idmap_bits = IDMAP_VA_BITS; 2328 - kernel_bits = vabits_actual; 2329 - *hyp_va_bits = max(idmap_bits, kernel_bits); 2330 - 2331 - kvm_debug("Using %u-bit virtual addresses at EL2\n", *hyp_va_bits); 2303 + kvm_debug("Using %u-bit virtual addresses at EL2\n", hyp_va_bits); 2332 2304 kvm_debug("IDMAP page: %lx\n", hyp_idmap_start); 2333 2305 kvm_debug("HYP VA range: %lx:%lx\n", 2334 2306 kern_hyp_va(PAGE_OFFSET), ··· 2335 2343 goto out; 2336 2344 } 2337 2345 2338 - err = kvm_pgtable_hyp_init(hyp_pgtable, *hyp_va_bits, &kvm_hyp_mm_ops); 2346 + err = kvm_pgtable_hyp_init(hyp_pgtable, hyp_va_bits, &kvm_hyp_mm_ops); 2339 2347 if (err) 2340 2348 goto out_free_pgtable; 2341 2349 ··· 2344 2352 goto out_destroy_pgtable; 2345 2353 2346 2354 io_map_base = hyp_idmap_start; 2347 - __hyp_va_bits = *hyp_va_bits; 2355 + __hyp_va_bits = hyp_va_bits; 2348 2356 return 0; 2349 2357 2350 2358 out_destroy_pgtable:
+88 -84
arch/arm64/kvm/nested.c
··· 377 377 { 378 378 wi->t0sz = vtcr & TCR_EL2_T0SZ_MASK; 379 379 380 - switch (vtcr & VTCR_EL2_TG0_MASK) { 380 + switch (FIELD_GET(VTCR_EL2_TG0_MASK, vtcr)) { 381 381 case VTCR_EL2_TG0_4K: 382 382 wi->pgshift = 12; break; 383 383 case VTCR_EL2_TG0_16K: ··· 513 513 514 514 lockdep_assert_held_write(&kvm_s2_mmu_to_kvm(mmu)->mmu_lock); 515 515 516 - switch (vtcr & VTCR_EL2_TG0_MASK) { 516 + switch (FIELD_GET(VTCR_EL2_TG0_MASK, vtcr)) { 517 517 case VTCR_EL2_TG0_4K: 518 518 ttl = (TLBI_TTL_TG_4K << 2); 519 519 break; ··· 530 530 531 531 again: 532 532 /* Iteratively compute the block sizes for a particular granule size */ 533 - switch (vtcr & VTCR_EL2_TG0_MASK) { 533 + switch (FIELD_GET(VTCR_EL2_TG0_MASK, vtcr)) { 534 534 case VTCR_EL2_TG0_4K: 535 535 if (sz < SZ_4K) sz = SZ_4K; 536 536 else if (sz < SZ_2M) sz = SZ_2M; ··· 593 593 594 594 if (!max_size) { 595 595 /* Compute the maximum extent of the invalidation */ 596 - switch (mmu->tlb_vtcr & VTCR_EL2_TG0_MASK) { 596 + switch (FIELD_GET(VTCR_EL2_TG0_MASK, mmu->tlb_vtcr)) { 597 597 case VTCR_EL2_TG0_4K: 598 598 max_size = SZ_1G; 599 599 break; ··· 1101 1101 1102 1102 lockdep_assert_held_write(&kvm->mmu_lock); 1103 1103 1104 + if (!kvm->arch.nested_mmus_size) 1105 + return; 1106 + 1104 1107 for (i = 0; i < kvm->arch.nested_mmus_size; i++) { 1105 1108 struct kvm_s2_mmu *mmu = &kvm->arch.nested_mmus[i]; 1106 1109 ··· 1119 1116 int i; 1120 1117 1121 1118 lockdep_assert_held_write(&kvm->mmu_lock); 1119 + 1120 + if (!kvm->arch.nested_mmus_size) 1121 + return; 1122 1122 1123 1123 for (i = 0; i < kvm->arch.nested_mmus_size; i++) { 1124 1124 struct kvm_s2_mmu *mmu = &kvm->arch.nested_mmus[i]; ··· 1139 1133 1140 1134 lockdep_assert_held_write(&kvm->mmu_lock); 1141 1135 1136 + if (!kvm->arch.nested_mmus_size) 1137 + return; 1138 + 1142 1139 for (i = 0; i < kvm->arch.nested_mmus_size; i++) { 1143 1140 struct kvm_s2_mmu *mmu = &kvm->arch.nested_mmus[i]; 1144 1141 ··· 1153 1144 void kvm_arch_flush_shadow_all(struct kvm *kvm) 1154 1145 { 1155 1146 int i; 1147 + 1148 + if (!kvm->arch.nested_mmus_size) 1149 + return; 1156 1150 1157 1151 for (i = 0; i < kvm->arch.nested_mmus_size; i++) { 1158 1152 struct kvm_s2_mmu *mmu = &kvm->arch.nested_mmus[i]; ··· 1517 1505 u64 orig_val = val; 1518 1506 1519 1507 switch (reg) { 1520 - case SYS_ID_AA64ISAR0_EL1: 1521 - /* Support everything but TME */ 1522 - val &= ~ID_AA64ISAR0_EL1_TME; 1523 - break; 1524 - 1525 1508 case SYS_ID_AA64ISAR1_EL1: 1526 1509 /* Support everything but LS64 and Spec Invalidation */ 1527 1510 val &= ~(ID_AA64ISAR1_EL1_LS64 | ··· 1676 1669 u64 kvm_vcpu_apply_reg_masks(const struct kvm_vcpu *vcpu, 1677 1670 enum vcpu_sysreg sr, u64 v) 1678 1671 { 1679 - struct kvm_sysreg_masks *masks; 1672 + struct resx resx; 1680 1673 1681 - masks = vcpu->kvm->arch.sysreg_masks; 1682 - 1683 - if (masks) { 1684 - sr -= __SANITISED_REG_START__; 1685 - 1686 - v &= ~masks->mask[sr].res0; 1687 - v |= masks->mask[sr].res1; 1688 - } 1674 + resx = kvm_get_sysreg_resx(vcpu->kvm, sr); 1675 + v &= ~resx.res0; 1676 + v |= resx.res1; 1689 1677 1690 1678 return v; 1691 1679 } 1692 1680 1693 - static __always_inline void set_sysreg_masks(struct kvm *kvm, int sr, u64 res0, u64 res1) 1681 + static __always_inline void set_sysreg_masks(struct kvm *kvm, int sr, struct resx resx) 1694 1682 { 1695 - int i = sr - __SANITISED_REG_START__; 1696 - 1697 1683 BUILD_BUG_ON(!__builtin_constant_p(sr)); 1698 1684 BUILD_BUG_ON(sr < __SANITISED_REG_START__); 1699 1685 BUILD_BUG_ON(sr >= NR_SYS_REGS); 1700 1686 1701 - kvm->arch.sysreg_masks->mask[i].res0 = res0; 1702 - kvm->arch.sysreg_masks->mask[i].res1 = res1; 1687 + kvm_set_sysreg_resx(kvm, sr, resx); 1703 1688 } 1704 1689 1705 1690 int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu) 1706 1691 { 1707 1692 struct kvm *kvm = vcpu->kvm; 1708 - u64 res0, res1; 1693 + struct resx resx; 1709 1694 1710 1695 lockdep_assert_held(&kvm->arch.config_lock); 1711 1696 ··· 1710 1711 return -ENOMEM; 1711 1712 1712 1713 /* VTTBR_EL2 */ 1713 - res0 = res1 = 0; 1714 + resx = (typeof(resx)){}; 1714 1715 if (!kvm_has_feat_enum(kvm, ID_AA64MMFR1_EL1, VMIDBits, 16)) 1715 - res0 |= GENMASK(63, 56); 1716 + resx.res0 |= GENMASK(63, 56); 1716 1717 if (!kvm_has_feat(kvm, ID_AA64MMFR2_EL1, CnP, IMP)) 1717 - res0 |= VTTBR_CNP_BIT; 1718 - set_sysreg_masks(kvm, VTTBR_EL2, res0, res1); 1718 + resx.res0 |= VTTBR_CNP_BIT; 1719 + set_sysreg_masks(kvm, VTTBR_EL2, resx); 1719 1720 1720 1721 /* VTCR_EL2 */ 1721 - res0 = GENMASK(63, 32) | GENMASK(30, 20); 1722 - res1 = BIT(31); 1723 - set_sysreg_masks(kvm, VTCR_EL2, res0, res1); 1722 + resx = get_reg_fixed_bits(kvm, VTCR_EL2); 1723 + set_sysreg_masks(kvm, VTCR_EL2, resx); 1724 1724 1725 1725 /* VMPIDR_EL2 */ 1726 - res0 = GENMASK(63, 40) | GENMASK(30, 24); 1727 - res1 = BIT(31); 1728 - set_sysreg_masks(kvm, VMPIDR_EL2, res0, res1); 1726 + resx.res0 = GENMASK(63, 40) | GENMASK(30, 24); 1727 + resx.res1 = BIT(31); 1728 + set_sysreg_masks(kvm, VMPIDR_EL2, resx); 1729 1729 1730 1730 /* HCR_EL2 */ 1731 - get_reg_fixed_bits(kvm, HCR_EL2, &res0, &res1); 1732 - set_sysreg_masks(kvm, HCR_EL2, res0, res1); 1731 + resx = get_reg_fixed_bits(kvm, HCR_EL2); 1732 + set_sysreg_masks(kvm, HCR_EL2, resx); 1733 1733 1734 1734 /* HCRX_EL2 */ 1735 - get_reg_fixed_bits(kvm, HCRX_EL2, &res0, &res1); 1736 - set_sysreg_masks(kvm, HCRX_EL2, res0, res1); 1735 + resx = get_reg_fixed_bits(kvm, HCRX_EL2); 1736 + set_sysreg_masks(kvm, HCRX_EL2, resx); 1737 1737 1738 1738 /* HFG[RW]TR_EL2 */ 1739 - get_reg_fixed_bits(kvm, HFGRTR_EL2, &res0, &res1); 1740 - set_sysreg_masks(kvm, HFGRTR_EL2, res0, res1); 1741 - get_reg_fixed_bits(kvm, HFGWTR_EL2, &res0, &res1); 1742 - set_sysreg_masks(kvm, HFGWTR_EL2, res0, res1); 1739 + resx = get_reg_fixed_bits(kvm, HFGRTR_EL2); 1740 + set_sysreg_masks(kvm, HFGRTR_EL2, resx); 1741 + resx = get_reg_fixed_bits(kvm, HFGWTR_EL2); 1742 + set_sysreg_masks(kvm, HFGWTR_EL2, resx); 1743 1743 1744 1744 /* HDFG[RW]TR_EL2 */ 1745 - get_reg_fixed_bits(kvm, HDFGRTR_EL2, &res0, &res1); 1746 - set_sysreg_masks(kvm, HDFGRTR_EL2, res0, res1); 1747 - get_reg_fixed_bits(kvm, HDFGWTR_EL2, &res0, &res1); 1748 - set_sysreg_masks(kvm, HDFGWTR_EL2, res0, res1); 1745 + resx = get_reg_fixed_bits(kvm, HDFGRTR_EL2); 1746 + set_sysreg_masks(kvm, HDFGRTR_EL2, resx); 1747 + resx = get_reg_fixed_bits(kvm, HDFGWTR_EL2); 1748 + set_sysreg_masks(kvm, HDFGWTR_EL2, resx); 1749 1749 1750 1750 /* HFGITR_EL2 */ 1751 - get_reg_fixed_bits(kvm, HFGITR_EL2, &res0, &res1); 1752 - set_sysreg_masks(kvm, HFGITR_EL2, res0, res1); 1751 + resx = get_reg_fixed_bits(kvm, HFGITR_EL2); 1752 + set_sysreg_masks(kvm, HFGITR_EL2, resx); 1753 1753 1754 1754 /* HAFGRTR_EL2 - not a lot to see here */ 1755 - get_reg_fixed_bits(kvm, HAFGRTR_EL2, &res0, &res1); 1756 - set_sysreg_masks(kvm, HAFGRTR_EL2, res0, res1); 1755 + resx = get_reg_fixed_bits(kvm, HAFGRTR_EL2); 1756 + set_sysreg_masks(kvm, HAFGRTR_EL2, resx); 1757 1757 1758 1758 /* HFG[RW]TR2_EL2 */ 1759 - get_reg_fixed_bits(kvm, HFGRTR2_EL2, &res0, &res1); 1760 - set_sysreg_masks(kvm, HFGRTR2_EL2, res0, res1); 1761 - get_reg_fixed_bits(kvm, HFGWTR2_EL2, &res0, &res1); 1762 - set_sysreg_masks(kvm, HFGWTR2_EL2, res0, res1); 1759 + resx = get_reg_fixed_bits(kvm, HFGRTR2_EL2); 1760 + set_sysreg_masks(kvm, HFGRTR2_EL2, resx); 1761 + resx = get_reg_fixed_bits(kvm, HFGWTR2_EL2); 1762 + set_sysreg_masks(kvm, HFGWTR2_EL2, resx); 1763 1763 1764 1764 /* HDFG[RW]TR2_EL2 */ 1765 - get_reg_fixed_bits(kvm, HDFGRTR2_EL2, &res0, &res1); 1766 - set_sysreg_masks(kvm, HDFGRTR2_EL2, res0, res1); 1767 - get_reg_fixed_bits(kvm, HDFGWTR2_EL2, &res0, &res1); 1768 - set_sysreg_masks(kvm, HDFGWTR2_EL2, res0, res1); 1765 + resx = get_reg_fixed_bits(kvm, HDFGRTR2_EL2); 1766 + set_sysreg_masks(kvm, HDFGRTR2_EL2, resx); 1767 + resx = get_reg_fixed_bits(kvm, HDFGWTR2_EL2); 1768 + set_sysreg_masks(kvm, HDFGWTR2_EL2, resx); 1769 1769 1770 1770 /* HFGITR2_EL2 */ 1771 - get_reg_fixed_bits(kvm, HFGITR2_EL2, &res0, &res1); 1772 - set_sysreg_masks(kvm, HFGITR2_EL2, res0, res1); 1771 + resx = get_reg_fixed_bits(kvm, HFGITR2_EL2); 1772 + set_sysreg_masks(kvm, HFGITR2_EL2, resx); 1773 1773 1774 1774 /* TCR2_EL2 */ 1775 - get_reg_fixed_bits(kvm, TCR2_EL2, &res0, &res1); 1776 - set_sysreg_masks(kvm, TCR2_EL2, res0, res1); 1775 + resx = get_reg_fixed_bits(kvm, TCR2_EL2); 1776 + set_sysreg_masks(kvm, TCR2_EL2, resx); 1777 1777 1778 1778 /* SCTLR_EL1 */ 1779 - get_reg_fixed_bits(kvm, SCTLR_EL1, &res0, &res1); 1780 - set_sysreg_masks(kvm, SCTLR_EL1, res0, res1); 1779 + resx = get_reg_fixed_bits(kvm, SCTLR_EL1); 1780 + set_sysreg_masks(kvm, SCTLR_EL1, resx); 1781 + 1782 + /* SCTLR_EL2 */ 1783 + resx = get_reg_fixed_bits(kvm, SCTLR_EL2); 1784 + set_sysreg_masks(kvm, SCTLR_EL2, resx); 1781 1785 1782 1786 /* SCTLR2_ELx */ 1783 - get_reg_fixed_bits(kvm, SCTLR2_EL1, &res0, &res1); 1784 - set_sysreg_masks(kvm, SCTLR2_EL1, res0, res1); 1785 - get_reg_fixed_bits(kvm, SCTLR2_EL2, &res0, &res1); 1786 - set_sysreg_masks(kvm, SCTLR2_EL2, res0, res1); 1787 + resx = get_reg_fixed_bits(kvm, SCTLR2_EL1); 1788 + set_sysreg_masks(kvm, SCTLR2_EL1, resx); 1789 + resx = get_reg_fixed_bits(kvm, SCTLR2_EL2); 1790 + set_sysreg_masks(kvm, SCTLR2_EL2, resx); 1787 1791 1788 1792 /* MDCR_EL2 */ 1789 - get_reg_fixed_bits(kvm, MDCR_EL2, &res0, &res1); 1790 - set_sysreg_masks(kvm, MDCR_EL2, res0, res1); 1793 + resx = get_reg_fixed_bits(kvm, MDCR_EL2); 1794 + set_sysreg_masks(kvm, MDCR_EL2, resx); 1791 1795 1792 1796 /* CNTHCTL_EL2 */ 1793 - res0 = GENMASK(63, 20); 1794 - res1 = 0; 1797 + resx.res0 = GENMASK(63, 20); 1798 + resx.res1 = 0; 1795 1799 if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RME, IMP)) 1796 - res0 |= CNTHCTL_CNTPMASK | CNTHCTL_CNTVMASK; 1800 + resx.res0 |= CNTHCTL_CNTPMASK | CNTHCTL_CNTVMASK; 1797 1801 if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, CNTPOFF)) { 1798 - res0 |= CNTHCTL_ECV; 1802 + resx.res0 |= CNTHCTL_ECV; 1799 1803 if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, IMP)) 1800 - res0 |= (CNTHCTL_EL1TVT | CNTHCTL_EL1TVCT | 1801 - CNTHCTL_EL1NVPCT | CNTHCTL_EL1NVVCT); 1804 + resx.res0 |= (CNTHCTL_EL1TVT | CNTHCTL_EL1TVCT | 1805 + CNTHCTL_EL1NVPCT | CNTHCTL_EL1NVVCT); 1802 1806 } 1803 1807 if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, VH, IMP)) 1804 - res0 |= GENMASK(11, 8); 1805 - set_sysreg_masks(kvm, CNTHCTL_EL2, res0, res1); 1808 + resx.res0 |= GENMASK(11, 8); 1809 + set_sysreg_masks(kvm, CNTHCTL_EL2, resx); 1806 1810 1807 1811 /* ICH_HCR_EL2 */ 1808 - res0 = ICH_HCR_EL2_RES0; 1809 - res1 = ICH_HCR_EL2_RES1; 1812 + resx.res0 = ICH_HCR_EL2_RES0; 1813 + resx.res1 = ICH_HCR_EL2_RES1; 1810 1814 if (!(kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_EL2_TDS)) 1811 - res0 |= ICH_HCR_EL2_TDIR; 1815 + resx.res0 |= ICH_HCR_EL2_TDIR; 1812 1816 /* No GICv4 is presented to the guest */ 1813 - res0 |= ICH_HCR_EL2_DVIM | ICH_HCR_EL2_vSGIEOICount; 1814 - set_sysreg_masks(kvm, ICH_HCR_EL2, res0, res1); 1817 + resx.res0 |= ICH_HCR_EL2_DVIM | ICH_HCR_EL2_vSGIEOICount; 1818 + set_sysreg_masks(kvm, ICH_HCR_EL2, resx); 1815 1819 1816 1820 /* VNCR_EL2 */ 1817 - set_sysreg_masks(kvm, VNCR_EL2, VNCR_EL2_RES0, VNCR_EL2_RES1); 1821 + resx.res0 = VNCR_EL2_RES0; 1822 + resx.res1 = VNCR_EL2_RES1; 1823 + set_sysreg_masks(kvm, VNCR_EL2, resx); 1818 1824 1819 1825 out: 1820 1826 for (enum vcpu_sysreg sr = __SANITISED_REG_START__; sr < NR_SYS_REGS; sr++)
+78 -44
arch/arm64/kvm/sys_regs.c
··· 3414 3414 { SYS_DESC(SYS_CCSIDR_EL1), access_ccsidr }, 3415 3415 { SYS_DESC(SYS_CLIDR_EL1), access_clidr, reset_clidr, CLIDR_EL1, 3416 3416 .set_user = set_clidr, .val = ~CLIDR_EL1_RES0 }, 3417 - { SYS_DESC(SYS_CCSIDR2_EL1), undef_access }, 3418 - { SYS_DESC(SYS_SMIDR_EL1), undef_access }, 3419 3417 IMPLEMENTATION_ID(AIDR_EL1, GENMASK_ULL(63, 0)), 3420 3418 { SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 }, 3421 3419 ID_FILTERED(CTR_EL0, ctr_el0, ··· 4993 4995 return false; 4994 4996 } 4995 4997 4996 - static const struct sys_reg_desc *idregs_debug_find(struct kvm *kvm, u8 pos) 4998 + static const struct sys_reg_desc *idregs_debug_find(struct kvm *kvm, loff_t pos) 4997 4999 { 4998 5000 unsigned long i, idreg_idx = 0; 4999 5001 ··· 5003 5005 if (!is_vm_ftr_id_reg(reg_to_encoding(r))) 5004 5006 continue; 5005 5007 5006 - if (idreg_idx == pos) 5008 + if (idreg_idx++ == pos) 5007 5009 return r; 5008 - 5009 - idreg_idx++; 5010 5010 } 5011 5011 5012 5012 return NULL; ··· 5013 5017 static void *idregs_debug_start(struct seq_file *s, loff_t *pos) 5014 5018 { 5015 5019 struct kvm *kvm = s->private; 5016 - u8 *iter; 5017 5020 5018 - mutex_lock(&kvm->arch.config_lock); 5021 + if (!test_bit(KVM_ARCH_FLAG_ID_REGS_INITIALIZED, &kvm->arch.flags)) 5022 + return NULL; 5019 5023 5020 - iter = &kvm->arch.idreg_debugfs_iter; 5021 - if (test_bit(KVM_ARCH_FLAG_ID_REGS_INITIALIZED, &kvm->arch.flags) && 5022 - *iter == (u8)~0) { 5023 - *iter = *pos; 5024 - if (!idregs_debug_find(kvm, *iter)) 5025 - iter = NULL; 5026 - } else { 5027 - iter = ERR_PTR(-EBUSY); 5028 - } 5029 - 5030 - mutex_unlock(&kvm->arch.config_lock); 5031 - 5032 - return iter; 5024 + return (void *)idregs_debug_find(kvm, *pos); 5033 5025 } 5034 5026 5035 5027 static void *idregs_debug_next(struct seq_file *s, void *v, loff_t *pos) ··· 5026 5042 5027 5043 (*pos)++; 5028 5044 5029 - if (idregs_debug_find(kvm, kvm->arch.idreg_debugfs_iter + 1)) { 5030 - kvm->arch.idreg_debugfs_iter++; 5031 - 5032 - return &kvm->arch.idreg_debugfs_iter; 5033 - } 5034 - 5035 - return NULL; 5045 + return (void *)idregs_debug_find(kvm, *pos); 5036 5046 } 5037 5047 5038 5048 static void idregs_debug_stop(struct seq_file *s, void *v) 5039 5049 { 5040 - struct kvm *kvm = s->private; 5041 - 5042 - if (IS_ERR(v)) 5043 - return; 5044 - 5045 - mutex_lock(&kvm->arch.config_lock); 5046 - 5047 - kvm->arch.idreg_debugfs_iter = ~0; 5048 - 5049 - mutex_unlock(&kvm->arch.config_lock); 5050 5050 } 5051 5051 5052 5052 static int idregs_debug_show(struct seq_file *s, void *v) 5053 5053 { 5054 - const struct sys_reg_desc *desc; 5054 + const struct sys_reg_desc *desc = v; 5055 5055 struct kvm *kvm = s->private; 5056 5056 5057 - desc = idregs_debug_find(kvm, kvm->arch.idreg_debugfs_iter); 5058 - 5059 - if (!desc->name) 5057 + if (!desc) 5060 5058 return 0; 5061 5059 5062 5060 seq_printf(s, "%20s:\t%016llx\n", ··· 5056 5090 5057 5091 DEFINE_SEQ_ATTRIBUTE(idregs_debug); 5058 5092 5093 + static const struct sys_reg_desc *sr_resx_find(struct kvm *kvm, loff_t pos) 5094 + { 5095 + unsigned long i, sr_idx = 0; 5096 + 5097 + for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) { 5098 + const struct sys_reg_desc *r = &sys_reg_descs[i]; 5099 + 5100 + if (r->reg < __SANITISED_REG_START__) 5101 + continue; 5102 + 5103 + if (sr_idx++ == pos) 5104 + return r; 5105 + } 5106 + 5107 + return NULL; 5108 + } 5109 + 5110 + static void *sr_resx_start(struct seq_file *s, loff_t *pos) 5111 + { 5112 + struct kvm *kvm = s->private; 5113 + 5114 + if (!kvm->arch.sysreg_masks) 5115 + return NULL; 5116 + 5117 + return (void *)sr_resx_find(kvm, *pos); 5118 + } 5119 + 5120 + static void *sr_resx_next(struct seq_file *s, void *v, loff_t *pos) 5121 + { 5122 + struct kvm *kvm = s->private; 5123 + 5124 + (*pos)++; 5125 + 5126 + return (void *)sr_resx_find(kvm, *pos); 5127 + } 5128 + 5129 + static void sr_resx_stop(struct seq_file *s, void *v) 5130 + { 5131 + } 5132 + 5133 + static int sr_resx_show(struct seq_file *s, void *v) 5134 + { 5135 + const struct sys_reg_desc *desc = v; 5136 + struct kvm *kvm = s->private; 5137 + struct resx resx; 5138 + 5139 + if (!desc) 5140 + return 0; 5141 + 5142 + resx = kvm_get_sysreg_resx(kvm, desc->reg); 5143 + 5144 + seq_printf(s, "%20s:\tRES0:%016llx\tRES1:%016llx\n", 5145 + desc->name, resx.res0, resx.res1); 5146 + 5147 + return 0; 5148 + } 5149 + 5150 + static const struct seq_operations sr_resx_sops = { 5151 + .start = sr_resx_start, 5152 + .next = sr_resx_next, 5153 + .stop = sr_resx_stop, 5154 + .show = sr_resx_show, 5155 + }; 5156 + 5157 + DEFINE_SEQ_ATTRIBUTE(sr_resx); 5158 + 5059 5159 void kvm_sys_regs_create_debugfs(struct kvm *kvm) 5060 5160 { 5061 - kvm->arch.idreg_debugfs_iter = ~0; 5062 - 5063 5161 debugfs_create_file("idregs", 0444, kvm->debugfs_dentry, kvm, 5064 5162 &idregs_debug_fops); 5163 + debugfs_create_file("resx", 0444, kvm->debugfs_dentry, kvm, 5164 + &sr_resx_fops); 5065 5165 } 5066 5166 5067 5167 static void reset_vm_ftr_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *reg) ··· 5613 5581 5614 5582 if (kvm_has_mte(vcpu->kvm)) 5615 5583 vcpu->arch.hcr_el2 |= HCR_ATA; 5584 + else 5585 + vcpu->arch.hcr_el2 |= HCR_TID5; 5616 5586 5617 5587 /* 5618 5588 * In the absence of FGT, we cannot independently trap TLBI
+10
arch/arm64/kvm/sys_regs.h
··· 49 49 .Op2 = ((esr) >> 17) & 0x7, \ 50 50 .is_write = !((esr) & 1) }) 51 51 52 + /* 53 + * The Feature ID space is defined as the System register space in AArch64 54 + * with op0==3, op1=={0, 1, 3}, CRn==0, CRm=={0-7}, op2=={0-7}. 55 + */ 56 + static inline bool in_feat_id_space(struct sys_reg_params *p) 57 + { 58 + return (p->Op0 == 3 && !(p->Op1 & 0b100) && p->Op1 != 2 && 59 + p->CRn == 0 && !(p->CRm & 0b1000)); 60 + } 61 + 52 62 struct sys_reg_desc { 53 63 /* Sysreg string for debug */ 54 64 const char *name;
+28 -33
arch/arm64/kvm/va_layout.c
··· 47 47 } 48 48 49 49 /* 50 + * Calculate the actual VA size used by the hypervisor 51 + */ 52 + __init u32 kvm_hyp_va_bits(void) 53 + { 54 + /* 55 + * The ID map is always configured for 48 bits of translation, which may 56 + * be different from the number of VA bits used by the regular kernel 57 + * stage 1. 58 + * 59 + * At EL2, there is only one TTBR register, and we can't switch between 60 + * translation tables *and* update TCR_EL2.T0SZ at the same time. Bottom 61 + * line: we need to use the extended range with *both* our translation 62 + * tables. 63 + * 64 + * So use the maximum of the idmap VA bits and the regular kernel stage 65 + * 1 VA bits as the hypervisor VA size to assure that the hypervisor can 66 + * both ID map its code page and map any kernel memory. 67 + */ 68 + return max(IDMAP_VA_BITS, vabits_actual); 69 + } 70 + 71 + /* 50 72 * We want to generate a hyp VA with the following format (with V == 51 - * vabits_actual): 73 + * hypervisor VA bits): 52 74 * 53 75 * 63 ... V | V-1 | V-2 .. tag_lsb | tag_lsb - 1 .. 0 54 76 * --------------------------------------------------------- ··· 83 61 { 84 62 phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start); 85 63 u64 hyp_va_msb; 64 + u32 hyp_va_bits = kvm_hyp_va_bits(); 86 65 87 66 /* Where is my RAM region? */ 88 - hyp_va_msb = idmap_addr & BIT(vabits_actual - 1); 89 - hyp_va_msb ^= BIT(vabits_actual - 1); 67 + hyp_va_msb = idmap_addr & BIT(hyp_va_bits - 1); 68 + hyp_va_msb ^= BIT(hyp_va_bits - 1); 90 69 91 70 tag_lsb = fls64((u64)phys_to_virt(memblock_start_of_DRAM()) ^ 92 71 (u64)(high_memory - 1)); ··· 95 72 va_mask = GENMASK_ULL(tag_lsb - 1, 0); 96 73 tag_val = hyp_va_msb; 97 74 98 - if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && tag_lsb != (vabits_actual - 1)) { 75 + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && tag_lsb != (hyp_va_bits - 1)) { 99 76 /* We have some free bits to insert a random tag. */ 100 - tag_val |= get_random_long() & GENMASK_ULL(vabits_actual - 2, tag_lsb); 77 + tag_val |= get_random_long() & GENMASK_ULL(hyp_va_bits - 2, tag_lsb); 101 78 } 102 79 tag_val >>= tag_lsb; 103 80 ··· 318 295 { 319 296 generate_mov_q(read_sanitised_ftr_reg(SYS_CTR_EL0), 320 297 origptr, updptr, nr_inst); 321 - } 322 - 323 - void kvm_pan_patch_el2_entry(struct alt_instr *alt, 324 - __le32 *origptr, __le32 *updptr, int nr_inst) 325 - { 326 - /* 327 - * If we're running at EL1 without hVHE, then SCTLR_EL2.SPAN means 328 - * nothing to us (it is RES1), and we don't need to set PSTATE.PAN 329 - * to anything useful. 330 - */ 331 - if (!is_kernel_in_hyp_mode() && !cpus_have_cap(ARM64_KVM_HVHE)) 332 - return; 333 - 334 - /* 335 - * Leap of faith: at this point, we must be running VHE one way or 336 - * another, and FEAT_PAN is required to be implemented. If KVM 337 - * explodes at runtime because your system does not abide by this 338 - * requirement, call your favourite HW vendor, they have screwed up. 339 - * 340 - * We don't expect hVHE to access any userspace mapping, so always 341 - * set PSTATE.PAN on enty. Same thing if we have PAN enabled on an 342 - * EL2 kernel. Only force it to 0 if we have not configured PAN in 343 - * the kernel (and you know this is really silly). 344 - */ 345 - if (cpus_have_cap(ARM64_KVM_HVHE) || IS_ENABLED(CONFIG_ARM64_PAN)) 346 - *updptr = cpu_to_le32(ENCODE_PSTATE(1, PAN)); 347 - else 348 - *updptr = cpu_to_le32(ENCODE_PSTATE(0, PAN)); 349 298 }
+32 -76
arch/arm64/kvm/vgic/vgic-debug.c
··· 25 25 struct vgic_state_iter { 26 26 int nr_cpus; 27 27 int nr_spis; 28 - int nr_lpis; 29 28 int dist_id; 30 29 int vcpu_id; 31 30 unsigned long intid; 32 - int lpi_idx; 33 31 }; 34 32 35 33 static void iter_next(struct kvm *kvm, struct vgic_state_iter *iter) ··· 43 45 * Let the xarray drive the iterator after the last SPI, as the iterator 44 46 * has exhausted the sequentially-allocated INTID space. 45 47 */ 46 - if (iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS - 1) && 47 - iter->nr_lpis) { 48 - if (iter->lpi_idx < iter->nr_lpis) 49 - xa_find_after(&dist->lpi_xa, &iter->intid, 50 - VGIC_LPI_MAX_INTID, 51 - LPI_XA_MARK_DEBUG_ITER); 52 - iter->lpi_idx++; 48 + if (iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS - 1)) { 49 + if (iter->intid == VGIC_LPI_MAX_INTID + 1) 50 + return; 51 + 52 + rcu_read_lock(); 53 + if (!xa_find_after(&dist->lpi_xa, &iter->intid, 54 + VGIC_LPI_MAX_INTID, XA_PRESENT)) 55 + iter->intid = VGIC_LPI_MAX_INTID + 1; 56 + rcu_read_unlock(); 53 57 return; 54 58 } 55 59 ··· 61 61 iter->intid = 0; 62 62 } 63 63 64 - static int iter_mark_lpis(struct kvm *kvm) 64 + static int vgic_count_lpis(struct kvm *kvm) 65 65 { 66 66 struct vgic_dist *dist = &kvm->arch.vgic; 67 - unsigned long intid, flags; 68 67 struct vgic_irq *irq; 68 + unsigned long intid; 69 69 int nr_lpis = 0; 70 70 71 - xa_lock_irqsave(&dist->lpi_xa, flags); 72 - 73 - xa_for_each(&dist->lpi_xa, intid, irq) { 74 - if (!vgic_try_get_irq_ref(irq)) 75 - continue; 76 - 77 - __xa_set_mark(&dist->lpi_xa, intid, LPI_XA_MARK_DEBUG_ITER); 71 + rcu_read_lock(); 72 + xa_for_each(&dist->lpi_xa, intid, irq) 78 73 nr_lpis++; 79 - } 80 - 81 - xa_unlock_irqrestore(&dist->lpi_xa, flags); 74 + rcu_read_unlock(); 82 75 83 76 return nr_lpis; 84 - } 85 - 86 - static void iter_unmark_lpis(struct kvm *kvm) 87 - { 88 - struct vgic_dist *dist = &kvm->arch.vgic; 89 - unsigned long intid, flags; 90 - struct vgic_irq *irq; 91 - 92 - xa_for_each_marked(&dist->lpi_xa, intid, irq, LPI_XA_MARK_DEBUG_ITER) { 93 - xa_lock_irqsave(&dist->lpi_xa, flags); 94 - __xa_clear_mark(&dist->lpi_xa, intid, LPI_XA_MARK_DEBUG_ITER); 95 - xa_unlock_irqrestore(&dist->lpi_xa, flags); 96 - 97 - /* vgic_put_irq() expects to be called outside of the xa_lock */ 98 - vgic_put_irq(kvm, irq); 99 - } 100 77 } 101 78 102 79 static void iter_init(struct kvm *kvm, struct vgic_state_iter *iter, ··· 85 108 86 109 iter->nr_cpus = nr_cpus; 87 110 iter->nr_spis = kvm->arch.vgic.nr_spis; 88 - if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) 89 - iter->nr_lpis = iter_mark_lpis(kvm); 90 111 91 112 /* Fast forward to the right position if needed */ 92 113 while (pos--) ··· 96 121 return iter->dist_id > 0 && 97 122 iter->vcpu_id == iter->nr_cpus && 98 123 iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS) && 99 - (!iter->nr_lpis || iter->lpi_idx > iter->nr_lpis); 124 + iter->intid > VGIC_LPI_MAX_INTID; 100 125 } 101 126 102 127 static void *vgic_debug_start(struct seq_file *s, loff_t *pos) ··· 104 129 struct kvm *kvm = s->private; 105 130 struct vgic_state_iter *iter; 106 131 107 - mutex_lock(&kvm->arch.config_lock); 108 - iter = kvm->arch.vgic.iter; 109 - if (iter) { 110 - iter = ERR_PTR(-EBUSY); 111 - goto out; 112 - } 113 - 114 132 iter = kmalloc(sizeof(*iter), GFP_KERNEL); 115 - if (!iter) { 116 - iter = ERR_PTR(-ENOMEM); 117 - goto out; 118 - } 133 + if (!iter) 134 + return ERR_PTR(-ENOMEM); 119 135 120 136 iter_init(kvm, iter, *pos); 121 - kvm->arch.vgic.iter = iter; 122 137 123 - if (end_of_vgic(iter)) 138 + if (end_of_vgic(iter)) { 139 + kfree(iter); 124 140 iter = NULL; 125 - out: 126 - mutex_unlock(&kvm->arch.config_lock); 141 + } 142 + 127 143 return iter; 128 144 } 129 145 130 146 static void *vgic_debug_next(struct seq_file *s, void *v, loff_t *pos) 131 147 { 132 148 struct kvm *kvm = s->private; 133 - struct vgic_state_iter *iter = kvm->arch.vgic.iter; 149 + struct vgic_state_iter *iter = v; 134 150 135 151 ++*pos; 136 152 iter_next(kvm, iter); 137 - if (end_of_vgic(iter)) 153 + if (end_of_vgic(iter)) { 154 + kfree(iter); 138 155 iter = NULL; 156 + } 139 157 return iter; 140 158 } 141 159 142 160 static void vgic_debug_stop(struct seq_file *s, void *v) 143 161 { 144 - struct kvm *kvm = s->private; 145 - struct vgic_state_iter *iter; 162 + struct vgic_state_iter *iter = v; 146 163 147 - /* 148 - * If the seq file wasn't properly opened, there's nothing to clearn 149 - * up. 150 - */ 151 - if (IS_ERR(v)) 164 + if (IS_ERR_OR_NULL(v)) 152 165 return; 153 166 154 - mutex_lock(&kvm->arch.config_lock); 155 - iter = kvm->arch.vgic.iter; 156 - iter_unmark_lpis(kvm); 157 167 kfree(iter); 158 - kvm->arch.vgic.iter = NULL; 159 - mutex_unlock(&kvm->arch.config_lock); 160 168 } 161 169 162 170 static void print_dist_state(struct seq_file *s, struct vgic_dist *dist, 163 171 struct vgic_state_iter *iter) 164 172 { 165 173 bool v3 = dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3; 174 + struct kvm *kvm = s->private; 166 175 167 176 seq_printf(s, "Distributor\n"); 168 177 seq_printf(s, "===========\n"); 169 178 seq_printf(s, "vgic_model:\t%s\n", v3 ? "GICv3" : "GICv2"); 170 179 seq_printf(s, "nr_spis:\t%d\n", dist->nr_spis); 171 180 if (v3) 172 - seq_printf(s, "nr_lpis:\t%d\n", iter->nr_lpis); 181 + seq_printf(s, "nr_lpis:\t%d\n", vgic_count_lpis(kvm)); 173 182 seq_printf(s, "enabled:\t%d\n", dist->enabled); 174 183 seq_printf(s, "\n"); 175 184 ··· 250 291 if (iter->vcpu_id < iter->nr_cpus) 251 292 vcpu = kvm_get_vcpu(kvm, iter->vcpu_id); 252 293 253 - /* 254 - * Expect this to succeed, as iter_mark_lpis() takes a reference on 255 - * every LPI to be visited. 256 - */ 257 294 if (iter->intid < VGIC_NR_PRIVATE_IRQS) 258 295 irq = vgic_get_vcpu_irq(vcpu, iter->intid); 259 296 else 260 297 irq = vgic_get_irq(kvm, iter->intid); 261 - if (WARN_ON_ONCE(!irq)) 262 - return -EINVAL; 298 + 299 + if (!irq) 300 + return 0; 263 301 264 302 raw_spin_lock_irqsave(&irq->irq_lock, flags); 265 303 print_irq_state(s, irq, vcpu);
+4 -4
arch/arm64/kvm/vgic/vgic-init.c
··· 140 140 goto out_unlock; 141 141 } 142 142 143 + kvm->arch.vgic.in_kernel = true; 144 + kvm->arch.vgic.vgic_model = type; 145 + kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST; 146 + 143 147 kvm_for_each_vcpu(i, vcpu, kvm) { 144 148 ret = vgic_allocate_private_irqs_locked(vcpu, type); 145 149 if (ret) ··· 159 155 160 156 goto out_unlock; 161 157 } 162 - 163 - kvm->arch.vgic.in_kernel = true; 164 - kvm->arch.vgic.vgic_model = type; 165 - kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST; 166 158 167 159 kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF; 168 160
+5 -5
arch/arm64/kvm/vgic/vgic-v3-nested.c
··· 57 57 * as the L1 guest is in charge of provisioning the interrupts via its own 58 58 * view of the ICH_LR*_EL2 registers, which conveniently live in the VNCR 59 59 * page. This means that the flow described above does work (there is no 60 - * state to rebuild in the L0 hypervisor), and that most things happed on L2 60 + * state to rebuild in the L0 hypervisor), and that most things happen on L2 61 61 * load/put: 62 62 * 63 63 * - on L2 load: move the in-memory L1 vGIC configuration into a shadow, ··· 202 202 if ((hcr & ICH_HCR_EL2_NPIE) && !mi_state.pend) 203 203 reg |= ICH_MISR_EL2_NP; 204 204 205 - if ((hcr & ICH_HCR_EL2_VGrp0EIE) && (vmcr & ICH_VMCR_ENG0_MASK)) 205 + if ((hcr & ICH_HCR_EL2_VGrp0EIE) && (vmcr & ICH_VMCR_EL2_VENG0_MASK)) 206 206 reg |= ICH_MISR_EL2_VGrp0E; 207 207 208 - if ((hcr & ICH_HCR_EL2_VGrp0DIE) && !(vmcr & ICH_VMCR_ENG0_MASK)) 208 + if ((hcr & ICH_HCR_EL2_VGrp0DIE) && !(vmcr & ICH_VMCR_EL2_VENG0_MASK)) 209 209 reg |= ICH_MISR_EL2_VGrp0D; 210 210 211 - if ((hcr & ICH_HCR_EL2_VGrp1EIE) && (vmcr & ICH_VMCR_ENG1_MASK)) 211 + if ((hcr & ICH_HCR_EL2_VGrp1EIE) && (vmcr & ICH_VMCR_EL2_VENG1_MASK)) 212 212 reg |= ICH_MISR_EL2_VGrp1E; 213 213 214 - if ((hcr & ICH_HCR_EL2_VGrp1DIE) && !(vmcr & ICH_VMCR_ENG1_MASK)) 214 + if ((hcr & ICH_HCR_EL2_VGrp1DIE) && !(vmcr & ICH_VMCR_EL2_VENG1_MASK)) 215 215 reg |= ICH_MISR_EL2_VGrp1D; 216 216 217 217 return reg;
+37 -36
arch/arm64/kvm/vgic/vgic-v3.c
··· 41 41 if (!als->nr_sgi) 42 42 cpuif->vgic_hcr |= ICH_HCR_EL2_vSGIEOICount; 43 43 44 - cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_ENG0_MASK) ? 44 + cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_EL2_VENG0_MASK) ? 45 45 ICH_HCR_EL2_VGrp0DIE : ICH_HCR_EL2_VGrp0EIE; 46 - cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_ENG1_MASK) ? 46 + cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_EL2_VENG1_MASK) ? 47 47 ICH_HCR_EL2_VGrp1DIE : ICH_HCR_EL2_VGrp1EIE; 48 48 49 49 /* ··· 215 215 * We only deal with DIR when EOIMode==1, and only for SGI, 216 216 * PPI or SPI. 217 217 */ 218 - if (!(cpuif->vgic_vmcr & ICH_VMCR_EOIM_MASK) || 218 + if (!(cpuif->vgic_vmcr & ICH_VMCR_EL2_VEOIM_MASK) || 219 219 val >= vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS) 220 220 return; 221 221 ··· 408 408 u32 vmcr; 409 409 410 410 if (model == KVM_DEV_TYPE_ARM_VGIC_V2) { 411 - vmcr = (vmcrp->ackctl << ICH_VMCR_ACK_CTL_SHIFT) & 412 - ICH_VMCR_ACK_CTL_MASK; 413 - vmcr |= (vmcrp->fiqen << ICH_VMCR_FIQ_EN_SHIFT) & 414 - ICH_VMCR_FIQ_EN_MASK; 411 + vmcr = FIELD_PREP(ICH_VMCR_EL2_VAckCtl, vmcrp->ackctl); 412 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VFIQEn, vmcrp->fiqen); 415 413 } else { 416 414 /* 417 415 * When emulating GICv3 on GICv3 with SRE=1 on the 418 416 * VFIQEn bit is RES1 and the VAckCtl bit is RES0. 419 417 */ 420 - vmcr = ICH_VMCR_FIQ_EN_MASK; 418 + vmcr = ICH_VMCR_EL2_VFIQEn_MASK; 421 419 } 422 420 423 - vmcr |= (vmcrp->cbpr << ICH_VMCR_CBPR_SHIFT) & ICH_VMCR_CBPR_MASK; 424 - vmcr |= (vmcrp->eoim << ICH_VMCR_EOIM_SHIFT) & ICH_VMCR_EOIM_MASK; 425 - vmcr |= (vmcrp->abpr << ICH_VMCR_BPR1_SHIFT) & ICH_VMCR_BPR1_MASK; 426 - vmcr |= (vmcrp->bpr << ICH_VMCR_BPR0_SHIFT) & ICH_VMCR_BPR0_MASK; 427 - vmcr |= (vmcrp->pmr << ICH_VMCR_PMR_SHIFT) & ICH_VMCR_PMR_MASK; 428 - vmcr |= (vmcrp->grpen0 << ICH_VMCR_ENG0_SHIFT) & ICH_VMCR_ENG0_MASK; 429 - vmcr |= (vmcrp->grpen1 << ICH_VMCR_ENG1_SHIFT) & ICH_VMCR_ENG1_MASK; 421 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VCBPR, vmcrp->cbpr); 422 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VEOIM, vmcrp->eoim); 423 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VBPR1, vmcrp->abpr); 424 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VBPR0, vmcrp->bpr); 425 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VPMR, vmcrp->pmr); 426 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VENG0, vmcrp->grpen0); 427 + vmcr |= FIELD_PREP(ICH_VMCR_EL2_VENG1, vmcrp->grpen1); 430 428 431 429 cpu_if->vgic_vmcr = vmcr; 432 430 } ··· 438 440 vmcr = cpu_if->vgic_vmcr; 439 441 440 442 if (model == KVM_DEV_TYPE_ARM_VGIC_V2) { 441 - vmcrp->ackctl = (vmcr & ICH_VMCR_ACK_CTL_MASK) >> 442 - ICH_VMCR_ACK_CTL_SHIFT; 443 - vmcrp->fiqen = (vmcr & ICH_VMCR_FIQ_EN_MASK) >> 444 - ICH_VMCR_FIQ_EN_SHIFT; 443 + vmcrp->ackctl = FIELD_GET(ICH_VMCR_EL2_VAckCtl, vmcr); 444 + vmcrp->fiqen = FIELD_GET(ICH_VMCR_EL2_VFIQEn, vmcr); 445 445 } else { 446 446 /* 447 447 * When emulating GICv3 on GICv3 with SRE=1 on the ··· 449 453 vmcrp->ackctl = 0; 450 454 } 451 455 452 - vmcrp->cbpr = (vmcr & ICH_VMCR_CBPR_MASK) >> ICH_VMCR_CBPR_SHIFT; 453 - vmcrp->eoim = (vmcr & ICH_VMCR_EOIM_MASK) >> ICH_VMCR_EOIM_SHIFT; 454 - vmcrp->abpr = (vmcr & ICH_VMCR_BPR1_MASK) >> ICH_VMCR_BPR1_SHIFT; 455 - vmcrp->bpr = (vmcr & ICH_VMCR_BPR0_MASK) >> ICH_VMCR_BPR0_SHIFT; 456 - vmcrp->pmr = (vmcr & ICH_VMCR_PMR_MASK) >> ICH_VMCR_PMR_SHIFT; 457 - vmcrp->grpen0 = (vmcr & ICH_VMCR_ENG0_MASK) >> ICH_VMCR_ENG0_SHIFT; 458 - vmcrp->grpen1 = (vmcr & ICH_VMCR_ENG1_MASK) >> ICH_VMCR_ENG1_SHIFT; 456 + vmcrp->cbpr = FIELD_GET(ICH_VMCR_EL2_VCBPR, vmcr); 457 + vmcrp->eoim = FIELD_GET(ICH_VMCR_EL2_VEOIM, vmcr); 458 + vmcrp->abpr = FIELD_GET(ICH_VMCR_EL2_VBPR1, vmcr); 459 + vmcrp->bpr = FIELD_GET(ICH_VMCR_EL2_VBPR0, vmcr); 460 + vmcrp->pmr = FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr); 461 + vmcrp->grpen0 = FIELD_GET(ICH_VMCR_EL2_VENG0, vmcr); 462 + vmcrp->grpen1 = FIELD_GET(ICH_VMCR_EL2_VENG1, vmcr); 459 463 } 460 464 461 465 #define INITIAL_PENDBASER_VALUE \ ··· 876 880 *updptr = cpu_to_le32(insn); 877 881 } 878 882 883 + void vgic_v3_enable_cpuif_traps(void) 884 + { 885 + u64 traps = vgic_ich_hcr_trap_bits(); 886 + 887 + if (traps) { 888 + kvm_info("GICv3 sysreg trapping enabled ([%s%s%s%s], reduced performance)\n", 889 + (traps & ICH_HCR_EL2_TALL0) ? "G0" : "", 890 + (traps & ICH_HCR_EL2_TALL1) ? "G1" : "", 891 + (traps & ICH_HCR_EL2_TC) ? "C" : "", 892 + (traps & ICH_HCR_EL2_TDIR) ? "D" : ""); 893 + static_branch_enable(&vgic_v3_cpuif_trap); 894 + } 895 + } 896 + 879 897 /** 880 898 * vgic_v3_probe - probe for a VGICv3 compatible interrupt controller 881 899 * @info: pointer to the GIC description ··· 901 891 { 902 892 u64 ich_vtr_el2 = kvm_call_hyp_ret(__vgic_v3_get_gic_config); 903 893 bool has_v2; 904 - u64 traps; 905 894 int ret; 906 895 907 896 has_v2 = ich_vtr_el2 >> 63; ··· 964 955 kvm_vgic_global_state.ich_vtr_el2 &= ~ICH_VTR_EL2_SEIS; 965 956 } 966 957 967 - traps = vgic_ich_hcr_trap_bits(); 968 - if (traps) { 969 - kvm_info("GICv3 sysreg trapping enabled ([%s%s%s%s], reduced performance)\n", 970 - (traps & ICH_HCR_EL2_TALL0) ? "G0" : "", 971 - (traps & ICH_HCR_EL2_TALL1) ? "G1" : "", 972 - (traps & ICH_HCR_EL2_TC) ? "C" : "", 973 - (traps & ICH_HCR_EL2_TDIR) ? "D" : ""); 974 - static_branch_enable(&vgic_v3_cpuif_trap); 975 - } 958 + vgic_v3_enable_cpuif_traps(); 976 959 977 960 kvm_vgic_global_state.vctrl_base = NULL; 978 961 kvm_vgic_global_state.type = VGIC_V3;
+2
arch/arm64/kvm/vgic/vgic-v5.c
··· 48 48 static_branch_enable(&kvm_vgic_global_state.gicv3_cpuif); 49 49 kvm_info("GCIE legacy system register CPU interface\n"); 50 50 51 + vgic_v3_enable_cpuif_traps(); 52 + 51 53 return 0; 52 54 }
+1
arch/arm64/kvm/vgic/vgic.h
··· 324 324 void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr); 325 325 void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr); 326 326 void vgic_v3_reset(struct kvm_vcpu *vcpu); 327 + void vgic_v3_enable_cpuif_traps(void); 327 328 int vgic_v3_probe(const struct gic_kvm_info *info); 328 329 int vgic_v3_map_resources(struct kvm *kvm); 329 330 int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq);
-2
arch/arm64/lib/insn.c
··· 611 611 state); 612 612 } 613 613 614 - #ifdef CONFIG_ARM64_LSE_ATOMICS 615 614 static u32 aarch64_insn_encode_ldst_order(enum aarch64_insn_mem_order_type type, 616 615 u32 insn) 617 616 { ··· 754 755 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RS, insn, 755 756 value); 756 757 } 757 - #endif 758 758 759 759 u32 aarch64_insn_gen_add_sub_imm(enum aarch64_insn_register dst, 760 760 enum aarch64_insn_register src,
-7
arch/arm64/net/bpf_jit_comp.c
··· 776 776 return 0; 777 777 } 778 778 779 - #ifdef CONFIG_ARM64_LSE_ATOMICS 780 779 static int emit_lse_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx) 781 780 { 782 781 const u8 code = insn->code; ··· 842 843 843 844 return 0; 844 845 } 845 - #else 846 - static inline int emit_lse_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx) 847 - { 848 - return -EINVAL; 849 - } 850 - #endif 851 846 852 847 static int emit_ll_sc_atomic(const struct bpf_insn *insn, struct jit_ctx *ctx) 853 848 {
+2
arch/arm64/tools/cpucaps
··· 46 46 HAS_LDAPR 47 47 HAS_LPA2 48 48 HAS_LSE_ATOMICS 49 + HAS_LS64 50 + HAS_LS64_V 49 51 HAS_MOPS 50 52 HAS_NESTED_VIRT 51 53 HAS_BBML2_NOABORT
+137 -17
arch/arm64/tools/sysreg
··· 1856 1856 0b0000 NI 1857 1857 0b0001 IMP 1858 1858 EndEnum 1859 - UnsignedEnum 27:24 TME 1860 - 0b0000 NI 1861 - 0b0001 IMP 1862 - EndEnum 1859 + Res0 27:24 1863 1860 UnsignedEnum 23:20 ATOMIC 1864 1861 0b0000 NI 1865 1862 0b0010 IMP ··· 2095 2098 0b0000 NI 2096 2099 0b0001 IMP 2097 2100 EndEnum 2098 - Enum 43:40 TGRAN4_2 2101 + UnsignedEnum 43:40 TGRAN4_2 2099 2102 0b0000 TGRAN4 2100 2103 0b0001 NI 2101 2104 0b0010 IMP 2102 2105 0b0011 52_BIT 2103 2106 EndEnum 2104 - Enum 39:36 TGRAN64_2 2107 + UnsignedEnum 39:36 TGRAN64_2 2105 2108 0b0000 TGRAN64 2106 2109 0b0001 NI 2107 2110 0b0010 IMP 2108 2111 EndEnum 2109 - Enum 35:32 TGRAN16_2 2112 + UnsignedEnum 35:32 TGRAN16_2 2110 2113 0b0000 TGRAN16 2111 2114 0b0001 NI 2112 2115 0b0010 IMP ··· 2253 2256 0b0000 NI 2254 2257 0b0001 IMP 2255 2258 EndEnum 2256 - Enum 39:36 IDS 2257 - 0b0000 0x0 2258 - 0b0001 0x18 2259 + UnsignedEnum 39:36 IDS 2260 + 0b0000 NI 2261 + 0b0001 IMP 2262 + 0b0010 EL3 2259 2263 EndEnum 2260 2264 UnsignedEnum 35:32 AT 2261 2265 0b0000 NI ··· 2430 2432 Field 56 EnALS 2431 2433 Field 55 EnAS0 2432 2434 Field 54 EnASR 2433 - Field 53 TME 2434 - Field 52 TME0 2435 - Field 51 TMT 2436 - Field 50 TMT0 2435 + Res0 53:50 2437 2436 Field 49:46 TWEDEL 2438 2437 Field 45 TWEDEn 2439 2438 Field 44 DSSBS ··· 3744 3749 EndEnum 3745 3750 EndSysreg 3746 3751 3752 + Sysreg SCTLR_EL2 3 4 1 0 0 3753 + Field 63 TIDCP 3754 + Field 62 SPINTMASK 3755 + Field 61 NMI 3756 + Field 60 EnTP2 3757 + Field 59 TCSO 3758 + Field 58 TCSO0 3759 + Field 57 EPAN 3760 + Field 56 EnALS 3761 + Field 55 EnAS0 3762 + Field 54 EnASR 3763 + Res0 53:50 3764 + Field 49:46 TWEDEL 3765 + Field 45 TWEDEn 3766 + Field 44 DSSBS 3767 + Field 43 ATA 3768 + Field 42 ATA0 3769 + Enum 41:40 TCF 3770 + 0b00 NONE 3771 + 0b01 SYNC 3772 + 0b10 ASYNC 3773 + 0b11 ASYMM 3774 + EndEnum 3775 + Enum 39:38 TCF0 3776 + 0b00 NONE 3777 + 0b01 SYNC 3778 + 0b10 ASYNC 3779 + 0b11 ASYMM 3780 + EndEnum 3781 + Field 37 ITFSB 3782 + Field 36 BT 3783 + Field 35 BT0 3784 + Field 34 EnFPM 3785 + Field 33 MSCEn 3786 + Field 32 CMOW 3787 + Field 31 EnIA 3788 + Field 30 EnIB 3789 + Field 29 LSMAOE 3790 + Field 28 nTLSMD 3791 + Field 27 EnDA 3792 + Field 26 UCI 3793 + Field 25 EE 3794 + Field 24 E0E 3795 + Field 23 SPAN 3796 + Field 22 EIS 3797 + Field 21 IESB 3798 + Field 20 TSCXT 3799 + Field 19 WXN 3800 + Field 18 nTWE 3801 + Res0 17 3802 + Field 16 nTWI 3803 + Field 15 UCT 3804 + Field 14 DZE 3805 + Field 13 EnDB 3806 + Field 12 I 3807 + Field 11 EOS 3808 + Field 10 EnRCTX 3809 + Res0 9 3810 + Field 8 SED 3811 + Field 7 ITD 3812 + Field 6 nAA 3813 + Field 5 CP15BEN 3814 + Field 4 SA0 3815 + Field 3 SA 3816 + Field 2 C 3817 + Field 1 A 3818 + Field 0 M 3819 + EndSysreg 3820 + 3747 3821 Sysreg HCR_EL2 3 4 1 1 0 3748 3822 Field 63:60 TWEDEL 3749 3823 Field 59 TWEDEn ··· 3835 3771 Field 42 NV 3836 3772 Field 41 API 3837 3773 Field 40 APK 3838 - Field 39 TME 3839 - Field 38 MIOCNCE 3774 + Res0 39:38 3840 3775 Field 37 TEA 3841 3776 Field 36 TERR 3842 3777 Field 35 TLOR ··· 4463 4400 Res0 11:0 4464 4401 EndSysreg 4465 4402 4403 + Sysreg VTCR_EL2 3 4 2 1 2 4404 + Res0 63:46 4405 + Field 45 HDBSS 4406 + Field 44 HAFT 4407 + Res0 43:42 4408 + Field 41 TL0 4409 + Field 40 GCSH 4410 + Res0 39 4411 + Field 38 D128 4412 + Field 37 S2POE 4413 + Field 36 S2PIE 4414 + Field 35 TL1 4415 + Field 34 AssuredOnly 4416 + Field 33 SL2 4417 + Field 32 DS 4418 + Res1 31 4419 + Field 30 NSA 4420 + Field 29 NSW 4421 + Field 28 HWU62 4422 + Field 27 HWU61 4423 + Field 26 HWU60 4424 + Field 25 HWU59 4425 + Res0 24:23 4426 + Field 22 HD 4427 + Field 21 HA 4428 + Res0 20 4429 + Enum 19 VS 4430 + 0b0 8BIT 4431 + 0b1 16BIT 4432 + EndEnum 4433 + Field 18:16 PS 4434 + Enum 15:14 TG0 4435 + 0b00 4K 4436 + 0b01 64K 4437 + 0b10 16K 4438 + EndEnum 4439 + Enum 13:12 SH0 4440 + 0b00 NONE 4441 + 0b01 OUTER 4442 + 0b11 INNER 4443 + EndEnum 4444 + Enum 11:10 ORGN0 4445 + 0b00 NC 4446 + 0b01 WBWA 4447 + 0b10 WT 4448 + 0b11 WBnWA 4449 + EndEnum 4450 + Enum 9:8 IRGN0 4451 + 0b00 NC 4452 + 0b01 WBWA 4453 + 0b10 WT 4454 + 0b11 WBnWA 4455 + EndEnum 4456 + Field 7:6 SL0 4457 + Field 5:0 T0SZ 4458 + EndSysreg 4459 + 4466 4460 Sysreg GCSCR_EL2 3 4 2 5 0 4467 4461 Fields GCSCR_ELx 4468 4462 EndSysreg ··· 4699 4579 Field 6 ICC_ICSR_EL1 4700 4580 Field 5 ICC_PCR_EL1 4701 4581 Field 4 ICC_HPPIR_EL1 4702 - Field 3 ICC_HAPR_EL1 4582 + Res1 3 4703 4583 Field 2 ICC_CR0_EL1 4704 4584 Field 1 ICC_IDRn_EL1 4705 4585 Field 0 ICC_APR_EL1
+2
drivers/irqchip/irq-gic-v5-irs.c
··· 743 743 * be consistent across IRSes by the architecture. 744 744 */ 745 745 if (list_empty(&irs_nodes)) { 746 + idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR0); 747 + gicv5_global_data.virt_capable = !FIELD_GET(GICV5_IRS_IDR0_VIRT, idr); 746 748 747 749 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1); 748 750 irs_setup_pri_bits(idr);
+10
drivers/irqchip/irq-gic-v5.c
··· 1064 1064 1065 1065 static void __init gic_of_setup_kvm_info(struct device_node *node) 1066 1066 { 1067 + /* 1068 + * If we don't have native GICv5 virtualisation support, then 1069 + * we also don't have FEAT_GCIE_LEGACY - the architecture 1070 + * forbids this combination. 1071 + */ 1072 + if (!gicv5_global_data.virt_capable) { 1073 + pr_info("GIC implementation is not virtualization capable\n"); 1074 + return; 1075 + } 1076 + 1067 1077 gic_v5_kvm_info.type = GIC_V5; 1068 1078 1069 1079 /* GIC Virtual CPU interface maintenance interrupt */
-4
include/kvm/arm_vgic.h
··· 300 300 */ 301 301 u64 propbaser; 302 302 303 - #define LPI_XA_MARK_DEBUG_ITER XA_MARK_0 304 303 struct xarray lpi_xa; 305 - 306 - /* used by vgic-debug */ 307 - struct vgic_state_iter *iter; 308 304 309 305 /* 310 306 * GICv4 ITS per-VM data, containing the IRQ domain, the VPE
+4
include/linux/irqchip/arm-gic-v5.h
··· 43 43 /* 44 44 * IRS registers and tables structures 45 45 */ 46 + #define GICV5_IRS_IDR0 0x0000 46 47 #define GICV5_IRS_IDR1 0x0004 47 48 #define GICV5_IRS_IDR2 0x0008 48 49 #define GICV5_IRS_IDR5 0x0014 ··· 63 62 #define GICV5_IRS_IST_CFGR 0x0190 64 63 #define GICV5_IRS_IST_STATUSR 0x0194 65 64 #define GICV5_IRS_MAP_L2_ISTR 0x01c0 65 + 66 + #define GICV5_IRS_IDR0_VIRT BIT(6) 66 67 67 68 #define GICV5_IRS_IDR1_PRIORITY_BITS GENMASK(22, 20) 68 69 #define GICV5_IRS_IDR1_IAFFID_BITS GENMASK(19, 16) ··· 281 278 u8 cpuif_pri_bits; 282 279 u8 cpuif_id_bits; 283 280 u8 irs_pri_bits; 281 + bool virt_capable; 284 282 struct { 285 283 __le64 *l1ist_addr; 286 284 u32 l2_size;
+2 -1
include/uapi/linux/kvm.h
··· 180 180 #define KVM_EXIT_MEMORY_FAULT 39 181 181 #define KVM_EXIT_TDX 40 182 182 #define KVM_EXIT_ARM_SEA 41 183 + #define KVM_EXIT_ARM_LDST64B 42 183 184 184 185 /* For KVM_EXIT_INTERNAL_ERROR */ 185 186 /* Emulate instruction failed. */ ··· 403 402 } eoi; 404 403 /* KVM_EXIT_HYPERV */ 405 404 struct kvm_hyperv_exit hyperv; 406 - /* KVM_EXIT_ARM_NISV */ 405 + /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */ 407 406 struct { 408 407 __u64 esr_iss; 409 408 __u64 fault_ipa;
-6
tools/arch/arm64/include/asm/sysreg.h
··· 847 847 #define SCTLR_ELx_A (BIT(1)) 848 848 #define SCTLR_ELx_M (BIT(0)) 849 849 850 - /* SCTLR_EL2 specific flags. */ 851 - #define SCTLR_EL2_RES1 ((BIT(4)) | (BIT(5)) | (BIT(11)) | (BIT(16)) | \ 852 - (BIT(18)) | (BIT(22)) | (BIT(23)) | (BIT(28)) | \ 853 - (BIT(29))) 854 - 855 - #define SCTLR_EL2_BT (BIT(36)) 856 850 #ifdef CONFIG_CPU_BIG_ENDIAN 857 851 #define ENDIAN_SET_EL2 SCTLR_ELx_EE 858 852 #else
-1
tools/perf/Documentation/perf-arm-spe.txt
··· 176 176 bit 10 - Remote access (FEAT_SPEv1p4) 177 177 bit 11 - Misaligned access (FEAT_SPEv1p1) 178 178 bit 12-15 - IMPLEMENTATION DEFINED events (when implemented) 179 - bit 16 - Transaction (FEAT_TME) 180 179 bit 17 - Partial or empty SME or SVE predicate (FEAT_SPEv1p1) 181 180 bit 18 - Empty SME or SVE predicate (FEAT_SPEv1p1) 182 181 bit 19 - L2D access (FEAT_SPEv1p4)
+1
tools/testing/selftests/kvm/Makefile.kvm
··· 175 175 TEST_GEN_PROGS_arm64 += arm64/vgic_lpi_stress 176 176 TEST_GEN_PROGS_arm64 += arm64/vpmu_counter_access 177 177 TEST_GEN_PROGS_arm64 += arm64/no-vgic-v3 178 + TEST_GEN_PROGS_arm64 += arm64/idreg-idst 178 179 TEST_GEN_PROGS_arm64 += arm64/kvm-uuid 179 180 TEST_GEN_PROGS_arm64 += access_tracking_perf_test 180 181 TEST_GEN_PROGS_arm64 += arch_timer
+117
tools/testing/selftests/kvm/arm64/idreg-idst.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + /* 4 + * Access all FEAT_IDST-handled registers that depend on more than 5 + * just FEAT_AA64, and fail if we don't get an a trap with an 0x18 EC. 6 + */ 7 + 8 + #include <test_util.h> 9 + #include <kvm_util.h> 10 + #include <processor.h> 11 + 12 + static volatile bool sys64, undef; 13 + 14 + #define __check_sr_read(r) \ 15 + ({ \ 16 + uint64_t val; \ 17 + \ 18 + sys64 = false; \ 19 + undef = false; \ 20 + dsb(sy); \ 21 + val = read_sysreg_s(SYS_ ## r); \ 22 + val; \ 23 + }) 24 + 25 + /* Fatal checks */ 26 + #define check_sr_read(r) \ 27 + do { \ 28 + __check_sr_read(r); \ 29 + __GUEST_ASSERT(!undef, #r " unexpected UNDEF"); \ 30 + __GUEST_ASSERT(sys64, #r " didn't trap"); \ 31 + } while(0) 32 + 33 + 34 + static void guest_code(void) 35 + { 36 + check_sr_read(CCSIDR2_EL1); 37 + check_sr_read(SMIDR_EL1); 38 + check_sr_read(GMID_EL1); 39 + 40 + GUEST_DONE(); 41 + } 42 + 43 + static void guest_sys64_handler(struct ex_regs *regs) 44 + { 45 + sys64 = true; 46 + undef = false; 47 + regs->pc += 4; 48 + } 49 + 50 + static void guest_undef_handler(struct ex_regs *regs) 51 + { 52 + sys64 = false; 53 + undef = true; 54 + regs->pc += 4; 55 + } 56 + 57 + static void test_run_vcpu(struct kvm_vcpu *vcpu) 58 + { 59 + struct ucall uc; 60 + 61 + do { 62 + vcpu_run(vcpu); 63 + 64 + switch (get_ucall(vcpu, &uc)) { 65 + case UCALL_ABORT: 66 + REPORT_GUEST_ASSERT(uc); 67 + break; 68 + case UCALL_PRINTF: 69 + printf("%s", uc.buffer); 70 + break; 71 + case UCALL_DONE: 72 + break; 73 + default: 74 + TEST_FAIL("Unknown ucall %lu", uc.cmd); 75 + } 76 + } while (uc.cmd != UCALL_DONE); 77 + } 78 + 79 + static void test_guest_feat_idst(void) 80 + { 81 + struct kvm_vcpu *vcpu; 82 + struct kvm_vm *vm; 83 + 84 + /* This VM has no MTE, no SME, no CCIDX */ 85 + vm = vm_create_with_one_vcpu(&vcpu, guest_code); 86 + 87 + vm_init_descriptor_tables(vm); 88 + vcpu_init_descriptor_tables(vcpu); 89 + 90 + vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 91 + ESR_ELx_EC_SYS64, guest_sys64_handler); 92 + vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 93 + ESR_ELx_EC_UNKNOWN, guest_undef_handler); 94 + 95 + test_run_vcpu(vcpu); 96 + 97 + kvm_vm_free(vm); 98 + } 99 + 100 + int main(int argc, char *argv[]) 101 + { 102 + struct kvm_vcpu *vcpu; 103 + struct kvm_vm *vm; 104 + uint64_t mmfr2; 105 + 106 + test_disable_default_vgic(); 107 + 108 + vm = vm_create_with_one_vcpu(&vcpu, NULL); 109 + mmfr2 = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64MMFR2_EL1)); 110 + __TEST_REQUIRE(FIELD_GET(ID_AA64MMFR2_EL1_IDS, mmfr2) > 0, 111 + "FEAT_IDST not supported"); 112 + kvm_vm_free(vm); 113 + 114 + test_guest_feat_idst(); 115 + 116 + return 0; 117 + }
-1
tools/testing/selftests/kvm/arm64/set_id_regs.c
··· 91 91 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, SM3, 0), 92 92 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, SHA3, 0), 93 93 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, RDM, 0), 94 - REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, TME, 0), 95 94 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, ATOMIC, 0), 96 95 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, CRC32, 0), 97 96 REG_FTR_BITS(FTR_LOWER_SAFE, ID_AA64ISAR0_EL1, SHA2, 0),
+4
tools/testing/selftests/kvm/include/arm64/processor.h
··· 90 90 #define TCR_TG0_64K (UL(1) << TCR_TG0_SHIFT) 91 91 #define TCR_TG0_16K (UL(2) << TCR_TG0_SHIFT) 92 92 93 + #define TCR_EPD1_SHIFT 23 94 + #define TCR_EPD1_MASK (UL(1) << TCR_EPD1_SHIFT) 95 + 93 96 #define TCR_IPS_SHIFT 32 94 97 #define TCR_IPS_MASK (UL(7) << TCR_IPS_SHIFT) 95 98 #define TCR_IPS_52_BITS (UL(6) << TCR_IPS_SHIFT) ··· 100 97 #define TCR_IPS_40_BITS (UL(2) << TCR_IPS_SHIFT) 101 98 #define TCR_IPS_36_BITS (UL(1) << TCR_IPS_SHIFT) 102 99 100 + #define TCR_TBI1 (UL(1) << 38) 103 101 #define TCR_HA (UL(1) << 39) 104 102 #define TCR_DS (UL(1) << 59) 105 103
+7 -2
tools/testing/selftests/kvm/include/kvm_util.h
··· 939 939 * VM VCPU Args Set 940 940 * 941 941 * Input Args: 942 - * vm - Virtual Machine 942 + * vcpu - vCPU 943 943 * num - number of arguments 944 944 * ... - arguments, each of type uint64_t 945 945 * ··· 1258 1258 return __vm_enable_cap(vm, KVM_CAP_VM_DISABLE_NX_HUGE_PAGES, 0); 1259 1259 } 1260 1260 1261 + static inline uint64_t vm_page_align(struct kvm_vm *vm, uint64_t v) 1262 + { 1263 + return (v + vm->page_size - 1) & ~(vm->page_size - 1); 1264 + } 1265 + 1261 1266 /* 1262 - * Arch hook that is invoked via a constructor, i.e. before exeucting main(), 1267 + * Arch hook that is invoked via a constructor, i.e. before executing main(), 1263 1268 * to allow for arch-specific setup that is common to all tests, e.g. computing 1264 1269 * the default guest "mode". 1265 1270 */
+3 -6
tools/testing/selftests/kvm/lib/arm64/processor.c
··· 21 21 22 22 static vm_vaddr_t exception_handlers; 23 23 24 - static uint64_t page_align(struct kvm_vm *vm, uint64_t v) 25 - { 26 - return (v + vm->page_size) & ~(vm->page_size - 1); 27 - } 28 - 29 24 static uint64_t pgd_index(struct kvm_vm *vm, vm_vaddr_t gva) 30 25 { 31 26 unsigned int shift = (vm->pgtable_levels - 1) * (vm->page_shift - 3) + vm->page_shift; ··· 110 115 111 116 void virt_arch_pgd_alloc(struct kvm_vm *vm) 112 117 { 113 - size_t nr_pages = page_align(vm, ptrs_per_pgd(vm) * 8) / vm->page_size; 118 + size_t nr_pages = vm_page_align(vm, ptrs_per_pgd(vm) * 8) / vm->page_size; 114 119 115 120 if (vm->pgd_created) 116 121 return; ··· 379 384 380 385 tcr_el1 |= TCR_IRGN0_WBWA | TCR_ORGN0_WBWA | TCR_SH0_INNER; 381 386 tcr_el1 |= TCR_T0SZ(vm->va_bits); 387 + tcr_el1 |= TCR_TBI1; 388 + tcr_el1 |= TCR_EPD1_MASK; 382 389 if (use_lpa2_pte_format(vm)) 383 390 tcr_el1 |= TCR_DS; 384 391
+1 -1
tools/testing/selftests/kvm/lib/kvm_util.c
··· 1351 1351 * Output Args: None 1352 1352 * 1353 1353 * Return: 1354 - * Lowest virtual address at or below vaddr_min, with at least 1354 + * Lowest virtual address at or above vaddr_min, with at least 1355 1355 * sz unused bytes. TEST_ASSERT failure if no area of at least 1356 1356 * size sz is available. 1357 1357 *
+1 -6
tools/testing/selftests/kvm/lib/riscv/processor.c
··· 26 26 return !ret && !!value; 27 27 } 28 28 29 - static uint64_t page_align(struct kvm_vm *vm, uint64_t v) 30 - { 31 - return (v + vm->page_size) & ~(vm->page_size - 1); 32 - } 33 - 34 29 static uint64_t pte_addr(struct kvm_vm *vm, uint64_t entry) 35 30 { 36 31 return ((entry & PGTBL_PTE_ADDR_MASK) >> PGTBL_PTE_ADDR_SHIFT) << ··· 63 68 64 69 void virt_arch_pgd_alloc(struct kvm_vm *vm) 65 70 { 66 - size_t nr_pages = page_align(vm, ptrs_per_pte(vm) * 8) / vm->page_size; 71 + size_t nr_pages = vm_page_align(vm, ptrs_per_pte(vm) * 8) / vm->page_size; 67 72 68 73 if (vm->pgd_created) 69 74 return;