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

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

KVM/arm64 changes for 6.13, part #1

- Support for stage-1 permission indirection (FEAT_S1PIE) and
permission overlays (FEAT_S1POE), including nested virt + the
emulated page table walker

- Introduce PSCI SYSTEM_OFF2 support to KVM + client driver. This call
was introduced in PSCIv1.3 as a mechanism to request hibernation,
similar to the S4 state in ACPI

- Explicitly trap + hide FEAT_MPAM (QoS controls) from KVM guests. As
part of it, introduce trivial initialization of the host's MPAM
context so KVM can use the corresponding traps

- PMU support under nested virtualization, honoring the guest
hypervisor's trap configuration and event filtering when running a
nested guest

- Fixes to vgic ITS serialization where stale device/interrupt table
entries are not zeroed when the mapping is invalidated by the VM

- Avoid emulated MMIO completion if userspace has requested synchronous
external abort injection

- Various fixes and cleanups affecting pKVM, vCPU initialization, and
selftests

+2866 -468
+2
Documentation/arch/arm64/cpu-feature-registers.rst
··· 152 152 +------------------------------+---------+---------+ 153 153 | DIT | [51-48] | y | 154 154 +------------------------------+---------+---------+ 155 + | MPAM | [43-40] | n | 156 + +------------------------------+---------+---------+ 155 157 | SVE | [35-32] | y | 156 158 +------------------------------+---------+---------+ 157 159 | GIC | [27-24] | n |
+10
Documentation/virt/kvm/api.rst
··· 6857 6857 the guest issued a SYSTEM_RESET2 call according to v1.1 of the PSCI 6858 6858 specification. 6859 6859 6860 + - for arm64, data[0] is set to KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2 6861 + if the guest issued a SYSTEM_OFF2 call according to v1.3 of the PSCI 6862 + specification. 6863 + 6860 6864 - for RISC-V, data[0] is set to the value of the second argument of the 6861 6865 ``sbi_system_reset`` call. 6862 6866 ··· 6893 6889 6894 6890 - Deny the guest request to suspend the VM. See ARM DEN0022D.b 5.19.2 6895 6891 "Caller responsibilities" for possible return values. 6892 + 6893 + Hibernation using the PSCI SYSTEM_OFF2 call is enabled when PSCI v1.3 6894 + is enabled. If a guest invokes the PSCI SYSTEM_OFF2 function, KVM will 6895 + exit to userspace with the KVM_SYSTEM_EVENT_SHUTDOWN event type and with 6896 + data[0] set to KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2. The only 6897 + supported hibernate type for the SYSTEM_OFF2 function is HIBERNATE_OFF. 6896 6898 6897 6899 :: 6898 6900
+1
arch/arm64/include/asm/cpu.h
··· 46 46 u64 reg_revidr; 47 47 u64 reg_gmid; 48 48 u64 reg_smidr; 49 + u64 reg_mpamidr; 49 50 50 51 u64 reg_id_aa64dfr0; 51 52 u64 reg_id_aa64dfr1;
+5
arch/arm64/include/asm/cpucaps.h
··· 60 60 return IS_ENABLED(CONFIG_ARM64_WORKAROUND_REPEAT_TLBI); 61 61 case ARM64_WORKAROUND_SPECULATIVE_SSBS: 62 62 return IS_ENABLED(CONFIG_ARM64_ERRATUM_3194386); 63 + case ARM64_MPAM: 64 + /* 65 + * KVM MPAM support doesn't rely on the host kernel supporting MPAM. 66 + */ 67 + return true; 63 68 } 64 69 65 70 return true;
+17
arch/arm64/include/asm/cpufeature.h
··· 612 612 return val > 0; 613 613 } 614 614 615 + static inline bool id_aa64pfr0_mpam(u64 pfr0) 616 + { 617 + u32 val = cpuid_feature_extract_unsigned_field(pfr0, ID_AA64PFR0_EL1_MPAM_SHIFT); 618 + 619 + return val > 0; 620 + } 621 + 615 622 static inline bool id_aa64pfr1_mte(u64 pfr1) 616 623 { 617 624 u32 val = cpuid_feature_extract_unsigned_field(pfr1, ID_AA64PFR1_EL1_MTE_SHIFT); ··· 843 836 { 844 837 return IS_ENABLED(CONFIG_ARM64_POE) && 845 838 alternative_has_cap_unlikely(ARM64_HAS_S1POE); 839 + } 840 + 841 + static __always_inline bool system_supports_mpam(void) 842 + { 843 + return alternative_has_cap_unlikely(ARM64_MPAM); 844 + } 845 + 846 + static __always_inline bool system_supports_mpam_hcr(void) 847 + { 848 + return alternative_has_cap_unlikely(ARM64_MPAM_HCR); 846 849 } 847 850 848 851 int do_emulate_mrs(struct pt_regs *regs, u32 sys_reg, u32 rt);
+14
arch/arm64/include/asm/el2_setup.h
··· 220 220 msr spsr_el2, x0 221 221 .endm 222 222 223 + .macro __init_el2_mpam 224 + /* Memory Partitioning And Monitoring: disable EL2 traps */ 225 + mrs x1, id_aa64pfr0_el1 226 + ubfx x0, x1, #ID_AA64PFR0_EL1_MPAM_SHIFT, #4 227 + cbz x0, .Lskip_mpam_\@ // skip if no MPAM 228 + msr_s SYS_MPAM2_EL2, xzr // use the default partition 229 + // and disable lower traps 230 + mrs_s x0, SYS_MPAMIDR_EL1 231 + tbz x0, #MPAMIDR_EL1_HAS_HCR_SHIFT, .Lskip_mpam_\@ // skip if no MPAMHCR reg 232 + msr_s SYS_MPAMHCR_EL2, xzr // clear TRAP_MPAMIDR_EL1 -> EL2 233 + .Lskip_mpam_\@: 234 + .endm 235 + 223 236 /** 224 237 * Initialize EL2 registers to sane values. This should be called early on all 225 238 * cores that were booted in EL2. Note that everything gets initialised as ··· 250 237 __init_el2_stage2 251 238 __init_el2_gicv3 252 239 __init_el2_hstr 240 + __init_el2_mpam 253 241 __init_el2_nvhe_idregs 254 242 __init_el2_cptr 255 243 __init_el2_fgt
+1 -29
arch/arm64/include/asm/kvm_arm.h
··· 103 103 #define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H) 104 104 105 105 #define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En | HCRX_EL2_EnFPM) 106 + #define MPAMHCR_HOST_FLAGS 0 106 107 107 108 /* TCR_EL2 Registers bits */ 108 109 #define TCR_EL2_DS (1UL << 32) ··· 311 310 GENMASK(23, 22) | \ 312 311 GENMASK(19, 18) | \ 313 312 GENMASK(15, 0)) 314 - 315 - /* Hyp Debug Configuration Register bits */ 316 - #define MDCR_EL2_E2TB_MASK (UL(0x3)) 317 - #define MDCR_EL2_E2TB_SHIFT (UL(24)) 318 - #define MDCR_EL2_HPMFZS (UL(1) << 36) 319 - #define MDCR_EL2_HPMFZO (UL(1) << 29) 320 - #define MDCR_EL2_MTPME (UL(1) << 28) 321 - #define MDCR_EL2_TDCC (UL(1) << 27) 322 - #define MDCR_EL2_HLP (UL(1) << 26) 323 - #define MDCR_EL2_HCCD (UL(1) << 23) 324 - #define MDCR_EL2_TTRF (UL(1) << 19) 325 - #define MDCR_EL2_HPMD (UL(1) << 17) 326 - #define MDCR_EL2_TPMS (UL(1) << 14) 327 - #define MDCR_EL2_E2PB_MASK (UL(0x3)) 328 - #define MDCR_EL2_E2PB_SHIFT (UL(12)) 329 - #define MDCR_EL2_TDRA (UL(1) << 11) 330 - #define MDCR_EL2_TDOSA (UL(1) << 10) 331 - #define MDCR_EL2_TDA (UL(1) << 9) 332 - #define MDCR_EL2_TDE (UL(1) << 8) 333 - #define MDCR_EL2_HPME (UL(1) << 7) 334 - #define MDCR_EL2_TPM (UL(1) << 6) 335 - #define MDCR_EL2_TPMCR (UL(1) << 5) 336 - #define MDCR_EL2_HPMN_MASK (UL(0x1F)) 337 - #define MDCR_EL2_RES0 (GENMASK(63, 37) | \ 338 - GENMASK(35, 30) | \ 339 - GENMASK(25, 24) | \ 340 - GENMASK(22, 20) | \ 341 - BIT(18) | \ 342 - GENMASK(16, 15)) 343 313 344 314 /* 345 315 * FGT register definitions
-1
arch/arm64/include/asm/kvm_asm.h
··· 76 76 __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff, 77 77 __KVM_HOST_SMCCC_FUNC___vgic_v3_save_vmcr_aprs, 78 78 __KVM_HOST_SMCCC_FUNC___vgic_v3_restore_vmcr_aprs, 79 - __KVM_HOST_SMCCC_FUNC___pkvm_vcpu_init_traps, 80 79 __KVM_HOST_SMCCC_FUNC___pkvm_init_vm, 81 80 __KVM_HOST_SMCCC_FUNC___pkvm_init_vcpu, 82 81 __KVM_HOST_SMCCC_FUNC___pkvm_teardown_vm,
+9
arch/arm64/include/asm/kvm_emulate.h
··· 225 225 return vcpu_has_nv(vcpu) && __is_hyp_ctxt(&vcpu->arch.ctxt); 226 226 } 227 227 228 + static inline bool vcpu_is_host_el0(const struct kvm_vcpu *vcpu) 229 + { 230 + return is_hyp_ctxt(vcpu) && !vcpu_is_el2(vcpu); 231 + } 232 + 228 233 /* 229 234 * The layout of SPSR for an AArch32 state is different when observed from an 230 235 * AArch64 SPSR_ELx or an AArch32 SPSR_*. This function generates the AArch32 ··· 698 693 return __guest_hyp_cptr_xen_trap_enabled(vcpu, ZEN); 699 694 } 700 695 696 + static inline void kvm_vcpu_enable_ptrauth(struct kvm_vcpu *vcpu) 697 + { 698 + vcpu_set_flag(vcpu, GUEST_HAS_PTRAUTH); 699 + } 701 700 #endif /* __ARM64_KVM_EMULATE_H__ */
+35 -9
arch/arm64/include/asm/kvm_host.h
··· 74 74 static inline enum kvm_mode kvm_get_mode(void) { return KVM_MODE_NONE; }; 75 75 #endif 76 76 77 - DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use); 78 - 79 77 extern unsigned int __ro_after_init kvm_sve_max_vl; 80 78 extern unsigned int __ro_after_init kvm_host_sve_max_vl; 81 79 int __init kvm_arm_init_sve(void); ··· 372 374 373 375 u64 ctr_el0; 374 376 375 - /* Masks for VNCR-baked sysregs */ 377 + /* Masks for VNCR-backed and general EL2 sysregs */ 376 378 struct kvm_sysreg_masks *sysreg_masks; 377 379 378 380 /* ··· 405 407 __before_##r, \ 406 408 r = __VNCR_START__ + ((VNCR_ ## r) / 8), \ 407 409 __after_##r = __MAX__(__before_##r - 1, r) 410 + 411 + #define MARKER(m) \ 412 + m, __after_##m = m - 1 408 413 409 414 enum vcpu_sysreg { 410 415 __INVALID_SYSREG__, /* 0 is reserved as an invalid value */ ··· 469 468 /* EL2 registers */ 470 469 SCTLR_EL2, /* System Control Register (EL2) */ 471 470 ACTLR_EL2, /* Auxiliary Control Register (EL2) */ 472 - MDCR_EL2, /* Monitor Debug Configuration Register (EL2) */ 473 471 CPTR_EL2, /* Architectural Feature Trap Register (EL2) */ 474 472 HACR_EL2, /* Hypervisor Auxiliary Control Register */ 475 473 ZCR_EL2, /* SVE Control Register (EL2) */ 476 474 TTBR0_EL2, /* Translation Table Base Register 0 (EL2) */ 477 475 TTBR1_EL2, /* Translation Table Base Register 1 (EL2) */ 478 476 TCR_EL2, /* Translation Control Register (EL2) */ 477 + PIRE0_EL2, /* Permission Indirection Register 0 (EL2) */ 478 + PIR_EL2, /* Permission Indirection Register 1 (EL2) */ 479 + POR_EL2, /* Permission Overlay Register 2 (EL2) */ 479 480 SPSR_EL2, /* EL2 saved program status register */ 480 481 ELR_EL2, /* EL2 exception link register */ 481 482 AFSR0_EL2, /* Auxiliary Fault Status Register 0 (EL2) */ ··· 497 494 CNTHV_CTL_EL2, 498 495 CNTHV_CVAL_EL2, 499 496 500 - __VNCR_START__, /* Any VNCR-capable reg goes after this point */ 497 + /* Anything from this can be RES0/RES1 sanitised */ 498 + MARKER(__SANITISED_REG_START__), 499 + TCR2_EL2, /* Extended Translation Control Register (EL2) */ 500 + MDCR_EL2, /* Monitor Debug Configuration Register (EL2) */ 501 + 502 + /* Any VNCR-capable reg goes after this point */ 503 + MARKER(__VNCR_START__), 501 504 502 505 VNCR(SCTLR_EL1),/* System Control Register */ 503 506 VNCR(ACTLR_EL1),/* Auxiliary Control Register */ ··· 563 554 struct { 564 555 u64 res0; 565 556 u64 res1; 566 - } mask[NR_SYS_REGS - __VNCR_START__]; 557 + } mask[NR_SYS_REGS - __SANITISED_REG_START__]; 567 558 }; 568 559 569 560 struct kvm_cpu_context { ··· 1011 1002 1012 1003 #define ctxt_sys_reg(c,r) (*__ctxt_sys_reg(c,r)) 1013 1004 1014 - u64 kvm_vcpu_sanitise_vncr_reg(const struct kvm_vcpu *, enum vcpu_sysreg); 1005 + u64 kvm_vcpu_apply_reg_masks(const struct kvm_vcpu *, enum vcpu_sysreg, u64); 1015 1006 #define __vcpu_sys_reg(v,r) \ 1016 1007 (*({ \ 1017 1008 const struct kvm_cpu_context *ctxt = &(v)->arch.ctxt; \ 1018 1009 u64 *__r = __ctxt_sys_reg(ctxt, (r)); \ 1019 - if (vcpu_has_nv((v)) && (r) >= __VNCR_START__) \ 1020 - *__r = kvm_vcpu_sanitise_vncr_reg((v), (r)); \ 1010 + if (vcpu_has_nv((v)) && (r) >= __SANITISED_REG_START__) \ 1011 + *__r = kvm_vcpu_apply_reg_masks((v), (r), *__r);\ 1021 1012 __r; \ 1022 1013 })) 1023 1014 ··· 1046 1037 case TTBR0_EL1: *val = read_sysreg_s(SYS_TTBR0_EL12); break; 1047 1038 case TTBR1_EL1: *val = read_sysreg_s(SYS_TTBR1_EL12); break; 1048 1039 case TCR_EL1: *val = read_sysreg_s(SYS_TCR_EL12); break; 1040 + case TCR2_EL1: *val = read_sysreg_s(SYS_TCR2_EL12); break; 1041 + case PIR_EL1: *val = read_sysreg_s(SYS_PIR_EL12); break; 1042 + case PIRE0_EL1: *val = read_sysreg_s(SYS_PIRE0_EL12); break; 1043 + case POR_EL1: *val = read_sysreg_s(SYS_POR_EL12); break; 1049 1044 case ESR_EL1: *val = read_sysreg_s(SYS_ESR_EL12); break; 1050 1045 case AFSR0_EL1: *val = read_sysreg_s(SYS_AFSR0_EL12); break; 1051 1046 case AFSR1_EL1: *val = read_sysreg_s(SYS_AFSR1_EL12); break; ··· 1096 1083 case TTBR0_EL1: write_sysreg_s(val, SYS_TTBR0_EL12); break; 1097 1084 case TTBR1_EL1: write_sysreg_s(val, SYS_TTBR1_EL12); break; 1098 1085 case TCR_EL1: write_sysreg_s(val, SYS_TCR_EL12); break; 1086 + case TCR2_EL1: write_sysreg_s(val, SYS_TCR2_EL12); break; 1087 + case PIR_EL1: write_sysreg_s(val, SYS_PIR_EL12); break; 1088 + case PIRE0_EL1: write_sysreg_s(val, SYS_PIRE0_EL12); break; 1089 + case POR_EL1: write_sysreg_s(val, SYS_POR_EL12); break; 1099 1090 case ESR_EL1: write_sysreg_s(val, SYS_ESR_EL12); break; 1100 1091 case AFSR0_EL1: write_sysreg_s(val, SYS_AFSR0_EL12); break; 1101 1092 case AFSR1_EL1: write_sysreg_s(val, SYS_AFSR1_EL12); break; ··· 1519 1502 #define kvm_has_fpmr(k) \ 1520 1503 (system_supports_fpmr() && \ 1521 1504 kvm_has_feat((k), ID_AA64PFR2_EL1, FPMR, IMP)) 1505 + 1506 + #define kvm_has_tcr2(k) \ 1507 + (kvm_has_feat((k), ID_AA64MMFR3_EL1, TCRX, IMP)) 1508 + 1509 + #define kvm_has_s1pie(k) \ 1510 + (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1PIE, IMP)) 1511 + 1512 + #define kvm_has_s1poe(k) \ 1513 + (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP)) 1522 1514 1523 1515 #endif /* __ARM64_KVM_HOST_H__ */
-12
arch/arm64/include/asm/sysreg.h
··· 542 542 543 543 #define SYS_MAIR_EL2 sys_reg(3, 4, 10, 2, 0) 544 544 #define SYS_AMAIR_EL2 sys_reg(3, 4, 10, 3, 0) 545 - #define SYS_MPAMHCR_EL2 sys_reg(3, 4, 10, 4, 0) 546 - #define SYS_MPAMVPMV_EL2 sys_reg(3, 4, 10, 4, 1) 547 - #define SYS_MPAM2_EL2 sys_reg(3, 4, 10, 5, 0) 548 - #define __SYS__MPAMVPMx_EL2(x) sys_reg(3, 4, 10, 6, x) 549 - #define SYS_MPAMVPM0_EL2 __SYS__MPAMVPMx_EL2(0) 550 - #define SYS_MPAMVPM1_EL2 __SYS__MPAMVPMx_EL2(1) 551 - #define SYS_MPAMVPM2_EL2 __SYS__MPAMVPMx_EL2(2) 552 - #define SYS_MPAMVPM3_EL2 __SYS__MPAMVPMx_EL2(3) 553 - #define SYS_MPAMVPM4_EL2 __SYS__MPAMVPMx_EL2(4) 554 - #define SYS_MPAMVPM5_EL2 __SYS__MPAMVPMx_EL2(5) 555 - #define SYS_MPAMVPM6_EL2 __SYS__MPAMVPMx_EL2(6) 556 - #define SYS_MPAMVPM7_EL2 __SYS__MPAMVPMx_EL2(7) 557 545 558 546 #define SYS_VBAR_EL2 sys_reg(3, 4, 12, 0, 0) 559 547 #define SYS_RVBAR_EL2 sys_reg(3, 4, 12, 0, 1)
-1
arch/arm64/include/asm/vncr_mapping.h
··· 50 50 #define VNCR_VBAR_EL1 0x250 51 51 #define VNCR_TCR2_EL1 0x270 52 52 #define VNCR_PIRE0_EL1 0x290 53 - #define VNCR_PIRE0_EL2 0x298 54 53 #define VNCR_PIR_EL1 0x2A0 55 54 #define VNCR_POR_EL1 0x2A8 56 55 #define VNCR_ICH_LR0_EL2 0x400
+6
arch/arm64/include/uapi/asm/kvm.h
··· 484 484 */ 485 485 #define KVM_SYSTEM_EVENT_RESET_FLAG_PSCI_RESET2 (1ULL << 0) 486 486 487 + /* 488 + * Shutdown caused by a PSCI v1.3 SYSTEM_OFF2 call. 489 + * Valid only when the system event has a type of KVM_SYSTEM_EVENT_SHUTDOWN. 490 + */ 491 + #define KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2 (1ULL << 0) 492 + 487 493 /* run->fail_entry.hardware_entry_failure_reason codes. */ 488 494 #define KVM_EXIT_FAIL_ENTRY_CPU_UNSUPPORTED (1ULL << 0) 489 495
+96
arch/arm64/kernel/cpufeature.c
··· 684 684 ARM64_FTR_END, 685 685 }; 686 686 687 + static const struct arm64_ftr_bits ftr_mpamidr[] = { 688 + ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, MPAMIDR_EL1_PMG_MAX_SHIFT, MPAMIDR_EL1_PMG_MAX_WIDTH, 0), 689 + ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, MPAMIDR_EL1_VPMR_MAX_SHIFT, MPAMIDR_EL1_VPMR_MAX_WIDTH, 0), 690 + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, MPAMIDR_EL1_HAS_HCR_SHIFT, 1, 0), 691 + ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, MPAMIDR_EL1_PARTID_MAX_SHIFT, MPAMIDR_EL1_PARTID_MAX_WIDTH, 0), 692 + ARM64_FTR_END, 693 + }; 694 + 687 695 /* 688 696 * Common ftr bits for a 32bit register with all hidden, strict 689 697 * attributes, with 4bit feature fields and a default safe value of ··· 811 803 &id_aa64mmfr2_override), 812 804 ARM64_FTR_REG(SYS_ID_AA64MMFR3_EL1, ftr_id_aa64mmfr3), 813 805 ARM64_FTR_REG(SYS_ID_AA64MMFR4_EL1, ftr_id_aa64mmfr4), 806 + 807 + /* Op1 = 0, CRn = 10, CRm = 4 */ 808 + ARM64_FTR_REG(SYS_MPAMIDR_EL1, ftr_mpamidr), 814 809 815 810 /* Op1 = 1, CRn = 0, CRm = 0 */ 816 811 ARM64_FTR_REG(SYS_GMID_EL1, ftr_gmid), ··· 1174 1163 cpacr_restore(cpacr); 1175 1164 } 1176 1165 1166 + if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0)) 1167 + init_cpu_ftr_reg(SYS_MPAMIDR_EL1, info->reg_mpamidr); 1168 + 1177 1169 if (id_aa64pfr1_mte(info->reg_id_aa64pfr1)) 1178 1170 init_cpu_ftr_reg(SYS_GMID_EL1, info->reg_gmid); 1179 1171 } ··· 1431 1417 vec_update_vq_map(ARM64_VEC_SME); 1432 1418 1433 1419 cpacr_restore(cpacr); 1420 + } 1421 + 1422 + if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0)) { 1423 + taint |= check_update_ftr_reg(SYS_MPAMIDR_EL1, cpu, 1424 + info->reg_mpamidr, boot->reg_mpamidr); 1434 1425 } 1435 1426 1436 1427 /* ··· 2396 2377 return !!(cap->type & ARM64_CPUCAP_PANIC_ON_CONFLICT); 2397 2378 } 2398 2379 2380 + static bool 2381 + test_has_mpam(const struct arm64_cpu_capabilities *entry, int scope) 2382 + { 2383 + if (!has_cpuid_feature(entry, scope)) 2384 + return false; 2385 + 2386 + /* Check firmware actually enabled MPAM on this cpu. */ 2387 + return (read_sysreg_s(SYS_MPAM1_EL1) & MPAM1_EL1_MPAMEN); 2388 + } 2389 + 2390 + static void 2391 + cpu_enable_mpam(const struct arm64_cpu_capabilities *entry) 2392 + { 2393 + /* 2394 + * Access by the kernel (at EL1) should use the reserved PARTID 2395 + * which is configured unrestricted. This avoids priority-inversion 2396 + * where latency sensitive tasks have to wait for a task that has 2397 + * been throttled to release the lock. 2398 + */ 2399 + write_sysreg_s(0, SYS_MPAM1_EL1); 2400 + } 2401 + 2402 + static bool 2403 + test_has_mpam_hcr(const struct arm64_cpu_capabilities *entry, int scope) 2404 + { 2405 + u64 idr = read_sanitised_ftr_reg(SYS_MPAMIDR_EL1); 2406 + 2407 + return idr & MPAMIDR_EL1_HAS_HCR; 2408 + } 2409 + 2399 2410 static const struct arm64_cpu_capabilities arm64_features[] = { 2400 2411 { 2401 2412 .capability = ARM64_ALWAYS_BOOT, ··· 2922 2873 #endif 2923 2874 }, 2924 2875 #endif 2876 + { 2877 + .desc = "Memory Partitioning And Monitoring", 2878 + .type = ARM64_CPUCAP_SYSTEM_FEATURE, 2879 + .capability = ARM64_MPAM, 2880 + .matches = test_has_mpam, 2881 + .cpu_enable = cpu_enable_mpam, 2882 + ARM64_CPUID_FIELDS(ID_AA64PFR0_EL1, MPAM, 1) 2883 + }, 2884 + { 2885 + .desc = "Memory Partitioning And Monitoring Virtualisation", 2886 + .type = ARM64_CPUCAP_SYSTEM_FEATURE, 2887 + .capability = ARM64_MPAM_HCR, 2888 + .matches = test_has_mpam_hcr, 2889 + }, 2925 2890 { 2926 2891 .desc = "NV1", 2927 2892 .capability = ARM64_HAS_HCR_NV1, ··· 3459 3396 } 3460 3397 } 3461 3398 3399 + static void verify_mpam_capabilities(void) 3400 + { 3401 + u64 cpu_idr = read_cpuid(ID_AA64PFR0_EL1); 3402 + u64 sys_idr = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1); 3403 + u16 cpu_partid_max, cpu_pmg_max, sys_partid_max, sys_pmg_max; 3404 + 3405 + if (FIELD_GET(ID_AA64PFR0_EL1_MPAM_MASK, cpu_idr) != 3406 + FIELD_GET(ID_AA64PFR0_EL1_MPAM_MASK, sys_idr)) { 3407 + pr_crit("CPU%d: MPAM version mismatch\n", smp_processor_id()); 3408 + cpu_die_early(); 3409 + } 3410 + 3411 + cpu_idr = read_cpuid(MPAMIDR_EL1); 3412 + sys_idr = read_sanitised_ftr_reg(SYS_MPAMIDR_EL1); 3413 + if (FIELD_GET(MPAMIDR_EL1_HAS_HCR, cpu_idr) != 3414 + FIELD_GET(MPAMIDR_EL1_HAS_HCR, sys_idr)) { 3415 + pr_crit("CPU%d: Missing MPAM HCR\n", smp_processor_id()); 3416 + cpu_die_early(); 3417 + } 3418 + 3419 + cpu_partid_max = FIELD_GET(MPAMIDR_EL1_PARTID_MAX, cpu_idr); 3420 + cpu_pmg_max = FIELD_GET(MPAMIDR_EL1_PMG_MAX, cpu_idr); 3421 + sys_partid_max = FIELD_GET(MPAMIDR_EL1_PARTID_MAX, sys_idr); 3422 + sys_pmg_max = FIELD_GET(MPAMIDR_EL1_PMG_MAX, sys_idr); 3423 + if (cpu_partid_max < sys_partid_max || cpu_pmg_max < sys_pmg_max) { 3424 + pr_crit("CPU%d: MPAM PARTID/PMG max values are mismatched\n", smp_processor_id()); 3425 + cpu_die_early(); 3426 + } 3427 + } 3428 + 3462 3429 /* 3463 3430 * Run through the enabled system capabilities and enable() it on this CPU. 3464 3431 * The capabilities were decided based on the available CPUs at the boot time. ··· 3515 3422 3516 3423 if (is_hyp_mode_available()) 3517 3424 verify_hyp_capabilities(); 3425 + 3426 + if (system_supports_mpam()) 3427 + verify_mpam_capabilities(); 3518 3428 } 3519 3429 3520 3430 void check_local_cpu_capabilities(void)
+3
arch/arm64/kernel/cpuinfo.c
··· 478 478 if (id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0)) 479 479 __cpuinfo_store_cpu_32bit(&info->aarch32); 480 480 481 + if (id_aa64pfr0_mpam(info->reg_id_aa64pfr0)) 482 + info->reg_mpamidr = read_cpuid(MPAMIDR_EL1); 483 + 481 484 cpuinfo_detect_icache_policy(info); 482 485 } 483 486
+1 -2
arch/arm64/kvm/arch_timer.c
··· 206 206 207 207 static inline bool userspace_irqchip(struct kvm *kvm) 208 208 { 209 - return static_branch_unlikely(&userspace_irqchip_in_use) && 210 - unlikely(!irqchip_in_kernel(kvm)); 209 + return unlikely(!irqchip_in_kernel(kvm)); 211 210 } 212 211 213 212 static void soft_timer_start(struct hrtimer *hrt, u64 ns)
+3 -23
arch/arm64/kvm/arm.c
··· 69 69 static bool vgic_present, kvm_arm_initialised; 70 70 71 71 static DEFINE_PER_CPU(unsigned char, kvm_hyp_initialized); 72 - DEFINE_STATIC_KEY_FALSE(userspace_irqchip_in_use); 73 72 74 73 bool is_kvm_arm_initialised(void) 75 74 { ··· 502 503 503 504 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) 504 505 { 505 - if (vcpu_has_run_once(vcpu) && unlikely(!irqchip_in_kernel(vcpu->kvm))) 506 - static_branch_dec(&userspace_irqchip_in_use); 507 - 508 506 kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache); 509 507 kvm_timer_vcpu_terminate(vcpu); 510 508 kvm_pmu_vcpu_destroy(vcpu); ··· 844 848 return ret; 845 849 } 846 850 847 - if (!irqchip_in_kernel(kvm)) { 848 - /* 849 - * Tell the rest of the code that there are userspace irqchip 850 - * VMs in the wild. 851 - */ 852 - static_branch_inc(&userspace_irqchip_in_use); 853 - } 854 - 855 - /* 856 - * Initialize traps for protected VMs. 857 - * NOTE: Move to run in EL2 directly, rather than via a hypercall, once 858 - * the code is in place for first run initialization at EL2. 859 - */ 860 - if (kvm_vm_is_protected(kvm)) 861 - kvm_call_hyp_nvhe(__pkvm_vcpu_init_traps, vcpu); 862 - 863 851 mutex_lock(&kvm->arch.config_lock); 864 852 set_bit(KVM_ARCH_FLAG_HAS_RAN_ONCE, &kvm->arch.flags); 865 853 mutex_unlock(&kvm->arch.config_lock); ··· 1057 1077 * state gets updated in kvm_timer_update_run and 1058 1078 * kvm_pmu_update_run below). 1059 1079 */ 1060 - if (static_branch_unlikely(&userspace_irqchip_in_use)) { 1080 + if (unlikely(!irqchip_in_kernel(vcpu->kvm))) { 1061 1081 if (kvm_timer_should_notify_user(vcpu) || 1062 1082 kvm_pmu_should_notify_user(vcpu)) { 1063 1083 *ret = -EINTR; ··· 1179 1199 vcpu->mode = OUTSIDE_GUEST_MODE; 1180 1200 isb(); /* Ensure work in x_flush_hwstate is committed */ 1181 1201 kvm_pmu_sync_hwstate(vcpu); 1182 - if (static_branch_unlikely(&userspace_irqchip_in_use)) 1202 + if (unlikely(!irqchip_in_kernel(vcpu->kvm))) 1183 1203 kvm_timer_sync_user(vcpu); 1184 1204 kvm_vgic_sync_hwstate(vcpu); 1185 1205 local_irq_enable(); ··· 1225 1245 * we don't want vtimer interrupts to race with syncing the 1226 1246 * timer virtual interrupt state. 1227 1247 */ 1228 - if (static_branch_unlikely(&userspace_irqchip_in_use)) 1248 + if (unlikely(!irqchip_in_kernel(vcpu->kvm))) 1229 1249 kvm_timer_sync_user(vcpu); 1230 1250 1231 1251 kvm_arch_vcpu_ctxsync_fp(vcpu);
+411 -73
arch/arm64/kvm/at.c
··· 24 24 unsigned int txsz; 25 25 int sl; 26 26 bool hpd; 27 + bool e0poe; 28 + bool poe; 29 + bool pan; 27 30 bool be; 28 31 bool s2; 29 32 }; ··· 40 37 u8 APTable; 41 38 bool UXNTable; 42 39 bool PXNTable; 40 + bool uwxn; 41 + bool uov; 42 + bool ur; 43 + bool uw; 44 + bool ux; 45 + bool pwxn; 46 + bool pov; 47 + bool pr; 48 + bool pw; 49 + bool px; 43 50 }; 44 51 struct { 45 52 u8 fst; ··· 100 87 } 101 88 } 102 89 90 + static bool s1pie_enabled(struct kvm_vcpu *vcpu, enum trans_regime regime) 91 + { 92 + if (!kvm_has_s1pie(vcpu->kvm)) 93 + return false; 94 + 95 + switch (regime) { 96 + case TR_EL2: 97 + case TR_EL20: 98 + return vcpu_read_sys_reg(vcpu, TCR2_EL2) & TCR2_EL2_PIE; 99 + case TR_EL10: 100 + return (__vcpu_sys_reg(vcpu, HCRX_EL2) & HCRX_EL2_TCR2En) && 101 + (__vcpu_sys_reg(vcpu, TCR2_EL1) & TCR2_EL1x_PIE); 102 + default: 103 + BUG(); 104 + } 105 + } 106 + 107 + static void compute_s1poe(struct kvm_vcpu *vcpu, struct s1_walk_info *wi) 108 + { 109 + u64 val; 110 + 111 + if (!kvm_has_s1poe(vcpu->kvm)) { 112 + wi->poe = wi->e0poe = false; 113 + return; 114 + } 115 + 116 + switch (wi->regime) { 117 + case TR_EL2: 118 + case TR_EL20: 119 + val = vcpu_read_sys_reg(vcpu, TCR2_EL2); 120 + wi->poe = val & TCR2_EL2_POE; 121 + wi->e0poe = (wi->regime == TR_EL20) && (val & TCR2_EL2_E0POE); 122 + break; 123 + case TR_EL10: 124 + if (__vcpu_sys_reg(vcpu, HCRX_EL2) & HCRX_EL2_TCR2En) { 125 + wi->poe = wi->e0poe = false; 126 + return; 127 + } 128 + 129 + val = __vcpu_sys_reg(vcpu, TCR2_EL1); 130 + wi->poe = val & TCR2_EL1x_POE; 131 + wi->e0poe = val & TCR2_EL1x_E0POE; 132 + } 133 + } 134 + 103 135 static int setup_s1_walk(struct kvm_vcpu *vcpu, u32 op, struct s1_walk_info *wi, 104 136 struct s1_walk_result *wr, u64 va) 105 137 { ··· 156 98 157 99 wi->regime = compute_translation_regime(vcpu, op); 158 100 as_el0 = (op == OP_AT_S1E0R || op == OP_AT_S1E0W); 101 + wi->pan = (op == OP_AT_S1E1RP || op == OP_AT_S1E1WP) && 102 + (*vcpu_cpsr(vcpu) & PSR_PAN_BIT); 159 103 160 104 va55 = va & BIT(55); 161 105 ··· 240 180 (va55 ? 241 181 FIELD_GET(TCR_HPD1, tcr) : 242 182 FIELD_GET(TCR_HPD0, tcr))); 183 + /* R_JHSVW */ 184 + wi->hpd |= s1pie_enabled(vcpu, wi->regime); 185 + 186 + /* Do we have POE? */ 187 + compute_s1poe(vcpu, wi); 188 + 189 + /* R_BVXDG */ 190 + wi->hpd |= (wi->poe || wi->e0poe); 243 191 244 192 /* Someone was silly enough to encode TG0/TG1 differently */ 245 193 if (va55) { ··· 480 412 u64 ttbr1; 481 413 u64 tcr; 482 414 u64 mair; 415 + u64 tcr2; 416 + u64 pir; 417 + u64 pire0; 418 + u64 por_el0; 419 + u64 por_el1; 483 420 u64 sctlr; 484 421 u64 vttbr; 485 422 u64 vtcr; ··· 497 424 config->ttbr1 = read_sysreg_el1(SYS_TTBR1); 498 425 config->tcr = read_sysreg_el1(SYS_TCR); 499 426 config->mair = read_sysreg_el1(SYS_MAIR); 427 + if (cpus_have_final_cap(ARM64_HAS_TCR2)) { 428 + config->tcr2 = read_sysreg_el1(SYS_TCR2); 429 + if (cpus_have_final_cap(ARM64_HAS_S1PIE)) { 430 + config->pir = read_sysreg_el1(SYS_PIR); 431 + config->pire0 = read_sysreg_el1(SYS_PIRE0); 432 + } 433 + if (system_supports_poe()) { 434 + config->por_el1 = read_sysreg_el1(SYS_POR); 435 + config->por_el0 = read_sysreg_s(SYS_POR_EL0); 436 + } 437 + } 500 438 config->sctlr = read_sysreg_el1(SYS_SCTLR); 501 439 config->vttbr = read_sysreg(vttbr_el2); 502 440 config->vtcr = read_sysreg(vtcr_el2); ··· 528 444 write_sysreg_el1(config->ttbr1, SYS_TTBR1); 529 445 write_sysreg_el1(config->tcr, SYS_TCR); 530 446 write_sysreg_el1(config->mair, SYS_MAIR); 447 + if (cpus_have_final_cap(ARM64_HAS_TCR2)) { 448 + write_sysreg_el1(config->tcr2, SYS_TCR2); 449 + if (cpus_have_final_cap(ARM64_HAS_S1PIE)) { 450 + write_sysreg_el1(config->pir, SYS_PIR); 451 + write_sysreg_el1(config->pire0, SYS_PIRE0); 452 + } 453 + if (system_supports_poe()) { 454 + write_sysreg_el1(config->por_el1, SYS_POR); 455 + write_sysreg_s(config->por_el0, SYS_POR_EL0); 456 + } 457 + } 531 458 write_sysreg_el1(config->sctlr, SYS_SCTLR); 532 459 write_sysreg(config->vttbr, vttbr_el2); 533 460 write_sysreg(config->vtcr, vtcr_el2); ··· 834 739 if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, PAN, PAN3)) 835 740 return false; 836 741 742 + if (s1pie_enabled(vcpu, regime)) 743 + return true; 744 + 837 745 if (regime == TR_EL10) 838 746 sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1); 839 747 else ··· 845 747 return sctlr & SCTLR_EL1_EPAN; 846 748 } 847 749 750 + static void compute_s1_direct_permissions(struct kvm_vcpu *vcpu, 751 + struct s1_walk_info *wi, 752 + struct s1_walk_result *wr) 753 + { 754 + bool wxn; 755 + 756 + /* Non-hierarchical part of AArch64.S1DirectBasePermissions() */ 757 + if (wi->regime != TR_EL2) { 758 + switch (FIELD_GET(PTE_USER | PTE_RDONLY, wr->desc)) { 759 + case 0b00: 760 + wr->pr = wr->pw = true; 761 + wr->ur = wr->uw = false; 762 + break; 763 + case 0b01: 764 + wr->pr = wr->pw = wr->ur = wr->uw = true; 765 + break; 766 + case 0b10: 767 + wr->pr = true; 768 + wr->pw = wr->ur = wr->uw = false; 769 + break; 770 + case 0b11: 771 + wr->pr = wr->ur = true; 772 + wr->pw = wr->uw = false; 773 + break; 774 + } 775 + 776 + /* We don't use px for anything yet, but hey... */ 777 + wr->px = !((wr->desc & PTE_PXN) || wr->uw); 778 + wr->ux = !(wr->desc & PTE_UXN); 779 + } else { 780 + wr->ur = wr->uw = wr->ux = false; 781 + 782 + if (!(wr->desc & PTE_RDONLY)) { 783 + wr->pr = wr->pw = true; 784 + } else { 785 + wr->pr = true; 786 + wr->pw = false; 787 + } 788 + 789 + /* XN maps to UXN */ 790 + wr->px = !(wr->desc & PTE_UXN); 791 + } 792 + 793 + switch (wi->regime) { 794 + case TR_EL2: 795 + case TR_EL20: 796 + wxn = (vcpu_read_sys_reg(vcpu, SCTLR_EL2) & SCTLR_ELx_WXN); 797 + break; 798 + case TR_EL10: 799 + wxn = (__vcpu_sys_reg(vcpu, SCTLR_EL1) & SCTLR_ELx_WXN); 800 + break; 801 + } 802 + 803 + wr->pwxn = wr->uwxn = wxn; 804 + wr->pov = wi->poe; 805 + wr->uov = wi->e0poe; 806 + } 807 + 808 + static void compute_s1_hierarchical_permissions(struct kvm_vcpu *vcpu, 809 + struct s1_walk_info *wi, 810 + struct s1_walk_result *wr) 811 + { 812 + /* Hierarchical part of AArch64.S1DirectBasePermissions() */ 813 + if (wi->regime != TR_EL2) { 814 + switch (wr->APTable) { 815 + case 0b00: 816 + break; 817 + case 0b01: 818 + wr->ur = wr->uw = false; 819 + break; 820 + case 0b10: 821 + wr->pw = wr->uw = false; 822 + break; 823 + case 0b11: 824 + wr->pw = wr->ur = wr->uw = false; 825 + break; 826 + } 827 + 828 + wr->px &= !wr->PXNTable; 829 + wr->ux &= !wr->UXNTable; 830 + } else { 831 + if (wr->APTable & BIT(1)) 832 + wr->pw = false; 833 + 834 + /* XN maps to UXN */ 835 + wr->px &= !wr->UXNTable; 836 + } 837 + } 838 + 839 + #define perm_idx(v, r, i) ((vcpu_read_sys_reg((v), (r)) >> ((i) * 4)) & 0xf) 840 + 841 + #define set_priv_perms(wr, r, w, x) \ 842 + do { \ 843 + (wr)->pr = (r); \ 844 + (wr)->pw = (w); \ 845 + (wr)->px = (x); \ 846 + } while (0) 847 + 848 + #define set_unpriv_perms(wr, r, w, x) \ 849 + do { \ 850 + (wr)->ur = (r); \ 851 + (wr)->uw = (w); \ 852 + (wr)->ux = (x); \ 853 + } while (0) 854 + 855 + #define set_priv_wxn(wr, v) \ 856 + do { \ 857 + (wr)->pwxn = (v); \ 858 + } while (0) 859 + 860 + #define set_unpriv_wxn(wr, v) \ 861 + do { \ 862 + (wr)->uwxn = (v); \ 863 + } while (0) 864 + 865 + /* Similar to AArch64.S1IndirectBasePermissions(), without GCS */ 866 + #define set_perms(w, wr, ip) \ 867 + do { \ 868 + /* R_LLZDZ */ \ 869 + switch ((ip)) { \ 870 + case 0b0000: \ 871 + set_ ## w ## _perms((wr), false, false, false); \ 872 + break; \ 873 + case 0b0001: \ 874 + set_ ## w ## _perms((wr), true , false, false); \ 875 + break; \ 876 + case 0b0010: \ 877 + set_ ## w ## _perms((wr), false, false, true ); \ 878 + break; \ 879 + case 0b0011: \ 880 + set_ ## w ## _perms((wr), true , false, true ); \ 881 + break; \ 882 + case 0b0100: \ 883 + set_ ## w ## _perms((wr), false, false, false); \ 884 + break; \ 885 + case 0b0101: \ 886 + set_ ## w ## _perms((wr), true , true , false); \ 887 + break; \ 888 + case 0b0110: \ 889 + set_ ## w ## _perms((wr), true , true , true ); \ 890 + break; \ 891 + case 0b0111: \ 892 + set_ ## w ## _perms((wr), true , true , true ); \ 893 + break; \ 894 + case 0b1000: \ 895 + set_ ## w ## _perms((wr), true , false, false); \ 896 + break; \ 897 + case 0b1001: \ 898 + set_ ## w ## _perms((wr), true , false, false); \ 899 + break; \ 900 + case 0b1010: \ 901 + set_ ## w ## _perms((wr), true , false, true ); \ 902 + break; \ 903 + case 0b1011: \ 904 + set_ ## w ## _perms((wr), false, false, false); \ 905 + break; \ 906 + case 0b1100: \ 907 + set_ ## w ## _perms((wr), true , true , false); \ 908 + break; \ 909 + case 0b1101: \ 910 + set_ ## w ## _perms((wr), false, false, false); \ 911 + break; \ 912 + case 0b1110: \ 913 + set_ ## w ## _perms((wr), true , true , true ); \ 914 + break; \ 915 + case 0b1111: \ 916 + set_ ## w ## _perms((wr), false, false, false); \ 917 + break; \ 918 + } \ 919 + \ 920 + /* R_HJYGR */ \ 921 + set_ ## w ## _wxn((wr), ((ip) == 0b0110)); \ 922 + \ 923 + } while (0) 924 + 925 + static void compute_s1_indirect_permissions(struct kvm_vcpu *vcpu, 926 + struct s1_walk_info *wi, 927 + struct s1_walk_result *wr) 928 + { 929 + u8 up, pp, idx; 930 + 931 + idx = pte_pi_index(wr->desc); 932 + 933 + switch (wi->regime) { 934 + case TR_EL10: 935 + pp = perm_idx(vcpu, PIR_EL1, idx); 936 + up = perm_idx(vcpu, PIRE0_EL1, idx); 937 + break; 938 + case TR_EL20: 939 + pp = perm_idx(vcpu, PIR_EL2, idx); 940 + up = perm_idx(vcpu, PIRE0_EL2, idx); 941 + break; 942 + case TR_EL2: 943 + pp = perm_idx(vcpu, PIR_EL2, idx); 944 + up = 0; 945 + break; 946 + } 947 + 948 + set_perms(priv, wr, pp); 949 + 950 + if (wi->regime != TR_EL2) 951 + set_perms(unpriv, wr, up); 952 + else 953 + set_unpriv_perms(wr, false, false, false); 954 + 955 + wr->pov = wi->poe && !(pp & BIT(3)); 956 + wr->uov = wi->e0poe && !(up & BIT(3)); 957 + 958 + /* R_VFPJF */ 959 + if (wr->px && wr->uw) { 960 + set_priv_perms(wr, false, false, false); 961 + set_unpriv_perms(wr, false, false, false); 962 + } 963 + } 964 + 965 + static void compute_s1_overlay_permissions(struct kvm_vcpu *vcpu, 966 + struct s1_walk_info *wi, 967 + struct s1_walk_result *wr) 968 + { 969 + u8 idx, pov_perms, uov_perms; 970 + 971 + idx = FIELD_GET(PTE_PO_IDX_MASK, wr->desc); 972 + 973 + switch (wi->regime) { 974 + case TR_EL10: 975 + pov_perms = perm_idx(vcpu, POR_EL1, idx); 976 + uov_perms = perm_idx(vcpu, POR_EL0, idx); 977 + break; 978 + case TR_EL20: 979 + pov_perms = perm_idx(vcpu, POR_EL2, idx); 980 + uov_perms = perm_idx(vcpu, POR_EL0, idx); 981 + break; 982 + case TR_EL2: 983 + pov_perms = perm_idx(vcpu, POR_EL2, idx); 984 + uov_perms = 0; 985 + break; 986 + } 987 + 988 + if (pov_perms & ~POE_RXW) 989 + pov_perms = POE_NONE; 990 + 991 + if (wi->poe && wr->pov) { 992 + wr->pr &= pov_perms & POE_R; 993 + wr->px &= pov_perms & POE_X; 994 + wr->pw &= pov_perms & POE_W; 995 + } 996 + 997 + if (uov_perms & ~POE_RXW) 998 + uov_perms = POE_NONE; 999 + 1000 + if (wi->e0poe && wr->uov) { 1001 + wr->ur &= uov_perms & POE_R; 1002 + wr->ux &= uov_perms & POE_X; 1003 + wr->uw &= uov_perms & POE_W; 1004 + } 1005 + } 1006 + 1007 + static void compute_s1_permissions(struct kvm_vcpu *vcpu, 1008 + struct s1_walk_info *wi, 1009 + struct s1_walk_result *wr) 1010 + { 1011 + bool pan; 1012 + 1013 + if (!s1pie_enabled(vcpu, wi->regime)) 1014 + compute_s1_direct_permissions(vcpu, wi, wr); 1015 + else 1016 + compute_s1_indirect_permissions(vcpu, wi, wr); 1017 + 1018 + if (!wi->hpd) 1019 + compute_s1_hierarchical_permissions(vcpu, wi, wr); 1020 + 1021 + if (wi->poe || wi->e0poe) 1022 + compute_s1_overlay_permissions(vcpu, wi, wr); 1023 + 1024 + /* R_QXXPC */ 1025 + if (wr->pwxn) { 1026 + if (!wr->pov && wr->pw) 1027 + wr->px = false; 1028 + if (wr->pov && wr->px) 1029 + wr->pw = false; 1030 + } 1031 + 1032 + /* R_NPBXC */ 1033 + if (wr->uwxn) { 1034 + if (!wr->uov && wr->uw) 1035 + wr->ux = false; 1036 + if (wr->uov && wr->ux) 1037 + wr->uw = false; 1038 + } 1039 + 1040 + pan = wi->pan && (wr->ur || wr->uw || 1041 + (pan3_enabled(vcpu, wi->regime) && wr->ux)); 1042 + wr->pw &= !pan; 1043 + wr->pr &= !pan; 1044 + } 1045 + 848 1046 static u64 handle_at_slow(struct kvm_vcpu *vcpu, u32 op, u64 vaddr) 849 1047 { 850 - bool perm_fail, ur, uw, ux, pr, pw, px; 851 1048 struct s1_walk_result wr = {}; 852 1049 struct s1_walk_info wi = {}; 1050 + bool perm_fail = false; 853 1051 int ret, idx; 854 1052 855 1053 ret = setup_s1_walk(vcpu, op, &wi, &wr, vaddr); ··· 1164 770 if (ret) 1165 771 goto compute_par; 1166 772 1167 - /* FIXME: revisit when adding indirect permission support */ 1168 - /* AArch64.S1DirectBasePermissions() */ 1169 - if (wi.regime != TR_EL2) { 1170 - switch (FIELD_GET(PTE_USER | PTE_RDONLY, wr.desc)) { 1171 - case 0b00: 1172 - pr = pw = true; 1173 - ur = uw = false; 1174 - break; 1175 - case 0b01: 1176 - pr = pw = ur = uw = true; 1177 - break; 1178 - case 0b10: 1179 - pr = true; 1180 - pw = ur = uw = false; 1181 - break; 1182 - case 0b11: 1183 - pr = ur = true; 1184 - pw = uw = false; 1185 - break; 1186 - } 1187 - 1188 - switch (wr.APTable) { 1189 - case 0b00: 1190 - break; 1191 - case 0b01: 1192 - ur = uw = false; 1193 - break; 1194 - case 0b10: 1195 - pw = uw = false; 1196 - break; 1197 - case 0b11: 1198 - pw = ur = uw = false; 1199 - break; 1200 - } 1201 - 1202 - /* We don't use px for anything yet, but hey... */ 1203 - px = !((wr.desc & PTE_PXN) || wr.PXNTable || uw); 1204 - ux = !((wr.desc & PTE_UXN) || wr.UXNTable); 1205 - 1206 - if (op == OP_AT_S1E1RP || op == OP_AT_S1E1WP) { 1207 - bool pan; 1208 - 1209 - pan = *vcpu_cpsr(vcpu) & PSR_PAN_BIT; 1210 - pan &= ur || uw || (pan3_enabled(vcpu, wi.regime) && ux); 1211 - pw &= !pan; 1212 - pr &= !pan; 1213 - } 1214 - } else { 1215 - ur = uw = ux = false; 1216 - 1217 - if (!(wr.desc & PTE_RDONLY)) { 1218 - pr = pw = true; 1219 - } else { 1220 - pr = true; 1221 - pw = false; 1222 - } 1223 - 1224 - if (wr.APTable & BIT(1)) 1225 - pw = false; 1226 - 1227 - /* XN maps to UXN */ 1228 - px = !((wr.desc & PTE_UXN) || wr.UXNTable); 1229 - } 1230 - 1231 - perm_fail = false; 773 + compute_s1_permissions(vcpu, &wi, &wr); 1232 774 1233 775 switch (op) { 1234 776 case OP_AT_S1E1RP: 1235 777 case OP_AT_S1E1R: 1236 778 case OP_AT_S1E2R: 1237 - perm_fail = !pr; 779 + perm_fail = !wr.pr; 1238 780 break; 1239 781 case OP_AT_S1E1WP: 1240 782 case OP_AT_S1E1W: 1241 783 case OP_AT_S1E2W: 1242 - perm_fail = !pw; 784 + perm_fail = !wr.pw; 1243 785 break; 1244 786 case OP_AT_S1E0R: 1245 - perm_fail = !ur; 787 + perm_fail = !wr.ur; 1246 788 break; 1247 789 case OP_AT_S1E0W: 1248 - perm_fail = !uw; 790 + perm_fail = !wr.uw; 1249 791 break; 1250 792 case OP_AT_S1E1A: 1251 793 case OP_AT_S1E2A: ··· 1244 914 write_sysreg_el1(vcpu_read_sys_reg(vcpu, TTBR1_EL1), SYS_TTBR1); 1245 915 write_sysreg_el1(vcpu_read_sys_reg(vcpu, TCR_EL1), SYS_TCR); 1246 916 write_sysreg_el1(vcpu_read_sys_reg(vcpu, MAIR_EL1), SYS_MAIR); 917 + if (kvm_has_tcr2(vcpu->kvm)) { 918 + write_sysreg_el1(vcpu_read_sys_reg(vcpu, TCR2_EL1), SYS_TCR2); 919 + if (kvm_has_s1pie(vcpu->kvm)) { 920 + write_sysreg_el1(vcpu_read_sys_reg(vcpu, PIR_EL1), SYS_PIR); 921 + write_sysreg_el1(vcpu_read_sys_reg(vcpu, PIRE0_EL1), SYS_PIRE0); 922 + } 923 + if (kvm_has_s1poe(vcpu->kvm)) { 924 + write_sysreg_el1(vcpu_read_sys_reg(vcpu, POR_EL1), SYS_POR); 925 + write_sysreg_s(vcpu_read_sys_reg(vcpu, POR_EL0), SYS_POR_EL0); 926 + } 927 + } 1247 928 write_sysreg_el1(vcpu_read_sys_reg(vcpu, SCTLR_EL1), SYS_SCTLR); 1248 929 __load_stage2(mmu, mmu->arch); 1249 930 ··· 1333 992 * switching context behind everybody's back, disable interrupts... 1334 993 */ 1335 994 scoped_guard(write_lock_irqsave, &vcpu->kvm->mmu_lock) { 1336 - struct kvm_s2_mmu *mmu; 1337 995 u64 val, hcr; 1338 996 bool fail; 1339 - 1340 - mmu = &vcpu->kvm->arch.mmu; 1341 997 1342 998 val = hcr = read_sysreg(hcr_el2); 1343 999 val &= ~HCR_TGE;
+179 -122
arch/arm64/kvm/emulate-nested.c
··· 16 16 17 17 enum trap_behaviour { 18 18 BEHAVE_HANDLE_LOCALLY = 0, 19 + 19 20 BEHAVE_FORWARD_READ = BIT(0), 20 21 BEHAVE_FORWARD_WRITE = BIT(1), 21 - BEHAVE_FORWARD_ANY = BEHAVE_FORWARD_READ | BEHAVE_FORWARD_WRITE, 22 + BEHAVE_FORWARD_RW = BEHAVE_FORWARD_READ | BEHAVE_FORWARD_WRITE, 23 + 24 + /* Traps that take effect in Host EL0, this is rare! */ 25 + BEHAVE_FORWARD_IN_HOST_EL0 = BIT(2), 22 26 }; 23 27 24 28 struct trap_bits { ··· 83 79 CGT_MDCR_E2TB, 84 80 CGT_MDCR_TDCC, 85 81 86 - CGT_CPACR_E0POE, 87 82 CGT_CPTR_TAM, 88 83 CGT_CPTR_TCPAC, 89 84 ··· 109 106 CGT_HCR_TPU_TOCU, 110 107 CGT_HCR_NV1_nNV2_ENSCXT, 111 108 CGT_MDCR_TPM_TPMCR, 109 + CGT_MDCR_TPM_HPMN, 112 110 CGT_MDCR_TDE_TDA, 113 111 CGT_MDCR_TDE_TDOSA, 114 112 CGT_MDCR_TDE_TDRA, ··· 126 122 CGT_CNTHCTL_EL1PTEN, 127 123 128 124 CGT_CPTR_TTA, 125 + CGT_MDCR_HPMN, 129 126 130 127 /* Must be last */ 131 128 __NR_CGT_GROUP_IDS__ ··· 143 138 .index = HCR_EL2, 144 139 .value = HCR_TID2, 145 140 .mask = HCR_TID2, 146 - .behaviour = BEHAVE_FORWARD_ANY, 141 + .behaviour = BEHAVE_FORWARD_RW, 147 142 }, 148 143 [CGT_HCR_TID3] = { 149 144 .index = HCR_EL2, ··· 167 162 .index = HCR_EL2, 168 163 .value = HCR_TIDCP, 169 164 .mask = HCR_TIDCP, 170 - .behaviour = BEHAVE_FORWARD_ANY, 165 + .behaviour = BEHAVE_FORWARD_RW, 171 166 }, 172 167 [CGT_HCR_TACR] = { 173 168 .index = HCR_EL2, 174 169 .value = HCR_TACR, 175 170 .mask = HCR_TACR, 176 - .behaviour = BEHAVE_FORWARD_ANY, 171 + .behaviour = BEHAVE_FORWARD_RW, 177 172 }, 178 173 [CGT_HCR_TSW] = { 179 174 .index = HCR_EL2, 180 175 .value = HCR_TSW, 181 176 .mask = HCR_TSW, 182 - .behaviour = BEHAVE_FORWARD_ANY, 177 + .behaviour = BEHAVE_FORWARD_RW, 183 178 }, 184 179 [CGT_HCR_TPC] = { /* Also called TCPC when FEAT_DPB is implemented */ 185 180 .index = HCR_EL2, 186 181 .value = HCR_TPC, 187 182 .mask = HCR_TPC, 188 - .behaviour = BEHAVE_FORWARD_ANY, 183 + .behaviour = BEHAVE_FORWARD_RW, 189 184 }, 190 185 [CGT_HCR_TPU] = { 191 186 .index = HCR_EL2, 192 187 .value = HCR_TPU, 193 188 .mask = HCR_TPU, 194 - .behaviour = BEHAVE_FORWARD_ANY, 189 + .behaviour = BEHAVE_FORWARD_RW, 195 190 }, 196 191 [CGT_HCR_TTLB] = { 197 192 .index = HCR_EL2, 198 193 .value = HCR_TTLB, 199 194 .mask = HCR_TTLB, 200 - .behaviour = BEHAVE_FORWARD_ANY, 195 + .behaviour = BEHAVE_FORWARD_RW, 201 196 }, 202 197 [CGT_HCR_TVM] = { 203 198 .index = HCR_EL2, ··· 209 204 .index = HCR_EL2, 210 205 .value = HCR_TDZ, 211 206 .mask = HCR_TDZ, 212 - .behaviour = BEHAVE_FORWARD_ANY, 207 + .behaviour = BEHAVE_FORWARD_RW, 213 208 }, 214 209 [CGT_HCR_TRVM] = { 215 210 .index = HCR_EL2, ··· 221 216 .index = HCR_EL2, 222 217 .value = HCR_TLOR, 223 218 .mask = HCR_TLOR, 224 - .behaviour = BEHAVE_FORWARD_ANY, 219 + .behaviour = BEHAVE_FORWARD_RW, 225 220 }, 226 221 [CGT_HCR_TERR] = { 227 222 .index = HCR_EL2, 228 223 .value = HCR_TERR, 229 224 .mask = HCR_TERR, 230 - .behaviour = BEHAVE_FORWARD_ANY, 225 + .behaviour = BEHAVE_FORWARD_RW, 231 226 }, 232 227 [CGT_HCR_APK] = { 233 228 .index = HCR_EL2, 234 229 .value = 0, 235 230 .mask = HCR_APK, 236 - .behaviour = BEHAVE_FORWARD_ANY, 231 + .behaviour = BEHAVE_FORWARD_RW, 237 232 }, 238 233 [CGT_HCR_NV] = { 239 234 .index = HCR_EL2, 240 235 .value = HCR_NV, 241 236 .mask = HCR_NV, 242 - .behaviour = BEHAVE_FORWARD_ANY, 237 + .behaviour = BEHAVE_FORWARD_RW, 243 238 }, 244 239 [CGT_HCR_NV_nNV2] = { 245 240 .index = HCR_EL2, 246 241 .value = HCR_NV, 247 242 .mask = HCR_NV | HCR_NV2, 248 - .behaviour = BEHAVE_FORWARD_ANY, 243 + .behaviour = BEHAVE_FORWARD_RW, 249 244 }, 250 245 [CGT_HCR_NV1_nNV2] = { 251 246 .index = HCR_EL2, 252 247 .value = HCR_NV | HCR_NV1, 253 248 .mask = HCR_NV | HCR_NV1 | HCR_NV2, 254 - .behaviour = BEHAVE_FORWARD_ANY, 249 + .behaviour = BEHAVE_FORWARD_RW, 255 250 }, 256 251 [CGT_HCR_AT] = { 257 252 .index = HCR_EL2, 258 253 .value = HCR_AT, 259 254 .mask = HCR_AT, 260 - .behaviour = BEHAVE_FORWARD_ANY, 255 + .behaviour = BEHAVE_FORWARD_RW, 261 256 }, 262 257 [CGT_HCR_nFIEN] = { 263 258 .index = HCR_EL2, 264 259 .value = 0, 265 260 .mask = HCR_FIEN, 266 - .behaviour = BEHAVE_FORWARD_ANY, 261 + .behaviour = BEHAVE_FORWARD_RW, 267 262 }, 268 263 [CGT_HCR_TID4] = { 269 264 .index = HCR_EL2, 270 265 .value = HCR_TID4, 271 266 .mask = HCR_TID4, 272 - .behaviour = BEHAVE_FORWARD_ANY, 267 + .behaviour = BEHAVE_FORWARD_RW, 273 268 }, 274 269 [CGT_HCR_TICAB] = { 275 270 .index = HCR_EL2, 276 271 .value = HCR_TICAB, 277 272 .mask = HCR_TICAB, 278 - .behaviour = BEHAVE_FORWARD_ANY, 273 + .behaviour = BEHAVE_FORWARD_RW, 279 274 }, 280 275 [CGT_HCR_TOCU] = { 281 276 .index = HCR_EL2, 282 277 .value = HCR_TOCU, 283 278 .mask = HCR_TOCU, 284 - .behaviour = BEHAVE_FORWARD_ANY, 279 + .behaviour = BEHAVE_FORWARD_RW, 285 280 }, 286 281 [CGT_HCR_ENSCXT] = { 287 282 .index = HCR_EL2, 288 283 .value = 0, 289 284 .mask = HCR_ENSCXT, 290 - .behaviour = BEHAVE_FORWARD_ANY, 285 + .behaviour = BEHAVE_FORWARD_RW, 291 286 }, 292 287 [CGT_HCR_TTLBIS] = { 293 288 .index = HCR_EL2, 294 289 .value = HCR_TTLBIS, 295 290 .mask = HCR_TTLBIS, 296 - .behaviour = BEHAVE_FORWARD_ANY, 291 + .behaviour = BEHAVE_FORWARD_RW, 297 292 }, 298 293 [CGT_HCR_TTLBOS] = { 299 294 .index = HCR_EL2, 300 295 .value = HCR_TTLBOS, 301 296 .mask = HCR_TTLBOS, 302 - .behaviour = BEHAVE_FORWARD_ANY, 297 + .behaviour = BEHAVE_FORWARD_RW, 303 298 }, 304 299 [CGT_MDCR_TPMCR] = { 305 300 .index = MDCR_EL2, 306 301 .value = MDCR_EL2_TPMCR, 307 302 .mask = MDCR_EL2_TPMCR, 308 - .behaviour = BEHAVE_FORWARD_ANY, 303 + .behaviour = BEHAVE_FORWARD_RW | 304 + BEHAVE_FORWARD_IN_HOST_EL0, 309 305 }, 310 306 [CGT_MDCR_TPM] = { 311 307 .index = MDCR_EL2, 312 308 .value = MDCR_EL2_TPM, 313 309 .mask = MDCR_EL2_TPM, 314 - .behaviour = BEHAVE_FORWARD_ANY, 310 + .behaviour = BEHAVE_FORWARD_RW | 311 + BEHAVE_FORWARD_IN_HOST_EL0, 315 312 }, 316 313 [CGT_MDCR_TDE] = { 317 314 .index = MDCR_EL2, 318 315 .value = MDCR_EL2_TDE, 319 316 .mask = MDCR_EL2_TDE, 320 - .behaviour = BEHAVE_FORWARD_ANY, 317 + .behaviour = BEHAVE_FORWARD_RW, 321 318 }, 322 319 [CGT_MDCR_TDA] = { 323 320 .index = MDCR_EL2, 324 321 .value = MDCR_EL2_TDA, 325 322 .mask = MDCR_EL2_TDA, 326 - .behaviour = BEHAVE_FORWARD_ANY, 323 + .behaviour = BEHAVE_FORWARD_RW, 327 324 }, 328 325 [CGT_MDCR_TDOSA] = { 329 326 .index = MDCR_EL2, 330 327 .value = MDCR_EL2_TDOSA, 331 328 .mask = MDCR_EL2_TDOSA, 332 - .behaviour = BEHAVE_FORWARD_ANY, 329 + .behaviour = BEHAVE_FORWARD_RW, 333 330 }, 334 331 [CGT_MDCR_TDRA] = { 335 332 .index = MDCR_EL2, 336 333 .value = MDCR_EL2_TDRA, 337 334 .mask = MDCR_EL2_TDRA, 338 - .behaviour = BEHAVE_FORWARD_ANY, 335 + .behaviour = BEHAVE_FORWARD_RW, 339 336 }, 340 337 [CGT_MDCR_E2PB] = { 341 338 .index = MDCR_EL2, 342 339 .value = 0, 343 340 .mask = BIT(MDCR_EL2_E2PB_SHIFT), 344 - .behaviour = BEHAVE_FORWARD_ANY, 341 + .behaviour = BEHAVE_FORWARD_RW, 345 342 }, 346 343 [CGT_MDCR_TPMS] = { 347 344 .index = MDCR_EL2, 348 345 .value = MDCR_EL2_TPMS, 349 346 .mask = MDCR_EL2_TPMS, 350 - .behaviour = BEHAVE_FORWARD_ANY, 347 + .behaviour = BEHAVE_FORWARD_RW, 351 348 }, 352 349 [CGT_MDCR_TTRF] = { 353 350 .index = MDCR_EL2, 354 351 .value = MDCR_EL2_TTRF, 355 352 .mask = MDCR_EL2_TTRF, 356 - .behaviour = BEHAVE_FORWARD_ANY, 353 + .behaviour = BEHAVE_FORWARD_RW, 357 354 }, 358 355 [CGT_MDCR_E2TB] = { 359 356 .index = MDCR_EL2, 360 357 .value = 0, 361 358 .mask = BIT(MDCR_EL2_E2TB_SHIFT), 362 - .behaviour = BEHAVE_FORWARD_ANY, 359 + .behaviour = BEHAVE_FORWARD_RW, 363 360 }, 364 361 [CGT_MDCR_TDCC] = { 365 362 .index = MDCR_EL2, 366 363 .value = MDCR_EL2_TDCC, 367 364 .mask = MDCR_EL2_TDCC, 368 - .behaviour = BEHAVE_FORWARD_ANY, 369 - }, 370 - [CGT_CPACR_E0POE] = { 371 - .index = CPTR_EL2, 372 - .value = CPACR_ELx_E0POE, 373 - .mask = CPACR_ELx_E0POE, 374 - .behaviour = BEHAVE_FORWARD_ANY, 365 + .behaviour = BEHAVE_FORWARD_RW, 375 366 }, 376 367 [CGT_CPTR_TAM] = { 377 368 .index = CPTR_EL2, 378 369 .value = CPTR_EL2_TAM, 379 370 .mask = CPTR_EL2_TAM, 380 - .behaviour = BEHAVE_FORWARD_ANY, 371 + .behaviour = BEHAVE_FORWARD_RW, 381 372 }, 382 373 [CGT_CPTR_TCPAC] = { 383 374 .index = CPTR_EL2, 384 375 .value = CPTR_EL2_TCPAC, 385 376 .mask = CPTR_EL2_TCPAC, 386 - .behaviour = BEHAVE_FORWARD_ANY, 377 + .behaviour = BEHAVE_FORWARD_RW, 387 378 }, 388 379 [CGT_HCRX_EnFPM] = { 389 380 .index = HCRX_EL2, 390 381 .value = 0, 391 382 .mask = HCRX_EL2_EnFPM, 392 - .behaviour = BEHAVE_FORWARD_ANY, 383 + .behaviour = BEHAVE_FORWARD_RW, 393 384 }, 394 385 [CGT_HCRX_TCR2En] = { 395 386 .index = HCRX_EL2, 396 387 .value = 0, 397 388 .mask = HCRX_EL2_TCR2En, 398 - .behaviour = BEHAVE_FORWARD_ANY, 389 + .behaviour = BEHAVE_FORWARD_RW, 399 390 }, 400 391 [CGT_ICH_HCR_TC] = { 401 392 .index = ICH_HCR_EL2, 402 393 .value = ICH_HCR_TC, 403 394 .mask = ICH_HCR_TC, 404 - .behaviour = BEHAVE_FORWARD_ANY, 395 + .behaviour = BEHAVE_FORWARD_RW, 405 396 }, 406 397 [CGT_ICH_HCR_TALL0] = { 407 398 .index = ICH_HCR_EL2, 408 399 .value = ICH_HCR_TALL0, 409 400 .mask = ICH_HCR_TALL0, 410 - .behaviour = BEHAVE_FORWARD_ANY, 401 + .behaviour = BEHAVE_FORWARD_RW, 411 402 }, 412 403 [CGT_ICH_HCR_TALL1] = { 413 404 .index = ICH_HCR_EL2, 414 405 .value = ICH_HCR_TALL1, 415 406 .mask = ICH_HCR_TALL1, 416 - .behaviour = BEHAVE_FORWARD_ANY, 407 + .behaviour = BEHAVE_FORWARD_RW, 417 408 }, 418 409 [CGT_ICH_HCR_TDIR] = { 419 410 .index = ICH_HCR_EL2, 420 411 .value = ICH_HCR_TDIR, 421 412 .mask = ICH_HCR_TDIR, 422 - .behaviour = BEHAVE_FORWARD_ANY, 413 + .behaviour = BEHAVE_FORWARD_RW, 423 414 }, 424 415 }; 425 416 ··· 436 435 MCB(CGT_HCR_TPU_TOCU, CGT_HCR_TPU, CGT_HCR_TOCU), 437 436 MCB(CGT_HCR_NV1_nNV2_ENSCXT, CGT_HCR_NV1_nNV2, CGT_HCR_ENSCXT), 438 437 MCB(CGT_MDCR_TPM_TPMCR, CGT_MDCR_TPM, CGT_MDCR_TPMCR), 438 + MCB(CGT_MDCR_TPM_HPMN, CGT_MDCR_TPM, CGT_MDCR_HPMN), 439 439 MCB(CGT_MDCR_TDE_TDA, CGT_MDCR_TDE, CGT_MDCR_TDA), 440 440 MCB(CGT_MDCR_TDE_TDOSA, CGT_MDCR_TDE, CGT_MDCR_TDOSA), 441 441 MCB(CGT_MDCR_TDE_TDRA, CGT_MDCR_TDE, CGT_MDCR_TDRA), ··· 476 474 if (get_sanitized_cnthctl(vcpu) & (CNTHCTL_EL1PCTEN << 10)) 477 475 return BEHAVE_HANDLE_LOCALLY; 478 476 479 - return BEHAVE_FORWARD_ANY; 477 + return BEHAVE_FORWARD_RW; 480 478 } 481 479 482 480 static enum trap_behaviour check_cnthctl_el1pten(struct kvm_vcpu *vcpu) ··· 484 482 if (get_sanitized_cnthctl(vcpu) & (CNTHCTL_EL1PCEN << 10)) 485 483 return BEHAVE_HANDLE_LOCALLY; 486 484 487 - return BEHAVE_FORWARD_ANY; 485 + return BEHAVE_FORWARD_RW; 488 486 } 489 487 490 488 static enum trap_behaviour check_cptr_tta(struct kvm_vcpu *vcpu) ··· 495 493 val = translate_cptr_el2_to_cpacr_el1(val); 496 494 497 495 if (val & CPACR_ELx_TTA) 498 - return BEHAVE_FORWARD_ANY; 496 + return BEHAVE_FORWARD_RW; 497 + 498 + return BEHAVE_HANDLE_LOCALLY; 499 + } 500 + 501 + static enum trap_behaviour check_mdcr_hpmn(struct kvm_vcpu *vcpu) 502 + { 503 + u32 sysreg = esr_sys64_to_sysreg(kvm_vcpu_get_esr(vcpu)); 504 + unsigned int idx; 505 + 506 + 507 + switch (sysreg) { 508 + case SYS_PMEVTYPERn_EL0(0) ... SYS_PMEVTYPERn_EL0(30): 509 + case SYS_PMEVCNTRn_EL0(0) ... SYS_PMEVCNTRn_EL0(30): 510 + idx = (sys_reg_CRm(sysreg) & 0x3) << 3 | sys_reg_Op2(sysreg); 511 + break; 512 + case SYS_PMXEVTYPER_EL0: 513 + case SYS_PMXEVCNTR_EL0: 514 + idx = SYS_FIELD_GET(PMSELR_EL0, SEL, 515 + __vcpu_sys_reg(vcpu, PMSELR_EL0)); 516 + break; 517 + default: 518 + /* Someone used this trap helper for something else... */ 519 + KVM_BUG_ON(1, vcpu->kvm); 520 + return BEHAVE_HANDLE_LOCALLY; 521 + } 522 + 523 + if (kvm_pmu_counter_is_hyp(vcpu, idx)) 524 + return BEHAVE_FORWARD_RW | BEHAVE_FORWARD_IN_HOST_EL0; 499 525 500 526 return BEHAVE_HANDLE_LOCALLY; 501 527 } ··· 535 505 CCC(CGT_CNTHCTL_EL1PCTEN, check_cnthctl_el1pcten), 536 506 CCC(CGT_CNTHCTL_EL1PTEN, check_cnthctl_el1pten), 537 507 CCC(CGT_CPTR_TTA, check_cptr_tta), 508 + CCC(CGT_MDCR_HPMN, check_mdcr_hpmn), 538 509 }; 539 510 540 511 /* ··· 742 711 SR_TRAP(SYS_MAIR_EL1, CGT_HCR_TVM_TRVM), 743 712 SR_TRAP(SYS_AMAIR_EL1, CGT_HCR_TVM_TRVM), 744 713 SR_TRAP(SYS_CONTEXTIDR_EL1, CGT_HCR_TVM_TRVM), 714 + SR_TRAP(SYS_PIR_EL1, CGT_HCR_TVM_TRVM), 715 + SR_TRAP(SYS_PIRE0_EL1, CGT_HCR_TVM_TRVM), 716 + SR_TRAP(SYS_POR_EL0, CGT_HCR_TVM_TRVM), 717 + SR_TRAP(SYS_POR_EL1, CGT_HCR_TVM_TRVM), 745 718 SR_TRAP(SYS_TCR2_EL1, CGT_HCR_TVM_TRVM_HCRX_TCR2En), 746 719 SR_TRAP(SYS_DC_ZVA, CGT_HCR_TDZ), 747 720 SR_TRAP(SYS_DC_GVA, CGT_HCR_TDZ), ··· 954 919 SR_TRAP(SYS_PMOVSCLR_EL0, CGT_MDCR_TPM), 955 920 SR_TRAP(SYS_PMCEID0_EL0, CGT_MDCR_TPM), 956 921 SR_TRAP(SYS_PMCEID1_EL0, CGT_MDCR_TPM), 957 - SR_TRAP(SYS_PMXEVTYPER_EL0, CGT_MDCR_TPM), 922 + SR_TRAP(SYS_PMXEVTYPER_EL0, CGT_MDCR_TPM_HPMN), 958 923 SR_TRAP(SYS_PMSWINC_EL0, CGT_MDCR_TPM), 959 924 SR_TRAP(SYS_PMSELR_EL0, CGT_MDCR_TPM), 960 - SR_TRAP(SYS_PMXEVCNTR_EL0, CGT_MDCR_TPM), 925 + SR_TRAP(SYS_PMXEVCNTR_EL0, CGT_MDCR_TPM_HPMN), 961 926 SR_TRAP(SYS_PMCCNTR_EL0, CGT_MDCR_TPM), 962 927 SR_TRAP(SYS_PMUSERENR_EL0, CGT_MDCR_TPM), 963 928 SR_TRAP(SYS_PMINTENSET_EL1, CGT_MDCR_TPM), 964 929 SR_TRAP(SYS_PMINTENCLR_EL1, CGT_MDCR_TPM), 965 930 SR_TRAP(SYS_PMMIR_EL1, CGT_MDCR_TPM), 966 - SR_TRAP(SYS_PMEVCNTRn_EL0(0), CGT_MDCR_TPM), 967 - SR_TRAP(SYS_PMEVCNTRn_EL0(1), CGT_MDCR_TPM), 968 - SR_TRAP(SYS_PMEVCNTRn_EL0(2), CGT_MDCR_TPM), 969 - SR_TRAP(SYS_PMEVCNTRn_EL0(3), CGT_MDCR_TPM), 970 - SR_TRAP(SYS_PMEVCNTRn_EL0(4), CGT_MDCR_TPM), 971 - SR_TRAP(SYS_PMEVCNTRn_EL0(5), CGT_MDCR_TPM), 972 - SR_TRAP(SYS_PMEVCNTRn_EL0(6), CGT_MDCR_TPM), 973 - SR_TRAP(SYS_PMEVCNTRn_EL0(7), CGT_MDCR_TPM), 974 - SR_TRAP(SYS_PMEVCNTRn_EL0(8), CGT_MDCR_TPM), 975 - SR_TRAP(SYS_PMEVCNTRn_EL0(9), CGT_MDCR_TPM), 976 - SR_TRAP(SYS_PMEVCNTRn_EL0(10), CGT_MDCR_TPM), 977 - SR_TRAP(SYS_PMEVCNTRn_EL0(11), CGT_MDCR_TPM), 978 - SR_TRAP(SYS_PMEVCNTRn_EL0(12), CGT_MDCR_TPM), 979 - SR_TRAP(SYS_PMEVCNTRn_EL0(13), CGT_MDCR_TPM), 980 - SR_TRAP(SYS_PMEVCNTRn_EL0(14), CGT_MDCR_TPM), 981 - SR_TRAP(SYS_PMEVCNTRn_EL0(15), CGT_MDCR_TPM), 982 - SR_TRAP(SYS_PMEVCNTRn_EL0(16), CGT_MDCR_TPM), 983 - SR_TRAP(SYS_PMEVCNTRn_EL0(17), CGT_MDCR_TPM), 984 - SR_TRAP(SYS_PMEVCNTRn_EL0(18), CGT_MDCR_TPM), 985 - SR_TRAP(SYS_PMEVCNTRn_EL0(19), CGT_MDCR_TPM), 986 - SR_TRAP(SYS_PMEVCNTRn_EL0(20), CGT_MDCR_TPM), 987 - SR_TRAP(SYS_PMEVCNTRn_EL0(21), CGT_MDCR_TPM), 988 - SR_TRAP(SYS_PMEVCNTRn_EL0(22), CGT_MDCR_TPM), 989 - SR_TRAP(SYS_PMEVCNTRn_EL0(23), CGT_MDCR_TPM), 990 - SR_TRAP(SYS_PMEVCNTRn_EL0(24), CGT_MDCR_TPM), 991 - SR_TRAP(SYS_PMEVCNTRn_EL0(25), CGT_MDCR_TPM), 992 - SR_TRAP(SYS_PMEVCNTRn_EL0(26), CGT_MDCR_TPM), 993 - SR_TRAP(SYS_PMEVCNTRn_EL0(27), CGT_MDCR_TPM), 994 - SR_TRAP(SYS_PMEVCNTRn_EL0(28), CGT_MDCR_TPM), 995 - SR_TRAP(SYS_PMEVCNTRn_EL0(29), CGT_MDCR_TPM), 996 - SR_TRAP(SYS_PMEVCNTRn_EL0(30), CGT_MDCR_TPM), 997 - SR_TRAP(SYS_PMEVTYPERn_EL0(0), CGT_MDCR_TPM), 998 - SR_TRAP(SYS_PMEVTYPERn_EL0(1), CGT_MDCR_TPM), 999 - SR_TRAP(SYS_PMEVTYPERn_EL0(2), CGT_MDCR_TPM), 1000 - SR_TRAP(SYS_PMEVTYPERn_EL0(3), CGT_MDCR_TPM), 1001 - SR_TRAP(SYS_PMEVTYPERn_EL0(4), CGT_MDCR_TPM), 1002 - SR_TRAP(SYS_PMEVTYPERn_EL0(5), CGT_MDCR_TPM), 1003 - SR_TRAP(SYS_PMEVTYPERn_EL0(6), CGT_MDCR_TPM), 1004 - SR_TRAP(SYS_PMEVTYPERn_EL0(7), CGT_MDCR_TPM), 1005 - SR_TRAP(SYS_PMEVTYPERn_EL0(8), CGT_MDCR_TPM), 1006 - SR_TRAP(SYS_PMEVTYPERn_EL0(9), CGT_MDCR_TPM), 1007 - SR_TRAP(SYS_PMEVTYPERn_EL0(10), CGT_MDCR_TPM), 1008 - SR_TRAP(SYS_PMEVTYPERn_EL0(11), CGT_MDCR_TPM), 1009 - SR_TRAP(SYS_PMEVTYPERn_EL0(12), CGT_MDCR_TPM), 1010 - SR_TRAP(SYS_PMEVTYPERn_EL0(13), CGT_MDCR_TPM), 1011 - SR_TRAP(SYS_PMEVTYPERn_EL0(14), CGT_MDCR_TPM), 1012 - SR_TRAP(SYS_PMEVTYPERn_EL0(15), CGT_MDCR_TPM), 1013 - SR_TRAP(SYS_PMEVTYPERn_EL0(16), CGT_MDCR_TPM), 1014 - SR_TRAP(SYS_PMEVTYPERn_EL0(17), CGT_MDCR_TPM), 1015 - SR_TRAP(SYS_PMEVTYPERn_EL0(18), CGT_MDCR_TPM), 1016 - SR_TRAP(SYS_PMEVTYPERn_EL0(19), CGT_MDCR_TPM), 1017 - SR_TRAP(SYS_PMEVTYPERn_EL0(20), CGT_MDCR_TPM), 1018 - SR_TRAP(SYS_PMEVTYPERn_EL0(21), CGT_MDCR_TPM), 1019 - SR_TRAP(SYS_PMEVTYPERn_EL0(22), CGT_MDCR_TPM), 1020 - SR_TRAP(SYS_PMEVTYPERn_EL0(23), CGT_MDCR_TPM), 1021 - SR_TRAP(SYS_PMEVTYPERn_EL0(24), CGT_MDCR_TPM), 1022 - SR_TRAP(SYS_PMEVTYPERn_EL0(25), CGT_MDCR_TPM), 1023 - SR_TRAP(SYS_PMEVTYPERn_EL0(26), CGT_MDCR_TPM), 1024 - SR_TRAP(SYS_PMEVTYPERn_EL0(27), CGT_MDCR_TPM), 1025 - SR_TRAP(SYS_PMEVTYPERn_EL0(28), CGT_MDCR_TPM), 1026 - SR_TRAP(SYS_PMEVTYPERn_EL0(29), CGT_MDCR_TPM), 1027 - SR_TRAP(SYS_PMEVTYPERn_EL0(30), CGT_MDCR_TPM), 931 + SR_TRAP(SYS_PMEVCNTRn_EL0(0), CGT_MDCR_TPM_HPMN), 932 + SR_TRAP(SYS_PMEVCNTRn_EL0(1), CGT_MDCR_TPM_HPMN), 933 + SR_TRAP(SYS_PMEVCNTRn_EL0(2), CGT_MDCR_TPM_HPMN), 934 + SR_TRAP(SYS_PMEVCNTRn_EL0(3), CGT_MDCR_TPM_HPMN), 935 + SR_TRAP(SYS_PMEVCNTRn_EL0(4), CGT_MDCR_TPM_HPMN), 936 + SR_TRAP(SYS_PMEVCNTRn_EL0(5), CGT_MDCR_TPM_HPMN), 937 + SR_TRAP(SYS_PMEVCNTRn_EL0(6), CGT_MDCR_TPM_HPMN), 938 + SR_TRAP(SYS_PMEVCNTRn_EL0(7), CGT_MDCR_TPM_HPMN), 939 + SR_TRAP(SYS_PMEVCNTRn_EL0(8), CGT_MDCR_TPM_HPMN), 940 + SR_TRAP(SYS_PMEVCNTRn_EL0(9), CGT_MDCR_TPM_HPMN), 941 + SR_TRAP(SYS_PMEVCNTRn_EL0(10), CGT_MDCR_TPM_HPMN), 942 + SR_TRAP(SYS_PMEVCNTRn_EL0(11), CGT_MDCR_TPM_HPMN), 943 + SR_TRAP(SYS_PMEVCNTRn_EL0(12), CGT_MDCR_TPM_HPMN), 944 + SR_TRAP(SYS_PMEVCNTRn_EL0(13), CGT_MDCR_TPM_HPMN), 945 + SR_TRAP(SYS_PMEVCNTRn_EL0(14), CGT_MDCR_TPM_HPMN), 946 + SR_TRAP(SYS_PMEVCNTRn_EL0(15), CGT_MDCR_TPM_HPMN), 947 + SR_TRAP(SYS_PMEVCNTRn_EL0(16), CGT_MDCR_TPM_HPMN), 948 + SR_TRAP(SYS_PMEVCNTRn_EL0(17), CGT_MDCR_TPM_HPMN), 949 + SR_TRAP(SYS_PMEVCNTRn_EL0(18), CGT_MDCR_TPM_HPMN), 950 + SR_TRAP(SYS_PMEVCNTRn_EL0(19), CGT_MDCR_TPM_HPMN), 951 + SR_TRAP(SYS_PMEVCNTRn_EL0(20), CGT_MDCR_TPM_HPMN), 952 + SR_TRAP(SYS_PMEVCNTRn_EL0(21), CGT_MDCR_TPM_HPMN), 953 + SR_TRAP(SYS_PMEVCNTRn_EL0(22), CGT_MDCR_TPM_HPMN), 954 + SR_TRAP(SYS_PMEVCNTRn_EL0(23), CGT_MDCR_TPM_HPMN), 955 + SR_TRAP(SYS_PMEVCNTRn_EL0(24), CGT_MDCR_TPM_HPMN), 956 + SR_TRAP(SYS_PMEVCNTRn_EL0(25), CGT_MDCR_TPM_HPMN), 957 + SR_TRAP(SYS_PMEVCNTRn_EL0(26), CGT_MDCR_TPM_HPMN), 958 + SR_TRAP(SYS_PMEVCNTRn_EL0(27), CGT_MDCR_TPM_HPMN), 959 + SR_TRAP(SYS_PMEVCNTRn_EL0(28), CGT_MDCR_TPM_HPMN), 960 + SR_TRAP(SYS_PMEVCNTRn_EL0(29), CGT_MDCR_TPM_HPMN), 961 + SR_TRAP(SYS_PMEVCNTRn_EL0(30), CGT_MDCR_TPM_HPMN), 962 + SR_TRAP(SYS_PMEVTYPERn_EL0(0), CGT_MDCR_TPM_HPMN), 963 + SR_TRAP(SYS_PMEVTYPERn_EL0(1), CGT_MDCR_TPM_HPMN), 964 + SR_TRAP(SYS_PMEVTYPERn_EL0(2), CGT_MDCR_TPM_HPMN), 965 + SR_TRAP(SYS_PMEVTYPERn_EL0(3), CGT_MDCR_TPM_HPMN), 966 + SR_TRAP(SYS_PMEVTYPERn_EL0(4), CGT_MDCR_TPM_HPMN), 967 + SR_TRAP(SYS_PMEVTYPERn_EL0(5), CGT_MDCR_TPM_HPMN), 968 + SR_TRAP(SYS_PMEVTYPERn_EL0(6), CGT_MDCR_TPM_HPMN), 969 + SR_TRAP(SYS_PMEVTYPERn_EL0(7), CGT_MDCR_TPM_HPMN), 970 + SR_TRAP(SYS_PMEVTYPERn_EL0(8), CGT_MDCR_TPM_HPMN), 971 + SR_TRAP(SYS_PMEVTYPERn_EL0(9), CGT_MDCR_TPM_HPMN), 972 + SR_TRAP(SYS_PMEVTYPERn_EL0(10), CGT_MDCR_TPM_HPMN), 973 + SR_TRAP(SYS_PMEVTYPERn_EL0(11), CGT_MDCR_TPM_HPMN), 974 + SR_TRAP(SYS_PMEVTYPERn_EL0(12), CGT_MDCR_TPM_HPMN), 975 + SR_TRAP(SYS_PMEVTYPERn_EL0(13), CGT_MDCR_TPM_HPMN), 976 + SR_TRAP(SYS_PMEVTYPERn_EL0(14), CGT_MDCR_TPM_HPMN), 977 + SR_TRAP(SYS_PMEVTYPERn_EL0(15), CGT_MDCR_TPM_HPMN), 978 + SR_TRAP(SYS_PMEVTYPERn_EL0(16), CGT_MDCR_TPM_HPMN), 979 + SR_TRAP(SYS_PMEVTYPERn_EL0(17), CGT_MDCR_TPM_HPMN), 980 + SR_TRAP(SYS_PMEVTYPERn_EL0(18), CGT_MDCR_TPM_HPMN), 981 + SR_TRAP(SYS_PMEVTYPERn_EL0(19), CGT_MDCR_TPM_HPMN), 982 + SR_TRAP(SYS_PMEVTYPERn_EL0(20), CGT_MDCR_TPM_HPMN), 983 + SR_TRAP(SYS_PMEVTYPERn_EL0(21), CGT_MDCR_TPM_HPMN), 984 + SR_TRAP(SYS_PMEVTYPERn_EL0(22), CGT_MDCR_TPM_HPMN), 985 + SR_TRAP(SYS_PMEVTYPERn_EL0(23), CGT_MDCR_TPM_HPMN), 986 + SR_TRAP(SYS_PMEVTYPERn_EL0(24), CGT_MDCR_TPM_HPMN), 987 + SR_TRAP(SYS_PMEVTYPERn_EL0(25), CGT_MDCR_TPM_HPMN), 988 + SR_TRAP(SYS_PMEVTYPERn_EL0(26), CGT_MDCR_TPM_HPMN), 989 + SR_TRAP(SYS_PMEVTYPERn_EL0(27), CGT_MDCR_TPM_HPMN), 990 + SR_TRAP(SYS_PMEVTYPERn_EL0(28), CGT_MDCR_TPM_HPMN), 991 + SR_TRAP(SYS_PMEVTYPERn_EL0(29), CGT_MDCR_TPM_HPMN), 992 + SR_TRAP(SYS_PMEVTYPERn_EL0(30), CGT_MDCR_TPM_HPMN), 1028 993 SR_TRAP(SYS_PMCCFILTR_EL0, CGT_MDCR_TPM), 1029 994 SR_TRAP(SYS_MDCCSR_EL0, CGT_MDCR_TDCC_TDE_TDA), 1030 995 SR_TRAP(SYS_MDCCINT_EL1, CGT_MDCR_TDCC_TDE_TDA), ··· 1176 1141 SR_TRAP(SYS_AMEVTYPER1_EL0(13), CGT_CPTR_TAM), 1177 1142 SR_TRAP(SYS_AMEVTYPER1_EL0(14), CGT_CPTR_TAM), 1178 1143 SR_TRAP(SYS_AMEVTYPER1_EL0(15), CGT_CPTR_TAM), 1179 - SR_TRAP(SYS_POR_EL0, CGT_CPACR_E0POE), 1180 1144 /* op0=2, op1=1, and CRn<0b1000 */ 1181 1145 SR_RANGE_TRAP(sys_reg(2, 1, 0, 0, 0), 1182 1146 sys_reg(2, 1, 7, 15, 7), CGT_CPTR_TTA), ··· 2055 2021 cgids = coarse_control_combo[id - __MULTIPLE_CONTROL_BITS__]; 2056 2022 2057 2023 for (int i = 0; cgids[i] != __RESERVED__; i++) { 2058 - if (cgids[i] >= __MULTIPLE_CONTROL_BITS__) { 2024 + if (cgids[i] >= __MULTIPLE_CONTROL_BITS__ && 2025 + cgids[i] < __COMPLEX_CONDITIONS__) { 2059 2026 kvm_err("Recursive MCB %d/%d\n", id, cgids[i]); 2060 2027 ret = -EINVAL; 2061 2028 } ··· 2161 2126 return masks->mask[sr - __VNCR_START__].res0; 2162 2127 } 2163 2128 2164 - static bool check_fgt_bit(struct kvm *kvm, bool is_read, 2129 + static bool check_fgt_bit(struct kvm_vcpu *vcpu, bool is_read, 2165 2130 u64 val, const union trap_config tc) 2166 2131 { 2132 + struct kvm *kvm = vcpu->kvm; 2167 2133 enum vcpu_sysreg sr; 2134 + 2135 + /* 2136 + * KVM doesn't know about any FGTs that apply to the host, and hopefully 2137 + * that'll remain the case. 2138 + */ 2139 + if (is_hyp_ctxt(vcpu)) 2140 + return false; 2168 2141 2169 2142 if (tc.pol) 2170 2143 return (val & BIT(tc.bit)); ··· 2250 2207 * If we're not nesting, immediately return to the caller, with the 2251 2208 * sysreg index, should we have it. 2252 2209 */ 2253 - if (!vcpu_has_nv(vcpu) || is_hyp_ctxt(vcpu)) 2210 + if (!vcpu_has_nv(vcpu)) 2211 + goto local; 2212 + 2213 + /* 2214 + * There are a few traps that take effect InHost, but are constrained 2215 + * to EL0. Don't bother with computing the trap behaviour if the vCPU 2216 + * isn't in EL0. 2217 + */ 2218 + if (is_hyp_ctxt(vcpu) && !vcpu_is_host_el0(vcpu)) 2254 2219 goto local; 2255 2220 2256 2221 switch ((enum fgt_group_id)tc.fgt) { ··· 2304 2253 goto local; 2305 2254 } 2306 2255 2307 - if (tc.fgt != __NO_FGT_GROUP__ && check_fgt_bit(vcpu->kvm, is_read, 2308 - val, tc)) 2256 + if (tc.fgt != __NO_FGT_GROUP__ && check_fgt_bit(vcpu, is_read, val, tc)) 2309 2257 goto inject; 2310 2258 2311 2259 b = compute_trap_behaviour(vcpu, tc); 2260 + 2261 + if (!(b & BEHAVE_FORWARD_IN_HOST_EL0) && vcpu_is_host_el0(vcpu)) 2262 + goto local; 2312 2263 2313 2264 if (((b & BEHAVE_FORWARD_READ) && is_read) || 2314 2265 ((b & BEHAVE_FORWARD_WRITE) && !is_read)) ··· 2446 2393 2447 2394 kvm_arch_vcpu_load(vcpu, smp_processor_id()); 2448 2395 preempt_enable(); 2396 + 2397 + kvm_pmu_nested_transition(vcpu); 2449 2398 } 2450 2399 2451 2400 static void kvm_inject_el2_exception(struct kvm_vcpu *vcpu, u64 esr_el2, ··· 2529 2474 2530 2475 kvm_arch_vcpu_load(vcpu, smp_processor_id()); 2531 2476 preempt_enable(); 2477 + 2478 + kvm_pmu_nested_transition(vcpu); 2532 2479 2533 2480 return 1; 2534 2481 }
+31
arch/arm64/kvm/hyp/include/hyp/switch.h
··· 204 204 __deactivate_fgt(hctxt, vcpu, kvm, HAFGRTR_EL2); 205 205 } 206 206 207 + static inline void __activate_traps_mpam(struct kvm_vcpu *vcpu) 208 + { 209 + u64 r = MPAM2_EL2_TRAPMPAM0EL1 | MPAM2_EL2_TRAPMPAM1EL1; 210 + 211 + if (!system_supports_mpam()) 212 + return; 213 + 214 + /* trap guest access to MPAMIDR_EL1 */ 215 + if (system_supports_mpam_hcr()) { 216 + write_sysreg_s(MPAMHCR_EL2_TRAP_MPAMIDR_EL1, SYS_MPAMHCR_EL2); 217 + } else { 218 + /* From v1.1 TIDR can trap MPAMIDR, set it unconditionally */ 219 + r |= MPAM2_EL2_TIDR; 220 + } 221 + 222 + write_sysreg_s(r, SYS_MPAM2_EL2); 223 + } 224 + 225 + static inline void __deactivate_traps_mpam(void) 226 + { 227 + if (!system_supports_mpam()) 228 + return; 229 + 230 + write_sysreg_s(0, SYS_MPAM2_EL2); 231 + 232 + if (system_supports_mpam_hcr()) 233 + write_sysreg_s(MPAMHCR_HOST_FLAGS, SYS_MPAMHCR_EL2); 234 + } 235 + 207 236 static inline void __activate_traps_common(struct kvm_vcpu *vcpu) 208 237 { 209 238 /* Trap on AArch32 cp15 c15 (impdef sysregs) accesses (EL1 or EL0) */ ··· 273 244 } 274 245 275 246 __activate_traps_hfgxtr(vcpu); 247 + __activate_traps_mpam(vcpu); 276 248 } 277 249 278 250 static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu) ··· 293 263 write_sysreg_s(HCRX_HOST_FLAGS, SYS_HCRX_EL2); 294 264 295 265 __deactivate_traps_hfgxtr(vcpu); 266 + __deactivate_traps_mpam(); 296 267 } 297 268 298 269 static inline void ___activate_traps(struct kvm_vcpu *vcpu, u64 hcr)
+6 -5
arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h
··· 58 58 return false; 59 59 60 60 vcpu = ctxt_to_vcpu(ctxt); 61 - return kvm_has_feat(kern_hyp_va(vcpu->kvm), ID_AA64MMFR3_EL1, S1PIE, IMP); 61 + return kvm_has_s1pie(kern_hyp_va(vcpu->kvm)); 62 62 } 63 63 64 64 static inline bool ctxt_has_tcrx(struct kvm_cpu_context *ctxt) ··· 69 69 return false; 70 70 71 71 vcpu = ctxt_to_vcpu(ctxt); 72 - return kvm_has_feat(kern_hyp_va(vcpu->kvm), ID_AA64MMFR3_EL1, TCRX, IMP); 72 + return kvm_has_tcr2(kern_hyp_va(vcpu->kvm)); 73 73 } 74 74 75 75 static inline bool ctxt_has_s1poe(struct kvm_cpu_context *ctxt) ··· 80 80 return false; 81 81 82 82 vcpu = ctxt_to_vcpu(ctxt); 83 - return kvm_has_feat(kern_hyp_va(vcpu->kvm), ID_AA64MMFR3_EL1, S1POE, IMP); 83 + return kvm_has_s1poe(kern_hyp_va(vcpu->kvm)); 84 84 } 85 85 86 86 static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt) ··· 152 152 write_sysreg(ctxt_sys_reg(ctxt, TPIDRRO_EL0), tpidrro_el0); 153 153 } 154 154 155 - static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt) 155 + static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt, 156 + u64 mpidr) 156 157 { 157 - write_sysreg(ctxt_sys_reg(ctxt, MPIDR_EL1), vmpidr_el2); 158 + write_sysreg(mpidr, vmpidr_el2); 158 159 159 160 if (has_vhe() || 160 161 !cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) {
-2
arch/arm64/kvm/hyp/include/nvhe/trap_handler.h
··· 15 15 #define DECLARE_REG(type, name, ctxt, reg) \ 16 16 type name = (type)cpu_reg(ctxt, (reg)) 17 17 18 - void __pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu); 19 - 20 18 #endif /* __ARM64_KVM_NVHE_TRAP_HANDLER_H__ */
+3 -9
arch/arm64/kvm/hyp/nvhe/hyp-main.c
··· 105 105 106 106 hyp_vcpu->vcpu.arch.hw_mmu = host_vcpu->arch.hw_mmu; 107 107 108 - hyp_vcpu->vcpu.arch.hcr_el2 = host_vcpu->arch.hcr_el2; 109 108 hyp_vcpu->vcpu.arch.mdcr_el2 = host_vcpu->arch.mdcr_el2; 109 + hyp_vcpu->vcpu.arch.hcr_el2 &= ~(HCR_TWI | HCR_TWE); 110 + hyp_vcpu->vcpu.arch.hcr_el2 |= READ_ONCE(host_vcpu->arch.hcr_el2) & 111 + (HCR_TWI | HCR_TWE); 110 112 111 113 hyp_vcpu->vcpu.arch.iflags = host_vcpu->arch.iflags; 112 114 ··· 351 349 cpu_reg(host_ctxt, 1) = __pkvm_prot_finalize(); 352 350 } 353 351 354 - static void handle___pkvm_vcpu_init_traps(struct kvm_cpu_context *host_ctxt) 355 - { 356 - DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1); 357 - 358 - __pkvm_vcpu_init_traps(kern_hyp_va(vcpu)); 359 - } 360 - 361 352 static void handle___pkvm_init_vm(struct kvm_cpu_context *host_ctxt) 362 353 { 363 354 DECLARE_REG(struct kvm *, host_kvm, host_ctxt, 1); ··· 406 411 HANDLE_FUNC(__kvm_timer_set_cntvoff), 407 412 HANDLE_FUNC(__vgic_v3_save_vmcr_aprs), 408 413 HANDLE_FUNC(__vgic_v3_restore_vmcr_aprs), 409 - HANDLE_FUNC(__pkvm_vcpu_init_traps), 410 414 HANDLE_FUNC(__pkvm_init_vm), 411 415 HANDLE_FUNC(__pkvm_init_vcpu), 412 416 HANDLE_FUNC(__pkvm_teardown_vm),
+115 -1
arch/arm64/kvm/hyp/nvhe/pkvm.c
··· 6 6 7 7 #include <linux/kvm_host.h> 8 8 #include <linux/mm.h> 9 + 10 + #include <asm/kvm_emulate.h> 11 + 9 12 #include <nvhe/fixed_config.h> 10 13 #include <nvhe/mem_protect.h> 11 14 #include <nvhe/memory.h> ··· 204 201 } 205 202 } 206 203 204 + static void pkvm_vcpu_reset_hcr(struct kvm_vcpu *vcpu) 205 + { 206 + vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS; 207 + 208 + if (has_hvhe()) 209 + vcpu->arch.hcr_el2 |= HCR_E2H; 210 + 211 + if (cpus_have_final_cap(ARM64_HAS_RAS_EXTN)) { 212 + /* route synchronous external abort exceptions to EL2 */ 213 + vcpu->arch.hcr_el2 |= HCR_TEA; 214 + /* trap error record accesses */ 215 + vcpu->arch.hcr_el2 |= HCR_TERR; 216 + } 217 + 218 + if (cpus_have_final_cap(ARM64_HAS_STAGE2_FWB)) 219 + vcpu->arch.hcr_el2 |= HCR_FWB; 220 + 221 + if (cpus_have_final_cap(ARM64_HAS_EVT) && 222 + !cpus_have_final_cap(ARM64_MISMATCHED_CACHE_TYPE)) 223 + vcpu->arch.hcr_el2 |= HCR_TID4; 224 + else 225 + vcpu->arch.hcr_el2 |= HCR_TID2; 226 + 227 + if (vcpu_has_ptrauth(vcpu)) 228 + vcpu->arch.hcr_el2 |= (HCR_API | HCR_APK); 229 + } 230 + 207 231 /* 208 232 * Initialize trap register values in protected mode. 209 233 */ 210 - void __pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu) 234 + static void pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu) 211 235 { 236 + vcpu->arch.cptr_el2 = kvm_get_reset_cptr_el2(vcpu); 237 + vcpu->arch.mdcr_el2 = 0; 238 + 239 + pkvm_vcpu_reset_hcr(vcpu); 240 + 241 + if ((!vcpu_is_protected(vcpu))) 242 + return; 243 + 212 244 pvm_init_trap_regs(vcpu); 213 245 pvm_init_traps_aa64pfr0(vcpu); 214 246 pvm_init_traps_aa64pfr1(vcpu); ··· 327 289 hyp_spin_unlock(&vm_table_lock); 328 290 } 329 291 292 + static void pkvm_init_features_from_host(struct pkvm_hyp_vm *hyp_vm, const struct kvm *host_kvm) 293 + { 294 + struct kvm *kvm = &hyp_vm->kvm; 295 + DECLARE_BITMAP(allowed_features, KVM_VCPU_MAX_FEATURES); 296 + 297 + /* No restrictions for non-protected VMs. */ 298 + if (!kvm_vm_is_protected(kvm)) { 299 + bitmap_copy(kvm->arch.vcpu_features, 300 + host_kvm->arch.vcpu_features, 301 + KVM_VCPU_MAX_FEATURES); 302 + return; 303 + } 304 + 305 + bitmap_zero(allowed_features, KVM_VCPU_MAX_FEATURES); 306 + 307 + /* 308 + * For protected VMs, always allow: 309 + * - CPU starting in poweroff state 310 + * - PSCI v0.2 311 + */ 312 + set_bit(KVM_ARM_VCPU_POWER_OFF, allowed_features); 313 + set_bit(KVM_ARM_VCPU_PSCI_0_2, allowed_features); 314 + 315 + /* 316 + * Check if remaining features are allowed: 317 + * - Performance Monitoring 318 + * - Scalable Vectors 319 + * - Pointer Authentication 320 + */ 321 + if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), PVM_ID_AA64DFR0_ALLOW)) 322 + set_bit(KVM_ARM_VCPU_PMU_V3, allowed_features); 323 + 324 + if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_SVE), PVM_ID_AA64PFR0_ALLOW)) 325 + set_bit(KVM_ARM_VCPU_SVE, allowed_features); 326 + 327 + if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_API), PVM_ID_AA64ISAR1_RESTRICT_UNSIGNED) && 328 + FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_APA), PVM_ID_AA64ISAR1_RESTRICT_UNSIGNED)) 329 + set_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, allowed_features); 330 + 331 + if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_GPI), PVM_ID_AA64ISAR1_ALLOW) && 332 + FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_GPA), PVM_ID_AA64ISAR1_ALLOW)) 333 + set_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, allowed_features); 334 + 335 + bitmap_and(kvm->arch.vcpu_features, host_kvm->arch.vcpu_features, 336 + allowed_features, KVM_VCPU_MAX_FEATURES); 337 + } 338 + 339 + static void pkvm_vcpu_init_ptrauth(struct pkvm_hyp_vcpu *hyp_vcpu) 340 + { 341 + struct kvm_vcpu *vcpu = &hyp_vcpu->vcpu; 342 + 343 + if (vcpu_has_feature(vcpu, KVM_ARM_VCPU_PTRAUTH_ADDRESS) || 344 + vcpu_has_feature(vcpu, KVM_ARM_VCPU_PTRAUTH_GENERIC)) { 345 + kvm_vcpu_enable_ptrauth(vcpu); 346 + } else { 347 + vcpu_clear_flag(&hyp_vcpu->vcpu, GUEST_HAS_PTRAUTH); 348 + } 349 + } 350 + 330 351 static void unpin_host_vcpu(struct kvm_vcpu *host_vcpu) 331 352 { 332 353 if (host_vcpu) ··· 407 310 hyp_vm->host_kvm = host_kvm; 408 311 hyp_vm->kvm.created_vcpus = nr_vcpus; 409 312 hyp_vm->kvm.arch.mmu.vtcr = host_mmu.arch.mmu.vtcr; 313 + hyp_vm->kvm.arch.pkvm.enabled = READ_ONCE(host_kvm->arch.pkvm.enabled); 314 + pkvm_init_features_from_host(hyp_vm, host_kvm); 315 + } 316 + 317 + static void pkvm_vcpu_init_sve(struct pkvm_hyp_vcpu *hyp_vcpu, struct kvm_vcpu *host_vcpu) 318 + { 319 + struct kvm_vcpu *vcpu = &hyp_vcpu->vcpu; 320 + 321 + if (!vcpu_has_feature(vcpu, KVM_ARM_VCPU_SVE)) { 322 + vcpu_clear_flag(vcpu, GUEST_HAS_SVE); 323 + vcpu_clear_flag(vcpu, VCPU_SVE_FINALIZED); 324 + } 410 325 } 411 326 412 327 static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu, ··· 444 335 445 336 hyp_vcpu->vcpu.arch.hw_mmu = &hyp_vm->kvm.arch.mmu; 446 337 hyp_vcpu->vcpu.arch.cflags = READ_ONCE(host_vcpu->arch.cflags); 338 + hyp_vcpu->vcpu.arch.mp_state.mp_state = KVM_MP_STATE_STOPPED; 339 + 340 + pkvm_vcpu_init_sve(hyp_vcpu, host_vcpu); 341 + pkvm_vcpu_init_ptrauth(hyp_vcpu); 342 + pkvm_vcpu_init_traps(&hyp_vcpu->vcpu); 447 343 done: 448 344 if (ret) 449 345 unpin_host_vcpu(host_vcpu);
+2
arch/arm64/kvm/hyp/nvhe/psci-relay.c
··· 265 265 case PSCI_1_0_FN_PSCI_FEATURES: 266 266 case PSCI_1_0_FN_SET_SUSPEND_MODE: 267 267 case PSCI_1_1_FN64_SYSTEM_RESET2: 268 + case PSCI_1_3_FN_SYSTEM_OFF2: 269 + case PSCI_1_3_FN64_SYSTEM_OFF2: 268 270 return psci_forward(host_ctxt); 269 271 case PSCI_1_0_FN64_SYSTEM_SUSPEND: 270 272 return psci_system_suspend(func_id, host_ctxt);
+1 -19
arch/arm64/kvm/hyp/nvhe/setup.c
··· 95 95 { 96 96 void *start, *end, *virt = hyp_phys_to_virt(phys); 97 97 unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT; 98 - enum kvm_pgtable_prot prot; 99 98 int ret, i; 100 99 101 100 /* Recreate the hyp page-table using the early page allocator */ ··· 146 147 return ret; 147 148 } 148 149 149 - pkvm_create_host_sve_mappings(); 150 - 151 - /* 152 - * Map the host sections RO in the hypervisor, but transfer the 153 - * ownership from the host to the hypervisor itself to make sure they 154 - * can't be donated or shared with another entity. 155 - * 156 - * The ownership transition requires matching changes in the host 157 - * stage-2. This will be done later (see finalize_host_mappings()) once 158 - * the hyp_vmemmap is addressable. 159 - */ 160 - prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED); 161 - ret = pkvm_create_mappings(&kvm_vgic_global_state, 162 - &kvm_vgic_global_state + 1, prot); 163 - if (ret) 164 - return ret; 165 - 166 - return 0; 150 + return pkvm_create_host_sve_mappings(); 167 151 } 168 152 169 153 static void update_nvhe_init_params(void)
+1 -1
arch/arm64/kvm/hyp/nvhe/sysreg-sr.c
··· 28 28 29 29 void __sysreg_restore_state_nvhe(struct kvm_cpu_context *ctxt) 30 30 { 31 - __sysreg_restore_el1_state(ctxt); 31 + __sysreg_restore_el1_state(ctxt, ctxt_sys_reg(ctxt, MPIDR_EL1)); 32 32 __sysreg_restore_common_state(ctxt); 33 33 __sysreg_restore_user_state(ctxt); 34 34 __sysreg_restore_el2_return_state(ctxt);
-3
arch/arm64/kvm/hyp/vgic-v3-sr.c
··· 1012 1012 val = ((vtr >> 29) & 7) << ICC_CTLR_EL1_PRI_BITS_SHIFT; 1013 1013 /* IDbits */ 1014 1014 val |= ((vtr >> 23) & 7) << ICC_CTLR_EL1_ID_BITS_SHIFT; 1015 - /* SEIS */ 1016 - if (kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK) 1017 - val |= BIT(ICC_CTLR_EL1_SEIS_SHIFT); 1018 1015 /* A3V */ 1019 1016 val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT; 1020 1017 /* EOImode */
+158 -2
arch/arm64/kvm/hyp/vhe/sysreg-sr.c
··· 15 15 #include <asm/kvm_hyp.h> 16 16 #include <asm/kvm_nested.h> 17 17 18 + static void __sysreg_save_vel2_state(struct kvm_vcpu *vcpu) 19 + { 20 + /* These registers are common with EL1 */ 21 + __vcpu_sys_reg(vcpu, PAR_EL1) = read_sysreg(par_el1); 22 + __vcpu_sys_reg(vcpu, TPIDR_EL1) = read_sysreg(tpidr_el1); 23 + 24 + __vcpu_sys_reg(vcpu, ESR_EL2) = read_sysreg_el1(SYS_ESR); 25 + __vcpu_sys_reg(vcpu, AFSR0_EL2) = read_sysreg_el1(SYS_AFSR0); 26 + __vcpu_sys_reg(vcpu, AFSR1_EL2) = read_sysreg_el1(SYS_AFSR1); 27 + __vcpu_sys_reg(vcpu, FAR_EL2) = read_sysreg_el1(SYS_FAR); 28 + __vcpu_sys_reg(vcpu, MAIR_EL2) = read_sysreg_el1(SYS_MAIR); 29 + __vcpu_sys_reg(vcpu, VBAR_EL2) = read_sysreg_el1(SYS_VBAR); 30 + __vcpu_sys_reg(vcpu, CONTEXTIDR_EL2) = read_sysreg_el1(SYS_CONTEXTIDR); 31 + __vcpu_sys_reg(vcpu, AMAIR_EL2) = read_sysreg_el1(SYS_AMAIR); 32 + 33 + /* 34 + * In VHE mode those registers are compatible between EL1 and EL2, 35 + * and the guest uses the _EL1 versions on the CPU naturally. 36 + * So we save them into their _EL2 versions here. 37 + * For nVHE mode we trap accesses to those registers, so our 38 + * _EL2 copy in sys_regs[] is always up-to-date and we don't need 39 + * to save anything here. 40 + */ 41 + if (vcpu_el2_e2h_is_set(vcpu)) { 42 + u64 val; 43 + 44 + /* 45 + * We don't save CPTR_EL2, as accesses to CPACR_EL1 46 + * are always trapped, ensuring that the in-memory 47 + * copy is always up-to-date. A small blessing... 48 + */ 49 + __vcpu_sys_reg(vcpu, SCTLR_EL2) = read_sysreg_el1(SYS_SCTLR); 50 + __vcpu_sys_reg(vcpu, TTBR0_EL2) = read_sysreg_el1(SYS_TTBR0); 51 + __vcpu_sys_reg(vcpu, TTBR1_EL2) = read_sysreg_el1(SYS_TTBR1); 52 + __vcpu_sys_reg(vcpu, TCR_EL2) = read_sysreg_el1(SYS_TCR); 53 + 54 + if (ctxt_has_tcrx(&vcpu->arch.ctxt)) { 55 + __vcpu_sys_reg(vcpu, TCR2_EL2) = read_sysreg_el1(SYS_TCR2); 56 + 57 + if (ctxt_has_s1pie(&vcpu->arch.ctxt)) { 58 + __vcpu_sys_reg(vcpu, PIRE0_EL2) = read_sysreg_el1(SYS_PIRE0); 59 + __vcpu_sys_reg(vcpu, PIR_EL2) = read_sysreg_el1(SYS_PIR); 60 + } 61 + 62 + if (ctxt_has_s1poe(&vcpu->arch.ctxt)) 63 + __vcpu_sys_reg(vcpu, POR_EL2) = read_sysreg_el1(SYS_POR); 64 + } 65 + 66 + /* 67 + * The EL1 view of CNTKCTL_EL1 has a bunch of RES0 bits where 68 + * the interesting CNTHCTL_EL2 bits live. So preserve these 69 + * bits when reading back the guest-visible value. 70 + */ 71 + val = read_sysreg_el1(SYS_CNTKCTL); 72 + val &= CNTKCTL_VALID_BITS; 73 + __vcpu_sys_reg(vcpu, CNTHCTL_EL2) &= ~CNTKCTL_VALID_BITS; 74 + __vcpu_sys_reg(vcpu, CNTHCTL_EL2) |= val; 75 + } 76 + 77 + __vcpu_sys_reg(vcpu, SP_EL2) = read_sysreg(sp_el1); 78 + __vcpu_sys_reg(vcpu, ELR_EL2) = read_sysreg_el1(SYS_ELR); 79 + __vcpu_sys_reg(vcpu, SPSR_EL2) = read_sysreg_el1(SYS_SPSR); 80 + } 81 + 82 + static void __sysreg_restore_vel2_state(struct kvm_vcpu *vcpu) 83 + { 84 + u64 val; 85 + 86 + /* These registers are common with EL1 */ 87 + write_sysreg(__vcpu_sys_reg(vcpu, PAR_EL1), par_el1); 88 + write_sysreg(__vcpu_sys_reg(vcpu, TPIDR_EL1), tpidr_el1); 89 + 90 + write_sysreg(__vcpu_sys_reg(vcpu, MPIDR_EL1), vmpidr_el2); 91 + write_sysreg_el1(__vcpu_sys_reg(vcpu, MAIR_EL2), SYS_MAIR); 92 + write_sysreg_el1(__vcpu_sys_reg(vcpu, VBAR_EL2), SYS_VBAR); 93 + write_sysreg_el1(__vcpu_sys_reg(vcpu, CONTEXTIDR_EL2), SYS_CONTEXTIDR); 94 + write_sysreg_el1(__vcpu_sys_reg(vcpu, AMAIR_EL2), SYS_AMAIR); 95 + 96 + if (vcpu_el2_e2h_is_set(vcpu)) { 97 + /* 98 + * In VHE mode those registers are compatible between 99 + * EL1 and EL2. 100 + */ 101 + write_sysreg_el1(__vcpu_sys_reg(vcpu, SCTLR_EL2), SYS_SCTLR); 102 + write_sysreg_el1(__vcpu_sys_reg(vcpu, CPTR_EL2), SYS_CPACR); 103 + write_sysreg_el1(__vcpu_sys_reg(vcpu, TTBR0_EL2), SYS_TTBR0); 104 + write_sysreg_el1(__vcpu_sys_reg(vcpu, TTBR1_EL2), SYS_TTBR1); 105 + write_sysreg_el1(__vcpu_sys_reg(vcpu, TCR_EL2), SYS_TCR); 106 + write_sysreg_el1(__vcpu_sys_reg(vcpu, CNTHCTL_EL2), SYS_CNTKCTL); 107 + } else { 108 + /* 109 + * CNTHCTL_EL2 only affects EL1 when running nVHE, so 110 + * no need to restore it. 111 + */ 112 + val = translate_sctlr_el2_to_sctlr_el1(__vcpu_sys_reg(vcpu, SCTLR_EL2)); 113 + write_sysreg_el1(val, SYS_SCTLR); 114 + val = translate_cptr_el2_to_cpacr_el1(__vcpu_sys_reg(vcpu, CPTR_EL2)); 115 + write_sysreg_el1(val, SYS_CPACR); 116 + val = translate_ttbr0_el2_to_ttbr0_el1(__vcpu_sys_reg(vcpu, TTBR0_EL2)); 117 + write_sysreg_el1(val, SYS_TTBR0); 118 + val = translate_tcr_el2_to_tcr_el1(__vcpu_sys_reg(vcpu, TCR_EL2)); 119 + write_sysreg_el1(val, SYS_TCR); 120 + } 121 + 122 + if (ctxt_has_tcrx(&vcpu->arch.ctxt)) { 123 + write_sysreg_el1(__vcpu_sys_reg(vcpu, TCR2_EL2), SYS_TCR2); 124 + 125 + if (ctxt_has_s1pie(&vcpu->arch.ctxt)) { 126 + write_sysreg_el1(__vcpu_sys_reg(vcpu, PIR_EL2), SYS_PIR); 127 + write_sysreg_el1(__vcpu_sys_reg(vcpu, PIRE0_EL2), SYS_PIRE0); 128 + } 129 + 130 + if (ctxt_has_s1poe(&vcpu->arch.ctxt)) 131 + write_sysreg_el1(__vcpu_sys_reg(vcpu, POR_EL2), SYS_POR); 132 + } 133 + 134 + write_sysreg_el1(__vcpu_sys_reg(vcpu, ESR_EL2), SYS_ESR); 135 + write_sysreg_el1(__vcpu_sys_reg(vcpu, AFSR0_EL2), SYS_AFSR0); 136 + write_sysreg_el1(__vcpu_sys_reg(vcpu, AFSR1_EL2), SYS_AFSR1); 137 + write_sysreg_el1(__vcpu_sys_reg(vcpu, FAR_EL2), SYS_FAR); 138 + write_sysreg(__vcpu_sys_reg(vcpu, SP_EL2), sp_el1); 139 + write_sysreg_el1(__vcpu_sys_reg(vcpu, ELR_EL2), SYS_ELR); 140 + write_sysreg_el1(__vcpu_sys_reg(vcpu, SPSR_EL2), SYS_SPSR); 141 + } 142 + 18 143 /* 19 144 * VHE: Host and guest must save mdscr_el1 and sp_el0 (and the PC and 20 145 * pstate, which are handled as part of the el2 return state) on every ··· 191 66 { 192 67 struct kvm_cpu_context *guest_ctxt = &vcpu->arch.ctxt; 193 68 struct kvm_cpu_context *host_ctxt; 69 + u64 mpidr; 194 70 195 71 host_ctxt = host_data_ptr(host_ctxt); 196 72 __sysreg_save_user_state(host_ctxt); ··· 215 89 */ 216 90 __sysreg32_restore_state(vcpu); 217 91 __sysreg_restore_user_state(guest_ctxt); 218 - __sysreg_restore_el1_state(guest_ctxt); 92 + 93 + if (unlikely(__is_hyp_ctxt(guest_ctxt))) { 94 + __sysreg_restore_vel2_state(vcpu); 95 + } else { 96 + if (vcpu_has_nv(vcpu)) { 97 + /* 98 + * Use the guest hypervisor's VPIDR_EL2 when in a 99 + * nested state. The hardware value of MIDR_EL1 gets 100 + * restored on put. 101 + */ 102 + write_sysreg(ctxt_sys_reg(guest_ctxt, VPIDR_EL2), vpidr_el2); 103 + 104 + /* 105 + * As we're restoring a nested guest, set the value 106 + * provided by the guest hypervisor. 107 + */ 108 + mpidr = ctxt_sys_reg(guest_ctxt, VMPIDR_EL2); 109 + } else { 110 + mpidr = ctxt_sys_reg(guest_ctxt, MPIDR_EL1); 111 + } 112 + 113 + __sysreg_restore_el1_state(guest_ctxt, mpidr); 114 + } 219 115 220 116 vcpu_set_flag(vcpu, SYSREGS_ON_CPU); 221 117 } ··· 260 112 261 113 host_ctxt = host_data_ptr(host_ctxt); 262 114 263 - __sysreg_save_el1_state(guest_ctxt); 115 + if (unlikely(__is_hyp_ctxt(guest_ctxt))) 116 + __sysreg_save_vel2_state(vcpu); 117 + else 118 + __sysreg_save_el1_state(guest_ctxt); 119 + 264 120 __sysreg_save_user_state(guest_ctxt); 265 121 __sysreg32_save_state(vcpu); 266 122 267 123 /* Restore host user state */ 268 124 __sysreg_restore_user_state(host_ctxt); 125 + 126 + /* If leaving a nesting guest, restore MIDR_EL1 default view */ 127 + if (vcpu_has_nv(vcpu)) 128 + write_sysreg(read_cpuid_id(), vpidr_el2); 269 129 270 130 vcpu_clear_flag(vcpu, SYSREGS_ON_CPU); 271 131 }
+2
arch/arm64/kvm/hypercalls.c
··· 575 575 case KVM_ARM_PSCI_0_2: 576 576 case KVM_ARM_PSCI_1_0: 577 577 case KVM_ARM_PSCI_1_1: 578 + case KVM_ARM_PSCI_1_2: 579 + case KVM_ARM_PSCI_1_3: 578 580 if (!wants_02) 579 581 return -EINVAL; 580 582 vcpu->kvm->arch.psci_version = val;
+30 -2
arch/arm64/kvm/mmio.c
··· 72 72 return data; 73 73 } 74 74 75 + static bool kvm_pending_sync_exception(struct kvm_vcpu *vcpu) 76 + { 77 + if (!vcpu_get_flag(vcpu, PENDING_EXCEPTION)) 78 + return false; 79 + 80 + if (vcpu_el1_is_32bit(vcpu)) { 81 + switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) { 82 + case unpack_vcpu_flag(EXCEPT_AA32_UND): 83 + case unpack_vcpu_flag(EXCEPT_AA32_IABT): 84 + case unpack_vcpu_flag(EXCEPT_AA32_DABT): 85 + return true; 86 + default: 87 + return false; 88 + } 89 + } else { 90 + switch (vcpu_get_flag(vcpu, EXCEPT_MASK)) { 91 + case unpack_vcpu_flag(EXCEPT_AA64_EL1_SYNC): 92 + case unpack_vcpu_flag(EXCEPT_AA64_EL2_SYNC): 93 + return true; 94 + default: 95 + return false; 96 + } 97 + } 98 + } 99 + 75 100 /** 76 101 * kvm_handle_mmio_return -- Handle MMIO loads after user space emulation 77 102 * or in-kernel IO emulation ··· 109 84 unsigned int len; 110 85 int mask; 111 86 112 - /* Detect an already handled MMIO return */ 113 - if (unlikely(!vcpu->mmio_needed)) 87 + /* 88 + * Detect if the MMIO return was already handled or if userspace aborted 89 + * the MMIO access. 90 + */ 91 + if (unlikely(!vcpu->mmio_needed || kvm_pending_sync_exception(vcpu))) 114 92 return 1; 115 93 116 94 vcpu->mmio_needed = 0;
+73 -9
arch/arm64/kvm/nested.c
··· 917 917 ID_AA64MMFR4_EL1_E2H0_NI_NV1); 918 918 kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR4_EL1, val); 919 919 920 - /* Only limited support for PMU, Debug, BPs and WPs */ 920 + /* Only limited support for PMU, Debug, BPs, WPs, and HPMN0 */ 921 921 val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1); 922 922 val &= (NV_FTR(DFR0, PMUVer) | 923 923 NV_FTR(DFR0, WRPs) | 924 924 NV_FTR(DFR0, BRPs) | 925 - NV_FTR(DFR0, DebugVer)); 925 + NV_FTR(DFR0, DebugVer) | 926 + NV_FTR(DFR0, HPMN0)); 926 927 927 928 /* Cap Debug to ARMv8.1 */ 928 929 tmp = FIELD_GET(NV_FTR(DFR0, DebugVer), val); ··· 934 933 kvm_set_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1, val); 935 934 } 936 935 937 - u64 kvm_vcpu_sanitise_vncr_reg(const struct kvm_vcpu *vcpu, enum vcpu_sysreg sr) 936 + u64 kvm_vcpu_apply_reg_masks(const struct kvm_vcpu *vcpu, 937 + enum vcpu_sysreg sr, u64 v) 938 938 { 939 - u64 v = ctxt_sys_reg(&vcpu->arch.ctxt, sr); 940 939 struct kvm_sysreg_masks *masks; 941 940 942 941 masks = vcpu->kvm->arch.sysreg_masks; 943 942 944 943 if (masks) { 945 - sr -= __VNCR_START__; 944 + sr -= __SANITISED_REG_START__; 946 945 947 946 v &= ~masks->mask[sr].res0; 948 947 v |= masks->mask[sr].res1; ··· 953 952 954 953 static void set_sysreg_masks(struct kvm *kvm, int sr, u64 res0, u64 res1) 955 954 { 956 - int i = sr - __VNCR_START__; 955 + int i = sr - __SANITISED_REG_START__; 956 + 957 + BUILD_BUG_ON(!__builtin_constant_p(sr)); 958 + BUILD_BUG_ON(sr < __SANITISED_REG_START__); 959 + BUILD_BUG_ON(sr >= NR_SYS_REGS); 957 960 958 961 kvm->arch.sysreg_masks->mask[i].res0 = res0; 959 962 kvm->arch.sysreg_masks->mask[i].res1 = res1; ··· 1055 1050 res0 |= HCRX_EL2_PTTWI; 1056 1051 if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SCTLRX, IMP)) 1057 1052 res0 |= HCRX_EL2_SCTLR2En; 1058 - if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, TCRX, IMP)) 1053 + if (!kvm_has_tcr2(kvm)) 1059 1054 res0 |= HCRX_EL2_TCR2En; 1060 1055 if (!kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP)) 1061 1056 res0 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2); ··· 1106 1101 res0 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0); 1107 1102 if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, THE, IMP)) 1108 1103 res0 |= HFGxTR_EL2_nRCWMASK_EL1; 1109 - if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP)) 1104 + if (!kvm_has_s1pie(kvm)) 1110 1105 res0 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1); 1111 - if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP)) 1106 + if (!kvm_has_s1poe(kvm)) 1112 1107 res0 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1); 1113 1108 if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S2POE, IMP)) 1114 1109 res0 |= HFGxTR_EL2_nS2POR_EL1; ··· 1205 1200 res0 |= ~(res0 | res1); 1206 1201 set_sysreg_masks(kvm, HAFGRTR_EL2, res0, res1); 1207 1202 1203 + /* TCR2_EL2 */ 1204 + res0 = TCR2_EL2_RES0; 1205 + res1 = TCR2_EL2_RES1; 1206 + if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, D128, IMP)) 1207 + res0 |= (TCR2_EL2_DisCH0 | TCR2_EL2_DisCH1 | TCR2_EL2_D128); 1208 + if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, MEC, IMP)) 1209 + res0 |= TCR2_EL2_AMEC1 | TCR2_EL2_AMEC0; 1210 + if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, HAFDBS, HAFT)) 1211 + res0 |= TCR2_EL2_HAFT; 1212 + if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, THE, IMP)) 1213 + res0 |= TCR2_EL2_PTTWI | TCR2_EL2_PnCH; 1214 + if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, AIE, IMP)) 1215 + res0 |= TCR2_EL2_AIE; 1216 + if (!kvm_has_s1poe(kvm)) 1217 + res0 |= TCR2_EL2_POE | TCR2_EL2_E0POE; 1218 + if (!kvm_has_s1pie(kvm)) 1219 + res0 |= TCR2_EL2_PIE; 1220 + if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, VH, IMP)) 1221 + res0 |= (TCR2_EL2_E0POE | TCR2_EL2_D128 | 1222 + TCR2_EL2_AMEC1 | TCR2_EL2_DisCH0 | TCR2_EL2_DisCH1); 1223 + set_sysreg_masks(kvm, TCR2_EL2, res0, res1); 1224 + 1208 1225 /* SCTLR_EL1 */ 1209 1226 res0 = SCTLR_EL1_RES0; 1210 1227 res1 = SCTLR_EL1_RES1; 1211 1228 if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, PAN, PAN3)) 1212 1229 res0 |= SCTLR_EL1_EPAN; 1213 1230 set_sysreg_masks(kvm, SCTLR_EL1, res0, res1); 1231 + 1232 + /* MDCR_EL2 */ 1233 + res0 = MDCR_EL2_RES0; 1234 + res1 = MDCR_EL2_RES1; 1235 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMUVer, IMP)) 1236 + res0 |= (MDCR_EL2_HPMN | MDCR_EL2_TPMCR | 1237 + MDCR_EL2_TPM | MDCR_EL2_HPME); 1238 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, IMP)) 1239 + res0 |= MDCR_EL2_E2PB | MDCR_EL2_TPMS; 1240 + if (!kvm_has_feat(kvm, ID_AA64DFR1_EL1, SPMU, IMP)) 1241 + res0 |= MDCR_EL2_EnSPM; 1242 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMUVer, V3P1)) 1243 + res0 |= MDCR_EL2_HPMD; 1244 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceFilt, IMP)) 1245 + res0 |= MDCR_EL2_TTRF; 1246 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMUVer, V3P5)) 1247 + res0 |= MDCR_EL2_HCCD | MDCR_EL2_HLP; 1248 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceBuffer, IMP)) 1249 + res0 |= MDCR_EL2_E2TB; 1250 + if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, FGT, IMP)) 1251 + res0 |= MDCR_EL2_TDCC; 1252 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, MTPMU, IMP) || 1253 + kvm_has_feat(kvm, ID_AA64PFR0_EL1, EL3, IMP)) 1254 + res0 |= MDCR_EL2_MTPME; 1255 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMUVer, V3P7)) 1256 + res0 |= MDCR_EL2_HPMFZO; 1257 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSS, IMP)) 1258 + res0 |= MDCR_EL2_PMSSE; 1259 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, V1P2)) 1260 + res0 |= MDCR_EL2_HPMFZS; 1261 + if (!kvm_has_feat(kvm, ID_AA64DFR1_EL1, EBEP, IMP)) 1262 + res0 |= MDCR_EL2_PMEE; 1263 + if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, DebugVer, V8P9)) 1264 + res0 |= MDCR_EL2_EBWE; 1265 + if (!kvm_has_feat(kvm, ID_AA64DFR2_EL1, STEP, IMP)) 1266 + res0 |= MDCR_EL2_EnSTEPOP; 1267 + set_sysreg_masks(kvm, MDCR_EL2, res0, res1); 1214 1268 1215 1269 return 0; 1216 1270 }
+124 -19
arch/arm64/kvm/pmu-emul.c
··· 89 89 90 90 static bool kvm_pmc_has_64bit_overflow(struct kvm_pmc *pmc) 91 91 { 92 - u64 val = kvm_vcpu_read_pmcr(kvm_pmc_to_vcpu(pmc)); 92 + struct kvm_vcpu *vcpu = kvm_pmc_to_vcpu(pmc); 93 + u64 val = kvm_vcpu_read_pmcr(vcpu); 94 + 95 + if (kvm_pmu_counter_is_hyp(vcpu, pmc->idx)) 96 + return __vcpu_sys_reg(vcpu, MDCR_EL2) & MDCR_EL2_HLP; 93 97 94 98 return (pmc->idx < ARMV8_PMU_CYCLE_IDX && (val & ARMV8_PMU_PMCR_LP)) || 95 99 (pmc->idx == ARMV8_PMU_CYCLE_IDX && (val & ARMV8_PMU_PMCR_LC)); ··· 113 109 static u32 counter_index_to_evtreg(u64 idx) 114 110 { 115 111 return (idx == ARMV8_PMU_CYCLE_IDX) ? PMCCFILTR_EL0 : PMEVTYPER0_EL0 + idx; 112 + } 113 + 114 + static u64 kvm_pmc_read_evtreg(const struct kvm_pmc *pmc) 115 + { 116 + return __vcpu_sys_reg(kvm_pmc_to_vcpu(pmc), counter_index_to_evtreg(pmc->idx)); 116 117 } 117 118 118 119 static u64 kvm_pmu_get_pmc_value(struct kvm_pmc *pmc) ··· 253 244 */ 254 245 void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) 255 246 { 256 - unsigned long mask = kvm_pmu_valid_counter_mask(vcpu); 247 + unsigned long mask = kvm_pmu_implemented_counter_mask(vcpu); 257 248 int i; 258 249 259 250 for_each_set_bit(i, &mask, 32) ··· 274 265 irq_work_sync(&vcpu->arch.pmu.overflow_work); 275 266 } 276 267 277 - u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu) 268 + bool kvm_pmu_counter_is_hyp(struct kvm_vcpu *vcpu, unsigned int idx) 269 + { 270 + unsigned int hpmn; 271 + 272 + if (!vcpu_has_nv(vcpu) || idx == ARMV8_PMU_CYCLE_IDX) 273 + return false; 274 + 275 + /* 276 + * Programming HPMN=0 is CONSTRAINED UNPREDICTABLE if FEAT_HPMN0 isn't 277 + * implemented. Since KVM's ability to emulate HPMN=0 does not directly 278 + * depend on hardware (all PMU registers are trapped), make the 279 + * implementation choice that all counters are included in the second 280 + * range reserved for EL2/EL3. 281 + */ 282 + hpmn = SYS_FIELD_GET(MDCR_EL2, HPMN, __vcpu_sys_reg(vcpu, MDCR_EL2)); 283 + return idx >= hpmn; 284 + } 285 + 286 + u64 kvm_pmu_accessible_counter_mask(struct kvm_vcpu *vcpu) 287 + { 288 + u64 mask = kvm_pmu_implemented_counter_mask(vcpu); 289 + u64 hpmn; 290 + 291 + if (!vcpu_has_nv(vcpu) || vcpu_is_el2(vcpu)) 292 + return mask; 293 + 294 + hpmn = SYS_FIELD_GET(MDCR_EL2, HPMN, __vcpu_sys_reg(vcpu, MDCR_EL2)); 295 + return mask & ~GENMASK(vcpu->kvm->arch.pmcr_n - 1, hpmn); 296 + } 297 + 298 + u64 kvm_pmu_implemented_counter_mask(struct kvm_vcpu *vcpu) 278 299 { 279 300 u64 val = FIELD_GET(ARMV8_PMU_PMCR_N, kvm_vcpu_read_pmcr(vcpu)); 280 301 ··· 613 574 kvm_pmu_set_counter_value(vcpu, ARMV8_PMU_CYCLE_IDX, 0); 614 575 615 576 if (val & ARMV8_PMU_PMCR_P) { 616 - unsigned long mask = kvm_pmu_valid_counter_mask(vcpu); 577 + unsigned long mask = kvm_pmu_accessible_counter_mask(vcpu); 617 578 mask &= ~BIT(ARMV8_PMU_CYCLE_IDX); 618 579 for_each_set_bit(i, &mask, 32) 619 580 kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, i), 0, true); ··· 624 585 static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc) 625 586 { 626 587 struct kvm_vcpu *vcpu = kvm_pmc_to_vcpu(pmc); 627 - return (kvm_vcpu_read_pmcr(vcpu) & ARMV8_PMU_PMCR_E) && 628 - (__vcpu_sys_reg(vcpu, PMCNTENSET_EL0) & BIT(pmc->idx)); 588 + unsigned int mdcr = __vcpu_sys_reg(vcpu, MDCR_EL2); 589 + 590 + if (!(__vcpu_sys_reg(vcpu, PMCNTENSET_EL0) & BIT(pmc->idx))) 591 + return false; 592 + 593 + if (kvm_pmu_counter_is_hyp(vcpu, pmc->idx)) 594 + return mdcr & MDCR_EL2_HPME; 595 + 596 + return kvm_vcpu_read_pmcr(vcpu) & ARMV8_PMU_PMCR_E; 597 + } 598 + 599 + static bool kvm_pmc_counts_at_el0(struct kvm_pmc *pmc) 600 + { 601 + u64 evtreg = kvm_pmc_read_evtreg(pmc); 602 + bool nsu = evtreg & ARMV8_PMU_EXCLUDE_NS_EL0; 603 + bool u = evtreg & ARMV8_PMU_EXCLUDE_EL0; 604 + 605 + return u == nsu; 606 + } 607 + 608 + static bool kvm_pmc_counts_at_el1(struct kvm_pmc *pmc) 609 + { 610 + u64 evtreg = kvm_pmc_read_evtreg(pmc); 611 + bool nsk = evtreg & ARMV8_PMU_EXCLUDE_NS_EL1; 612 + bool p = evtreg & ARMV8_PMU_EXCLUDE_EL1; 613 + 614 + return p == nsk; 615 + } 616 + 617 + static bool kvm_pmc_counts_at_el2(struct kvm_pmc *pmc) 618 + { 619 + struct kvm_vcpu *vcpu = kvm_pmc_to_vcpu(pmc); 620 + u64 mdcr = __vcpu_sys_reg(vcpu, MDCR_EL2); 621 + 622 + if (!kvm_pmu_counter_is_hyp(vcpu, pmc->idx) && (mdcr & MDCR_EL2_HPMD)) 623 + return false; 624 + 625 + return kvm_pmc_read_evtreg(pmc) & ARMV8_PMU_INCLUDE_EL2; 629 626 } 630 627 631 628 /** ··· 674 599 struct arm_pmu *arm_pmu = vcpu->kvm->arch.arm_pmu; 675 600 struct perf_event *event; 676 601 struct perf_event_attr attr; 677 - u64 eventsel, reg, data; 678 - bool p, u, nsk, nsu; 602 + u64 eventsel, evtreg; 679 603 680 - reg = counter_index_to_evtreg(pmc->idx); 681 - data = __vcpu_sys_reg(vcpu, reg); 604 + evtreg = kvm_pmc_read_evtreg(pmc); 682 605 683 606 kvm_pmu_stop_counter(pmc); 684 607 if (pmc->idx == ARMV8_PMU_CYCLE_IDX) 685 608 eventsel = ARMV8_PMUV3_PERFCTR_CPU_CYCLES; 686 609 else 687 - eventsel = data & kvm_pmu_event_mask(vcpu->kvm); 610 + eventsel = evtreg & kvm_pmu_event_mask(vcpu->kvm); 688 611 689 612 /* 690 613 * Neither SW increment nor chained events need to be backed ··· 700 627 !test_bit(eventsel, vcpu->kvm->arch.pmu_filter)) 701 628 return; 702 629 703 - p = data & ARMV8_PMU_EXCLUDE_EL1; 704 - u = data & ARMV8_PMU_EXCLUDE_EL0; 705 - nsk = data & ARMV8_PMU_EXCLUDE_NS_EL1; 706 - nsu = data & ARMV8_PMU_EXCLUDE_NS_EL0; 707 - 708 630 memset(&attr, 0, sizeof(struct perf_event_attr)); 709 631 attr.type = arm_pmu->pmu.type; 710 632 attr.size = sizeof(attr); 711 633 attr.pinned = 1; 712 634 attr.disabled = !kvm_pmu_counter_is_enabled(pmc); 713 - attr.exclude_user = (u != nsu); 714 - attr.exclude_kernel = (p != nsk); 635 + attr.exclude_user = !kvm_pmc_counts_at_el0(pmc); 715 636 attr.exclude_hv = 1; /* Don't count EL2 events */ 716 637 attr.exclude_host = 1; /* Don't count host events */ 717 638 attr.config = eventsel; 639 + 640 + /* 641 + * Filter events at EL1 (i.e. vEL2) when in a hyp context based on the 642 + * guest's EL2 filter. 643 + */ 644 + if (unlikely(is_hyp_ctxt(vcpu))) 645 + attr.exclude_kernel = !kvm_pmc_counts_at_el2(pmc); 646 + else 647 + attr.exclude_kernel = !kvm_pmc_counts_at_el1(pmc); 718 648 719 649 /* 720 650 * If counting with a 64bit counter, advertise it to the perf ··· 880 804 881 805 void kvm_vcpu_reload_pmu(struct kvm_vcpu *vcpu) 882 806 { 883 - u64 mask = kvm_pmu_valid_counter_mask(vcpu); 807 + u64 mask = kvm_pmu_implemented_counter_mask(vcpu); 884 808 885 809 kvm_pmu_handle_pmcr(vcpu, kvm_vcpu_read_pmcr(vcpu)); 886 810 ··· 1214 1138 u64 pmcr = __vcpu_sys_reg(vcpu, PMCR_EL0); 1215 1139 1216 1140 return u64_replace_bits(pmcr, vcpu->kvm->arch.pmcr_n, ARMV8_PMU_PMCR_N); 1141 + } 1142 + 1143 + void kvm_pmu_nested_transition(struct kvm_vcpu *vcpu) 1144 + { 1145 + bool reprogrammed = false; 1146 + unsigned long mask; 1147 + int i; 1148 + 1149 + if (!kvm_vcpu_has_pmu(vcpu)) 1150 + return; 1151 + 1152 + mask = __vcpu_sys_reg(vcpu, PMCNTENSET_EL0); 1153 + for_each_set_bit(i, &mask, 32) { 1154 + struct kvm_pmc *pmc = kvm_vcpu_idx_to_pmc(vcpu, i); 1155 + 1156 + /* 1157 + * We only need to reconfigure events where the filter is 1158 + * different at EL1 vs. EL2, as we're multiplexing the true EL1 1159 + * event filter bit for nested. 1160 + */ 1161 + if (kvm_pmc_counts_at_el1(pmc) == kvm_pmc_counts_at_el2(pmc)) 1162 + continue; 1163 + 1164 + kvm_pmu_create_perf_event(pmc); 1165 + reprogrammed = true; 1166 + } 1167 + 1168 + if (reprogrammed) 1169 + kvm_vcpu_pmu_restore_guest(vcpu); 1217 1170 }
+43 -1
arch/arm64/kvm/psci.c
··· 194 194 kvm_prepare_system_event(vcpu, KVM_SYSTEM_EVENT_SHUTDOWN, 0); 195 195 } 196 196 197 + static void kvm_psci_system_off2(struct kvm_vcpu *vcpu) 198 + { 199 + kvm_prepare_system_event(vcpu, KVM_SYSTEM_EVENT_SHUTDOWN, 200 + KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2); 201 + } 202 + 197 203 static void kvm_psci_system_reset(struct kvm_vcpu *vcpu) 198 204 { 199 205 kvm_prepare_system_event(vcpu, KVM_SYSTEM_EVENT_RESET, 0); ··· 328 322 329 323 switch(psci_fn) { 330 324 case PSCI_0_2_FN_PSCI_VERSION: 331 - val = minor == 0 ? KVM_ARM_PSCI_1_0 : KVM_ARM_PSCI_1_1; 325 + val = PSCI_VERSION(1, minor); 332 326 break; 333 327 case PSCI_1_0_FN_PSCI_FEATURES: 334 328 arg = smccc_get_arg1(vcpu); ··· 364 358 if (minor >= 1) 365 359 val = 0; 366 360 break; 361 + case PSCI_1_3_FN_SYSTEM_OFF2: 362 + case PSCI_1_3_FN64_SYSTEM_OFF2: 363 + if (minor >= 3) 364 + val = PSCI_1_3_OFF_TYPE_HIBERNATE_OFF; 365 + break; 367 366 } 368 367 break; 369 368 case PSCI_1_0_FN_SYSTEM_SUSPEND: ··· 402 391 val = PSCI_RET_INVALID_PARAMS; 403 392 break; 404 393 } 394 + break; 395 + case PSCI_1_3_FN_SYSTEM_OFF2: 396 + kvm_psci_narrow_to_32bit(vcpu); 397 + fallthrough; 398 + case PSCI_1_3_FN64_SYSTEM_OFF2: 399 + if (minor < 3) 400 + break; 401 + 402 + arg = smccc_get_arg1(vcpu); 403 + /* 404 + * SYSTEM_OFF2 defaults to HIBERNATE_OFF if arg1 is zero. arg2 405 + * must be zero. 406 + */ 407 + if ((arg && arg != PSCI_1_3_OFF_TYPE_HIBERNATE_OFF) || 408 + smccc_get_arg2(vcpu) != 0) { 409 + val = PSCI_RET_INVALID_PARAMS; 410 + break; 411 + } 412 + kvm_psci_system_off2(vcpu); 413 + /* 414 + * We shouldn't be going back to the guest after receiving a 415 + * SYSTEM_OFF2 request. Preload a return value of 416 + * INTERNAL_FAILURE should userspace ignore the exit and resume 417 + * the vCPU. 418 + */ 419 + val = PSCI_RET_INTERNAL_FAILURE; 420 + ret = 0; 405 421 break; 406 422 default: 407 423 return kvm_psci_0_2_call(vcpu); ··· 487 449 } 488 450 489 451 switch (version) { 452 + case KVM_ARM_PSCI_1_3: 453 + return kvm_psci_1_x_call(vcpu, 3); 454 + case KVM_ARM_PSCI_1_2: 455 + return kvm_psci_1_x_call(vcpu, 2); 490 456 case KVM_ARM_PSCI_1_1: 491 457 return kvm_psci_1_x_call(vcpu, 1); 492 458 case KVM_ARM_PSCI_1_0:
-5
arch/arm64/kvm/reset.c
··· 167 167 memset(vcpu->arch.sve_state, 0, vcpu_sve_state_size(vcpu)); 168 168 } 169 169 170 - static void kvm_vcpu_enable_ptrauth(struct kvm_vcpu *vcpu) 171 - { 172 - vcpu_set_flag(vcpu, GUEST_HAS_PTRAUTH); 173 - } 174 - 175 170 /** 176 171 * kvm_reset_vcpu - sets core registers and sys_regs to reset value 177 172 * @vcpu: The VCPU pointer
+250 -59
arch/arm64/kvm/sys_regs.c
··· 110 110 PURE_EL2_SYSREG( RVBAR_EL2 ); 111 111 PURE_EL2_SYSREG( TPIDR_EL2 ); 112 112 PURE_EL2_SYSREG( HPFAR_EL2 ); 113 + PURE_EL2_SYSREG( HCRX_EL2 ); 114 + PURE_EL2_SYSREG( HFGRTR_EL2 ); 115 + PURE_EL2_SYSREG( HFGWTR_EL2 ); 116 + PURE_EL2_SYSREG( HFGITR_EL2 ); 117 + PURE_EL2_SYSREG( HDFGRTR_EL2 ); 118 + PURE_EL2_SYSREG( HDFGWTR_EL2 ); 119 + PURE_EL2_SYSREG( HAFGRTR_EL2 ); 120 + PURE_EL2_SYSREG( CNTVOFF_EL2 ); 113 121 PURE_EL2_SYSREG( CNTHCTL_EL2 ); 114 122 MAPPED_EL2_SYSREG(SCTLR_EL2, SCTLR_EL1, 115 123 translate_sctlr_el2_to_sctlr_el1 ); ··· 134 126 MAPPED_EL2_SYSREG(ESR_EL2, ESR_EL1, NULL ); 135 127 MAPPED_EL2_SYSREG(FAR_EL2, FAR_EL1, NULL ); 136 128 MAPPED_EL2_SYSREG(MAIR_EL2, MAIR_EL1, NULL ); 129 + MAPPED_EL2_SYSREG(TCR2_EL2, TCR2_EL1, NULL ); 130 + MAPPED_EL2_SYSREG(PIR_EL2, PIR_EL1, NULL ); 131 + MAPPED_EL2_SYSREG(PIRE0_EL2, PIRE0_EL1, NULL ); 132 + MAPPED_EL2_SYSREG(POR_EL2, POR_EL1, NULL ); 137 133 MAPPED_EL2_SYSREG(AMAIR_EL2, AMAIR_EL1, NULL ); 138 134 MAPPED_EL2_SYSREG(ELR_EL2, ELR_EL1, NULL ); 139 135 MAPPED_EL2_SYSREG(SPSR_EL2, SPSR_EL1, NULL ); 140 136 MAPPED_EL2_SYSREG(ZCR_EL2, ZCR_EL1, NULL ); 137 + MAPPED_EL2_SYSREG(CONTEXTIDR_EL2, CONTEXTIDR_EL1, NULL ); 141 138 default: 142 139 return false; 143 140 } ··· 162 149 goto memory_read; 163 150 164 151 /* 152 + * CNTHCTL_EL2 requires some special treatment to 153 + * account for the bits that can be set via CNTKCTL_EL1. 154 + */ 155 + switch (reg) { 156 + case CNTHCTL_EL2: 157 + if (vcpu_el2_e2h_is_set(vcpu)) { 158 + val = read_sysreg_el1(SYS_CNTKCTL); 159 + val &= CNTKCTL_VALID_BITS; 160 + val |= __vcpu_sys_reg(vcpu, reg) & ~CNTKCTL_VALID_BITS; 161 + return val; 162 + } 163 + break; 164 + } 165 + 166 + /* 165 167 * If this register does not have an EL1 counterpart, 166 168 * then read the stored EL2 version. 167 169 */ ··· 193 165 194 166 /* Get the current version of the EL1 counterpart. */ 195 167 WARN_ON(!__vcpu_read_sys_reg_from_cpu(el1r, &val)); 168 + if (reg >= __SANITISED_REG_START__) 169 + val = kvm_vcpu_apply_reg_masks(vcpu, reg, val); 170 + 196 171 return val; 197 172 } 198 173 ··· 228 197 * non-VHE guest hypervisor. 229 198 */ 230 199 __vcpu_sys_reg(vcpu, reg) = val; 200 + 201 + switch (reg) { 202 + case CNTHCTL_EL2: 203 + /* 204 + * If E2H=0, CNHTCTL_EL2 is a pure shadow register. 205 + * Otherwise, some of the bits are backed by 206 + * CNTKCTL_EL1, while the rest is kept in memory. 207 + * Yes, this is fun stuff. 208 + */ 209 + if (vcpu_el2_e2h_is_set(vcpu)) 210 + write_sysreg_el1(val, SYS_CNTKCTL); 211 + return; 212 + } 231 213 232 214 /* No EL1 counterpart? We're done here.? */ 233 215 if (reg == el1r) ··· 433 389 { 434 390 bool was_enabled = vcpu_has_cache_enabled(vcpu); 435 391 u64 val, mask, shift; 436 - 437 - if (reg_to_encoding(r) == SYS_TCR2_EL1 && 438 - !kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, TCRX, IMP)) 439 - return undef_access(vcpu, p, r); 440 392 441 393 BUG_ON(!p->is_write); 442 394 ··· 1168 1128 { 1169 1129 bool set; 1170 1130 1171 - val &= kvm_pmu_valid_counter_mask(vcpu); 1131 + val &= kvm_pmu_accessible_counter_mask(vcpu); 1172 1132 1173 1133 switch (r->reg) { 1174 1134 case PMOVSSET_EL0: ··· 1191 1151 1192 1152 static int get_pmreg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val) 1193 1153 { 1194 - u64 mask = kvm_pmu_valid_counter_mask(vcpu); 1154 + u64 mask = kvm_pmu_accessible_counter_mask(vcpu); 1195 1155 1196 1156 *val = __vcpu_sys_reg(vcpu, r->reg) & mask; 1197 1157 return 0; ··· 1205 1165 if (pmu_access_el0_disabled(vcpu)) 1206 1166 return false; 1207 1167 1208 - mask = kvm_pmu_valid_counter_mask(vcpu); 1168 + mask = kvm_pmu_accessible_counter_mask(vcpu); 1209 1169 if (p->is_write) { 1210 1170 val = p->regval & mask; 1211 1171 if (r->Op2 & 0x1) { ··· 1228 1188 static bool access_pminten(struct kvm_vcpu *vcpu, struct sys_reg_params *p, 1229 1189 const struct sys_reg_desc *r) 1230 1190 { 1231 - u64 mask = kvm_pmu_valid_counter_mask(vcpu); 1191 + u64 mask = kvm_pmu_accessible_counter_mask(vcpu); 1232 1192 1233 1193 if (check_pmu_access_disabled(vcpu, 0)) 1234 1194 return false; ··· 1252 1212 static bool access_pmovs(struct kvm_vcpu *vcpu, struct sys_reg_params *p, 1253 1213 const struct sys_reg_desc *r) 1254 1214 { 1255 - u64 mask = kvm_pmu_valid_counter_mask(vcpu); 1215 + u64 mask = kvm_pmu_accessible_counter_mask(vcpu); 1256 1216 1257 1217 if (pmu_access_el0_disabled(vcpu)) 1258 1218 return false; ··· 1282 1242 if (pmu_write_swinc_el0_disabled(vcpu)) 1283 1243 return false; 1284 1244 1285 - mask = kvm_pmu_valid_counter_mask(vcpu); 1245 + mask = kvm_pmu_accessible_counter_mask(vcpu); 1286 1246 kvm_pmu_software_increment(vcpu, p->regval & mask); 1287 1247 return true; 1288 1248 } ··· 1549 1509 } 1550 1510 } 1551 1511 1512 + static u64 sanitise_id_aa64pfr0_el1(const struct kvm_vcpu *vcpu, u64 val); 1513 + static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val); 1514 + 1552 1515 /* Read a sanitised cpufeature ID register by sys_reg_desc */ 1553 1516 static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu, 1554 1517 const struct sys_reg_desc *r) ··· 1565 1522 val = read_sanitised_ftr_reg(id); 1566 1523 1567 1524 switch (id) { 1525 + case SYS_ID_AA64DFR0_EL1: 1526 + val = sanitise_id_aa64dfr0_el1(vcpu, val); 1527 + break; 1528 + case SYS_ID_AA64PFR0_EL1: 1529 + val = sanitise_id_aa64pfr0_el1(vcpu, val); 1530 + break; 1568 1531 case SYS_ID_AA64PFR1_EL1: 1569 1532 if (!kvm_has_mte(vcpu->kvm)) 1570 1533 val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTE); ··· 1584 1535 val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MTEX); 1585 1536 val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_DF2); 1586 1537 val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_PFAR); 1538 + val &= ~ARM64_FEATURE_MASK(ID_AA64PFR1_EL1_MPAM_frac); 1587 1539 break; 1588 1540 case SYS_ID_AA64PFR2_EL1: 1589 1541 /* We only expose FPMR */ ··· 1742 1692 return REG_HIDDEN; 1743 1693 } 1744 1694 1745 - static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu, 1746 - const struct sys_reg_desc *rd) 1695 + static u64 sanitise_id_aa64pfr0_el1(const struct kvm_vcpu *vcpu, u64 val) 1747 1696 { 1748 - u64 val = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1); 1749 - 1750 1697 if (!vcpu_has_sve(vcpu)) 1751 1698 val &= ~ID_AA64PFR0_EL1_SVE_MASK; 1752 1699 ··· 1771 1724 1772 1725 val &= ~ID_AA64PFR0_EL1_AMU_MASK; 1773 1726 1727 + /* 1728 + * MPAM is disabled by default as KVM also needs a set of PARTID to 1729 + * program the MPAMVPMx_EL2 PARTID remapping registers with. But some 1730 + * older kernels let the guest see the ID bit. 1731 + */ 1732 + val &= ~ID_AA64PFR0_EL1_MPAM_MASK; 1733 + 1774 1734 return val; 1775 1735 } 1776 1736 ··· 1791 1737 (val); \ 1792 1738 }) 1793 1739 1794 - static u64 read_sanitised_id_aa64dfr0_el1(struct kvm_vcpu *vcpu, 1795 - const struct sys_reg_desc *rd) 1740 + static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val) 1796 1741 { 1797 - u64 val = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1); 1798 - 1799 1742 val = ID_REG_LIMIT_FIELD_ENUM(val, ID_AA64DFR0_EL1, DebugVer, V8P8); 1800 1743 1801 1744 /* ··· 1883 1832 return -EINVAL; 1884 1833 1885 1834 return set_id_reg(vcpu, rd, val); 1835 + } 1836 + 1837 + static int set_id_aa64pfr0_el1(struct kvm_vcpu *vcpu, 1838 + const struct sys_reg_desc *rd, u64 user_val) 1839 + { 1840 + u64 hw_val = read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1); 1841 + u64 mpam_mask = ID_AA64PFR0_EL1_MPAM_MASK; 1842 + 1843 + /* 1844 + * Commit 011e5f5bf529f ("arm64/cpufeature: Add remaining feature bits 1845 + * in ID_AA64PFR0 register") exposed the MPAM field of AA64PFR0_EL1 to 1846 + * guests, but didn't add trap handling. KVM doesn't support MPAM and 1847 + * always returns an UNDEF for these registers. The guest must see 0 1848 + * for this field. 1849 + * 1850 + * But KVM must also accept values from user-space that were provided 1851 + * by KVM. On CPUs that support MPAM, permit user-space to write 1852 + * the sanitizied value to ID_AA64PFR0_EL1.MPAM, but ignore this field. 1853 + */ 1854 + if ((hw_val & mpam_mask) == (user_val & mpam_mask)) 1855 + user_val &= ~ID_AA64PFR0_EL1_MPAM_MASK; 1856 + 1857 + return set_id_reg(vcpu, rd, user_val); 1858 + } 1859 + 1860 + static int set_id_aa64pfr1_el1(struct kvm_vcpu *vcpu, 1861 + const struct sys_reg_desc *rd, u64 user_val) 1862 + { 1863 + u64 hw_val = read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1); 1864 + u64 mpam_mask = ID_AA64PFR1_EL1_MPAM_frac_MASK; 1865 + 1866 + /* See set_id_aa64pfr0_el1 for comment about MPAM */ 1867 + if ((hw_val & mpam_mask) == (user_val & mpam_mask)) 1868 + user_val &= ~ID_AA64PFR1_EL1_MPAM_frac_MASK; 1869 + 1870 + return set_id_reg(vcpu, rd, user_val); 1871 + } 1872 + 1873 + static int set_ctr_el0(struct kvm_vcpu *vcpu, 1874 + const struct sys_reg_desc *rd, u64 user_val) 1875 + { 1876 + u8 user_L1Ip = SYS_FIELD_GET(CTR_EL0, L1Ip, user_val); 1877 + 1878 + /* 1879 + * Both AIVIVT (0b01) and VPIPT (0b00) are documented as reserved. 1880 + * Hence only allow to set VIPT(0b10) or PIPT(0b11) for L1Ip based 1881 + * on what hardware reports. 1882 + * 1883 + * Using a VIPT software model on PIPT will lead to over invalidation, 1884 + * but still correct. Hence, we can allow downgrading PIPT to VIPT, 1885 + * but not the other way around. This is handled via arm64_ftr_safe_value() 1886 + * as CTR_EL0 ftr_bits has L1Ip field with type FTR_EXACT and safe value 1887 + * set as VIPT. 1888 + */ 1889 + switch (user_L1Ip) { 1890 + case CTR_EL0_L1Ip_RESERVED_VPIPT: 1891 + case CTR_EL0_L1Ip_RESERVED_AIVIVT: 1892 + return -EINVAL; 1893 + case CTR_EL0_L1Ip_VIPT: 1894 + case CTR_EL0_L1Ip_PIPT: 1895 + return set_id_reg(vcpu, rd, user_val); 1896 + default: 1897 + return -ENOENT; 1898 + } 1886 1899 } 1887 1900 1888 1901 /* ··· 2219 2104 .val = v, \ 2220 2105 } 2221 2106 2107 + #define EL2_REG_FILTERED(name, acc, rst, v, filter) { \ 2108 + SYS_DESC(SYS_##name), \ 2109 + .access = acc, \ 2110 + .reset = rst, \ 2111 + .reg = name, \ 2112 + .visibility = filter, \ 2113 + .val = v, \ 2114 + } 2115 + 2222 2116 #define EL2_REG_VNCR(name, rst, v) EL2_REG(name, bad_vncr_trap, rst, v) 2223 2117 #define EL2_REG_REDIR(name, rst, v) EL2_REG(name, bad_redir_trap, rst, v) 2224 2118 ··· 2272 2148 .visibility = id_visibility, \ 2273 2149 .reset = kvm_read_sanitised_id_reg, \ 2274 2150 .val = mask, \ 2151 + } 2152 + 2153 + /* sys_reg_desc initialiser for cpufeature ID registers that need filtering */ 2154 + #define ID_FILTERED(sysreg, name, mask) { \ 2155 + ID_DESC(sysreg), \ 2156 + .set_user = set_##name, \ 2157 + .visibility = id_visibility, \ 2158 + .reset = kvm_read_sanitised_id_reg, \ 2159 + .val = (mask), \ 2275 2160 } 2276 2161 2277 2162 /* ··· 2369 2236 return __vcpu_sys_reg(vcpu, r->reg) = val; 2370 2237 } 2371 2238 2239 + static unsigned int __el2_visibility(const struct kvm_vcpu *vcpu, 2240 + const struct sys_reg_desc *rd, 2241 + unsigned int (*fn)(const struct kvm_vcpu *, 2242 + const struct sys_reg_desc *)) 2243 + { 2244 + return el2_visibility(vcpu, rd) ?: fn(vcpu, rd); 2245 + } 2246 + 2372 2247 static unsigned int sve_el2_visibility(const struct kvm_vcpu *vcpu, 2373 2248 const struct sys_reg_desc *rd) 2374 2249 { 2375 - unsigned int r; 2376 - 2377 - r = el2_visibility(vcpu, rd); 2378 - if (r) 2379 - return r; 2380 - 2381 - return sve_visibility(vcpu, rd); 2250 + return __el2_visibility(vcpu, rd, sve_visibility); 2382 2251 } 2383 2252 2384 2253 static bool access_zcr_el2(struct kvm_vcpu *vcpu, ··· 2408 2273 static unsigned int s1poe_visibility(const struct kvm_vcpu *vcpu, 2409 2274 const struct sys_reg_desc *rd) 2410 2275 { 2411 - if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, S1POE, IMP)) 2276 + if (kvm_has_s1poe(vcpu->kvm)) 2412 2277 return 0; 2413 2278 2414 2279 return REG_HIDDEN; 2280 + } 2281 + 2282 + static unsigned int s1poe_el2_visibility(const struct kvm_vcpu *vcpu, 2283 + const struct sys_reg_desc *rd) 2284 + { 2285 + return __el2_visibility(vcpu, rd, s1poe_visibility); 2286 + } 2287 + 2288 + static unsigned int tcr2_visibility(const struct kvm_vcpu *vcpu, 2289 + const struct sys_reg_desc *rd) 2290 + { 2291 + if (kvm_has_tcr2(vcpu->kvm)) 2292 + return 0; 2293 + 2294 + return REG_HIDDEN; 2295 + } 2296 + 2297 + static unsigned int tcr2_el2_visibility(const struct kvm_vcpu *vcpu, 2298 + const struct sys_reg_desc *rd) 2299 + { 2300 + return __el2_visibility(vcpu, rd, tcr2_visibility); 2301 + } 2302 + 2303 + static unsigned int s1pie_visibility(const struct kvm_vcpu *vcpu, 2304 + const struct sys_reg_desc *rd) 2305 + { 2306 + if (kvm_has_s1pie(vcpu->kvm)) 2307 + return 0; 2308 + 2309 + return REG_HIDDEN; 2310 + } 2311 + 2312 + static unsigned int s1pie_el2_visibility(const struct kvm_vcpu *vcpu, 2313 + const struct sys_reg_desc *rd) 2314 + { 2315 + return __el2_visibility(vcpu, rd, s1pie_visibility); 2415 2316 } 2416 2317 2417 2318 /* ··· 2545 2374 2546 2375 /* AArch64 ID registers */ 2547 2376 /* CRm=4 */ 2548 - { SYS_DESC(SYS_ID_AA64PFR0_EL1), 2549 - .access = access_id_reg, 2550 - .get_user = get_id_reg, 2551 - .set_user = set_id_reg, 2552 - .reset = read_sanitised_id_aa64pfr0_el1, 2553 - .val = ~(ID_AA64PFR0_EL1_AMU | 2554 - ID_AA64PFR0_EL1_MPAM | 2555 - ID_AA64PFR0_EL1_SVE | 2556 - ID_AA64PFR0_EL1_RAS | 2557 - ID_AA64PFR0_EL1_AdvSIMD | 2558 - ID_AA64PFR0_EL1_FP), }, 2559 - ID_WRITABLE(ID_AA64PFR1_EL1, ~(ID_AA64PFR1_EL1_PFAR | 2377 + ID_FILTERED(ID_AA64PFR0_EL1, id_aa64pfr0_el1, 2378 + ~(ID_AA64PFR0_EL1_AMU | 2379 + ID_AA64PFR0_EL1_MPAM | 2380 + ID_AA64PFR0_EL1_SVE | 2381 + ID_AA64PFR0_EL1_RAS | 2382 + ID_AA64PFR0_EL1_AdvSIMD | 2383 + ID_AA64PFR0_EL1_FP)), 2384 + ID_FILTERED(ID_AA64PFR1_EL1, id_aa64pfr1_el1, 2385 + ~(ID_AA64PFR1_EL1_PFAR | 2560 2386 ID_AA64PFR1_EL1_DF2 | 2561 2387 ID_AA64PFR1_EL1_MTEX | 2562 2388 ID_AA64PFR1_EL1_THE | ··· 2574 2406 ID_WRITABLE(ID_AA64FPFR0_EL1, ~ID_AA64FPFR0_EL1_RES0), 2575 2407 2576 2408 /* CRm=5 */ 2577 - { SYS_DESC(SYS_ID_AA64DFR0_EL1), 2578 - .access = access_id_reg, 2579 - .get_user = get_id_reg, 2580 - .set_user = set_id_aa64dfr0_el1, 2581 - .reset = read_sanitised_id_aa64dfr0_el1, 2582 2409 /* 2583 2410 * Prior to FEAT_Debugv8.9, the architecture defines context-aware 2584 2411 * breakpoints (CTX_CMPs) as the highest numbered breakpoints (BRPs). ··· 2586 2423 * See DDI0487K.a, section D2.8.3 Breakpoint types and linking 2587 2424 * of breakpoints for more details. 2588 2425 */ 2589 - .val = ID_AA64DFR0_EL1_DoubleLock_MASK | 2590 - ID_AA64DFR0_EL1_WRPs_MASK | 2591 - ID_AA64DFR0_EL1_PMUVer_MASK | 2592 - ID_AA64DFR0_EL1_DebugVer_MASK, }, 2426 + ID_FILTERED(ID_AA64DFR0_EL1, id_aa64dfr0_el1, 2427 + ID_AA64DFR0_EL1_DoubleLock_MASK | 2428 + ID_AA64DFR0_EL1_WRPs_MASK | 2429 + ID_AA64DFR0_EL1_PMUVer_MASK | 2430 + ID_AA64DFR0_EL1_DebugVer_MASK), 2593 2431 ID_SANITISED(ID_AA64DFR1_EL1), 2594 2432 ID_UNALLOCATED(5,2), 2595 2433 ID_UNALLOCATED(5,3), ··· 2653 2489 { SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 }, 2654 2490 { SYS_DESC(SYS_TTBR1_EL1), access_vm_reg, reset_unknown, TTBR1_EL1 }, 2655 2491 { SYS_DESC(SYS_TCR_EL1), access_vm_reg, reset_val, TCR_EL1, 0 }, 2656 - { SYS_DESC(SYS_TCR2_EL1), access_vm_reg, reset_val, TCR2_EL1, 0 }, 2492 + { SYS_DESC(SYS_TCR2_EL1), access_vm_reg, reset_val, TCR2_EL1, 0, 2493 + .visibility = tcr2_visibility }, 2657 2494 2658 2495 PTRAUTH_KEY(APIA), 2659 2496 PTRAUTH_KEY(APIB), ··· 2708 2543 { SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi }, 2709 2544 2710 2545 { SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 }, 2711 - { SYS_DESC(SYS_PIRE0_EL1), NULL, reset_unknown, PIRE0_EL1 }, 2712 - { SYS_DESC(SYS_PIR_EL1), NULL, reset_unknown, PIR_EL1 }, 2546 + { SYS_DESC(SYS_PIRE0_EL1), NULL, reset_unknown, PIRE0_EL1, 2547 + .visibility = s1pie_visibility }, 2548 + { SYS_DESC(SYS_PIR_EL1), NULL, reset_unknown, PIR_EL1, 2549 + .visibility = s1pie_visibility }, 2713 2550 { SYS_DESC(SYS_POR_EL1), NULL, reset_unknown, POR_EL1, 2714 2551 .visibility = s1poe_visibility }, 2715 2552 { SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 }, ··· 2720 2553 { SYS_DESC(SYS_LOREA_EL1), trap_loregion }, 2721 2554 { SYS_DESC(SYS_LORN_EL1), trap_loregion }, 2722 2555 { SYS_DESC(SYS_LORC_EL1), trap_loregion }, 2556 + { SYS_DESC(SYS_MPAMIDR_EL1), undef_access }, 2723 2557 { SYS_DESC(SYS_LORID_EL1), trap_loregion }, 2724 2558 2559 + { SYS_DESC(SYS_MPAM1_EL1), undef_access }, 2560 + { SYS_DESC(SYS_MPAM0_EL1), undef_access }, 2725 2561 { SYS_DESC(SYS_VBAR_EL1), access_rw, reset_val, VBAR_EL1, 0 }, 2726 2562 { SYS_DESC(SYS_DISR_EL1), NULL, reset_val, DISR_EL1, 0 }, 2727 2563 ··· 2769 2599 { SYS_DESC(SYS_CCSIDR2_EL1), undef_access }, 2770 2600 { SYS_DESC(SYS_SMIDR_EL1), undef_access }, 2771 2601 { SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 }, 2772 - ID_WRITABLE(CTR_EL0, CTR_EL0_DIC_MASK | 2773 - CTR_EL0_IDC_MASK | 2774 - CTR_EL0_DminLine_MASK | 2775 - CTR_EL0_IminLine_MASK), 2602 + ID_FILTERED(CTR_EL0, ctr_el0, 2603 + CTR_EL0_DIC_MASK | 2604 + CTR_EL0_IDC_MASK | 2605 + CTR_EL0_DminLine_MASK | 2606 + CTR_EL0_L1Ip_MASK | 2607 + CTR_EL0_IminLine_MASK), 2776 2608 { SYS_DESC(SYS_SVCR), undef_access, reset_val, SVCR, 0, .visibility = sme_visibility }, 2777 2609 { SYS_DESC(SYS_FPMR), undef_access, reset_val, FPMR, 0, .visibility = fp8_visibility }, 2778 2610 ··· 2990 2818 EL2_REG_VNCR(HFGITR_EL2, reset_val, 0), 2991 2819 EL2_REG_VNCR(HACR_EL2, reset_val, 0), 2992 2820 2993 - { SYS_DESC(SYS_ZCR_EL2), .access = access_zcr_el2, .reset = reset_val, 2994 - .visibility = sve_el2_visibility, .reg = ZCR_EL2 }, 2821 + EL2_REG_FILTERED(ZCR_EL2, access_zcr_el2, reset_val, 0, 2822 + sve_el2_visibility), 2995 2823 2996 2824 EL2_REG_VNCR(HCRX_EL2, reset_val, 0), 2997 2825 2998 2826 EL2_REG(TTBR0_EL2, access_rw, reset_val, 0), 2999 2827 EL2_REG(TTBR1_EL2, access_rw, reset_val, 0), 3000 2828 EL2_REG(TCR_EL2, access_rw, reset_val, TCR_EL2_RES1), 2829 + EL2_REG_FILTERED(TCR2_EL2, access_rw, reset_val, TCR2_EL2_RES1, 2830 + tcr2_el2_visibility), 3001 2831 EL2_REG_VNCR(VTTBR_EL2, reset_val, 0), 3002 2832 EL2_REG_VNCR(VTCR_EL2, reset_val, 0), 3003 2833 ··· 3027 2853 EL2_REG(HPFAR_EL2, access_rw, reset_val, 0), 3028 2854 3029 2855 EL2_REG(MAIR_EL2, access_rw, reset_val, 0), 2856 + EL2_REG_FILTERED(PIRE0_EL2, access_rw, reset_val, 0, 2857 + s1pie_el2_visibility), 2858 + EL2_REG_FILTERED(PIR_EL2, access_rw, reset_val, 0, 2859 + s1pie_el2_visibility), 2860 + EL2_REG_FILTERED(POR_EL2, access_rw, reset_val, 0, 2861 + s1poe_el2_visibility), 3030 2862 EL2_REG(AMAIR_EL2, access_rw, reset_val, 0), 2863 + { SYS_DESC(SYS_MPAMHCR_EL2), undef_access }, 2864 + { SYS_DESC(SYS_MPAMVPMV_EL2), undef_access }, 2865 + { SYS_DESC(SYS_MPAM2_EL2), undef_access }, 2866 + { SYS_DESC(SYS_MPAMVPM0_EL2), undef_access }, 2867 + { SYS_DESC(SYS_MPAMVPM1_EL2), undef_access }, 2868 + { SYS_DESC(SYS_MPAMVPM2_EL2), undef_access }, 2869 + { SYS_DESC(SYS_MPAMVPM3_EL2), undef_access }, 2870 + { SYS_DESC(SYS_MPAMVPM4_EL2), undef_access }, 2871 + { SYS_DESC(SYS_MPAMVPM5_EL2), undef_access }, 2872 + { SYS_DESC(SYS_MPAMVPM6_EL2), undef_access }, 2873 + { SYS_DESC(SYS_MPAMVPM7_EL2), undef_access }, 3031 2874 3032 2875 EL2_REG(VBAR_EL2, access_rw, reset_val, 0), 3033 2876 EL2_REG(RVBAR_EL2, access_rw, reset_val, 0), ··· 4910 4719 if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP)) 4911 4720 vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2); 4912 4721 4913 - if (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, TCRX, IMP)) 4722 + if (kvm_has_tcr2(kvm)) 4914 4723 vcpu->arch.hcrx_el2 |= HCRX_EL2_TCR2En; 4915 4724 4916 4725 if (kvm_has_fpmr(kvm)) ··· 4960 4769 kvm->arch.fgu[HFGITR_GROUP] |= (HFGITR_EL2_ATS1E1RP | 4961 4770 HFGITR_EL2_ATS1E1WP); 4962 4771 4963 - if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP)) 4772 + if (!kvm_has_s1pie(kvm)) 4964 4773 kvm->arch.fgu[HFGxTR_GROUP] |= (HFGxTR_EL2_nPIRE0_EL1 | 4965 4774 HFGxTR_EL2_nPIR_EL1); 4966 4775 4967 - if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP)) 4776 + if (!kvm_has_s1poe(kvm)) 4968 4777 kvm->arch.fgu[HFGxTR_GROUP] |= (HFGxTR_EL2_nPOR_EL1 | 4969 4778 HFGxTR_EL2_nPOR_EL0); 4970 4779
+17 -15
arch/arm64/kvm/vgic/vgic-its.c
··· 782 782 783 783 ite = find_ite(its, device_id, event_id); 784 784 if (ite && its_is_collection_mapped(ite->collection)) { 785 + struct its_device *device = find_its_device(its, device_id); 786 + int ite_esz = vgic_its_get_abi(its)->ite_esz; 787 + gpa_t gpa = device->itt_addr + ite->event_id * ite_esz; 785 788 /* 786 789 * Though the spec talks about removing the pending state, we 787 790 * don't bother here since we clear the ITTE anyway and the ··· 793 790 vgic_its_invalidate_cache(its); 794 791 795 792 its_free_ite(kvm, ite); 796 - return 0; 793 + 794 + return vgic_its_write_entry_lock(its, gpa, 0, ite_esz); 797 795 } 798 796 799 797 return E_ITS_DISCARD_UNMAPPED_INTERRUPT; ··· 1143 1139 bool valid = its_cmd_get_validbit(its_cmd); 1144 1140 u8 num_eventid_bits = its_cmd_get_size(its_cmd); 1145 1141 gpa_t itt_addr = its_cmd_get_ittaddr(its_cmd); 1142 + int dte_esz = vgic_its_get_abi(its)->dte_esz; 1146 1143 struct its_device *device; 1144 + gpa_t gpa; 1147 1145 1148 - if (!vgic_its_check_id(its, its->baser_device_table, device_id, NULL)) 1146 + if (!vgic_its_check_id(its, its->baser_device_table, device_id, &gpa)) 1149 1147 return E_ITS_MAPD_DEVICE_OOR; 1150 1148 1151 1149 if (valid && num_eventid_bits > VITS_TYPER_IDBITS) ··· 1168 1162 * is an error, so we are done in any case. 1169 1163 */ 1170 1164 if (!valid) 1171 - return 0; 1165 + return vgic_its_write_entry_lock(its, gpa, 0, dte_esz); 1172 1166 1173 1167 device = vgic_its_alloc_device(its, device_id, itt_addr, 1174 1168 num_eventid_bits); ··· 2092 2086 static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev, 2093 2087 struct its_ite *ite, gpa_t gpa, int ite_esz) 2094 2088 { 2095 - struct kvm *kvm = its->dev->kvm; 2096 2089 u32 next_offset; 2097 2090 u64 val; 2098 2091 ··· 2100 2095 ((u64)ite->irq->intid << KVM_ITS_ITE_PINTID_SHIFT) | 2101 2096 ite->collection->collection_id; 2102 2097 val = cpu_to_le64(val); 2103 - return vgic_write_guest_lock(kvm, gpa, &val, ite_esz); 2098 + 2099 + return vgic_its_write_entry_lock(its, gpa, val, ite_esz); 2104 2100 } 2105 2101 2106 2102 /** ··· 2245 2239 static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev, 2246 2240 gpa_t ptr, int dte_esz) 2247 2241 { 2248 - struct kvm *kvm = its->dev->kvm; 2249 2242 u64 val, itt_addr_field; 2250 2243 u32 next_offset; 2251 2244 ··· 2255 2250 (itt_addr_field << KVM_ITS_DTE_ITTADDR_SHIFT) | 2256 2251 (dev->num_eventid_bits - 1)); 2257 2252 val = cpu_to_le64(val); 2258 - return vgic_write_guest_lock(kvm, ptr, &val, dte_esz); 2253 + 2254 + return vgic_its_write_entry_lock(its, ptr, val, dte_esz); 2259 2255 } 2260 2256 2261 2257 /** ··· 2443 2437 ((u64)collection->target_addr << KVM_ITS_CTE_RDBASE_SHIFT) | 2444 2438 collection->collection_id); 2445 2439 val = cpu_to_le64(val); 2446 - return vgic_write_guest_lock(its->dev->kvm, gpa, &val, esz); 2440 + 2441 + return vgic_its_write_entry_lock(its, gpa, val, esz); 2447 2442 } 2448 2443 2449 2444 /* ··· 2460 2453 u64 val; 2461 2454 int ret; 2462 2455 2463 - BUG_ON(esz > sizeof(val)); 2464 - ret = kvm_read_guest_lock(kvm, gpa, &val, esz); 2456 + ret = vgic_its_read_entry_lock(its, gpa, &val, esz); 2465 2457 if (ret) 2466 2458 return ret; 2467 2459 val = le64_to_cpu(val); ··· 2498 2492 u64 baser = its->baser_coll_table; 2499 2493 gpa_t gpa = GITS_BASER_ADDR_48_to_52(baser); 2500 2494 struct its_collection *collection; 2501 - u64 val; 2502 2495 size_t max_size, filled = 0; 2503 2496 int ret, cte_esz = abi->cte_esz; 2504 2497 ··· 2521 2516 * table is not fully filled, add a last dummy element 2522 2517 * with valid bit unset 2523 2518 */ 2524 - val = 0; 2525 - BUG_ON(cte_esz > sizeof(val)); 2526 - ret = vgic_write_guest_lock(its->dev->kvm, gpa, &val, cte_esz); 2527 - return ret; 2519 + return vgic_its_write_entry_lock(its, gpa, 0, cte_esz); 2528 2520 } 2529 2521 2530 2522 /*
+23
arch/arm64/kvm/vgic/vgic.h
··· 146 146 return ret; 147 147 } 148 148 149 + static inline int vgic_its_read_entry_lock(struct vgic_its *its, gpa_t eaddr, 150 + u64 *eval, unsigned long esize) 151 + { 152 + struct kvm *kvm = its->dev->kvm; 153 + 154 + if (KVM_BUG_ON(esize != sizeof(*eval), kvm)) 155 + return -EINVAL; 156 + 157 + return kvm_read_guest_lock(kvm, eaddr, eval, esize); 158 + 159 + } 160 + 161 + static inline int vgic_its_write_entry_lock(struct vgic_its *its, gpa_t eaddr, 162 + u64 eval, unsigned long esize) 163 + { 164 + struct kvm *kvm = its->dev->kvm; 165 + 166 + if (KVM_BUG_ON(esize != sizeof(eval), kvm)) 167 + return -EINVAL; 168 + 169 + return vgic_write_guest_lock(kvm, eaddr, &eval, esize); 170 + } 171 + 149 172 /* 150 173 * This struct provides an intermediate representation of the fields contained 151 174 * in the GICH_VMCR and ICH_VMCR registers, such that code exporting the GIC
+2
arch/arm64/tools/cpucaps
··· 60 60 KVM_HVHE 61 61 KVM_PROTECTED_MODE 62 62 MISMATCHED_CACHE_TYPE 63 + MPAM 64 + MPAM_HCR 63 65 MTE 64 66 MTE_ASYMM 65 67 SME
+244 -5
arch/arm64/tools/sysreg
··· 1200 1200 0b0001 IMP 1201 1201 0b0010 BRBE_V1P1 1202 1202 EndEnum 1203 - Enum 51:48 MTPMU 1203 + SignedEnum 51:48 MTPMU 1204 1204 0b0000 NI_IMPDEF 1205 1205 0b0001 IMP 1206 1206 0b1111 NI ··· 1208 1208 UnsignedEnum 47:44 TraceBuffer 1209 1209 0b0000 NI 1210 1210 0b0001 IMP 1211 + 0b0010 TRBE_V1P1 1211 1212 EndEnum 1212 1213 UnsignedEnum 43:40 TraceFilt 1213 1214 0b0000 NI ··· 1225 1224 0b0011 V1P2 1226 1225 0b0100 V1P3 1227 1226 0b0101 V1P4 1227 + 0b0110 V1P5 1228 1228 EndEnum 1229 1229 Field 31:28 CTX_CMPs 1230 - Res0 27:24 1230 + UnsignedEnum 27:24 SEBEP 1231 + 0b0000 NI 1232 + 0b0001 IMP 1233 + EndEnum 1231 1234 Field 23:20 WRPs 1232 - Res0 19:16 1235 + UnsignedEnum 19:16 PMSS 1236 + 0b0000 NI 1237 + 0b0001 IMP 1238 + EndEnum 1233 1239 Field 15:12 BRPs 1234 1240 UnsignedEnum 11:8 PMUVer 1235 1241 0b0000 NI ··· 1246 1238 0b0110 V3P5 1247 1239 0b0111 V3P7 1248 1240 0b1000 V3P8 1241 + 0b1001 V3P9 1249 1242 0b1111 IMP_DEF 1250 1243 EndEnum 1251 1244 UnsignedEnum 7:4 TraceVer ··· 1294 1285 Field 23:16 WRPs 1295 1286 Field 15:8 BRPs 1296 1287 Field 7:0 SYSPMUID 1288 + EndSysreg 1289 + 1290 + Sysreg ID_AA64DFR2_EL1 3 0 0 5 2 1291 + Res0 63:28 1292 + UnsignedEnum 27:24 TRBE_EXC 1293 + 0b0000 NI 1294 + 0b0001 IMP 1295 + EndEnum 1296 + UnsignedEnum 23:20 SPE_nVM 1297 + 0b0000 NI 1298 + 0b0001 IMP 1299 + EndEnum 1300 + UnsignedEnum 19:16 SPE_EXC 1301 + 0b0000 NI 1302 + 0b0001 IMP 1303 + EndEnum 1304 + Res0 15:8 1305 + UnsignedEnum 7:4 BWE 1306 + 0b0000 NI 1307 + 0b0001 FEAT_BWE 1308 + 0b0002 FEAT_BWE2 1309 + EndEnum 1310 + UnsignedEnum 3:0 STEP 1311 + 0b0000 NI 1312 + 0b0001 IMP 1313 + EndEnum 1297 1314 EndSysreg 1298 1315 1299 1316 Sysreg ID_AA64AFR0_EL1 3 0 0 5 4 ··· 1723 1688 0b0000 NI 1724 1689 0b0001 AF 1725 1690 0b0010 DBM 1691 + 0b0011 HAFT 1726 1692 EndEnum 1727 1693 EndSysreg 1728 1694 ··· 2424 2388 Field 0 AFSR0_EL1 2425 2389 EndSysregFields 2426 2390 2391 + Sysreg MDCR_EL2 3 4 1 1 1 2392 + Res0 63:51 2393 + Field 50 EnSTEPOP 2394 + Res0 49:44 2395 + Field 43 EBWE 2396 + Res0 42 2397 + Field 41:40 PMEE 2398 + Res0 39:37 2399 + Field 36 HPMFZS 2400 + Res0 35:32 2401 + Field 31:30 PMSSE 2402 + Field 29 HPMFZO 2403 + Field 28 MTPME 2404 + Field 27 TDCC 2405 + Field 26 HLP 2406 + Field 25:24 E2TB 2407 + Field 23 HCCD 2408 + Res0 22:20 2409 + Field 19 TTRF 2410 + Res0 18 2411 + Field 17 HPMD 2412 + Res0 16 2413 + Field 15 EnSPM 2414 + Field 14 TPMS 2415 + Field 13:12 E2PB 2416 + Field 11 TDRA 2417 + Field 10 TDOSA 2418 + Field 9 TDA 2419 + Field 8 TDE 2420 + Field 7 HPME 2421 + Field 6 TPM 2422 + Field 5 TPMCR 2423 + Field 4:0 HPMN 2424 + EndSysreg 2425 + 2427 2426 Sysreg HFGRTR_EL2 3 4 1 1 4 2428 2427 Fields HFGxTR_EL2 2429 2428 EndSysreg ··· 2808 2737 Field 0 E0HSPE 2809 2738 EndSysreg 2810 2739 2740 + Sysreg MPAMHCR_EL2 3 4 10 4 0 2741 + Res0 63:32 2742 + Field 31 TRAP_MPAMIDR_EL1 2743 + Res0 30:9 2744 + Field 8 GSTAPP_PLK 2745 + Res0 7:2 2746 + Field 1 EL1_VPMEN 2747 + Field 0 EL0_VPMEN 2748 + EndSysreg 2749 + 2750 + Sysreg MPAMVPMV_EL2 3 4 10 4 1 2751 + Res0 63:32 2752 + Field 31 VPM_V31 2753 + Field 30 VPM_V30 2754 + Field 29 VPM_V29 2755 + Field 28 VPM_V28 2756 + Field 27 VPM_V27 2757 + Field 26 VPM_V26 2758 + Field 25 VPM_V25 2759 + Field 24 VPM_V24 2760 + Field 23 VPM_V23 2761 + Field 22 VPM_V22 2762 + Field 21 VPM_V21 2763 + Field 20 VPM_V20 2764 + Field 19 VPM_V19 2765 + Field 18 VPM_V18 2766 + Field 17 VPM_V17 2767 + Field 16 VPM_V16 2768 + Field 15 VPM_V15 2769 + Field 14 VPM_V14 2770 + Field 13 VPM_V13 2771 + Field 12 VPM_V12 2772 + Field 11 VPM_V11 2773 + Field 10 VPM_V10 2774 + Field 9 VPM_V9 2775 + Field 8 VPM_V8 2776 + Field 7 VPM_V7 2777 + Field 6 VPM_V6 2778 + Field 5 VPM_V5 2779 + Field 4 VPM_V4 2780 + Field 3 VPM_V3 2781 + Field 2 VPM_V2 2782 + Field 1 VPM_V1 2783 + Field 0 VPM_V0 2784 + EndSysreg 2785 + 2786 + Sysreg MPAM2_EL2 3 4 10 5 0 2787 + Field 63 MPAMEN 2788 + Res0 62:59 2789 + Field 58 TIDR 2790 + Res0 57 2791 + Field 56 ALTSP_HFC 2792 + Field 55 ALTSP_EL2 2793 + Field 54 ALTSP_FRCD 2794 + Res0 53:51 2795 + Field 50 EnMPAMSM 2796 + Field 49 TRAPMPAM0EL1 2797 + Field 48 TRAPMPAM1EL1 2798 + Field 47:40 PMG_D 2799 + Field 39:32 PMG_I 2800 + Field 31:16 PARTID_D 2801 + Field 15:0 PARTID_I 2802 + EndSysreg 2803 + 2804 + Sysreg MPAMVPM0_EL2 3 4 10 6 0 2805 + Field 63:48 PhyPARTID3 2806 + Field 47:32 PhyPARTID2 2807 + Field 31:16 PhyPARTID1 2808 + Field 15:0 PhyPARTID0 2809 + EndSysreg 2810 + 2811 + Sysreg MPAMVPM1_EL2 3 4 10 6 1 2812 + Field 63:48 PhyPARTID7 2813 + Field 47:32 PhyPARTID6 2814 + Field 31:16 PhyPARTID5 2815 + Field 15:0 PhyPARTID4 2816 + EndSysreg 2817 + 2818 + Sysreg MPAMVPM2_EL2 3 4 10 6 2 2819 + Field 63:48 PhyPARTID11 2820 + Field 47:32 PhyPARTID10 2821 + Field 31:16 PhyPARTID9 2822 + Field 15:0 PhyPARTID8 2823 + EndSysreg 2824 + 2825 + Sysreg MPAMVPM3_EL2 3 4 10 6 3 2826 + Field 63:48 PhyPARTID15 2827 + Field 47:32 PhyPARTID14 2828 + Field 31:16 PhyPARTID13 2829 + Field 15:0 PhyPARTID12 2830 + EndSysreg 2831 + 2832 + Sysreg MPAMVPM4_EL2 3 4 10 6 4 2833 + Field 63:48 PhyPARTID19 2834 + Field 47:32 PhyPARTID18 2835 + Field 31:16 PhyPARTID17 2836 + Field 15:0 PhyPARTID16 2837 + EndSysreg 2838 + 2839 + Sysreg MPAMVPM5_EL2 3 4 10 6 5 2840 + Field 63:48 PhyPARTID23 2841 + Field 47:32 PhyPARTID22 2842 + Field 31:16 PhyPARTID21 2843 + Field 15:0 PhyPARTID20 2844 + EndSysreg 2845 + 2846 + Sysreg MPAMVPM6_EL2 3 4 10 6 6 2847 + Field 63:48 PhyPARTID27 2848 + Field 47:32 PhyPARTID26 2849 + Field 31:16 PhyPARTID25 2850 + Field 15:0 PhyPARTID24 2851 + EndSysreg 2852 + 2853 + Sysreg MPAMVPM7_EL2 3 4 10 6 7 2854 + Field 63:48 PhyPARTID31 2855 + Field 47:32 PhyPARTID30 2856 + Field 31:16 PhyPARTID29 2857 + Field 15:0 PhyPARTID28 2858 + EndSysreg 2859 + 2811 2860 Sysreg CONTEXTIDR_EL2 3 4 13 0 1 2812 2861 Fields CONTEXTIDR_ELx 2813 2862 EndSysreg ··· 2958 2767 2959 2768 Sysreg FAR_EL12 3 5 6 0 0 2960 2769 Field 63:0 ADDR 2770 + EndSysreg 2771 + 2772 + Sysreg MPAM1_EL12 3 5 10 5 0 2773 + Fields MPAM1_ELx 2961 2774 EndSysreg 2962 2775 2963 2776 Sysreg CONTEXTIDR_EL12 3 5 13 0 1 ··· 3014 2819 Field 12 AMEC0 3015 2820 Field 11 HAFT 3016 2821 Field 10 PTTWI 3017 - Field 9:8 SKL1 3018 - Field 7:6 SKL0 2822 + Res0 9:6 3019 2823 Field 5 D128 3020 2824 Field 4 AIE 3021 2825 Field 3 POE ··· 3077 2883 Fields PIRx_ELx 3078 2884 EndSysreg 3079 2885 2886 + Sysreg PIRE0_EL2 3 4 10 2 2 2887 + Fields PIRx_ELx 2888 + EndSysreg 2889 + 3080 2890 Sysreg PIR_EL1 3 0 10 2 3 3081 2891 Fields PIRx_ELx 3082 2892 EndSysreg ··· 3098 2900 EndSysreg 3099 2901 3100 2902 Sysreg POR_EL1 3 0 10 2 4 2903 + Fields PIRx_ELx 2904 + EndSysreg 2905 + 2906 + Sysreg POR_EL2 3 4 10 2 4 3101 2907 Fields PIRx_ELx 3102 2908 EndSysreg 3103 2909 ··· 3143 2941 Field 0 EN 3144 2942 EndSysreg 3145 2943 2944 + Sysreg MPAMIDR_EL1 3 0 10 4 4 2945 + Res0 63:62 2946 + Field 61 HAS_SDEFLT 2947 + Field 60 HAS_FORCE_NS 2948 + Field 59 SP4 2949 + Field 58 HAS_TIDR 2950 + Field 57 HAS_ALTSP 2951 + Res0 56:40 2952 + Field 39:32 PMG_MAX 2953 + Res0 31:21 2954 + Field 20:18 VPMR_MAX 2955 + Field 17 HAS_HCR 2956 + Res0 16 2957 + Field 15:0 PARTID_MAX 2958 + EndSysreg 2959 + 3146 2960 Sysreg LORID_EL1 3 0 10 4 7 3147 2961 Res0 63:24 3148 2962 Field 23:16 LD 3149 2963 Res0 15:8 3150 2964 Field 7:0 LR 2965 + EndSysreg 2966 + 2967 + Sysreg MPAM1_EL1 3 0 10 5 0 2968 + Field 63 MPAMEN 2969 + Res0 62:61 2970 + Field 60 FORCED_NS 2971 + Res0 59:55 2972 + Field 54 ALTSP_FRCD 2973 + Res0 53:48 2974 + Field 47:40 PMG_D 2975 + Field 39:32 PMG_I 2976 + Field 31:16 PARTID_D 2977 + Field 15:0 PARTID_I 2978 + EndSysreg 2979 + 2980 + Sysreg MPAM0_EL1 3 0 10 5 1 2981 + Res0 63:48 2982 + Field 47:40 PMG_D 2983 + Field 39:32 PMG_I 2984 + Field 31:16 PARTID_D 2985 + Field 15:0 PARTID_I 3151 2986 EndSysreg 3152 2987 3153 2988 Sysreg ISR_EL1 3 0 12 1 0
+45
drivers/firmware/psci/psci.c
··· 78 78 79 79 static u32 psci_cpu_suspend_feature; 80 80 static bool psci_system_reset2_supported; 81 + static bool psci_system_off2_hibernate_supported; 81 82 82 83 static inline bool psci_has_ext_power_state(void) 83 84 { ··· 334 333 invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0); 335 334 } 336 335 336 + #ifdef CONFIG_HIBERNATION 337 + static int psci_sys_hibernate(struct sys_off_data *data) 338 + { 339 + /* 340 + * If no hibernate type is specified SYSTEM_OFF2 defaults to selecting 341 + * HIBERNATE_OFF. 342 + * 343 + * There are hypervisors in the wild that do not align with the spec and 344 + * reject calls that explicitly provide a hibernate type. For 345 + * compatibility with these nonstandard implementations, pass 0 as the 346 + * type. 347 + */ 348 + if (system_entering_hibernation()) 349 + invoke_psci_fn(PSCI_FN_NATIVE(1_3, SYSTEM_OFF2), 0, 0, 0); 350 + return NOTIFY_DONE; 351 + } 352 + 353 + static int __init psci_hibernate_init(void) 354 + { 355 + if (psci_system_off2_hibernate_supported) { 356 + /* Higher priority than EFI shutdown, but only for hibernate */ 357 + register_sys_off_handler(SYS_OFF_MODE_POWER_OFF, 358 + SYS_OFF_PRIO_FIRMWARE + 2, 359 + psci_sys_hibernate, NULL); 360 + } 361 + return 0; 362 + } 363 + subsys_initcall(psci_hibernate_init); 364 + #endif 365 + 337 366 static int psci_features(u32 psci_func_id) 338 367 { 339 368 return invoke_psci_fn(PSCI_1_0_FN_PSCI_FEATURES, ··· 395 364 PSCI_ID_NATIVE(1_1, SYSTEM_RESET2), 396 365 PSCI_ID(1_1, MEM_PROTECT), 397 366 PSCI_ID_NATIVE(1_1, MEM_PROTECT_CHECK_RANGE), 367 + PSCI_ID_NATIVE(1_3, SYSTEM_OFF2), 398 368 }; 399 369 400 370 static int psci_debugfs_read(struct seq_file *s, void *data) ··· 557 525 psci_system_reset2_supported = true; 558 526 } 559 527 528 + static void __init psci_init_system_off2(void) 529 + { 530 + int ret; 531 + 532 + ret = psci_features(PSCI_FN_NATIVE(1_3, SYSTEM_OFF2)); 533 + if (ret < 0) 534 + return; 535 + 536 + if (ret & PSCI_1_3_OFF_TYPE_HIBERNATE_OFF) 537 + psci_system_off2_hibernate_supported = true; 538 + } 539 + 560 540 static void __init psci_init_system_suspend(void) 561 541 { 562 542 int ret; ··· 699 655 psci_init_cpu_suspend(); 700 656 psci_init_system_suspend(); 701 657 psci_init_system_reset2(); 658 + psci_init_system_off2(); 702 659 kvm_init_hyp_services(); 703 660 } 704 661
+3
include/kvm/arm_arch_timer.h
··· 147 147 void kvm_timer_cpu_up(void); 148 148 void kvm_timer_cpu_down(void); 149 149 150 + /* CNTKCTL_EL1 valid bits as of DDI0487J.a */ 151 + #define CNTKCTL_VALID_BITS (BIT(17) | GENMASK_ULL(9, 0)) 152 + 150 153 static inline bool has_cntpoff(void) 151 154 { 152 155 return (has_vhe() && cpus_have_final_cap(ARM64_HAS_ECV_CNTPOFF));
+16 -2
include/kvm/arm_pmu.h
··· 47 47 #define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS) 48 48 u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx); 49 49 void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val); 50 - u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu); 50 + u64 kvm_pmu_implemented_counter_mask(struct kvm_vcpu *vcpu); 51 + u64 kvm_pmu_accessible_counter_mask(struct kvm_vcpu *vcpu); 51 52 u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1); 52 53 void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu); 53 54 void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu); ··· 97 96 u8 kvm_arm_pmu_get_max_counters(struct kvm *kvm); 98 97 99 98 u64 kvm_vcpu_read_pmcr(struct kvm_vcpu *vcpu); 99 + bool kvm_pmu_counter_is_hyp(struct kvm_vcpu *vcpu, unsigned int idx); 100 + void kvm_pmu_nested_transition(struct kvm_vcpu *vcpu); 100 101 #else 101 102 struct kvm_pmu { 102 103 }; ··· 116 113 } 117 114 static inline void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, 118 115 u64 select_idx, u64 val) {} 119 - static inline u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu) 116 + static inline u64 kvm_pmu_implemented_counter_mask(struct kvm_vcpu *vcpu) 117 + { 118 + return 0; 119 + } 120 + static inline u64 kvm_pmu_accessible_counter_mask(struct kvm_vcpu *vcpu) 120 121 { 121 122 return 0; 122 123 } ··· 193 186 { 194 187 return 0; 195 188 } 189 + 190 + static inline bool kvm_pmu_counter_is_hyp(struct kvm_vcpu *vcpu, unsigned int idx) 191 + { 192 + return false; 193 + } 194 + 195 + static inline void kvm_pmu_nested_transition(struct kvm_vcpu *vcpu) {} 196 196 197 197 #endif 198 198
+3 -1
include/kvm/arm_psci.h
··· 14 14 #define KVM_ARM_PSCI_0_2 PSCI_VERSION(0, 2) 15 15 #define KVM_ARM_PSCI_1_0 PSCI_VERSION(1, 0) 16 16 #define KVM_ARM_PSCI_1_1 PSCI_VERSION(1, 1) 17 + #define KVM_ARM_PSCI_1_2 PSCI_VERSION(1, 2) 18 + #define KVM_ARM_PSCI_1_3 PSCI_VERSION(1, 3) 17 19 18 - #define KVM_ARM_PSCI_LATEST KVM_ARM_PSCI_1_1 20 + #define KVM_ARM_PSCI_LATEST KVM_ARM_PSCI_1_3 19 21 20 22 static inline int kvm_psci_version(struct kvm_vcpu *vcpu) 21 23 {
+5
include/uapi/linux/psci.h
··· 59 59 #define PSCI_1_1_FN_SYSTEM_RESET2 PSCI_0_2_FN(18) 60 60 #define PSCI_1_1_FN_MEM_PROTECT PSCI_0_2_FN(19) 61 61 #define PSCI_1_1_FN_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN(20) 62 + #define PSCI_1_3_FN_SYSTEM_OFF2 PSCI_0_2_FN(21) 62 63 63 64 #define PSCI_1_0_FN64_CPU_DEFAULT_SUSPEND PSCI_0_2_FN64(12) 64 65 #define PSCI_1_0_FN64_NODE_HW_STATE PSCI_0_2_FN64(13) ··· 69 68 70 69 #define PSCI_1_1_FN64_SYSTEM_RESET2 PSCI_0_2_FN64(18) 71 70 #define PSCI_1_1_FN64_MEM_PROTECT_CHECK_RANGE PSCI_0_2_FN64(20) 71 + #define PSCI_1_3_FN64_SYSTEM_OFF2 PSCI_0_2_FN64(21) 72 72 73 73 /* PSCI v0.2 power state encoding for CPU_SUSPEND function */ 74 74 #define PSCI_0_2_POWER_STATE_ID_MASK 0xffff ··· 101 99 /* PSCI v1.1 reset type encoding for SYSTEM_RESET2 */ 102 100 #define PSCI_1_1_RESET_TYPE_SYSTEM_WARM_RESET 0 103 101 #define PSCI_1_1_RESET_TYPE_VENDOR_START 0x80000000U 102 + 103 + /* PSCI v1.3 hibernate type for SYSTEM_OFF2 */ 104 + #define PSCI_1_3_OFF_TYPE_HIBERNATE_OFF BIT(0) 104 105 105 106 /* PSCI version decoding (independent of PSCI version) */ 106 107 #define PSCI_VERSION_MAJOR_SHIFT 16
+4 -1
kernel/power/hibernate.c
··· 685 685 } 686 686 fallthrough; 687 687 case HIBERNATION_SHUTDOWN: 688 - if (kernel_can_power_off()) 688 + if (kernel_can_power_off()) { 689 + entering_platform_hibernation = true; 689 690 kernel_power_off(); 691 + entering_platform_hibernation = false; 692 + } 690 693 break; 691 694 } 692 695 kernel_halt();
+42
tools/arch/arm64/include/asm/brk-imm.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (C) 2012 ARM Ltd. 4 + */ 5 + 6 + #ifndef __ASM_BRK_IMM_H 7 + #define __ASM_BRK_IMM_H 8 + 9 + /* 10 + * #imm16 values used for BRK instruction generation 11 + * 0x004: for installing kprobes 12 + * 0x005: for installing uprobes 13 + * 0x006: for kprobe software single-step 14 + * 0x007: for kretprobe return 15 + * Allowed values for kgdb are 0x400 - 0x7ff 16 + * 0x100: for triggering a fault on purpose (reserved) 17 + * 0x400: for dynamic BRK instruction 18 + * 0x401: for compile time BRK instruction 19 + * 0x800: kernel-mode BUG() and WARN() traps 20 + * 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff) 21 + * 0x55xx: Undefined Behavior Sanitizer traps ('U' << 8) 22 + * 0x8xxx: Control-Flow Integrity traps 23 + */ 24 + #define KPROBES_BRK_IMM 0x004 25 + #define UPROBES_BRK_IMM 0x005 26 + #define KPROBES_BRK_SS_IMM 0x006 27 + #define KRETPROBES_BRK_IMM 0x007 28 + #define FAULT_BRK_IMM 0x100 29 + #define KGDB_DYN_DBG_BRK_IMM 0x400 30 + #define KGDB_COMPILED_DBG_BRK_IMM 0x401 31 + #define BUG_BRK_IMM 0x800 32 + #define KASAN_BRK_IMM 0x900 33 + #define KASAN_BRK_MASK 0x0ff 34 + #define UBSAN_BRK_IMM 0x5500 35 + #define UBSAN_BRK_MASK 0x00ff 36 + 37 + #define CFI_BRK_IMM_TARGET GENMASK(4, 0) 38 + #define CFI_BRK_IMM_TYPE GENMASK(9, 5) 39 + #define CFI_BRK_IMM_BASE 0x8000 40 + #define CFI_BRK_IMM_MASK (CFI_BRK_IMM_TARGET | CFI_BRK_IMM_TYPE) 41 + 42 + #endif
+455
tools/arch/arm64/include/asm/esr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (C) 2013 - ARM Ltd 4 + * Author: Marc Zyngier <marc.zyngier@arm.com> 5 + */ 6 + 7 + #ifndef __ASM_ESR_H 8 + #define __ASM_ESR_H 9 + 10 + #include <asm/sysreg.h> 11 + 12 + #define ESR_ELx_EC_UNKNOWN UL(0x00) 13 + #define ESR_ELx_EC_WFx UL(0x01) 14 + /* Unallocated EC: 0x02 */ 15 + #define ESR_ELx_EC_CP15_32 UL(0x03) 16 + #define ESR_ELx_EC_CP15_64 UL(0x04) 17 + #define ESR_ELx_EC_CP14_MR UL(0x05) 18 + #define ESR_ELx_EC_CP14_LS UL(0x06) 19 + #define ESR_ELx_EC_FP_ASIMD UL(0x07) 20 + #define ESR_ELx_EC_CP10_ID UL(0x08) /* EL2 only */ 21 + #define ESR_ELx_EC_PAC UL(0x09) /* EL2 and above */ 22 + /* Unallocated EC: 0x0A - 0x0B */ 23 + #define ESR_ELx_EC_CP14_64 UL(0x0C) 24 + #define ESR_ELx_EC_BTI UL(0x0D) 25 + #define ESR_ELx_EC_ILL UL(0x0E) 26 + /* Unallocated EC: 0x0F - 0x10 */ 27 + #define ESR_ELx_EC_SVC32 UL(0x11) 28 + #define ESR_ELx_EC_HVC32 UL(0x12) /* EL2 only */ 29 + #define ESR_ELx_EC_SMC32 UL(0x13) /* EL2 and above */ 30 + /* Unallocated EC: 0x14 */ 31 + #define ESR_ELx_EC_SVC64 UL(0x15) 32 + #define ESR_ELx_EC_HVC64 UL(0x16) /* EL2 and above */ 33 + #define ESR_ELx_EC_SMC64 UL(0x17) /* EL2 and above */ 34 + #define ESR_ELx_EC_SYS64 UL(0x18) 35 + #define ESR_ELx_EC_SVE UL(0x19) 36 + #define ESR_ELx_EC_ERET UL(0x1a) /* EL2 only */ 37 + /* Unallocated EC: 0x1B */ 38 + #define ESR_ELx_EC_FPAC UL(0x1C) /* EL1 and above */ 39 + #define ESR_ELx_EC_SME UL(0x1D) 40 + /* Unallocated EC: 0x1E */ 41 + #define ESR_ELx_EC_IMP_DEF UL(0x1f) /* EL3 only */ 42 + #define ESR_ELx_EC_IABT_LOW UL(0x20) 43 + #define ESR_ELx_EC_IABT_CUR UL(0x21) 44 + #define ESR_ELx_EC_PC_ALIGN UL(0x22) 45 + /* Unallocated EC: 0x23 */ 46 + #define ESR_ELx_EC_DABT_LOW UL(0x24) 47 + #define ESR_ELx_EC_DABT_CUR UL(0x25) 48 + #define ESR_ELx_EC_SP_ALIGN UL(0x26) 49 + #define ESR_ELx_EC_MOPS UL(0x27) 50 + #define ESR_ELx_EC_FP_EXC32 UL(0x28) 51 + /* Unallocated EC: 0x29 - 0x2B */ 52 + #define ESR_ELx_EC_FP_EXC64 UL(0x2C) 53 + /* Unallocated EC: 0x2D - 0x2E */ 54 + #define ESR_ELx_EC_SERROR UL(0x2F) 55 + #define ESR_ELx_EC_BREAKPT_LOW UL(0x30) 56 + #define ESR_ELx_EC_BREAKPT_CUR UL(0x31) 57 + #define ESR_ELx_EC_SOFTSTP_LOW UL(0x32) 58 + #define ESR_ELx_EC_SOFTSTP_CUR UL(0x33) 59 + #define ESR_ELx_EC_WATCHPT_LOW UL(0x34) 60 + #define ESR_ELx_EC_WATCHPT_CUR UL(0x35) 61 + /* Unallocated EC: 0x36 - 0x37 */ 62 + #define ESR_ELx_EC_BKPT32 UL(0x38) 63 + /* Unallocated EC: 0x39 */ 64 + #define ESR_ELx_EC_VECTOR32 UL(0x3A) /* EL2 only */ 65 + /* Unallocated EC: 0x3B */ 66 + #define ESR_ELx_EC_BRK64 UL(0x3C) 67 + /* Unallocated EC: 0x3D - 0x3F */ 68 + #define ESR_ELx_EC_MAX UL(0x3F) 69 + 70 + #define ESR_ELx_EC_SHIFT (26) 71 + #define ESR_ELx_EC_WIDTH (6) 72 + #define ESR_ELx_EC_MASK (UL(0x3F) << ESR_ELx_EC_SHIFT) 73 + #define ESR_ELx_EC(esr) (((esr) & ESR_ELx_EC_MASK) >> ESR_ELx_EC_SHIFT) 74 + 75 + #define ESR_ELx_IL_SHIFT (25) 76 + #define ESR_ELx_IL (UL(1) << ESR_ELx_IL_SHIFT) 77 + #define ESR_ELx_ISS_MASK (GENMASK(24, 0)) 78 + #define ESR_ELx_ISS(esr) ((esr) & ESR_ELx_ISS_MASK) 79 + #define ESR_ELx_ISS2_SHIFT (32) 80 + #define ESR_ELx_ISS2_MASK (GENMASK_ULL(55, 32)) 81 + #define ESR_ELx_ISS2(esr) (((esr) & ESR_ELx_ISS2_MASK) >> ESR_ELx_ISS2_SHIFT) 82 + 83 + /* ISS field definitions shared by different classes */ 84 + #define ESR_ELx_WNR_SHIFT (6) 85 + #define ESR_ELx_WNR (UL(1) << ESR_ELx_WNR_SHIFT) 86 + 87 + /* Asynchronous Error Type */ 88 + #define ESR_ELx_IDS_SHIFT (24) 89 + #define ESR_ELx_IDS (UL(1) << ESR_ELx_IDS_SHIFT) 90 + #define ESR_ELx_AET_SHIFT (10) 91 + #define ESR_ELx_AET (UL(0x7) << ESR_ELx_AET_SHIFT) 92 + 93 + #define ESR_ELx_AET_UC (UL(0) << ESR_ELx_AET_SHIFT) 94 + #define ESR_ELx_AET_UEU (UL(1) << ESR_ELx_AET_SHIFT) 95 + #define ESR_ELx_AET_UEO (UL(2) << ESR_ELx_AET_SHIFT) 96 + #define ESR_ELx_AET_UER (UL(3) << ESR_ELx_AET_SHIFT) 97 + #define ESR_ELx_AET_CE (UL(6) << ESR_ELx_AET_SHIFT) 98 + 99 + /* Shared ISS field definitions for Data/Instruction aborts */ 100 + #define ESR_ELx_SET_SHIFT (11) 101 + #define ESR_ELx_SET_MASK (UL(3) << ESR_ELx_SET_SHIFT) 102 + #define ESR_ELx_FnV_SHIFT (10) 103 + #define ESR_ELx_FnV (UL(1) << ESR_ELx_FnV_SHIFT) 104 + #define ESR_ELx_EA_SHIFT (9) 105 + #define ESR_ELx_EA (UL(1) << ESR_ELx_EA_SHIFT) 106 + #define ESR_ELx_S1PTW_SHIFT (7) 107 + #define ESR_ELx_S1PTW (UL(1) << ESR_ELx_S1PTW_SHIFT) 108 + 109 + /* Shared ISS fault status code(IFSC/DFSC) for Data/Instruction aborts */ 110 + #define ESR_ELx_FSC (0x3F) 111 + #define ESR_ELx_FSC_TYPE (0x3C) 112 + #define ESR_ELx_FSC_LEVEL (0x03) 113 + #define ESR_ELx_FSC_EXTABT (0x10) 114 + #define ESR_ELx_FSC_MTE (0x11) 115 + #define ESR_ELx_FSC_SERROR (0x11) 116 + #define ESR_ELx_FSC_ACCESS (0x08) 117 + #define ESR_ELx_FSC_FAULT (0x04) 118 + #define ESR_ELx_FSC_PERM (0x0C) 119 + #define ESR_ELx_FSC_SEA_TTW(n) (0x14 + (n)) 120 + #define ESR_ELx_FSC_SECC (0x18) 121 + #define ESR_ELx_FSC_SECC_TTW(n) (0x1c + (n)) 122 + 123 + /* Status codes for individual page table levels */ 124 + #define ESR_ELx_FSC_ACCESS_L(n) (ESR_ELx_FSC_ACCESS + (n)) 125 + #define ESR_ELx_FSC_PERM_L(n) (ESR_ELx_FSC_PERM + (n)) 126 + 127 + #define ESR_ELx_FSC_FAULT_nL (0x2C) 128 + #define ESR_ELx_FSC_FAULT_L(n) (((n) < 0 ? ESR_ELx_FSC_FAULT_nL : \ 129 + ESR_ELx_FSC_FAULT) + (n)) 130 + 131 + /* ISS field definitions for Data Aborts */ 132 + #define ESR_ELx_ISV_SHIFT (24) 133 + #define ESR_ELx_ISV (UL(1) << ESR_ELx_ISV_SHIFT) 134 + #define ESR_ELx_SAS_SHIFT (22) 135 + #define ESR_ELx_SAS (UL(3) << ESR_ELx_SAS_SHIFT) 136 + #define ESR_ELx_SSE_SHIFT (21) 137 + #define ESR_ELx_SSE (UL(1) << ESR_ELx_SSE_SHIFT) 138 + #define ESR_ELx_SRT_SHIFT (16) 139 + #define ESR_ELx_SRT_MASK (UL(0x1F) << ESR_ELx_SRT_SHIFT) 140 + #define ESR_ELx_SF_SHIFT (15) 141 + #define ESR_ELx_SF (UL(1) << ESR_ELx_SF_SHIFT) 142 + #define ESR_ELx_AR_SHIFT (14) 143 + #define ESR_ELx_AR (UL(1) << ESR_ELx_AR_SHIFT) 144 + #define ESR_ELx_CM_SHIFT (8) 145 + #define ESR_ELx_CM (UL(1) << ESR_ELx_CM_SHIFT) 146 + 147 + /* ISS2 field definitions for Data Aborts */ 148 + #define ESR_ELx_TnD_SHIFT (10) 149 + #define ESR_ELx_TnD (UL(1) << ESR_ELx_TnD_SHIFT) 150 + #define ESR_ELx_TagAccess_SHIFT (9) 151 + #define ESR_ELx_TagAccess (UL(1) << ESR_ELx_TagAccess_SHIFT) 152 + #define ESR_ELx_GCS_SHIFT (8) 153 + #define ESR_ELx_GCS (UL(1) << ESR_ELx_GCS_SHIFT) 154 + #define ESR_ELx_Overlay_SHIFT (6) 155 + #define ESR_ELx_Overlay (UL(1) << ESR_ELx_Overlay_SHIFT) 156 + #define ESR_ELx_DirtyBit_SHIFT (5) 157 + #define ESR_ELx_DirtyBit (UL(1) << ESR_ELx_DirtyBit_SHIFT) 158 + #define ESR_ELx_Xs_SHIFT (0) 159 + #define ESR_ELx_Xs_MASK (GENMASK_ULL(4, 0)) 160 + 161 + /* ISS field definitions for exceptions taken in to Hyp */ 162 + #define ESR_ELx_FSC_ADDRSZ (0x00) 163 + #define ESR_ELx_FSC_ADDRSZ_L(n) (ESR_ELx_FSC_ADDRSZ + (n)) 164 + #define ESR_ELx_CV (UL(1) << 24) 165 + #define ESR_ELx_COND_SHIFT (20) 166 + #define ESR_ELx_COND_MASK (UL(0xF) << ESR_ELx_COND_SHIFT) 167 + #define ESR_ELx_WFx_ISS_RN (UL(0x1F) << 5) 168 + #define ESR_ELx_WFx_ISS_RV (UL(1) << 2) 169 + #define ESR_ELx_WFx_ISS_TI (UL(3) << 0) 170 + #define ESR_ELx_WFx_ISS_WFxT (UL(2) << 0) 171 + #define ESR_ELx_WFx_ISS_WFI (UL(0) << 0) 172 + #define ESR_ELx_WFx_ISS_WFE (UL(1) << 0) 173 + #define ESR_ELx_xVC_IMM_MASK ((UL(1) << 16) - 1) 174 + 175 + #define DISR_EL1_IDS (UL(1) << 24) 176 + /* 177 + * DISR_EL1 and ESR_ELx share the bottom 13 bits, but the RES0 bits may mean 178 + * different things in the future... 179 + */ 180 + #define DISR_EL1_ESR_MASK (ESR_ELx_AET | ESR_ELx_EA | ESR_ELx_FSC) 181 + 182 + /* ESR value templates for specific events */ 183 + #define ESR_ELx_WFx_MASK (ESR_ELx_EC_MASK | \ 184 + (ESR_ELx_WFx_ISS_TI & ~ESR_ELx_WFx_ISS_WFxT)) 185 + #define ESR_ELx_WFx_WFI_VAL ((ESR_ELx_EC_WFx << ESR_ELx_EC_SHIFT) | \ 186 + ESR_ELx_WFx_ISS_WFI) 187 + 188 + /* BRK instruction trap from AArch64 state */ 189 + #define ESR_ELx_BRK64_ISS_COMMENT_MASK 0xffff 190 + 191 + /* ISS field definitions for System instruction traps */ 192 + #define ESR_ELx_SYS64_ISS_RES0_SHIFT 22 193 + #define ESR_ELx_SYS64_ISS_RES0_MASK (UL(0x7) << ESR_ELx_SYS64_ISS_RES0_SHIFT) 194 + #define ESR_ELx_SYS64_ISS_DIR_MASK 0x1 195 + #define ESR_ELx_SYS64_ISS_DIR_READ 0x1 196 + #define ESR_ELx_SYS64_ISS_DIR_WRITE 0x0 197 + 198 + #define ESR_ELx_SYS64_ISS_RT_SHIFT 5 199 + #define ESR_ELx_SYS64_ISS_RT_MASK (UL(0x1f) << ESR_ELx_SYS64_ISS_RT_SHIFT) 200 + #define ESR_ELx_SYS64_ISS_CRM_SHIFT 1 201 + #define ESR_ELx_SYS64_ISS_CRM_MASK (UL(0xf) << ESR_ELx_SYS64_ISS_CRM_SHIFT) 202 + #define ESR_ELx_SYS64_ISS_CRN_SHIFT 10 203 + #define ESR_ELx_SYS64_ISS_CRN_MASK (UL(0xf) << ESR_ELx_SYS64_ISS_CRN_SHIFT) 204 + #define ESR_ELx_SYS64_ISS_OP1_SHIFT 14 205 + #define ESR_ELx_SYS64_ISS_OP1_MASK (UL(0x7) << ESR_ELx_SYS64_ISS_OP1_SHIFT) 206 + #define ESR_ELx_SYS64_ISS_OP2_SHIFT 17 207 + #define ESR_ELx_SYS64_ISS_OP2_MASK (UL(0x7) << ESR_ELx_SYS64_ISS_OP2_SHIFT) 208 + #define ESR_ELx_SYS64_ISS_OP0_SHIFT 20 209 + #define ESR_ELx_SYS64_ISS_OP0_MASK (UL(0x3) << ESR_ELx_SYS64_ISS_OP0_SHIFT) 210 + #define ESR_ELx_SYS64_ISS_SYS_MASK (ESR_ELx_SYS64_ISS_OP0_MASK | \ 211 + ESR_ELx_SYS64_ISS_OP1_MASK | \ 212 + ESR_ELx_SYS64_ISS_OP2_MASK | \ 213 + ESR_ELx_SYS64_ISS_CRN_MASK | \ 214 + ESR_ELx_SYS64_ISS_CRM_MASK) 215 + #define ESR_ELx_SYS64_ISS_SYS_VAL(op0, op1, op2, crn, crm) \ 216 + (((op0) << ESR_ELx_SYS64_ISS_OP0_SHIFT) | \ 217 + ((op1) << ESR_ELx_SYS64_ISS_OP1_SHIFT) | \ 218 + ((op2) << ESR_ELx_SYS64_ISS_OP2_SHIFT) | \ 219 + ((crn) << ESR_ELx_SYS64_ISS_CRN_SHIFT) | \ 220 + ((crm) << ESR_ELx_SYS64_ISS_CRM_SHIFT)) 221 + 222 + #define ESR_ELx_SYS64_ISS_SYS_OP_MASK (ESR_ELx_SYS64_ISS_SYS_MASK | \ 223 + ESR_ELx_SYS64_ISS_DIR_MASK) 224 + #define ESR_ELx_SYS64_ISS_RT(esr) \ 225 + (((esr) & ESR_ELx_SYS64_ISS_RT_MASK) >> ESR_ELx_SYS64_ISS_RT_SHIFT) 226 + /* 227 + * User space cache operations have the following sysreg encoding 228 + * in System instructions. 229 + * op0=1, op1=3, op2=1, crn=7, crm={ 5, 10, 11, 12, 13, 14 }, WRITE (L=0) 230 + */ 231 + #define ESR_ELx_SYS64_ISS_CRM_DC_CIVAC 14 232 + #define ESR_ELx_SYS64_ISS_CRM_DC_CVADP 13 233 + #define ESR_ELx_SYS64_ISS_CRM_DC_CVAP 12 234 + #define ESR_ELx_SYS64_ISS_CRM_DC_CVAU 11 235 + #define ESR_ELx_SYS64_ISS_CRM_DC_CVAC 10 236 + #define ESR_ELx_SYS64_ISS_CRM_IC_IVAU 5 237 + 238 + #define ESR_ELx_SYS64_ISS_EL0_CACHE_OP_MASK (ESR_ELx_SYS64_ISS_OP0_MASK | \ 239 + ESR_ELx_SYS64_ISS_OP1_MASK | \ 240 + ESR_ELx_SYS64_ISS_OP2_MASK | \ 241 + ESR_ELx_SYS64_ISS_CRN_MASK | \ 242 + ESR_ELx_SYS64_ISS_DIR_MASK) 243 + #define ESR_ELx_SYS64_ISS_EL0_CACHE_OP_VAL \ 244 + (ESR_ELx_SYS64_ISS_SYS_VAL(1, 3, 1, 7, 0) | \ 245 + ESR_ELx_SYS64_ISS_DIR_WRITE) 246 + /* 247 + * User space MRS operations which are supported for emulation 248 + * have the following sysreg encoding in System instructions. 249 + * op0 = 3, op1= 0, crn = 0, {crm = 0, 4-7}, READ (L = 1) 250 + */ 251 + #define ESR_ELx_SYS64_ISS_SYS_MRS_OP_MASK (ESR_ELx_SYS64_ISS_OP0_MASK | \ 252 + ESR_ELx_SYS64_ISS_OP1_MASK | \ 253 + ESR_ELx_SYS64_ISS_CRN_MASK | \ 254 + ESR_ELx_SYS64_ISS_DIR_MASK) 255 + #define ESR_ELx_SYS64_ISS_SYS_MRS_OP_VAL \ 256 + (ESR_ELx_SYS64_ISS_SYS_VAL(3, 0, 0, 0, 0) | \ 257 + ESR_ELx_SYS64_ISS_DIR_READ) 258 + 259 + #define ESR_ELx_SYS64_ISS_SYS_CTR ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 1, 0, 0) 260 + #define ESR_ELx_SYS64_ISS_SYS_CTR_READ (ESR_ELx_SYS64_ISS_SYS_CTR | \ 261 + ESR_ELx_SYS64_ISS_DIR_READ) 262 + 263 + #define ESR_ELx_SYS64_ISS_SYS_CNTVCT (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 2, 14, 0) | \ 264 + ESR_ELx_SYS64_ISS_DIR_READ) 265 + 266 + #define ESR_ELx_SYS64_ISS_SYS_CNTVCTSS (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 6, 14, 0) | \ 267 + ESR_ELx_SYS64_ISS_DIR_READ) 268 + 269 + #define ESR_ELx_SYS64_ISS_SYS_CNTFRQ (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 0, 14, 0) | \ 270 + ESR_ELx_SYS64_ISS_DIR_READ) 271 + 272 + #define esr_sys64_to_sysreg(e) \ 273 + sys_reg((((e) & ESR_ELx_SYS64_ISS_OP0_MASK) >> \ 274 + ESR_ELx_SYS64_ISS_OP0_SHIFT), \ 275 + (((e) & ESR_ELx_SYS64_ISS_OP1_MASK) >> \ 276 + ESR_ELx_SYS64_ISS_OP1_SHIFT), \ 277 + (((e) & ESR_ELx_SYS64_ISS_CRN_MASK) >> \ 278 + ESR_ELx_SYS64_ISS_CRN_SHIFT), \ 279 + (((e) & ESR_ELx_SYS64_ISS_CRM_MASK) >> \ 280 + ESR_ELx_SYS64_ISS_CRM_SHIFT), \ 281 + (((e) & ESR_ELx_SYS64_ISS_OP2_MASK) >> \ 282 + ESR_ELx_SYS64_ISS_OP2_SHIFT)) 283 + 284 + #define esr_cp15_to_sysreg(e) \ 285 + sys_reg(3, \ 286 + (((e) & ESR_ELx_SYS64_ISS_OP1_MASK) >> \ 287 + ESR_ELx_SYS64_ISS_OP1_SHIFT), \ 288 + (((e) & ESR_ELx_SYS64_ISS_CRN_MASK) >> \ 289 + ESR_ELx_SYS64_ISS_CRN_SHIFT), \ 290 + (((e) & ESR_ELx_SYS64_ISS_CRM_MASK) >> \ 291 + ESR_ELx_SYS64_ISS_CRM_SHIFT), \ 292 + (((e) & ESR_ELx_SYS64_ISS_OP2_MASK) >> \ 293 + ESR_ELx_SYS64_ISS_OP2_SHIFT)) 294 + 295 + /* ISS field definitions for ERET/ERETAA/ERETAB trapping */ 296 + #define ESR_ELx_ERET_ISS_ERET 0x2 297 + #define ESR_ELx_ERET_ISS_ERETA 0x1 298 + 299 + /* 300 + * ISS field definitions for floating-point exception traps 301 + * (FP_EXC_32/FP_EXC_64). 302 + * 303 + * (The FPEXC_* constants are used instead for common bits.) 304 + */ 305 + 306 + #define ESR_ELx_FP_EXC_TFV (UL(1) << 23) 307 + 308 + /* 309 + * ISS field definitions for CP15 accesses 310 + */ 311 + #define ESR_ELx_CP15_32_ISS_DIR_MASK 0x1 312 + #define ESR_ELx_CP15_32_ISS_DIR_READ 0x1 313 + #define ESR_ELx_CP15_32_ISS_DIR_WRITE 0x0 314 + 315 + #define ESR_ELx_CP15_32_ISS_RT_SHIFT 5 316 + #define ESR_ELx_CP15_32_ISS_RT_MASK (UL(0x1f) << ESR_ELx_CP15_32_ISS_RT_SHIFT) 317 + #define ESR_ELx_CP15_32_ISS_CRM_SHIFT 1 318 + #define ESR_ELx_CP15_32_ISS_CRM_MASK (UL(0xf) << ESR_ELx_CP15_32_ISS_CRM_SHIFT) 319 + #define ESR_ELx_CP15_32_ISS_CRN_SHIFT 10 320 + #define ESR_ELx_CP15_32_ISS_CRN_MASK (UL(0xf) << ESR_ELx_CP15_32_ISS_CRN_SHIFT) 321 + #define ESR_ELx_CP15_32_ISS_OP1_SHIFT 14 322 + #define ESR_ELx_CP15_32_ISS_OP1_MASK (UL(0x7) << ESR_ELx_CP15_32_ISS_OP1_SHIFT) 323 + #define ESR_ELx_CP15_32_ISS_OP2_SHIFT 17 324 + #define ESR_ELx_CP15_32_ISS_OP2_MASK (UL(0x7) << ESR_ELx_CP15_32_ISS_OP2_SHIFT) 325 + 326 + #define ESR_ELx_CP15_32_ISS_SYS_MASK (ESR_ELx_CP15_32_ISS_OP1_MASK | \ 327 + ESR_ELx_CP15_32_ISS_OP2_MASK | \ 328 + ESR_ELx_CP15_32_ISS_CRN_MASK | \ 329 + ESR_ELx_CP15_32_ISS_CRM_MASK | \ 330 + ESR_ELx_CP15_32_ISS_DIR_MASK) 331 + #define ESR_ELx_CP15_32_ISS_SYS_VAL(op1, op2, crn, crm) \ 332 + (((op1) << ESR_ELx_CP15_32_ISS_OP1_SHIFT) | \ 333 + ((op2) << ESR_ELx_CP15_32_ISS_OP2_SHIFT) | \ 334 + ((crn) << ESR_ELx_CP15_32_ISS_CRN_SHIFT) | \ 335 + ((crm) << ESR_ELx_CP15_32_ISS_CRM_SHIFT)) 336 + 337 + #define ESR_ELx_CP15_64_ISS_DIR_MASK 0x1 338 + #define ESR_ELx_CP15_64_ISS_DIR_READ 0x1 339 + #define ESR_ELx_CP15_64_ISS_DIR_WRITE 0x0 340 + 341 + #define ESR_ELx_CP15_64_ISS_RT_SHIFT 5 342 + #define ESR_ELx_CP15_64_ISS_RT_MASK (UL(0x1f) << ESR_ELx_CP15_64_ISS_RT_SHIFT) 343 + 344 + #define ESR_ELx_CP15_64_ISS_RT2_SHIFT 10 345 + #define ESR_ELx_CP15_64_ISS_RT2_MASK (UL(0x1f) << ESR_ELx_CP15_64_ISS_RT2_SHIFT) 346 + 347 + #define ESR_ELx_CP15_64_ISS_OP1_SHIFT 16 348 + #define ESR_ELx_CP15_64_ISS_OP1_MASK (UL(0xf) << ESR_ELx_CP15_64_ISS_OP1_SHIFT) 349 + #define ESR_ELx_CP15_64_ISS_CRM_SHIFT 1 350 + #define ESR_ELx_CP15_64_ISS_CRM_MASK (UL(0xf) << ESR_ELx_CP15_64_ISS_CRM_SHIFT) 351 + 352 + #define ESR_ELx_CP15_64_ISS_SYS_VAL(op1, crm) \ 353 + (((op1) << ESR_ELx_CP15_64_ISS_OP1_SHIFT) | \ 354 + ((crm) << ESR_ELx_CP15_64_ISS_CRM_SHIFT)) 355 + 356 + #define ESR_ELx_CP15_64_ISS_SYS_MASK (ESR_ELx_CP15_64_ISS_OP1_MASK | \ 357 + ESR_ELx_CP15_64_ISS_CRM_MASK | \ 358 + ESR_ELx_CP15_64_ISS_DIR_MASK) 359 + 360 + #define ESR_ELx_CP15_64_ISS_SYS_CNTVCT (ESR_ELx_CP15_64_ISS_SYS_VAL(1, 14) | \ 361 + ESR_ELx_CP15_64_ISS_DIR_READ) 362 + 363 + #define ESR_ELx_CP15_64_ISS_SYS_CNTVCTSS (ESR_ELx_CP15_64_ISS_SYS_VAL(9, 14) | \ 364 + ESR_ELx_CP15_64_ISS_DIR_READ) 365 + 366 + #define ESR_ELx_CP15_32_ISS_SYS_CNTFRQ (ESR_ELx_CP15_32_ISS_SYS_VAL(0, 0, 14, 0) |\ 367 + ESR_ELx_CP15_32_ISS_DIR_READ) 368 + 369 + /* 370 + * ISS values for SME traps 371 + */ 372 + 373 + #define ESR_ELx_SME_ISS_SME_DISABLED 0 374 + #define ESR_ELx_SME_ISS_ILL 1 375 + #define ESR_ELx_SME_ISS_SM_DISABLED 2 376 + #define ESR_ELx_SME_ISS_ZA_DISABLED 3 377 + #define ESR_ELx_SME_ISS_ZT_DISABLED 4 378 + 379 + /* ISS field definitions for MOPS exceptions */ 380 + #define ESR_ELx_MOPS_ISS_MEM_INST (UL(1) << 24) 381 + #define ESR_ELx_MOPS_ISS_FROM_EPILOGUE (UL(1) << 18) 382 + #define ESR_ELx_MOPS_ISS_WRONG_OPTION (UL(1) << 17) 383 + #define ESR_ELx_MOPS_ISS_OPTION_A (UL(1) << 16) 384 + #define ESR_ELx_MOPS_ISS_DESTREG(esr) (((esr) & (UL(0x1f) << 10)) >> 10) 385 + #define ESR_ELx_MOPS_ISS_SRCREG(esr) (((esr) & (UL(0x1f) << 5)) >> 5) 386 + #define ESR_ELx_MOPS_ISS_SIZEREG(esr) (((esr) & (UL(0x1f) << 0)) >> 0) 387 + 388 + #ifndef __ASSEMBLY__ 389 + #include <asm/types.h> 390 + 391 + static inline unsigned long esr_brk_comment(unsigned long esr) 392 + { 393 + return esr & ESR_ELx_BRK64_ISS_COMMENT_MASK; 394 + } 395 + 396 + static inline bool esr_is_data_abort(unsigned long esr) 397 + { 398 + const unsigned long ec = ESR_ELx_EC(esr); 399 + 400 + return ec == ESR_ELx_EC_DABT_LOW || ec == ESR_ELx_EC_DABT_CUR; 401 + } 402 + 403 + static inline bool esr_is_cfi_brk(unsigned long esr) 404 + { 405 + return ESR_ELx_EC(esr) == ESR_ELx_EC_BRK64 && 406 + (esr_brk_comment(esr) & ~CFI_BRK_IMM_MASK) == CFI_BRK_IMM_BASE; 407 + } 408 + 409 + static inline bool esr_fsc_is_translation_fault(unsigned long esr) 410 + { 411 + esr = esr & ESR_ELx_FSC; 412 + 413 + return (esr == ESR_ELx_FSC_FAULT_L(3)) || 414 + (esr == ESR_ELx_FSC_FAULT_L(2)) || 415 + (esr == ESR_ELx_FSC_FAULT_L(1)) || 416 + (esr == ESR_ELx_FSC_FAULT_L(0)) || 417 + (esr == ESR_ELx_FSC_FAULT_L(-1)); 418 + } 419 + 420 + static inline bool esr_fsc_is_permission_fault(unsigned long esr) 421 + { 422 + esr = esr & ESR_ELx_FSC; 423 + 424 + return (esr == ESR_ELx_FSC_PERM_L(3)) || 425 + (esr == ESR_ELx_FSC_PERM_L(2)) || 426 + (esr == ESR_ELx_FSC_PERM_L(1)) || 427 + (esr == ESR_ELx_FSC_PERM_L(0)); 428 + } 429 + 430 + static inline bool esr_fsc_is_access_flag_fault(unsigned long esr) 431 + { 432 + esr = esr & ESR_ELx_FSC; 433 + 434 + return (esr == ESR_ELx_FSC_ACCESS_L(3)) || 435 + (esr == ESR_ELx_FSC_ACCESS_L(2)) || 436 + (esr == ESR_ELx_FSC_ACCESS_L(1)) || 437 + (esr == ESR_ELx_FSC_ACCESS_L(0)); 438 + } 439 + 440 + /* Indicate whether ESR.EC==0x1A is for an ERETAx instruction */ 441 + static inline bool esr_iss_is_eretax(unsigned long esr) 442 + { 443 + return esr & ESR_ELx_ERET_ISS_ERET; 444 + } 445 + 446 + /* Indicate which key is used for ERETAx (false: A-Key, true: B-Key) */ 447 + static inline bool esr_iss_is_eretab(unsigned long esr) 448 + { 449 + return esr & ESR_ELx_ERET_ISS_ERETA; 450 + } 451 + 452 + const char *esr_get_class_string(unsigned long esr); 453 + #endif /* __ASSEMBLY */ 454 + 455 + #endif /* __ASM_ESR_H */
+1
tools/testing/selftests/kvm/Makefile
··· 157 157 TEST_GEN_PROGS_aarch64 += aarch64/arch_timer_edge_cases 158 158 TEST_GEN_PROGS_aarch64 += aarch64/debug-exceptions 159 159 TEST_GEN_PROGS_aarch64 += aarch64/hypercalls 160 + TEST_GEN_PROGS_aarch64 += aarch64/mmio_abort 160 161 TEST_GEN_PROGS_aarch64 += aarch64/page_fault_test 161 162 TEST_GEN_PROGS_aarch64 += aarch64/psci_test 162 163 TEST_GEN_PROGS_aarch64 += aarch64/set_id_regs
+5 -5
tools/testing/selftests/kvm/aarch64/debug-exceptions.c
··· 433 433 vcpu_init_descriptor_tables(vcpu); 434 434 435 435 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 436 - ESR_EC_BRK_INS, guest_sw_bp_handler); 436 + ESR_ELx_EC_BRK64, guest_sw_bp_handler); 437 437 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 438 - ESR_EC_HW_BP_CURRENT, guest_hw_bp_handler); 438 + ESR_ELx_EC_BREAKPT_CUR, guest_hw_bp_handler); 439 439 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 440 - ESR_EC_WP_CURRENT, guest_wp_handler); 440 + ESR_ELx_EC_WATCHPT_CUR, guest_wp_handler); 441 441 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 442 - ESR_EC_SSTEP_CURRENT, guest_ss_handler); 442 + ESR_ELx_EC_SOFTSTP_CUR, guest_ss_handler); 443 443 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 444 - ESR_EC_SVC64, guest_svc_handler); 444 + ESR_ELx_EC_SVC64, guest_svc_handler); 445 445 446 446 /* Specify bpn/wpn/ctx_bpn to be tested */ 447 447 vcpu_args_set(vcpu, 3, bpn, wpn, ctx_bpn);
+159
tools/testing/selftests/kvm/aarch64/mmio_abort.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * mmio_abort - Tests for userspace MMIO abort injection 4 + * 5 + * Copyright (c) 2024 Google LLC 6 + */ 7 + #include "processor.h" 8 + #include "test_util.h" 9 + 10 + #define MMIO_ADDR 0x8000000ULL 11 + 12 + static u64 expected_abort_pc; 13 + 14 + static void expect_sea_handler(struct ex_regs *regs) 15 + { 16 + u64 esr = read_sysreg(esr_el1); 17 + 18 + GUEST_ASSERT_EQ(regs->pc, expected_abort_pc); 19 + GUEST_ASSERT_EQ(ESR_ELx_EC(esr), ESR_ELx_EC_DABT_CUR); 20 + GUEST_ASSERT_EQ(esr & ESR_ELx_FSC_TYPE, ESR_ELx_FSC_EXTABT); 21 + 22 + GUEST_DONE(); 23 + } 24 + 25 + static void unexpected_dabt_handler(struct ex_regs *regs) 26 + { 27 + GUEST_FAIL("Unexpected data abort at PC: %lx\n", regs->pc); 28 + } 29 + 30 + static struct kvm_vm *vm_create_with_dabt_handler(struct kvm_vcpu **vcpu, void *guest_code, 31 + handler_fn dabt_handler) 32 + { 33 + struct kvm_vm *vm = vm_create_with_one_vcpu(vcpu, guest_code); 34 + 35 + vm_init_descriptor_tables(vm); 36 + vcpu_init_descriptor_tables(*vcpu); 37 + vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, ESR_ELx_EC_DABT_CUR, dabt_handler); 38 + 39 + virt_map(vm, MMIO_ADDR, MMIO_ADDR, 1); 40 + 41 + return vm; 42 + } 43 + 44 + static void vcpu_inject_extabt(struct kvm_vcpu *vcpu) 45 + { 46 + struct kvm_vcpu_events events = {}; 47 + 48 + events.exception.ext_dabt_pending = true; 49 + vcpu_events_set(vcpu, &events); 50 + } 51 + 52 + static void vcpu_run_expect_done(struct kvm_vcpu *vcpu) 53 + { 54 + struct ucall uc; 55 + 56 + vcpu_run(vcpu); 57 + switch (get_ucall(vcpu, &uc)) { 58 + case UCALL_ABORT: 59 + REPORT_GUEST_ASSERT(uc); 60 + break; 61 + case UCALL_DONE: 62 + break; 63 + default: 64 + TEST_FAIL("Unexpected ucall: %lu", uc.cmd); 65 + } 66 + } 67 + 68 + extern char test_mmio_abort_insn; 69 + 70 + static void test_mmio_abort_guest(void) 71 + { 72 + WRITE_ONCE(expected_abort_pc, (u64)&test_mmio_abort_insn); 73 + 74 + asm volatile("test_mmio_abort_insn:\n\t" 75 + "ldr x0, [%0]\n\t" 76 + : : "r" (MMIO_ADDR) : "x0", "memory"); 77 + 78 + GUEST_FAIL("MMIO instruction should not retire"); 79 + } 80 + 81 + /* 82 + * Test that KVM doesn't complete MMIO emulation when userspace has made an 83 + * external abort pending for the instruction. 84 + */ 85 + static void test_mmio_abort(void) 86 + { 87 + struct kvm_vcpu *vcpu; 88 + struct kvm_vm *vm = vm_create_with_dabt_handler(&vcpu, test_mmio_abort_guest, 89 + expect_sea_handler); 90 + struct kvm_run *run = vcpu->run; 91 + 92 + vcpu_run(vcpu); 93 + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_MMIO); 94 + TEST_ASSERT_EQ(run->mmio.phys_addr, MMIO_ADDR); 95 + TEST_ASSERT_EQ(run->mmio.len, sizeof(unsigned long)); 96 + TEST_ASSERT(!run->mmio.is_write, "Expected MMIO read"); 97 + 98 + vcpu_inject_extabt(vcpu); 99 + vcpu_run_expect_done(vcpu); 100 + kvm_vm_free(vm); 101 + } 102 + 103 + extern char test_mmio_nisv_insn; 104 + 105 + static void test_mmio_nisv_guest(void) 106 + { 107 + WRITE_ONCE(expected_abort_pc, (u64)&test_mmio_nisv_insn); 108 + 109 + asm volatile("test_mmio_nisv_insn:\n\t" 110 + "ldr x0, [%0], #8\n\t" 111 + : : "r" (MMIO_ADDR) : "x0", "memory"); 112 + 113 + GUEST_FAIL("MMIO instruction should not retire"); 114 + } 115 + 116 + /* 117 + * Test that the KVM_RUN ioctl fails for ESR_EL2.ISV=0 MMIO aborts if userspace 118 + * hasn't enabled KVM_CAP_ARM_NISV_TO_USER. 119 + */ 120 + static void test_mmio_nisv(void) 121 + { 122 + struct kvm_vcpu *vcpu; 123 + struct kvm_vm *vm = vm_create_with_dabt_handler(&vcpu, test_mmio_nisv_guest, 124 + unexpected_dabt_handler); 125 + 126 + TEST_ASSERT(_vcpu_run(vcpu), "Expected nonzero return code from KVM_RUN"); 127 + TEST_ASSERT_EQ(errno, ENOSYS); 128 + 129 + kvm_vm_free(vm); 130 + } 131 + 132 + /* 133 + * Test that ESR_EL2.ISV=0 MMIO aborts reach userspace and that an injected SEA 134 + * reaches the guest. 135 + */ 136 + static void test_mmio_nisv_abort(void) 137 + { 138 + struct kvm_vcpu *vcpu; 139 + struct kvm_vm *vm = vm_create_with_dabt_handler(&vcpu, test_mmio_nisv_guest, 140 + expect_sea_handler); 141 + struct kvm_run *run = vcpu->run; 142 + 143 + vm_enable_cap(vm, KVM_CAP_ARM_NISV_TO_USER, 1); 144 + 145 + vcpu_run(vcpu); 146 + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_ARM_NISV); 147 + TEST_ASSERT_EQ(run->arm_nisv.fault_ipa, MMIO_ADDR); 148 + 149 + vcpu_inject_extabt(vcpu); 150 + vcpu_run_expect_done(vcpu); 151 + kvm_vm_free(vm); 152 + } 153 + 154 + int main(void) 155 + { 156 + test_mmio_abort(); 157 + test_mmio_nisv(); 158 + test_mmio_nisv_abort(); 159 + }
+1 -1
tools/testing/selftests/kvm/aarch64/no-vgic-v3.c
··· 150 150 vcpu_init_descriptor_tables(vcpu); 151 151 152 152 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 153 - ESR_EC_UNKNOWN, guest_undef_handler); 153 + ESR_ELx_EC_UNKNOWN, guest_undef_handler); 154 154 155 155 test_run_vcpu(vcpu); 156 156
+2 -2
tools/testing/selftests/kvm/aarch64/page_fault_test.c
··· 544 544 vcpu_init_descriptor_tables(vcpu); 545 545 546 546 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 547 - ESR_EC_DABT, no_dabt_handler); 547 + ESR_ELx_EC_DABT_CUR, no_dabt_handler); 548 548 vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT, 549 - ESR_EC_IABT, no_iabt_handler); 549 + ESR_ELx_EC_IABT_CUR, no_iabt_handler); 550 550 } 551 551 552 552 static void setup_gva_maps(struct kvm_vm *vm)
+92
tools/testing/selftests/kvm/aarch64/psci_test.c
··· 54 54 return res.a0; 55 55 } 56 56 57 + static uint64_t psci_system_off2(uint64_t type, uint64_t cookie) 58 + { 59 + struct arm_smccc_res res; 60 + 61 + smccc_hvc(PSCI_1_3_FN64_SYSTEM_OFF2, type, cookie, 0, 0, 0, 0, 0, &res); 62 + 63 + return res.a0; 64 + } 65 + 57 66 static uint64_t psci_features(uint32_t func_id) 58 67 { 59 68 struct arm_smccc_res res; ··· 197 188 kvm_vm_free(vm); 198 189 } 199 190 191 + static void guest_test_system_off2(void) 192 + { 193 + uint64_t ret; 194 + 195 + /* assert that SYSTEM_OFF2 is discoverable */ 196 + GUEST_ASSERT(psci_features(PSCI_1_3_FN_SYSTEM_OFF2) & 197 + PSCI_1_3_OFF_TYPE_HIBERNATE_OFF); 198 + GUEST_ASSERT(psci_features(PSCI_1_3_FN64_SYSTEM_OFF2) & 199 + PSCI_1_3_OFF_TYPE_HIBERNATE_OFF); 200 + 201 + /* With non-zero 'cookie' field, it should fail */ 202 + ret = psci_system_off2(PSCI_1_3_OFF_TYPE_HIBERNATE_OFF, 1); 203 + GUEST_ASSERT(ret == PSCI_RET_INVALID_PARAMS); 204 + 205 + /* 206 + * This would normally never return, so KVM sets the return value 207 + * to PSCI_RET_INTERNAL_FAILURE. The test case *does* return, so 208 + * that it can test both values for HIBERNATE_OFF. 209 + */ 210 + ret = psci_system_off2(PSCI_1_3_OFF_TYPE_HIBERNATE_OFF, 0); 211 + GUEST_ASSERT(ret == PSCI_RET_INTERNAL_FAILURE); 212 + 213 + /* 214 + * Revision F.b of the PSCI v1.3 specification documents zero as an 215 + * alias for HIBERNATE_OFF, since that's the value used in earlier 216 + * revisions of the spec and some implementations in the field. 217 + */ 218 + ret = psci_system_off2(0, 1); 219 + GUEST_ASSERT(ret == PSCI_RET_INVALID_PARAMS); 220 + 221 + ret = psci_system_off2(0, 0); 222 + GUEST_ASSERT(ret == PSCI_RET_INTERNAL_FAILURE); 223 + 224 + GUEST_DONE(); 225 + } 226 + 227 + static void host_test_system_off2(void) 228 + { 229 + struct kvm_vcpu *source, *target; 230 + struct kvm_mp_state mps; 231 + uint64_t psci_version = 0; 232 + int nr_shutdowns = 0; 233 + struct kvm_run *run; 234 + struct ucall uc; 235 + 236 + setup_vm(guest_test_system_off2, &source, &target); 237 + 238 + vcpu_get_reg(target, KVM_REG_ARM_PSCI_VERSION, &psci_version); 239 + 240 + TEST_ASSERT(psci_version >= PSCI_VERSION(1, 3), 241 + "Unexpected PSCI version %lu.%lu", 242 + PSCI_VERSION_MAJOR(psci_version), 243 + PSCI_VERSION_MINOR(psci_version)); 244 + 245 + vcpu_power_off(target); 246 + run = source->run; 247 + 248 + enter_guest(source); 249 + while (run->exit_reason == KVM_EXIT_SYSTEM_EVENT) { 250 + TEST_ASSERT(run->system_event.type == KVM_SYSTEM_EVENT_SHUTDOWN, 251 + "Unhandled system event: %u (expected: %u)", 252 + run->system_event.type, KVM_SYSTEM_EVENT_SHUTDOWN); 253 + TEST_ASSERT(run->system_event.ndata >= 1, 254 + "Unexpected amount of system event data: %u (expected, >= 1)", 255 + run->system_event.ndata); 256 + TEST_ASSERT(run->system_event.data[0] & KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2, 257 + "PSCI_OFF2 flag not set. Flags %llu (expected %llu)", 258 + run->system_event.data[0], KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2); 259 + 260 + nr_shutdowns++; 261 + 262 + /* Restart the vCPU */ 263 + mps.mp_state = KVM_MP_STATE_RUNNABLE; 264 + vcpu_mp_state_set(source, &mps); 265 + 266 + enter_guest(source); 267 + } 268 + 269 + TEST_ASSERT(get_ucall(source, &uc) == UCALL_DONE, "Guest did not exit cleanly"); 270 + TEST_ASSERT(nr_shutdowns == 2, "Two shutdown events were expected, but saw %d", nr_shutdowns); 271 + } 272 + 200 273 int main(void) 201 274 { 202 275 TEST_REQUIRE(kvm_has_cap(KVM_CAP_ARM_SYSTEM_SUSPEND)); 203 276 204 277 host_test_cpu_on(); 205 278 host_test_system_suspend(); 279 + host_test_system_off2(); 206 280 return 0; 207 281 }
+98 -1
tools/testing/selftests/kvm/aarch64/set_id_regs.c
··· 443 443 } 444 444 } 445 445 446 + #define MPAM_IDREG_TEST 6 447 + static void test_user_set_mpam_reg(struct kvm_vcpu *vcpu) 448 + { 449 + uint64_t masks[KVM_ARM_FEATURE_ID_RANGE_SIZE]; 450 + struct reg_mask_range range = { 451 + .addr = (__u64)masks, 452 + }; 453 + uint64_t val; 454 + int idx, err; 455 + 456 + /* 457 + * If ID_AA64PFR0.MPAM is _not_ officially modifiable and is zero, 458 + * check that if it can be set to 1, (i.e. it is supported by the 459 + * hardware), that it can't be set to other values. 460 + */ 461 + 462 + /* Get writable masks for feature ID registers */ 463 + memset(range.reserved, 0, sizeof(range.reserved)); 464 + vm_ioctl(vcpu->vm, KVM_ARM_GET_REG_WRITABLE_MASKS, &range); 465 + 466 + /* Writeable? Nothing to test! */ 467 + idx = encoding_to_range_idx(SYS_ID_AA64PFR0_EL1); 468 + if ((masks[idx] & ID_AA64PFR0_EL1_MPAM_MASK) == ID_AA64PFR0_EL1_MPAM_MASK) { 469 + ksft_test_result_skip("ID_AA64PFR0_EL1.MPAM is officially writable, nothing to test\n"); 470 + return; 471 + } 472 + 473 + /* Get the id register value */ 474 + vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1), &val); 475 + 476 + /* Try to set MPAM=0. This should always be possible. */ 477 + val &= ~ID_AA64PFR0_EL1_MPAM_MASK; 478 + val |= FIELD_PREP(ID_AA64PFR0_EL1_MPAM_MASK, 0); 479 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1), val); 480 + if (err) 481 + ksft_test_result_fail("ID_AA64PFR0_EL1.MPAM=0 was not accepted\n"); 482 + else 483 + ksft_test_result_pass("ID_AA64PFR0_EL1.MPAM=0 worked\n"); 484 + 485 + /* Try to set MPAM=1 */ 486 + val &= ~ID_AA64PFR0_EL1_MPAM_MASK; 487 + val |= FIELD_PREP(ID_AA64PFR0_EL1_MPAM_MASK, 1); 488 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1), val); 489 + if (err) 490 + ksft_test_result_skip("ID_AA64PFR0_EL1.MPAM is not writable, nothing to test\n"); 491 + else 492 + ksft_test_result_pass("ID_AA64PFR0_EL1.MPAM=1 was writable\n"); 493 + 494 + /* Try to set MPAM=2 */ 495 + val &= ~ID_AA64PFR0_EL1_MPAM_MASK; 496 + val |= FIELD_PREP(ID_AA64PFR0_EL1_MPAM_MASK, 2); 497 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1), val); 498 + if (err) 499 + ksft_test_result_pass("ID_AA64PFR0_EL1.MPAM not arbitrarily modifiable\n"); 500 + else 501 + ksft_test_result_fail("ID_AA64PFR0_EL1.MPAM value should not be ignored\n"); 502 + 503 + /* And again for ID_AA64PFR1_EL1.MPAM_frac */ 504 + idx = encoding_to_range_idx(SYS_ID_AA64PFR1_EL1); 505 + if ((masks[idx] & ID_AA64PFR1_EL1_MPAM_frac_MASK) == ID_AA64PFR1_EL1_MPAM_frac_MASK) { 506 + ksft_test_result_skip("ID_AA64PFR1_EL1.MPAM_frac is officially writable, nothing to test\n"); 507 + return; 508 + } 509 + 510 + /* Get the id register value */ 511 + vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR1_EL1), &val); 512 + 513 + /* Try to set MPAM_frac=0. This should always be possible. */ 514 + val &= ~ID_AA64PFR1_EL1_MPAM_frac_MASK; 515 + val |= FIELD_PREP(ID_AA64PFR1_EL1_MPAM_frac_MASK, 0); 516 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR1_EL1), val); 517 + if (err) 518 + ksft_test_result_fail("ID_AA64PFR0_EL1.MPAM_frac=0 was not accepted\n"); 519 + else 520 + ksft_test_result_pass("ID_AA64PFR0_EL1.MPAM_frac=0 worked\n"); 521 + 522 + /* Try to set MPAM_frac=1 */ 523 + val &= ~ID_AA64PFR1_EL1_MPAM_frac_MASK; 524 + val |= FIELD_PREP(ID_AA64PFR1_EL1_MPAM_frac_MASK, 1); 525 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR1_EL1), val); 526 + if (err) 527 + ksft_test_result_skip("ID_AA64PFR1_EL1.MPAM_frac is not writable, nothing to test\n"); 528 + else 529 + ksft_test_result_pass("ID_AA64PFR0_EL1.MPAM_frac=1 was writable\n"); 530 + 531 + /* Try to set MPAM_frac=2 */ 532 + val &= ~ID_AA64PFR1_EL1_MPAM_frac_MASK; 533 + val |= FIELD_PREP(ID_AA64PFR1_EL1_MPAM_frac_MASK, 2); 534 + err = __vcpu_set_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR1_EL1), val); 535 + if (err) 536 + ksft_test_result_pass("ID_AA64PFR1_EL1.MPAM_frac not arbitrarily modifiable\n"); 537 + else 538 + ksft_test_result_fail("ID_AA64PFR1_EL1.MPAM_frac value should not be ignored\n"); 539 + } 540 + 446 541 static void test_guest_reg_read(struct kvm_vcpu *vcpu) 447 542 { 448 543 bool done = false; ··· 676 581 ARRAY_SIZE(ftr_id_aa64isar2_el1) + ARRAY_SIZE(ftr_id_aa64pfr0_el1) + 677 582 ARRAY_SIZE(ftr_id_aa64pfr1_el1) + ARRAY_SIZE(ftr_id_aa64mmfr0_el1) + 678 583 ARRAY_SIZE(ftr_id_aa64mmfr1_el1) + ARRAY_SIZE(ftr_id_aa64mmfr2_el1) + 679 - ARRAY_SIZE(ftr_id_aa64zfr0_el1) - ARRAY_SIZE(test_regs) + 2; 584 + ARRAY_SIZE(ftr_id_aa64zfr0_el1) - ARRAY_SIZE(test_regs) + 2 + 585 + MPAM_IDREG_TEST; 680 586 681 587 ksft_set_plan(test_cnt); 682 588 683 589 test_vm_ftr_id_regs(vcpu, aarch64_only); 684 590 test_vcpu_ftr_id_regs(vcpu); 591 + test_user_set_mpam_reg(vcpu); 685 592 686 593 test_guest_reg_read(vcpu); 687 594
+6 -6
tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c
··· 300 300 uint64_t esr, ec; 301 301 302 302 esr = read_sysreg(esr_el1); 303 - ec = (esr >> ESR_EC_SHIFT) & ESR_EC_MASK; 303 + ec = ESR_ELx_EC(esr); 304 304 305 305 __GUEST_ASSERT(expected_ec == ec, 306 306 "PC: 0x%lx; ESR: 0x%lx; EC: 0x%lx; EC expected: 0x%lx", ··· 338 338 * Reading/writing the event count/type registers should cause 339 339 * an UNDEFINED exception. 340 340 */ 341 - TEST_EXCEPTION(ESR_EC_UNKNOWN, acc->read_cntr(pmc_idx)); 342 - TEST_EXCEPTION(ESR_EC_UNKNOWN, acc->write_cntr(pmc_idx, 0)); 343 - TEST_EXCEPTION(ESR_EC_UNKNOWN, acc->read_typer(pmc_idx)); 344 - TEST_EXCEPTION(ESR_EC_UNKNOWN, acc->write_typer(pmc_idx, 0)); 341 + TEST_EXCEPTION(ESR_ELx_EC_UNKNOWN, acc->read_cntr(pmc_idx)); 342 + TEST_EXCEPTION(ESR_ELx_EC_UNKNOWN, acc->write_cntr(pmc_idx, 0)); 343 + TEST_EXCEPTION(ESR_ELx_EC_UNKNOWN, acc->read_typer(pmc_idx)); 344 + TEST_EXCEPTION(ESR_ELx_EC_UNKNOWN, acc->write_typer(pmc_idx, 0)); 345 345 /* 346 346 * The bit corresponding to the (unimplemented) counter in 347 347 * {PMCNTEN,PMINTEN,PMOVS}{SET,CLR} registers should be RAZ. ··· 425 425 426 426 vpmu_vm.vm = vm_create(1); 427 427 vm_init_descriptor_tables(vpmu_vm.vm); 428 - for (ec = 0; ec < ESR_EC_NUM; ec++) { 428 + for (ec = 0; ec < ESR_ELx_EC_MAX + 1; ec++) { 429 429 vm_install_sync_handler(vpmu_vm.vm, VECTOR_SYNC_CURRENT, ec, 430 430 guest_sync_handler); 431 431 }
+2 -13
tools/testing/selftests/kvm/include/aarch64/processor.h
··· 12 12 13 13 #include <linux/stringify.h> 14 14 #include <linux/types.h> 15 + #include <asm/brk-imm.h> 16 + #include <asm/esr.h> 15 17 #include <asm/sysreg.h> 16 18 17 19 ··· 101 99 (v) == VECTOR_SYNC_CURRENT || \ 102 100 (v) == VECTOR_SYNC_LOWER_64 || \ 103 101 (v) == VECTOR_SYNC_LOWER_32) 104 - 105 - #define ESR_EC_NUM 64 106 - #define ESR_EC_SHIFT 26 107 - #define ESR_EC_MASK (ESR_EC_NUM - 1) 108 - 109 - #define ESR_EC_UNKNOWN 0x0 110 - #define ESR_EC_SVC64 0x15 111 - #define ESR_EC_IABT 0x21 112 - #define ESR_EC_DABT 0x25 113 - #define ESR_EC_HW_BP_CURRENT 0x31 114 - #define ESR_EC_SSTEP_CURRENT 0x33 115 - #define ESR_EC_WP_CURRENT 0x35 116 - #define ESR_EC_BRK_INS 0x3c 117 102 118 103 /* Access flag */ 119 104 #define PTE_AF (1ULL << 10)
+3 -3
tools/testing/selftests/kvm/lib/aarch64/processor.c
··· 450 450 } 451 451 452 452 struct handlers { 453 - handler_fn exception_handlers[VECTOR_NUM][ESR_EC_NUM]; 453 + handler_fn exception_handlers[VECTOR_NUM][ESR_ELx_EC_MAX + 1]; 454 454 }; 455 455 456 456 void vcpu_init_descriptor_tables(struct kvm_vcpu *vcpu) ··· 469 469 switch (vector) { 470 470 case VECTOR_SYNC_CURRENT: 471 471 case VECTOR_SYNC_LOWER_64: 472 - ec = (read_sysreg(esr_el1) >> ESR_EC_SHIFT) & ESR_EC_MASK; 472 + ec = ESR_ELx_EC(read_sysreg(esr_el1)); 473 473 valid_ec = true; 474 474 break; 475 475 case VECTOR_IRQ_CURRENT: ··· 508 508 509 509 assert(VECTOR_IS_SYNC(vector)); 510 510 assert(vector < VECTOR_NUM); 511 - assert(ec < ESR_EC_NUM); 511 + assert(ec <= ESR_ELx_EC_MAX); 512 512 handlers->exception_handlers[vector][ec] = handler; 513 513 } 514 514
+6 -4
tools/testing/selftests/kvm/lib/kvm_util.c
··· 720 720 rb_erase(&region->hva_node, &vm->regions.hva_tree); 721 721 hash_del(&region->slot_node); 722 722 723 - region->region.memory_size = 0; 724 - vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, &region->region); 725 - 726 723 sparsebit_free(&region->unused_phy_pages); 727 724 sparsebit_free(&region->protected_phy_pages); 728 725 ret = munmap(region->mmap_start, region->mmap_size); ··· 1194 1197 */ 1195 1198 void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot) 1196 1199 { 1197 - __vm_mem_region_delete(vm, memslot2region(vm, slot)); 1200 + struct userspace_mem_region *region = memslot2region(vm, slot); 1201 + 1202 + region->region.memory_size = 0; 1203 + vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, &region->region); 1204 + 1205 + __vm_mem_region_delete(vm, region); 1198 1206 } 1199 1207 1200 1208 void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t base, uint64_t size,