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

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

KVM/arm64 fixes for 6.18, take #1

Improvements and bug fixes:

- Fix the handling of ZCR_EL2 in NV VMs
(20250926194108.84093-1-oliver.upton@linux.dev)

- Pick the correct translation regime when doing a PTW on
the back of a SEA (20250926224246.731748-1-oliver.upton@linux.dev)

- Prevent userspace from injecting an event into a vcpu that isn't
initialised yet (20250930085237.108326-1-oliver.upton@linux.dev)

- Move timer save/restore to the sysreg handling code, fixing EL2 timer
access in the process (20250929160458.3351788-1-maz@kernel.org)

- Add FGT-based trapping of MDSCR_EL1 to reduce the overhead of debug
(20250924235150.617451-1-oliver.upton@linux.dev)

- Fix trapping configuration when the host isn't GICv3
(20251007160704.1673584-1-sascha.bischoff@arm.com)

- Improve the detection of HCR_EL2.E2H being RES1
(20251009121239.29370-1-maz@kernel.org)

- Drop a spurious 'break' statement in the S1 PTW
(20250930135621.162050-1-osama.abdelkader@gmail.com)

- Don't try to access SPE when owned by EL3
(20251010174707.1684200-1-mukesh.ojha@oss.qualcomm.com)

Documentation updates:

- Document the failure modes of event injection
(20250930233620.124607-1-oliver.upton@linux.dev)

- Document that a GICv3 guest can be created on a GICv5 host
with FEAT_GCIE_LEGACY (20251007154848.1640444-1-sascha.bischoff@arm.com)

Selftest improvements:

- Add a selftest for the effective value of HCR_EL2.AMO
(20250926224454.734066-1-oliver.upton@linux.dev)

- Address build warning in the timer selftest when building
with clang (20250926155838.2612205-1-seanjc@google.com)

- Teach irq_fd selftests about non-x86 architectures
(20250930193301.119859-1-oliver.upton@linux.dev)

- Add missing sysregs to the set_id_regs selftest
(20251012154352.61133-1-zenghui.yu@linux.dev)

- Fix vcpu allocation in the vgic_lpi_stress selftest
(20251008154520.54801-1-zenghui.yu@linux.dev)

- Correctly enable interrupts in the vgic_lpi_stress selftest
(20251007195254.260539-1-oliver.upton@linux.dev)

+565 -354
+5
Documentation/virt/kvm/api.rst
··· 1229 1229 KVM_SET_VCPU_EVENTS or otherwise) because such an exception is always delivered 1230 1230 directly to the virtual CPU). 1231 1231 1232 + Calling this ioctl on a vCPU that hasn't been initialized will return 1233 + -ENOEXEC. 1234 + 1232 1235 :: 1233 1236 1234 1237 struct kvm_vcpu_events { ··· 1312 1309 1313 1310 See KVM_GET_VCPU_EVENTS for the data structure. 1314 1311 1312 + Calling this ioctl on a vCPU that hasn't been initialized will return 1313 + -ENOEXEC. 1315 1314 1316 1315 4.33 KVM_GET_DEBUGREGS 1317 1316 ----------------------
+2 -1
Documentation/virt/kvm/devices/arm-vgic-v3.rst
··· 13 13 to inject interrupts to the VGIC instead of directly to CPUs. It is not 14 14 possible to create both a GICv3 and GICv2 on the same VM. 15 15 16 - Creating a guest GICv3 device requires a host GICv3 as well. 16 + Creating a guest GICv3 device requires a host GICv3 host, or a GICv5 host with 17 + support for FEAT_GCIE_LEGACY. 17 18 18 19 19 20 Groups:
+32 -6
arch/arm64/include/asm/el2_setup.h
··· 24 24 * ID_AA64MMFR4_EL1.E2H0 < 0. On such CPUs HCR_EL2.E2H is RES1, but it 25 25 * can reset into an UNKNOWN state and might not read as 1 until it has 26 26 * been initialized explicitly. 27 - * 28 - * Fruity CPUs seem to have HCR_EL2.E2H set to RAO/WI, but 29 - * don't advertise it (they predate this relaxation). 30 - * 31 27 * Initalize HCR_EL2.E2H so that later code can rely upon HCR_EL2.E2H 32 28 * indicating whether the CPU is running in E2H mode. 33 29 */ 34 30 mrs_s x1, SYS_ID_AA64MMFR4_EL1 35 31 sbfx x1, x1, #ID_AA64MMFR4_EL1_E2H0_SHIFT, #ID_AA64MMFR4_EL1_E2H0_WIDTH 36 32 cmp x1, #0 37 - b.ge .LnVHE_\@ 33 + b.lt .LnE2H0_\@ 38 34 35 + /* 36 + * Unfortunately, HCR_EL2.E2H can be RES1 even if not advertised 37 + * as such via ID_AA64MMFR4_EL1.E2H0: 38 + * 39 + * - Fruity CPUs predate the !FEAT_E2H0 relaxation, and seem to 40 + * have HCR_EL2.E2H implemented as RAO/WI. 41 + * 42 + * - On CPUs that lack FEAT_FGT, a hypervisor can't trap guest 43 + * reads of ID_AA64MMFR4_EL1 to advertise !FEAT_E2H0. NV 44 + * guests on these hosts can write to HCR_EL2.E2H without 45 + * trapping to the hypervisor, but these writes have no 46 + * functional effect. 47 + * 48 + * Handle both cases by checking for an essential VHE property 49 + * (system register remapping) to decide whether we're 50 + * effectively VHE-only or not. 51 + */ 52 + msr_hcr_el2 x0 // Setup HCR_EL2 as nVHE 53 + isb 54 + mov x1, #1 // Write something to FAR_EL1 55 + msr far_el1, x1 56 + isb 57 + mov x1, #2 // Try to overwrite it via FAR_EL2 58 + msr far_el2, x1 59 + isb 60 + mrs x1, far_el1 // If we see the latest write in FAR_EL1, 61 + cmp x1, #2 // we can safely assume we are VHE only. 62 + b.ne .LnVHE_\@ // Otherwise, we know that nVHE works. 63 + 64 + .LnE2H0_\@: 39 65 orr x0, x0, #HCR_E2H 40 - .LnVHE_\@: 41 66 msr_hcr_el2 x0 42 67 isb 68 + .LnVHE_\@: 43 69 .endm 44 70 45 71 .macro __init_el2_sctlr
+50
arch/arm64/include/asm/kvm_host.h
··· 816 816 u64 hcrx_el2; 817 817 u64 mdcr_el2; 818 818 819 + struct { 820 + u64 r; 821 + u64 w; 822 + } fgt[__NR_FGT_GROUP_IDS__]; 823 + 819 824 /* Exception Information */ 820 825 struct kvm_vcpu_fault_info fault; 821 826 ··· 1605 1600 void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt); 1606 1601 void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *res1); 1607 1602 void check_feature_map(void); 1603 + void kvm_vcpu_load_fgt(struct kvm_vcpu *vcpu); 1608 1604 1605 + static __always_inline enum fgt_group_id __fgt_reg_to_group_id(enum vcpu_sysreg reg) 1606 + { 1607 + switch (reg) { 1608 + case HFGRTR_EL2: 1609 + case HFGWTR_EL2: 1610 + return HFGRTR_GROUP; 1611 + case HFGITR_EL2: 1612 + return HFGITR_GROUP; 1613 + case HDFGRTR_EL2: 1614 + case HDFGWTR_EL2: 1615 + return HDFGRTR_GROUP; 1616 + case HAFGRTR_EL2: 1617 + return HAFGRTR_GROUP; 1618 + case HFGRTR2_EL2: 1619 + case HFGWTR2_EL2: 1620 + return HFGRTR2_GROUP; 1621 + case HFGITR2_EL2: 1622 + return HFGITR2_GROUP; 1623 + case HDFGRTR2_EL2: 1624 + case HDFGWTR2_EL2: 1625 + return HDFGRTR2_GROUP; 1626 + default: 1627 + BUILD_BUG_ON(1); 1628 + } 1629 + } 1630 + 1631 + #define vcpu_fgt(vcpu, reg) \ 1632 + ({ \ 1633 + enum fgt_group_id id = __fgt_reg_to_group_id(reg); \ 1634 + u64 *p; \ 1635 + switch (reg) { \ 1636 + case HFGWTR_EL2: \ 1637 + case HDFGWTR_EL2: \ 1638 + case HFGWTR2_EL2: \ 1639 + case HDFGWTR2_EL2: \ 1640 + p = &(vcpu)->arch.fgt[id].w; \ 1641 + break; \ 1642 + default: \ 1643 + p = &(vcpu)->arch.fgt[id].r; \ 1644 + break; \ 1645 + } \ 1646 + \ 1647 + p; \ 1648 + }) 1609 1649 1610 1650 #endif /* __ARM64_KVM_HOST_H__ */
+14 -91
arch/arm64/kvm/arch_timer.c
··· 66 66 67 67 u32 timer_get_ctl(struct arch_timer_context *ctxt) 68 68 { 69 - struct kvm_vcpu *vcpu = ctxt->vcpu; 69 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctxt); 70 70 71 71 switch(arch_timer_ctx_index(ctxt)) { 72 72 case TIMER_VTIMER: ··· 85 85 86 86 u64 timer_get_cval(struct arch_timer_context *ctxt) 87 87 { 88 - struct kvm_vcpu *vcpu = ctxt->vcpu; 88 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctxt); 89 89 90 90 switch(arch_timer_ctx_index(ctxt)) { 91 91 case TIMER_VTIMER: ··· 104 104 105 105 static void timer_set_ctl(struct arch_timer_context *ctxt, u32 ctl) 106 106 { 107 - struct kvm_vcpu *vcpu = ctxt->vcpu; 107 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctxt); 108 108 109 109 switch(arch_timer_ctx_index(ctxt)) { 110 110 case TIMER_VTIMER: ··· 126 126 127 127 static void timer_set_cval(struct arch_timer_context *ctxt, u64 cval) 128 128 { 129 - struct kvm_vcpu *vcpu = ctxt->vcpu; 129 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctxt); 130 130 131 131 switch(arch_timer_ctx_index(ctxt)) { 132 132 case TIMER_VTIMER: ··· 144 144 default: 145 145 WARN_ON(1); 146 146 } 147 - } 148 - 149 - static void timer_set_offset(struct arch_timer_context *ctxt, u64 offset) 150 - { 151 - if (!ctxt->offset.vm_offset) { 152 - WARN(offset, "timer %ld\n", arch_timer_ctx_index(ctxt)); 153 - return; 154 - } 155 - 156 - WRITE_ONCE(*ctxt->offset.vm_offset, offset); 157 147 } 158 148 159 149 u64 kvm_phys_timer_read(void) ··· 333 343 u64 ns; 334 344 335 345 ctx = container_of(hrt, struct arch_timer_context, hrtimer); 336 - vcpu = ctx->vcpu; 346 + vcpu = timer_context_to_vcpu(ctx); 337 347 338 348 trace_kvm_timer_hrtimer_expire(ctx); 339 349 ··· 426 436 * 427 437 * But hey, it's fast, right? 428 438 */ 429 - if (is_hyp_ctxt(ctx->vcpu) && 430 - (ctx == vcpu_vtimer(ctx->vcpu) || ctx == vcpu_ptimer(ctx->vcpu))) { 439 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctx); 440 + if (is_hyp_ctxt(vcpu) && 441 + (ctx == vcpu_vtimer(vcpu) || ctx == vcpu_ptimer(vcpu))) { 431 442 unsigned long val = timer_get_ctl(ctx); 432 443 __assign_bit(__ffs(ARCH_TIMER_CTRL_IT_STAT), &val, level); 433 444 timer_set_ctl(ctx, val); ··· 461 470 trace_kvm_timer_emulate(ctx, should_fire); 462 471 463 472 if (should_fire != ctx->irq.level) 464 - kvm_timer_update_irq(ctx->vcpu, should_fire, ctx); 473 + kvm_timer_update_irq(timer_context_to_vcpu(ctx), should_fire, ctx); 465 474 466 475 kvm_timer_update_status(ctx, should_fire); 467 476 ··· 489 498 490 499 static void timer_save_state(struct arch_timer_context *ctx) 491 500 { 492 - struct arch_timer_cpu *timer = vcpu_timer(ctx->vcpu); 501 + struct arch_timer_cpu *timer = vcpu_timer(timer_context_to_vcpu(ctx)); 493 502 enum kvm_arch_timers index = arch_timer_ctx_index(ctx); 494 503 unsigned long flags; 495 504 ··· 600 609 601 610 static void timer_restore_state(struct arch_timer_context *ctx) 602 611 { 603 - struct arch_timer_cpu *timer = vcpu_timer(ctx->vcpu); 612 + struct arch_timer_cpu *timer = vcpu_timer(timer_context_to_vcpu(ctx)); 604 613 enum kvm_arch_timers index = arch_timer_ctx_index(ctx); 605 614 unsigned long flags; 606 615 ··· 659 668 660 669 static void kvm_timer_vcpu_load_gic(struct arch_timer_context *ctx) 661 670 { 662 - struct kvm_vcpu *vcpu = ctx->vcpu; 671 + struct kvm_vcpu *vcpu = timer_context_to_vcpu(ctx); 663 672 bool phys_active = false; 664 673 665 674 /* ··· 668 677 * this point and the register restoration, we'll take the 669 678 * interrupt anyway. 670 679 */ 671 - kvm_timer_update_irq(ctx->vcpu, kvm_timer_should_fire(ctx), ctx); 680 + kvm_timer_update_irq(vcpu, kvm_timer_should_fire(ctx), ctx); 672 681 673 682 if (irqchip_in_kernel(vcpu->kvm)) 674 683 phys_active = kvm_vgic_map_is_active(vcpu, timer_irq(ctx)); ··· 1054 1063 struct arch_timer_context *ctxt = vcpu_get_timer(vcpu, timerid); 1055 1064 struct kvm *kvm = vcpu->kvm; 1056 1065 1057 - ctxt->vcpu = vcpu; 1066 + ctxt->timer_id = timerid; 1058 1067 1059 1068 if (timerid == TIMER_VTIMER) 1060 1069 ctxt->offset.vm_offset = &kvm->arch.timer_data.voffset; ··· 1112 1121 disable_percpu_irq(host_ptimer_irq); 1113 1122 } 1114 1123 1115 - int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value) 1116 - { 1117 - struct arch_timer_context *timer; 1118 - 1119 - switch (regid) { 1120 - case KVM_REG_ARM_TIMER_CTL: 1121 - timer = vcpu_vtimer(vcpu); 1122 - kvm_arm_timer_write(vcpu, timer, TIMER_REG_CTL, value); 1123 - break; 1124 - case KVM_REG_ARM_TIMER_CNT: 1125 - if (!test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, 1126 - &vcpu->kvm->arch.flags)) { 1127 - timer = vcpu_vtimer(vcpu); 1128 - timer_set_offset(timer, kvm_phys_timer_read() - value); 1129 - } 1130 - break; 1131 - case KVM_REG_ARM_TIMER_CVAL: 1132 - timer = vcpu_vtimer(vcpu); 1133 - kvm_arm_timer_write(vcpu, timer, TIMER_REG_CVAL, value); 1134 - break; 1135 - case KVM_REG_ARM_PTIMER_CTL: 1136 - timer = vcpu_ptimer(vcpu); 1137 - kvm_arm_timer_write(vcpu, timer, TIMER_REG_CTL, value); 1138 - break; 1139 - case KVM_REG_ARM_PTIMER_CNT: 1140 - if (!test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, 1141 - &vcpu->kvm->arch.flags)) { 1142 - timer = vcpu_ptimer(vcpu); 1143 - timer_set_offset(timer, kvm_phys_timer_read() - value); 1144 - } 1145 - break; 1146 - case KVM_REG_ARM_PTIMER_CVAL: 1147 - timer = vcpu_ptimer(vcpu); 1148 - kvm_arm_timer_write(vcpu, timer, TIMER_REG_CVAL, value); 1149 - break; 1150 - 1151 - default: 1152 - return -1; 1153 - } 1154 - 1155 - return 0; 1156 - } 1157 - 1158 1124 static u64 read_timer_ctl(struct arch_timer_context *timer) 1159 1125 { 1160 1126 /* ··· 1126 1178 ctl |= ARCH_TIMER_CTRL_IT_STAT; 1127 1179 1128 1180 return ctl; 1129 - } 1130 - 1131 - u64 kvm_arm_timer_get_reg(struct kvm_vcpu *vcpu, u64 regid) 1132 - { 1133 - switch (regid) { 1134 - case KVM_REG_ARM_TIMER_CTL: 1135 - return kvm_arm_timer_read(vcpu, 1136 - vcpu_vtimer(vcpu), TIMER_REG_CTL); 1137 - case KVM_REG_ARM_TIMER_CNT: 1138 - return kvm_arm_timer_read(vcpu, 1139 - vcpu_vtimer(vcpu), TIMER_REG_CNT); 1140 - case KVM_REG_ARM_TIMER_CVAL: 1141 - return kvm_arm_timer_read(vcpu, 1142 - vcpu_vtimer(vcpu), TIMER_REG_CVAL); 1143 - case KVM_REG_ARM_PTIMER_CTL: 1144 - return kvm_arm_timer_read(vcpu, 1145 - vcpu_ptimer(vcpu), TIMER_REG_CTL); 1146 - case KVM_REG_ARM_PTIMER_CNT: 1147 - return kvm_arm_timer_read(vcpu, 1148 - vcpu_ptimer(vcpu), TIMER_REG_CNT); 1149 - case KVM_REG_ARM_PTIMER_CVAL: 1150 - return kvm_arm_timer_read(vcpu, 1151 - vcpu_ptimer(vcpu), TIMER_REG_CVAL); 1152 - } 1153 - return (u64)-1; 1154 1181 } 1155 1182 1156 1183 static u64 kvm_arm_timer_read(struct kvm_vcpu *vcpu,
+7
arch/arm64/kvm/arm.c
··· 642 642 vcpu->arch.hcr_el2 |= HCR_TWI; 643 643 644 644 vcpu_set_pauth_traps(vcpu); 645 + kvm_vcpu_load_fgt(vcpu); 645 646 646 647 if (is_protected_kvm_enabled()) { 647 648 kvm_call_hyp_nvhe(__pkvm_vcpu_load, ··· 1795 1794 case KVM_GET_VCPU_EVENTS: { 1796 1795 struct kvm_vcpu_events events; 1797 1796 1797 + if (!kvm_vcpu_initialized(vcpu)) 1798 + return -ENOEXEC; 1799 + 1798 1800 if (kvm_arm_vcpu_get_events(vcpu, &events)) 1799 1801 return -EINVAL; 1800 1802 ··· 1808 1804 } 1809 1805 case KVM_SET_VCPU_EVENTS: { 1810 1806 struct kvm_vcpu_events events; 1807 + 1808 + if (!kvm_vcpu_initialized(vcpu)) 1809 + return -ENOEXEC; 1811 1810 1812 1811 if (copy_from_user(&events, argp, sizeof(events))) 1813 1812 return -EFAULT;
+5 -2
arch/arm64/kvm/at.c
··· 91 91 case OP_AT_S1E2W: 92 92 case OP_AT_S1E2A: 93 93 return vcpu_el2_e2h_is_set(vcpu) ? TR_EL20 : TR_EL2; 94 - break; 95 94 default: 96 95 return (vcpu_el2_e2h_is_set(vcpu) && 97 96 vcpu_el2_tge_is_set(vcpu)) ? TR_EL20 : TR_EL10; ··· 1601 1602 .fn = match_s1_desc, 1602 1603 .priv = &dm, 1603 1604 }, 1604 - .regime = TR_EL10, 1605 1605 .as_el0 = false, 1606 1606 .pan = false, 1607 1607 }; 1608 1608 struct s1_walk_result wr = {}; 1609 1609 int ret; 1610 + 1611 + if (is_hyp_ctxt(vcpu)) 1612 + wi.regime = vcpu_el2_e2h_is_set(vcpu) ? TR_EL20 : TR_EL2; 1613 + else 1614 + wi.regime = TR_EL10; 1610 1615 1611 1616 ret = setup_s1_walk(vcpu, &wi, &wr, va); 1612 1617 if (ret)
+90
arch/arm64/kvm/config.c
··· 5 5 */ 6 6 7 7 #include <linux/kvm_host.h> 8 + #include <asm/kvm_emulate.h> 9 + #include <asm/kvm_nested.h> 8 10 #include <asm/sysreg.h> 9 11 10 12 /* ··· 1429 1427 *res0 = *res1 = 0; 1430 1428 break; 1431 1429 } 1430 + } 1431 + 1432 + static __always_inline struct fgt_masks *__fgt_reg_to_masks(enum vcpu_sysreg reg) 1433 + { 1434 + switch (reg) { 1435 + case HFGRTR_EL2: 1436 + return &hfgrtr_masks; 1437 + case HFGWTR_EL2: 1438 + return &hfgwtr_masks; 1439 + case HFGITR_EL2: 1440 + return &hfgitr_masks; 1441 + case HDFGRTR_EL2: 1442 + return &hdfgrtr_masks; 1443 + case HDFGWTR_EL2: 1444 + return &hdfgwtr_masks; 1445 + case HAFGRTR_EL2: 1446 + return &hafgrtr_masks; 1447 + case HFGRTR2_EL2: 1448 + return &hfgrtr2_masks; 1449 + case HFGWTR2_EL2: 1450 + return &hfgwtr2_masks; 1451 + case HFGITR2_EL2: 1452 + return &hfgitr2_masks; 1453 + case HDFGRTR2_EL2: 1454 + return &hdfgrtr2_masks; 1455 + case HDFGWTR2_EL2: 1456 + return &hdfgwtr2_masks; 1457 + default: 1458 + BUILD_BUG_ON(1); 1459 + } 1460 + } 1461 + 1462 + static __always_inline void __compute_fgt(struct kvm_vcpu *vcpu, enum vcpu_sysreg reg) 1463 + { 1464 + u64 fgu = vcpu->kvm->arch.fgu[__fgt_reg_to_group_id(reg)]; 1465 + struct fgt_masks *m = __fgt_reg_to_masks(reg); 1466 + u64 clear = 0, set = 0, val = m->nmask; 1467 + 1468 + set |= fgu & m->mask; 1469 + clear |= fgu & m->nmask; 1470 + 1471 + if (is_nested_ctxt(vcpu)) { 1472 + u64 nested = __vcpu_sys_reg(vcpu, reg); 1473 + set |= nested & m->mask; 1474 + clear |= ~nested & m->nmask; 1475 + } 1476 + 1477 + val |= set; 1478 + val &= ~clear; 1479 + *vcpu_fgt(vcpu, reg) = val; 1480 + } 1481 + 1482 + static void __compute_hfgwtr(struct kvm_vcpu *vcpu) 1483 + { 1484 + __compute_fgt(vcpu, HFGWTR_EL2); 1485 + 1486 + if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38)) 1487 + *vcpu_fgt(vcpu, HFGWTR_EL2) |= HFGWTR_EL2_TCR_EL1; 1488 + } 1489 + 1490 + static void __compute_hdfgwtr(struct kvm_vcpu *vcpu) 1491 + { 1492 + __compute_fgt(vcpu, HDFGWTR_EL2); 1493 + 1494 + if (is_hyp_ctxt(vcpu)) 1495 + *vcpu_fgt(vcpu, HDFGWTR_EL2) |= HDFGWTR_EL2_MDSCR_EL1; 1496 + } 1497 + 1498 + void kvm_vcpu_load_fgt(struct kvm_vcpu *vcpu) 1499 + { 1500 + if (!cpus_have_final_cap(ARM64_HAS_FGT)) 1501 + return; 1502 + 1503 + __compute_fgt(vcpu, HFGRTR_EL2); 1504 + __compute_hfgwtr(vcpu); 1505 + __compute_fgt(vcpu, HFGITR_EL2); 1506 + __compute_fgt(vcpu, HDFGRTR_EL2); 1507 + __compute_hdfgwtr(vcpu); 1508 + __compute_fgt(vcpu, HAFGRTR_EL2); 1509 + 1510 + if (!cpus_have_final_cap(ARM64_HAS_FGT2)) 1511 + return; 1512 + 1513 + __compute_fgt(vcpu, HFGRTR2_EL2); 1514 + __compute_fgt(vcpu, HFGWTR2_EL2); 1515 + __compute_fgt(vcpu, HFGITR2_EL2); 1516 + __compute_fgt(vcpu, HDFGRTR2_EL2); 1517 + __compute_fgt(vcpu, HDFGWTR2_EL2); 1432 1518 }
+10 -5
arch/arm64/kvm/debug.c
··· 15 15 #include <asm/kvm_arm.h> 16 16 #include <asm/kvm_emulate.h> 17 17 18 + static int cpu_has_spe(u64 dfr0) 19 + { 20 + return cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_PMSVer_SHIFT) && 21 + !(read_sysreg_s(SYS_PMBIDR_EL1) & PMBIDR_EL1_P); 22 + } 23 + 18 24 /** 19 25 * kvm_arm_setup_mdcr_el2 - configure vcpu mdcr_el2 value 20 26 * ··· 83 77 *host_data_ptr(debug_brps) = SYS_FIELD_GET(ID_AA64DFR0_EL1, BRPs, dfr0); 84 78 *host_data_ptr(debug_wrps) = SYS_FIELD_GET(ID_AA64DFR0_EL1, WRPs, dfr0); 85 79 80 + if (cpu_has_spe(dfr0)) 81 + host_data_set_flag(HAS_SPE); 82 + 86 83 if (has_vhe()) 87 84 return; 88 - 89 - if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_PMSVer_SHIFT) && 90 - !(read_sysreg_s(SYS_PMBIDR_EL1) & PMBIDR_EL1_P)) 91 - host_data_set_flag(HAS_SPE); 92 85 93 86 /* Check if we have BRBE implemented and available at the host */ 94 87 if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_BRBE_SHIFT)) ··· 107 102 void kvm_debug_init_vhe(void) 108 103 { 109 104 /* Clear PMSCR_EL1.E{0,1}SPE which reset to UNKNOWN values. */ 110 - if (SYS_FIELD_GET(ID_AA64DFR0_EL1, PMSVer, read_sysreg(id_aa64dfr0_el1))) 105 + if (host_data_test_flag(HAS_SPE)) 111 106 write_sysreg_el1(0, SYS_PMSCR); 112 107 } 113 108
-70
arch/arm64/kvm/guest.c
··· 591 591 return copy_core_reg_indices(vcpu, NULL); 592 592 } 593 593 594 - static const u64 timer_reg_list[] = { 595 - KVM_REG_ARM_TIMER_CTL, 596 - KVM_REG_ARM_TIMER_CNT, 597 - KVM_REG_ARM_TIMER_CVAL, 598 - KVM_REG_ARM_PTIMER_CTL, 599 - KVM_REG_ARM_PTIMER_CNT, 600 - KVM_REG_ARM_PTIMER_CVAL, 601 - }; 602 - 603 - #define NUM_TIMER_REGS ARRAY_SIZE(timer_reg_list) 604 - 605 - static bool is_timer_reg(u64 index) 606 - { 607 - switch (index) { 608 - case KVM_REG_ARM_TIMER_CTL: 609 - case KVM_REG_ARM_TIMER_CNT: 610 - case KVM_REG_ARM_TIMER_CVAL: 611 - case KVM_REG_ARM_PTIMER_CTL: 612 - case KVM_REG_ARM_PTIMER_CNT: 613 - case KVM_REG_ARM_PTIMER_CVAL: 614 - return true; 615 - } 616 - return false; 617 - } 618 - 619 - static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) 620 - { 621 - for (int i = 0; i < NUM_TIMER_REGS; i++) { 622 - if (put_user(timer_reg_list[i], uindices)) 623 - return -EFAULT; 624 - uindices++; 625 - } 626 - 627 - return 0; 628 - } 629 - 630 - static int set_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 631 - { 632 - void __user *uaddr = (void __user *)(long)reg->addr; 633 - u64 val; 634 - int ret; 635 - 636 - ret = copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id)); 637 - if (ret != 0) 638 - return -EFAULT; 639 - 640 - return kvm_arm_timer_set_reg(vcpu, reg->id, val); 641 - } 642 - 643 - static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 644 - { 645 - void __user *uaddr = (void __user *)(long)reg->addr; 646 - u64 val; 647 - 648 - val = kvm_arm_timer_get_reg(vcpu, reg->id); 649 - return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)) ? -EFAULT : 0; 650 - } 651 - 652 594 static unsigned long num_sve_regs(const struct kvm_vcpu *vcpu) 653 595 { 654 596 const unsigned int slices = vcpu_sve_slices(vcpu); ··· 666 724 res += num_sve_regs(vcpu); 667 725 res += kvm_arm_num_sys_reg_descs(vcpu); 668 726 res += kvm_arm_get_fw_num_regs(vcpu); 669 - res += NUM_TIMER_REGS; 670 727 671 728 return res; 672 729 } ··· 696 755 return ret; 697 756 uindices += kvm_arm_get_fw_num_regs(vcpu); 698 757 699 - ret = copy_timer_indices(vcpu, uindices); 700 - if (ret < 0) 701 - return ret; 702 - uindices += NUM_TIMER_REGS; 703 - 704 758 return kvm_arm_copy_sys_reg_indices(vcpu, uindices); 705 759 } 706 760 ··· 713 777 case KVM_REG_ARM64_SVE: return get_sve_reg(vcpu, reg); 714 778 } 715 779 716 - if (is_timer_reg(reg->id)) 717 - return get_timer_reg(vcpu, reg); 718 - 719 780 return kvm_arm_sys_reg_get_reg(vcpu, reg); 720 781 } 721 782 ··· 729 796 return kvm_arm_set_fw_reg(vcpu, reg); 730 797 case KVM_REG_ARM64_SVE: return set_sve_reg(vcpu, reg); 731 798 } 732 - 733 - if (is_timer_reg(reg->id)) 734 - return set_timer_reg(vcpu, reg); 735 799 736 800 return kvm_arm_sys_reg_set_reg(vcpu, reg); 737 801 }
+6 -1
arch/arm64/kvm/handle_exit.c
··· 147 147 if (esr & ESR_ELx_WFx_ISS_RV) { 148 148 u64 val, now; 149 149 150 - now = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_TIMER_CNT); 150 + now = kvm_phys_timer_read(); 151 + if (is_hyp_ctxt(vcpu) && vcpu_el2_e2h_is_set(vcpu)) 152 + now -= timer_get_offset(vcpu_hvtimer(vcpu)); 153 + else 154 + now -= timer_get_offset(vcpu_vtimer(vcpu)); 155 + 151 156 val = vcpu_get_reg(vcpu, kvm_vcpu_sys_get_rt(vcpu)); 152 157 153 158 if (now >= val)
+17 -131
arch/arm64/kvm/hyp/include/hyp/switch.h
··· 195 195 __deactivate_cptr_traps_nvhe(vcpu); 196 196 } 197 197 198 - #define reg_to_fgt_masks(reg) \ 199 - ({ \ 200 - struct fgt_masks *m; \ 201 - switch(reg) { \ 202 - case HFGRTR_EL2: \ 203 - m = &hfgrtr_masks; \ 204 - break; \ 205 - case HFGWTR_EL2: \ 206 - m = &hfgwtr_masks; \ 207 - break; \ 208 - case HFGITR_EL2: \ 209 - m = &hfgitr_masks; \ 210 - break; \ 211 - case HDFGRTR_EL2: \ 212 - m = &hdfgrtr_masks; \ 213 - break; \ 214 - case HDFGWTR_EL2: \ 215 - m = &hdfgwtr_masks; \ 216 - break; \ 217 - case HAFGRTR_EL2: \ 218 - m = &hafgrtr_masks; \ 219 - break; \ 220 - case HFGRTR2_EL2: \ 221 - m = &hfgrtr2_masks; \ 222 - break; \ 223 - case HFGWTR2_EL2: \ 224 - m = &hfgwtr2_masks; \ 225 - break; \ 226 - case HFGITR2_EL2: \ 227 - m = &hfgitr2_masks; \ 228 - break; \ 229 - case HDFGRTR2_EL2: \ 230 - m = &hdfgrtr2_masks; \ 231 - break; \ 232 - case HDFGWTR2_EL2: \ 233 - m = &hdfgwtr2_masks; \ 234 - break; \ 235 - default: \ 236 - BUILD_BUG_ON(1); \ 237 - } \ 238 - \ 239 - m; \ 240 - }) 241 - 242 - #define compute_clr_set(vcpu, reg, clr, set) \ 243 - do { \ 244 - u64 hfg = __vcpu_sys_reg(vcpu, reg); \ 245 - struct fgt_masks *m = reg_to_fgt_masks(reg); \ 246 - set |= hfg & m->mask; \ 247 - clr |= ~hfg & m->nmask; \ 248 - } while(0) 249 - 250 - #define reg_to_fgt_group_id(reg) \ 251 - ({ \ 252 - enum fgt_group_id id; \ 253 - switch(reg) { \ 254 - case HFGRTR_EL2: \ 255 - case HFGWTR_EL2: \ 256 - id = HFGRTR_GROUP; \ 257 - break; \ 258 - case HFGITR_EL2: \ 259 - id = HFGITR_GROUP; \ 260 - break; \ 261 - case HDFGRTR_EL2: \ 262 - case HDFGWTR_EL2: \ 263 - id = HDFGRTR_GROUP; \ 264 - break; \ 265 - case HAFGRTR_EL2: \ 266 - id = HAFGRTR_GROUP; \ 267 - break; \ 268 - case HFGRTR2_EL2: \ 269 - case HFGWTR2_EL2: \ 270 - id = HFGRTR2_GROUP; \ 271 - break; \ 272 - case HFGITR2_EL2: \ 273 - id = HFGITR2_GROUP; \ 274 - break; \ 275 - case HDFGRTR2_EL2: \ 276 - case HDFGWTR2_EL2: \ 277 - id = HDFGRTR2_GROUP; \ 278 - break; \ 279 - default: \ 280 - BUILD_BUG_ON(1); \ 281 - } \ 282 - \ 283 - id; \ 284 - }) 285 - 286 - #define compute_undef_clr_set(vcpu, kvm, reg, clr, set) \ 287 - do { \ 288 - u64 hfg = kvm->arch.fgu[reg_to_fgt_group_id(reg)]; \ 289 - struct fgt_masks *m = reg_to_fgt_masks(reg); \ 290 - set |= hfg & m->mask; \ 291 - clr |= hfg & m->nmask; \ 292 - } while(0) 293 - 294 - #define update_fgt_traps_cs(hctxt, vcpu, kvm, reg, clr, set) \ 295 - do { \ 296 - struct fgt_masks *m = reg_to_fgt_masks(reg); \ 297 - u64 c = clr, s = set; \ 298 - u64 val; \ 299 - \ 300 - ctxt_sys_reg(hctxt, reg) = read_sysreg_s(SYS_ ## reg); \ 301 - if (is_nested_ctxt(vcpu)) \ 302 - compute_clr_set(vcpu, reg, c, s); \ 303 - \ 304 - compute_undef_clr_set(vcpu, kvm, reg, c, s); \ 305 - \ 306 - val = m->nmask; \ 307 - val |= s; \ 308 - val &= ~c; \ 309 - write_sysreg_s(val, SYS_ ## reg); \ 310 - } while(0) 311 - 312 - #define update_fgt_traps(hctxt, vcpu, kvm, reg) \ 313 - update_fgt_traps_cs(hctxt, vcpu, kvm, reg, 0, 0) 314 - 315 198 static inline bool cpu_has_amu(void) 316 199 { 317 200 u64 pfr0 = read_sysreg_s(SYS_ID_AA64PFR0_EL1); ··· 203 320 ID_AA64PFR0_EL1_AMU_SHIFT); 204 321 } 205 322 323 + #define __activate_fgt(hctxt, vcpu, reg) \ 324 + do { \ 325 + ctxt_sys_reg(hctxt, reg) = read_sysreg_s(SYS_ ## reg); \ 326 + write_sysreg_s(*vcpu_fgt(vcpu, reg), SYS_ ## reg); \ 327 + } while (0) 328 + 206 329 static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu) 207 330 { 208 331 struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt); 209 - struct kvm *kvm = kern_hyp_va(vcpu->kvm); 210 332 211 333 if (!cpus_have_final_cap(ARM64_HAS_FGT)) 212 334 return; 213 335 214 - update_fgt_traps(hctxt, vcpu, kvm, HFGRTR_EL2); 215 - update_fgt_traps_cs(hctxt, vcpu, kvm, HFGWTR_EL2, 0, 216 - cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38) ? 217 - HFGWTR_EL2_TCR_EL1_MASK : 0); 218 - update_fgt_traps(hctxt, vcpu, kvm, HFGITR_EL2); 219 - update_fgt_traps(hctxt, vcpu, kvm, HDFGRTR_EL2); 220 - update_fgt_traps(hctxt, vcpu, kvm, HDFGWTR_EL2); 336 + __activate_fgt(hctxt, vcpu, HFGRTR_EL2); 337 + __activate_fgt(hctxt, vcpu, HFGWTR_EL2); 338 + __activate_fgt(hctxt, vcpu, HFGITR_EL2); 339 + __activate_fgt(hctxt, vcpu, HDFGRTR_EL2); 340 + __activate_fgt(hctxt, vcpu, HDFGWTR_EL2); 221 341 222 342 if (cpu_has_amu()) 223 - update_fgt_traps(hctxt, vcpu, kvm, HAFGRTR_EL2); 343 + __activate_fgt(hctxt, vcpu, HAFGRTR_EL2); 224 344 225 345 if (!cpus_have_final_cap(ARM64_HAS_FGT2)) 226 346 return; 227 347 228 - update_fgt_traps(hctxt, vcpu, kvm, HFGRTR2_EL2); 229 - update_fgt_traps(hctxt, vcpu, kvm, HFGWTR2_EL2); 230 - update_fgt_traps(hctxt, vcpu, kvm, HFGITR2_EL2); 231 - update_fgt_traps(hctxt, vcpu, kvm, HDFGRTR2_EL2); 232 - update_fgt_traps(hctxt, vcpu, kvm, HDFGWTR2_EL2); 348 + __activate_fgt(hctxt, vcpu, HFGRTR2_EL2); 349 + __activate_fgt(hctxt, vcpu, HFGWTR2_EL2); 350 + __activate_fgt(hctxt, vcpu, HFGITR2_EL2); 351 + __activate_fgt(hctxt, vcpu, HDFGRTR2_EL2); 352 + __activate_fgt(hctxt, vcpu, HDFGWTR2_EL2); 233 353 } 234 354 235 355 #define __deactivate_fgt(htcxt, vcpu, reg) \
+1
arch/arm64/kvm/hyp/nvhe/pkvm.c
··· 172 172 173 173 /* Trust the host for non-protected vcpu features. */ 174 174 vcpu->arch.hcrx_el2 = host_vcpu->arch.hcrx_el2; 175 + memcpy(vcpu->arch.fgt, host_vcpu->arch.fgt, sizeof(vcpu->arch.fgt)); 175 176 return 0; 176 177 } 177 178
+6 -3
arch/arm64/kvm/nested.c
··· 1859 1859 { 1860 1860 u64 guest_mdcr = __vcpu_sys_reg(vcpu, MDCR_EL2); 1861 1861 1862 + if (is_nested_ctxt(vcpu)) 1863 + vcpu->arch.mdcr_el2 |= (guest_mdcr & NV_MDCR_GUEST_INCLUDE); 1862 1864 /* 1863 1865 * In yet another example where FEAT_NV2 is fscking broken, accesses 1864 1866 * to MDSCR_EL1 are redirected to the VNCR despite having an effect 1865 1867 * at EL2. Use a big hammer to apply sanity. 1868 + * 1869 + * Unless of course we have FEAT_FGT, in which case we can precisely 1870 + * trap MDSCR_EL1. 1866 1871 */ 1867 - if (is_hyp_ctxt(vcpu)) 1872 + else if (!cpus_have_final_cap(ARM64_HAS_FGT)) 1868 1873 vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA; 1869 - else 1870 - vcpu->arch.mdcr_el2 |= (guest_mdcr & NV_MDCR_GUEST_INCLUDE); 1871 1874 }
+105 -26
arch/arm64/kvm/sys_regs.c
··· 203 203 MAPPED_EL2_SYSREG(AMAIR_EL2, AMAIR_EL1, NULL ); 204 204 MAPPED_EL2_SYSREG(ELR_EL2, ELR_EL1, NULL ); 205 205 MAPPED_EL2_SYSREG(SPSR_EL2, SPSR_EL1, NULL ); 206 - MAPPED_EL2_SYSREG(ZCR_EL2, ZCR_EL1, NULL ); 207 206 MAPPED_EL2_SYSREG(CONTEXTIDR_EL2, CONTEXTIDR_EL1, NULL ); 208 207 MAPPED_EL2_SYSREG(SCTLR2_EL2, SCTLR2_EL1, NULL ); 209 208 case CNTHCTL_EL2: ··· 1594 1595 return true; 1595 1596 } 1596 1597 1597 - static bool access_hv_timer(struct kvm_vcpu *vcpu, 1598 - struct sys_reg_params *p, 1599 - const struct sys_reg_desc *r) 1598 + static int arch_timer_set_user(struct kvm_vcpu *vcpu, 1599 + const struct sys_reg_desc *rd, 1600 + u64 val) 1600 1601 { 1601 - if (!vcpu_el2_e2h_is_set(vcpu)) 1602 - return undef_access(vcpu, p, r); 1602 + switch (reg_to_encoding(rd)) { 1603 + case SYS_CNTV_CTL_EL0: 1604 + case SYS_CNTP_CTL_EL0: 1605 + case SYS_CNTHV_CTL_EL2: 1606 + case SYS_CNTHP_CTL_EL2: 1607 + val &= ~ARCH_TIMER_CTRL_IT_STAT; 1608 + break; 1609 + case SYS_CNTVCT_EL0: 1610 + if (!test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, &vcpu->kvm->arch.flags)) 1611 + timer_set_offset(vcpu_vtimer(vcpu), kvm_phys_timer_read() - val); 1612 + return 0; 1613 + case SYS_CNTPCT_EL0: 1614 + if (!test_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, &vcpu->kvm->arch.flags)) 1615 + timer_set_offset(vcpu_ptimer(vcpu), kvm_phys_timer_read() - val); 1616 + return 0; 1617 + } 1603 1618 1604 - return access_arch_timer(vcpu, p, r); 1619 + __vcpu_assign_sys_reg(vcpu, rd->reg, val); 1620 + return 0; 1621 + } 1622 + 1623 + static int arch_timer_get_user(struct kvm_vcpu *vcpu, 1624 + const struct sys_reg_desc *rd, 1625 + u64 *val) 1626 + { 1627 + switch (reg_to_encoding(rd)) { 1628 + case SYS_CNTVCT_EL0: 1629 + *val = kvm_phys_timer_read() - timer_get_offset(vcpu_vtimer(vcpu)); 1630 + break; 1631 + case SYS_CNTPCT_EL0: 1632 + *val = kvm_phys_timer_read() - timer_get_offset(vcpu_ptimer(vcpu)); 1633 + break; 1634 + default: 1635 + *val = __vcpu_sys_reg(vcpu, rd->reg); 1636 + } 1637 + 1638 + return 0; 1605 1639 } 1606 1640 1607 1641 static s64 kvm_arm64_ftr_safe_value(u32 id, const struct arm64_ftr_bits *ftrp, ··· 2539 2507 "trap of EL2 register redirected to EL1"); 2540 2508 } 2541 2509 2542 - #define EL2_REG_FILTERED(name, acc, rst, v, filter) { \ 2510 + #define SYS_REG_USER_FILTER(name, acc, rst, v, gu, su, filter) { \ 2543 2511 SYS_DESC(SYS_##name), \ 2544 2512 .access = acc, \ 2545 2513 .reset = rst, \ 2546 2514 .reg = name, \ 2515 + .get_user = gu, \ 2516 + .set_user = su, \ 2547 2517 .visibility = filter, \ 2548 2518 .val = v, \ 2549 2519 } 2520 + 2521 + #define EL2_REG_FILTERED(name, acc, rst, v, filter) \ 2522 + SYS_REG_USER_FILTER(name, acc, rst, v, NULL, NULL, filter) 2550 2523 2551 2524 #define EL2_REG(name, acc, rst, v) \ 2552 2525 EL2_REG_FILTERED(name, acc, rst, v, el2_visibility) ··· 2562 2525 #define EL2_REG_VNCR_GICv3(name) \ 2563 2526 EL2_REG_VNCR_FILT(name, hidden_visibility) 2564 2527 #define EL2_REG_REDIR(name, rst, v) EL2_REG(name, bad_redir_trap, rst, v) 2528 + 2529 + #define TIMER_REG(name, vis) \ 2530 + SYS_REG_USER_FILTER(name, access_arch_timer, reset_val, 0, \ 2531 + arch_timer_get_user, arch_timer_set_user, vis) 2565 2532 2566 2533 /* 2567 2534 * Since reset() callback and field val are not used for idregs, they will be ··· 2746 2705 2747 2706 if (guest_hyp_sve_traps_enabled(vcpu)) { 2748 2707 kvm_inject_nested_sve_trap(vcpu); 2749 - return true; 2708 + return false; 2750 2709 } 2751 2710 2752 2711 if (!p->is_write) { 2753 - p->regval = vcpu_read_sys_reg(vcpu, ZCR_EL2); 2712 + p->regval = __vcpu_sys_reg(vcpu, ZCR_EL2); 2754 2713 return true; 2755 2714 } 2756 2715 2757 2716 vq = SYS_FIELD_GET(ZCR_ELx, LEN, p->regval) + 1; 2758 2717 vq = min(vq, vcpu_sve_max_vq(vcpu)); 2759 - vcpu_write_sys_reg(vcpu, vq - 1, ZCR_EL2); 2760 - 2718 + __vcpu_assign_sys_reg(vcpu, ZCR_EL2, vq - 1); 2761 2719 return true; 2762 2720 } 2763 2721 ··· 2871 2831 const struct sys_reg_desc *rd) 2872 2832 { 2873 2833 return __el2_visibility(vcpu, rd, s1pie_visibility); 2834 + } 2835 + 2836 + static unsigned int cnthv_visibility(const struct kvm_vcpu *vcpu, 2837 + const struct sys_reg_desc *rd) 2838 + { 2839 + if (vcpu_has_nv(vcpu) && 2840 + !vcpu_has_feature(vcpu, KVM_ARM_VCPU_HAS_EL2_E2H0)) 2841 + return 0; 2842 + 2843 + return REG_HIDDEN; 2874 2844 } 2875 2845 2876 2846 static bool access_mdcr(struct kvm_vcpu *vcpu, ··· 3532 3482 AMU_AMEVTYPER1_EL0(14), 3533 3483 AMU_AMEVTYPER1_EL0(15), 3534 3484 3535 - { SYS_DESC(SYS_CNTPCT_EL0), access_arch_timer }, 3536 - { SYS_DESC(SYS_CNTVCT_EL0), access_arch_timer }, 3485 + { SYS_DESC(SYS_CNTPCT_EL0), .access = access_arch_timer, 3486 + .get_user = arch_timer_get_user, .set_user = arch_timer_set_user }, 3487 + { SYS_DESC(SYS_CNTVCT_EL0), .access = access_arch_timer, 3488 + .get_user = arch_timer_get_user, .set_user = arch_timer_set_user }, 3537 3489 { SYS_DESC(SYS_CNTPCTSS_EL0), access_arch_timer }, 3538 3490 { SYS_DESC(SYS_CNTVCTSS_EL0), access_arch_timer }, 3539 3491 { SYS_DESC(SYS_CNTP_TVAL_EL0), access_arch_timer }, 3540 - { SYS_DESC(SYS_CNTP_CTL_EL0), access_arch_timer }, 3541 - { SYS_DESC(SYS_CNTP_CVAL_EL0), access_arch_timer }, 3492 + TIMER_REG(CNTP_CTL_EL0, NULL), 3493 + TIMER_REG(CNTP_CVAL_EL0, NULL), 3542 3494 3543 3495 { SYS_DESC(SYS_CNTV_TVAL_EL0), access_arch_timer }, 3544 - { SYS_DESC(SYS_CNTV_CTL_EL0), access_arch_timer }, 3545 - { SYS_DESC(SYS_CNTV_CVAL_EL0), access_arch_timer }, 3496 + TIMER_REG(CNTV_CTL_EL0, NULL), 3497 + TIMER_REG(CNTV_CVAL_EL0, NULL), 3546 3498 3547 3499 /* PMEVCNTRn_EL0 */ 3548 3500 PMU_PMEVCNTR_EL0(0), ··· 3742 3690 EL2_REG_VNCR(CNTVOFF_EL2, reset_val, 0), 3743 3691 EL2_REG(CNTHCTL_EL2, access_rw, reset_val, 0), 3744 3692 { SYS_DESC(SYS_CNTHP_TVAL_EL2), access_arch_timer }, 3745 - EL2_REG(CNTHP_CTL_EL2, access_arch_timer, reset_val, 0), 3746 - EL2_REG(CNTHP_CVAL_EL2, access_arch_timer, reset_val, 0), 3693 + TIMER_REG(CNTHP_CTL_EL2, el2_visibility), 3694 + TIMER_REG(CNTHP_CVAL_EL2, el2_visibility), 3747 3695 3748 - { SYS_DESC(SYS_CNTHV_TVAL_EL2), access_hv_timer }, 3749 - EL2_REG(CNTHV_CTL_EL2, access_hv_timer, reset_val, 0), 3750 - EL2_REG(CNTHV_CVAL_EL2, access_hv_timer, reset_val, 0), 3696 + { SYS_DESC(SYS_CNTHV_TVAL_EL2), access_arch_timer, .visibility = cnthv_visibility }, 3697 + TIMER_REG(CNTHV_CTL_EL2, cnthv_visibility), 3698 + TIMER_REG(CNTHV_CVAL_EL2, cnthv_visibility), 3751 3699 3752 3700 { SYS_DESC(SYS_CNTKCTL_EL12), access_cntkctl_el12 }, 3753 3701 ··· 5285 5233 } 5286 5234 } 5287 5235 5236 + static u64 kvm_one_reg_to_id(const struct kvm_one_reg *reg) 5237 + { 5238 + switch(reg->id) { 5239 + case KVM_REG_ARM_TIMER_CVAL: 5240 + return TO_ARM64_SYS_REG(CNTV_CVAL_EL0); 5241 + case KVM_REG_ARM_TIMER_CNT: 5242 + return TO_ARM64_SYS_REG(CNTVCT_EL0); 5243 + default: 5244 + return reg->id; 5245 + } 5246 + } 5247 + 5288 5248 int kvm_sys_reg_get_user(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg, 5289 5249 const struct sys_reg_desc table[], unsigned int num) 5290 5250 { 5291 5251 u64 __user *uaddr = (u64 __user *)(unsigned long)reg->addr; 5292 5252 const struct sys_reg_desc *r; 5253 + u64 id = kvm_one_reg_to_id(reg); 5293 5254 u64 val; 5294 5255 int ret; 5295 5256 5296 - r = id_to_sys_reg_desc(vcpu, reg->id, table, num); 5257 + r = id_to_sys_reg_desc(vcpu, id, table, num); 5297 5258 if (!r || sysreg_hidden(vcpu, r)) 5298 5259 return -ENOENT; 5299 5260 ··· 5339 5274 { 5340 5275 u64 __user *uaddr = (u64 __user *)(unsigned long)reg->addr; 5341 5276 const struct sys_reg_desc *r; 5277 + u64 id = kvm_one_reg_to_id(reg); 5342 5278 u64 val; 5343 5279 int ret; 5344 5280 5345 5281 if (get_user(val, uaddr)) 5346 5282 return -EFAULT; 5347 5283 5348 - r = id_to_sys_reg_desc(vcpu, reg->id, table, num); 5284 + r = id_to_sys_reg_desc(vcpu, id, table, num); 5349 5285 if (!r || sysreg_hidden(vcpu, r)) 5350 5286 return -ENOENT; 5351 5287 ··· 5406 5340 5407 5341 static bool copy_reg_to_user(const struct sys_reg_desc *reg, u64 __user **uind) 5408 5342 { 5343 + u64 idx; 5344 + 5409 5345 if (!*uind) 5410 5346 return true; 5411 5347 5412 - if (put_user(sys_reg_to_index(reg), *uind)) 5348 + switch (reg_to_encoding(reg)) { 5349 + case SYS_CNTV_CVAL_EL0: 5350 + idx = KVM_REG_ARM_TIMER_CVAL; 5351 + break; 5352 + case SYS_CNTVCT_EL0: 5353 + idx = KVM_REG_ARM_TIMER_CNT; 5354 + break; 5355 + default: 5356 + idx = sys_reg_to_index(reg); 5357 + } 5358 + 5359 + if (put_user(idx, *uind)) 5413 5360 return false; 5414 5361 5415 5362 (*uind)++;
+6
arch/arm64/kvm/sys_regs.h
··· 257 257 (val); \ 258 258 }) 259 259 260 + #define TO_ARM64_SYS_REG(r) ARM64_SYS_REG(sys_reg_Op0(SYS_ ## r), \ 261 + sys_reg_Op1(SYS_ ## r), \ 262 + sys_reg_CRn(SYS_ ## r), \ 263 + sys_reg_CRm(SYS_ ## r), \ 264 + sys_reg_Op2(SYS_ ## r)) 265 + 260 266 #endif /* __ARM64_KVM_SYS_REGS_LOCAL_H__ */
+4 -1
arch/arm64/kvm/vgic/vgic-v3.c
··· 297 297 { 298 298 struct vgic_v3_cpu_if *vgic_v3 = &vcpu->arch.vgic_cpu.vgic_v3; 299 299 300 + if (!vgic_is_v3(vcpu->kvm)) 301 + return; 302 + 300 303 /* Hide GICv3 sysreg if necessary */ 301 - if (!kvm_has_gicv3(vcpu->kvm)) { 304 + if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2) { 302 305 vgic_v3->vgic_hcr |= (ICH_HCR_EL2_TALL0 | ICH_HCR_EL2_TALL1 | 303 306 ICH_HCR_EL2_TC); 304 307 return;
+16 -8
include/kvm/arm_arch_timer.h
··· 51 51 }; 52 52 53 53 struct arch_timer_context { 54 - struct kvm_vcpu *vcpu; 55 - 56 54 /* Emulated Timer (may be unused) */ 57 55 struct hrtimer hrtimer; 58 56 u64 ns_frac; ··· 68 70 struct { 69 71 bool level; 70 72 } irq; 73 + 74 + /* Who am I? */ 75 + enum kvm_arch_timers timer_id; 71 76 72 77 /* Duplicated state from arch_timer.c for convenience */ 73 78 u32 host_timer_irq; ··· 107 106 108 107 void kvm_timer_init_vm(struct kvm *kvm); 109 108 110 - u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid); 111 - int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value); 112 - 113 109 int kvm_arm_timer_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); 114 110 int kvm_arm_timer_get_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); 115 111 int kvm_arm_timer_has_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); ··· 125 127 #define vcpu_hvtimer(v) (&(v)->arch.timer_cpu.timers[TIMER_HVTIMER]) 126 128 #define vcpu_hptimer(v) (&(v)->arch.timer_cpu.timers[TIMER_HPTIMER]) 127 129 128 - #define arch_timer_ctx_index(ctx) ((ctx) - vcpu_timer((ctx)->vcpu)->timers) 129 - 130 - #define timer_vm_data(ctx) (&(ctx)->vcpu->kvm->arch.timer_data) 130 + #define arch_timer_ctx_index(ctx) ((ctx)->timer_id) 131 + #define timer_context_to_vcpu(ctx) container_of((ctx), struct kvm_vcpu, arch.timer_cpu.timers[(ctx)->timer_id]) 132 + #define timer_vm_data(ctx) (&(timer_context_to_vcpu(ctx)->kvm->arch.timer_data)) 131 133 #define timer_irq(ctx) (timer_vm_data(ctx)->ppi[arch_timer_ctx_index(ctx)]) 132 134 133 135 u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu, ··· 174 176 offset += *ctxt->offset.vcpu_offset; 175 177 176 178 return offset; 179 + } 180 + 181 + static inline void timer_set_offset(struct arch_timer_context *ctxt, u64 offset) 182 + { 183 + if (!ctxt->offset.vm_offset) { 184 + WARN(offset, "timer %d\n", arch_timer_ctx_index(ctxt)); 185 + return; 186 + } 187 + 188 + WRITE_ONCE(*ctxt->offset.vm_offset, offset); 177 189 } 178 190 179 191 #endif
+1 -1
tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c
··· 1020 1020 { 1021 1021 const uint64_t MIN_ROLLOVER_SECS = 40ULL * 365 * 24 * 3600; 1022 1022 uint64_t freq = read_sysreg(CNTFRQ_EL0); 1023 - uint64_t width = ilog2(MIN_ROLLOVER_SECS * freq); 1023 + int width = ilog2(MIN_ROLLOVER_SECS * freq); 1024 1024 1025 1025 width = clamp(width, 56, 64); 1026 1026 CVAL_MAX = GENMASK_ULL(width - 1, 0);
+43
tools/testing/selftests/kvm/arm64/external_aborts.c
··· 359 359 kvm_vm_free(vm); 360 360 } 361 361 362 + static void test_serror_amo_guest(void) 363 + { 364 + /* 365 + * The ISB is entirely unnecessary (and highlights how FEAT_NV2 is borked) 366 + * since the write is redirected to memory. But don't write (intentionally) 367 + * broken code! 368 + */ 369 + sysreg_clear_set(hcr_el2, HCR_EL2_AMO | HCR_EL2_TGE, 0); 370 + isb(); 371 + 372 + GUEST_SYNC(0); 373 + GUEST_ASSERT(read_sysreg(isr_el1) & ISR_EL1_A); 374 + 375 + /* 376 + * KVM treats the effective value of AMO as 1 when 377 + * HCR_EL2.{E2H,TGE} = {1, 0}, meaning the SError will be taken when 378 + * unmasked. 379 + */ 380 + local_serror_enable(); 381 + isb(); 382 + local_serror_disable(); 383 + 384 + GUEST_FAIL("Should've taken pending SError exception"); 385 + } 386 + 387 + static void test_serror_amo(void) 388 + { 389 + struct kvm_vcpu *vcpu; 390 + struct kvm_vm *vm = vm_create_with_dabt_handler(&vcpu, test_serror_amo_guest, 391 + unexpected_dabt_handler); 392 + 393 + vm_install_exception_handler(vm, VECTOR_ERROR_CURRENT, expect_serror_handler); 394 + vcpu_run_expect_sync(vcpu); 395 + vcpu_inject_serror(vcpu); 396 + vcpu_run_expect_done(vcpu); 397 + kvm_vm_free(vm); 398 + } 399 + 362 400 int main(void) 363 401 { 364 402 test_mmio_abort(); ··· 407 369 test_serror_emulated(); 408 370 test_mmio_ease(); 409 371 test_s1ptw_abort(); 372 + 373 + if (!test_supports_el2()) 374 + return 0; 375 + 376 + test_serror_amo(); 410 377 }
+96 -3
tools/testing/selftests/kvm/arm64/get-reg-list.c
··· 65 65 REG_FEAT(SCTLR2_EL1, ID_AA64MMFR3_EL1, SCTLRX, IMP), 66 66 REG_FEAT(VDISR_EL2, ID_AA64PFR0_EL1, RAS, IMP), 67 67 REG_FEAT(VSESR_EL2, ID_AA64PFR0_EL1, RAS, IMP), 68 + REG_FEAT(VNCR_EL2, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY), 69 + REG_FEAT(CNTHV_CTL_EL2, ID_AA64MMFR1_EL1, VH, IMP), 70 + REG_FEAT(CNTHV_CVAL_EL2,ID_AA64MMFR1_EL1, VH, IMP), 68 71 }; 69 72 70 73 bool filter_reg(__u64 reg) ··· 348 345 KVM_REG_ARM_FW_FEAT_BMAP_REG(1), /* KVM_REG_ARM_STD_HYP_BMAP */ 349 346 KVM_REG_ARM_FW_FEAT_BMAP_REG(2), /* KVM_REG_ARM_VENDOR_HYP_BMAP */ 350 347 KVM_REG_ARM_FW_FEAT_BMAP_REG(3), /* KVM_REG_ARM_VENDOR_HYP_BMAP_2 */ 351 - ARM64_SYS_REG(3, 3, 14, 3, 1), /* CNTV_CTL_EL0 */ 352 - ARM64_SYS_REG(3, 3, 14, 3, 2), /* CNTV_CVAL_EL0 */ 353 - ARM64_SYS_REG(3, 3, 14, 0, 2), 348 + 349 + /* 350 + * EL0 Virtual Timer Registers 351 + * 352 + * WARNING: 353 + * KVM_REG_ARM_TIMER_CVAL and KVM_REG_ARM_TIMER_CNT are not defined 354 + * with the appropriate register encodings. Their values have been 355 + * accidentally swapped. As this is set API, the definitions here 356 + * must be used, rather than ones derived from the encodings. 357 + */ 358 + KVM_ARM64_SYS_REG(SYS_CNTV_CTL_EL0), 359 + KVM_REG_ARM_TIMER_CVAL, 360 + KVM_REG_ARM_TIMER_CNT, 361 + 354 362 ARM64_SYS_REG(3, 0, 0, 0, 0), /* MIDR_EL1 */ 355 363 ARM64_SYS_REG(3, 0, 0, 0, 6), /* REVIDR_EL1 */ 356 364 ARM64_SYS_REG(3, 1, 0, 0, 1), /* CLIDR_EL1 */ ··· 769 755 SYS_REG(VSESR_EL2), 770 756 }; 771 757 758 + static __u64 el2_e2h0_regs[] = { 759 + /* Empty */ 760 + }; 761 + 772 762 #define BASE_SUBLIST \ 773 763 { "base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), } 774 764 #define VREGS_SUBLIST \ ··· 806 788 .feature = KVM_ARM_VCPU_HAS_EL2, \ 807 789 .regs = el2_regs, \ 808 790 .regs_n = ARRAY_SIZE(el2_regs), \ 791 + } 792 + #define EL2_E2H0_SUBLIST \ 793 + EL2_SUBLIST, \ 794 + { \ 795 + .name = "EL2 E2H0", \ 796 + .capability = KVM_CAP_ARM_EL2_E2H0, \ 797 + .feature = KVM_ARM_VCPU_HAS_EL2_E2H0, \ 798 + .regs = el2_e2h0_regs, \ 799 + .regs_n = ARRAY_SIZE(el2_e2h0_regs), \ 809 800 } 810 801 811 802 static struct vcpu_reg_list vregs_config = { ··· 924 897 }, 925 898 }; 926 899 900 + static struct vcpu_reg_list el2_e2h0_vregs_config = { 901 + .sublists = { 902 + BASE_SUBLIST, 903 + EL2_E2H0_SUBLIST, 904 + VREGS_SUBLIST, 905 + {0}, 906 + }, 907 + }; 908 + 909 + static struct vcpu_reg_list el2_e2h0_vregs_pmu_config = { 910 + .sublists = { 911 + BASE_SUBLIST, 912 + EL2_E2H0_SUBLIST, 913 + VREGS_SUBLIST, 914 + PMU_SUBLIST, 915 + {0}, 916 + }, 917 + }; 918 + 919 + static struct vcpu_reg_list el2_e2h0_sve_config = { 920 + .sublists = { 921 + BASE_SUBLIST, 922 + EL2_E2H0_SUBLIST, 923 + SVE_SUBLIST, 924 + {0}, 925 + }, 926 + }; 927 + 928 + static struct vcpu_reg_list el2_e2h0_sve_pmu_config = { 929 + .sublists = { 930 + BASE_SUBLIST, 931 + EL2_E2H0_SUBLIST, 932 + SVE_SUBLIST, 933 + PMU_SUBLIST, 934 + {0}, 935 + }, 936 + }; 937 + 938 + static struct vcpu_reg_list el2_e2h0_pauth_config = { 939 + .sublists = { 940 + BASE_SUBLIST, 941 + EL2_E2H0_SUBLIST, 942 + VREGS_SUBLIST, 943 + PAUTH_SUBLIST, 944 + {0}, 945 + }, 946 + }; 947 + 948 + static struct vcpu_reg_list el2_e2h0_pauth_pmu_config = { 949 + .sublists = { 950 + BASE_SUBLIST, 951 + EL2_E2H0_SUBLIST, 952 + VREGS_SUBLIST, 953 + PAUTH_SUBLIST, 954 + PMU_SUBLIST, 955 + {0}, 956 + }, 957 + }; 958 + 927 959 struct vcpu_reg_list *vcpu_configs[] = { 928 960 &vregs_config, 929 961 &vregs_pmu_config, ··· 997 911 &el2_sve_pmu_config, 998 912 &el2_pauth_config, 999 913 &el2_pauth_pmu_config, 914 + 915 + &el2_e2h0_vregs_config, 916 + &el2_e2h0_vregs_pmu_config, 917 + &el2_e2h0_sve_config, 918 + &el2_e2h0_sve_pmu_config, 919 + &el2_e2h0_pauth_config, 920 + &el2_e2h0_pauth_pmu_config, 1000 921 }; 1001 922 int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);
+3
tools/testing/selftests/kvm/arm64/set_id_regs.c
··· 249 249 GUEST_REG_SYNC(SYS_ID_AA64ISAR2_EL1); 250 250 GUEST_REG_SYNC(SYS_ID_AA64ISAR3_EL1); 251 251 GUEST_REG_SYNC(SYS_ID_AA64PFR0_EL1); 252 + GUEST_REG_SYNC(SYS_ID_AA64PFR1_EL1); 252 253 GUEST_REG_SYNC(SYS_ID_AA64MMFR0_EL1); 253 254 GUEST_REG_SYNC(SYS_ID_AA64MMFR1_EL1); 254 255 GUEST_REG_SYNC(SYS_ID_AA64MMFR2_EL1); 255 256 GUEST_REG_SYNC(SYS_ID_AA64MMFR3_EL1); 256 257 GUEST_REG_SYNC(SYS_ID_AA64ZFR0_EL1); 258 + GUEST_REG_SYNC(SYS_MPIDR_EL1); 259 + GUEST_REG_SYNC(SYS_CLIDR_EL1); 257 260 GUEST_REG_SYNC(SYS_CTR_EL0); 258 261 GUEST_REG_SYNC(SYS_MIDR_EL1); 259 262 GUEST_REG_SYNC(SYS_REVIDR_EL1);
+2 -1
tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
··· 123 123 static void guest_code(size_t nr_lpis) 124 124 { 125 125 guest_setup_gic(); 126 + local_irq_enable(); 126 127 127 128 GUEST_SYNC(0); 128 129 ··· 332 331 { 333 332 int i; 334 333 335 - vcpus = malloc(test_data.nr_cpus * sizeof(struct kvm_vcpu)); 334 + vcpus = malloc(test_data.nr_cpus * sizeof(struct kvm_vcpu *)); 336 335 TEST_ASSERT(vcpus, "Failed to allocate vCPU array"); 337 336 338 337 vm = vm_create_with_vcpus(test_data.nr_cpus, guest_code, vcpus);
+11 -1
tools/testing/selftests/kvm/include/arm64/processor.h
··· 305 305 void test_disable_default_vgic(void); 306 306 307 307 bool vm_supports_el2(struct kvm_vm *vm); 308 - static bool vcpu_has_el2(struct kvm_vcpu *vcpu) 308 + 309 + static inline bool test_supports_el2(void) 310 + { 311 + struct kvm_vm *vm = vm_create(1); 312 + bool supported = vm_supports_el2(vm); 313 + 314 + kvm_vm_free(vm); 315 + return supported; 316 + } 317 + 318 + static inline bool vcpu_has_el2(struct kvm_vcpu *vcpu) 309 319 { 310 320 return vcpu->init.features[0] & BIT(KVM_ARM_VCPU_HAS_EL2); 311 321 }
+2
tools/testing/selftests/kvm/include/kvm_util.h
··· 1273 1273 1274 1274 uint32_t guest_get_vcpuid(void); 1275 1275 1276 + bool kvm_arch_has_default_irqchip(void); 1277 + 1276 1278 #endif /* SELFTEST_KVM_UTIL_H */
+11 -3
tools/testing/selftests/kvm/irqfd_test.c
··· 89 89 int main(int argc, char *argv[]) 90 90 { 91 91 pthread_t racing_thread; 92 + struct kvm_vcpu *unused; 92 93 int r, i; 93 94 94 - /* Create "full" VMs, as KVM_IRQFD requires an in-kernel IRQ chip. */ 95 - vm1 = vm_create(1); 96 - vm2 = vm_create(1); 95 + TEST_REQUIRE(kvm_arch_has_default_irqchip()); 96 + 97 + /* 98 + * Create "full" VMs, as KVM_IRQFD requires an in-kernel IRQ chip. Also 99 + * create an unused vCPU as certain architectures (like arm64) need to 100 + * complete IRQ chip initialization after all possible vCPUs for a VM 101 + * have been created. 102 + */ 103 + vm1 = vm_create_with_one_vcpu(&unused, NULL); 104 + vm2 = vm_create_with_one_vcpu(&unused, NULL); 97 105 98 106 WRITE_ONCE(__eventfd, kvm_new_eventfd()); 99 107
+5
tools/testing/selftests/kvm/lib/arm64/processor.c
··· 725 725 if (vm->arch.has_gic) 726 726 close(vm->arch.gic_fd); 727 727 } 728 + 729 + bool kvm_arch_has_default_irqchip(void) 730 + { 731 + return request_vgic && kvm_supports_vgic_v3(); 732 + }
+5
tools/testing/selftests/kvm/lib/kvm_util.c
··· 2344 2344 pg = paddr >> vm->page_shift; 2345 2345 return sparsebit_is_set(region->protected_phy_pages, pg); 2346 2346 } 2347 + 2348 + __weak bool kvm_arch_has_default_irqchip(void) 2349 + { 2350 + return false; 2351 + }
+5
tools/testing/selftests/kvm/lib/s390/processor.c
··· 221 221 void assert_on_unhandled_exception(struct kvm_vcpu *vcpu) 222 222 { 223 223 } 224 + 225 + bool kvm_arch_has_default_irqchip(void) 226 + { 227 + return true; 228 + }
+5
tools/testing/selftests/kvm/lib/x86/processor.c
··· 1318 1318 1319 1319 return ret; 1320 1320 } 1321 + 1322 + bool kvm_arch_has_default_irqchip(void) 1323 + { 1324 + return true; 1325 + }