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

Configure Feed

Select the types of activity you want to include in your feed.

KVM: arm64: Move CNT*_CTL_EL0 userspace accessors to generic infrastructure

Remove the handling of CNT*_CTL_EL0 from guest.c, and move it to
sys_regs.c, using a new TIMER_REG() definition to encapsulate it.

Signed-off-by: Marc Zyngier <maz@kernel.org>

+31 -9
-4
arch/arm64/kvm/guest.c
··· 592 592 } 593 593 594 594 static const u64 timer_reg_list[] = { 595 - KVM_REG_ARM_TIMER_CTL, 596 595 KVM_REG_ARM_TIMER_CNT, 597 596 KVM_REG_ARM_TIMER_CVAL, 598 - KVM_REG_ARM_PTIMER_CTL, 599 597 KVM_REG_ARM_PTIMER_CNT, 600 598 KVM_REG_ARM_PTIMER_CVAL, 601 599 }; ··· 603 605 static bool is_timer_reg(u64 index) 604 606 { 605 607 switch (index) { 606 - case KVM_REG_ARM_TIMER_CTL: 607 608 case KVM_REG_ARM_TIMER_CNT: 608 609 case KVM_REG_ARM_TIMER_CVAL: 609 - case KVM_REG_ARM_PTIMER_CTL: 610 610 case KVM_REG_ARM_PTIMER_CNT: 611 611 case KVM_REG_ARM_PTIMER_CVAL: 612 612 return true;
+31 -5
arch/arm64/kvm/sys_regs.c
··· 1594 1594 return true; 1595 1595 } 1596 1596 1597 + static int arch_timer_set_user(struct kvm_vcpu *vcpu, 1598 + const struct sys_reg_desc *rd, 1599 + u64 val) 1600 + { 1601 + switch (reg_to_encoding(rd)) { 1602 + case SYS_CNTV_CTL_EL0: 1603 + case SYS_CNTP_CTL_EL0: 1604 + case SYS_CNTHV_CTL_EL2: 1605 + case SYS_CNTHP_CTL_EL2: 1606 + val &= ~ARCH_TIMER_CTRL_IT_STAT; 1607 + break; 1608 + } 1609 + 1610 + __vcpu_assign_sys_reg(vcpu, rd->reg, val); 1611 + return 0; 1612 + } 1613 + 1597 1614 static s64 kvm_arm64_ftr_safe_value(u32 id, const struct arm64_ftr_bits *ftrp, 1598 1615 s64 new, s64 cur) 1599 1616 { ··· 2513 2496 "trap of EL2 register redirected to EL1"); 2514 2497 } 2515 2498 2516 - #define EL2_REG_FILTERED(name, acc, rst, v, filter) { \ 2499 + #define SYS_REG_USER_FILTER(name, acc, rst, v, gu, su, filter) { \ 2517 2500 SYS_DESC(SYS_##name), \ 2518 2501 .access = acc, \ 2519 2502 .reset = rst, \ 2520 2503 .reg = name, \ 2504 + .get_user = gu, \ 2505 + .set_user = su, \ 2521 2506 .visibility = filter, \ 2522 2507 .val = v, \ 2523 2508 } 2509 + 2510 + #define EL2_REG_FILTERED(name, acc, rst, v, filter) \ 2511 + SYS_REG_USER_FILTER(name, acc, rst, v, NULL, NULL, filter) 2524 2512 2525 2513 #define EL2_REG(name, acc, rst, v) \ 2526 2514 EL2_REG_FILTERED(name, acc, rst, v, el2_visibility) ··· 2536 2514 #define EL2_REG_VNCR_GICv3(name) \ 2537 2515 EL2_REG_VNCR_FILT(name, hidden_visibility) 2538 2516 #define EL2_REG_REDIR(name, rst, v) EL2_REG(name, bad_redir_trap, rst, v) 2517 + 2518 + #define TIMER_REG(name, vis) \ 2519 + SYS_REG_USER_FILTER(name, access_arch_timer, reset_val, 0, \ 2520 + NULL, arch_timer_set_user, vis) 2539 2521 2540 2522 /* 2541 2523 * Since reset() callback and field val are not used for idregs, they will be ··· 3511 3485 { SYS_DESC(SYS_CNTPCTSS_EL0), access_arch_timer }, 3512 3486 { SYS_DESC(SYS_CNTVCTSS_EL0), access_arch_timer }, 3513 3487 { SYS_DESC(SYS_CNTP_TVAL_EL0), access_arch_timer }, 3514 - { SYS_DESC(SYS_CNTP_CTL_EL0), access_arch_timer }, 3488 + TIMER_REG(CNTP_CTL_EL0, NULL), 3515 3489 { SYS_DESC(SYS_CNTP_CVAL_EL0), access_arch_timer }, 3516 3490 3517 3491 { SYS_DESC(SYS_CNTV_TVAL_EL0), access_arch_timer }, 3518 - { SYS_DESC(SYS_CNTV_CTL_EL0), access_arch_timer }, 3492 + TIMER_REG(CNTV_CTL_EL0, NULL), 3519 3493 { SYS_DESC(SYS_CNTV_CVAL_EL0), access_arch_timer }, 3520 3494 3521 3495 /* PMEVCNTRn_EL0 */ ··· 3714 3688 EL2_REG_VNCR(CNTVOFF_EL2, reset_val, 0), 3715 3689 EL2_REG(CNTHCTL_EL2, access_rw, reset_val, 0), 3716 3690 { SYS_DESC(SYS_CNTHP_TVAL_EL2), access_arch_timer }, 3717 - EL2_REG(CNTHP_CTL_EL2, access_arch_timer, reset_val, 0), 3691 + TIMER_REG(CNTHP_CTL_EL2, el2_visibility), 3718 3692 EL2_REG(CNTHP_CVAL_EL2, access_arch_timer, reset_val, 0), 3719 3693 3720 3694 { SYS_DESC(SYS_CNTHV_TVAL_EL2), access_arch_timer, .visibility = cnthv_visibility }, 3721 - EL2_REG_FILTERED(CNTHV_CTL_EL2, access_arch_timer, reset_val, 0, cnthv_visibility), 3695 + TIMER_REG(CNTHV_CTL_EL2, cnthv_visibility), 3722 3696 EL2_REG_FILTERED(CNTHV_CVAL_EL2, access_arch_timer, reset_val, 0, cnthv_visibility), 3723 3697 3724 3698 { SYS_DESC(SYS_CNTKCTL_EL12), access_cntkctl_el12 },