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

KVM: PPC: Use accessors for VCPU registers

Introduce accessor generator macros for VCPU registers. Use the accessor
functions to replace direct accesses to this registers.

This will be important later for Nested APIv2 support which requires
additional functionality for accessing and modifying VCPU state.

Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230914030600.16993-5-jniethe5@gmail.com

authored by

Jordan Niethe and committed by
Michael Ellerman
7028ac8d 2a64bc67

+59 -24
+36 -1
arch/powerpc/include/asm/kvm_book3s.h
··· 458 458 } 459 459 #endif 460 460 461 + #define KVMPPC_BOOK3S_VCPU_ACCESSOR_SET(reg, size) \ 462 + static inline void kvmppc_set_##reg(struct kvm_vcpu *vcpu, u##size val) \ 463 + { \ 464 + \ 465 + vcpu->arch.reg = val; \ 466 + } 467 + 468 + #define KVMPPC_BOOK3S_VCPU_ACCESSOR_GET(reg, size) \ 469 + static inline u##size kvmppc_get_##reg(struct kvm_vcpu *vcpu) \ 470 + { \ 471 + return vcpu->arch.reg; \ 472 + } 473 + 474 + #define KVMPPC_BOOK3S_VCPU_ACCESSOR(reg, size) \ 475 + KVMPPC_BOOK3S_VCPU_ACCESSOR_SET(reg, size) \ 476 + KVMPPC_BOOK3S_VCPU_ACCESSOR_GET(reg, size) \ 477 + 478 + KVMPPC_BOOK3S_VCPU_ACCESSOR(pid, 32) 479 + KVMPPC_BOOK3S_VCPU_ACCESSOR(tar, 64) 480 + KVMPPC_BOOK3S_VCPU_ACCESSOR(ebbhr, 64) 481 + KVMPPC_BOOK3S_VCPU_ACCESSOR(ebbrr, 64) 482 + KVMPPC_BOOK3S_VCPU_ACCESSOR(bescr, 64) 483 + KVMPPC_BOOK3S_VCPU_ACCESSOR(ic, 64) 484 + KVMPPC_BOOK3S_VCPU_ACCESSOR(vrsave, 64) 485 + 486 + static inline u64 kvmppc_get_dec_expires(struct kvm_vcpu *vcpu) 487 + { 488 + return vcpu->arch.dec_expires; 489 + } 490 + 491 + static inline void kvmppc_set_dec_expires(struct kvm_vcpu *vcpu, u64 val) 492 + { 493 + vcpu->arch.dec_expires = val; 494 + } 495 + 461 496 /* Expiry time of vcpu DEC relative to host TB */ 462 497 static inline u64 kvmppc_dec_expires_host_tb(struct kvm_vcpu *vcpu) 463 498 { 464 - return vcpu->arch.dec_expires - vcpu->arch.vcore->tb_offset; 499 + return kvmppc_get_dec_expires(vcpu) - vcpu->arch.vcore->tb_offset; 465 500 } 466 501 467 502 static inline bool is_kvmppc_resume_guest(int r)
+11 -11
arch/powerpc/kvm/book3s.c
··· 565 565 regs->msr = kvmppc_get_msr(vcpu); 566 566 regs->srr0 = kvmppc_get_srr0(vcpu); 567 567 regs->srr1 = kvmppc_get_srr1(vcpu); 568 - regs->pid = vcpu->arch.pid; 568 + regs->pid = kvmppc_get_pid(vcpu); 569 569 regs->sprg0 = kvmppc_get_sprg0(vcpu); 570 570 regs->sprg1 = kvmppc_get_sprg1(vcpu); 571 571 regs->sprg2 = kvmppc_get_sprg2(vcpu); ··· 683 683 *val = get_reg_val(id, vcpu->arch.fscr); 684 684 break; 685 685 case KVM_REG_PPC_TAR: 686 - *val = get_reg_val(id, vcpu->arch.tar); 686 + *val = get_reg_val(id, kvmppc_get_tar(vcpu)); 687 687 break; 688 688 case KVM_REG_PPC_EBBHR: 689 - *val = get_reg_val(id, vcpu->arch.ebbhr); 689 + *val = get_reg_val(id, kvmppc_get_ebbhr(vcpu)); 690 690 break; 691 691 case KVM_REG_PPC_EBBRR: 692 - *val = get_reg_val(id, vcpu->arch.ebbrr); 692 + *val = get_reg_val(id, kvmppc_get_ebbrr(vcpu)); 693 693 break; 694 694 case KVM_REG_PPC_BESCR: 695 - *val = get_reg_val(id, vcpu->arch.bescr); 695 + *val = get_reg_val(id, kvmppc_get_bescr(vcpu)); 696 696 break; 697 697 case KVM_REG_PPC_IC: 698 - *val = get_reg_val(id, vcpu->arch.ic); 698 + *val = get_reg_val(id, kvmppc_get_ic(vcpu)); 699 699 break; 700 700 default: 701 701 r = -EINVAL; ··· 768 768 kvmppc_set_fpscr(vcpu, set_reg_val(id, *val)); 769 769 break; 770 770 case KVM_REG_PPC_TAR: 771 - vcpu->arch.tar = set_reg_val(id, *val); 771 + kvmppc_set_tar(vcpu, set_reg_val(id, *val)); 772 772 break; 773 773 case KVM_REG_PPC_EBBHR: 774 - vcpu->arch.ebbhr = set_reg_val(id, *val); 774 + kvmppc_set_ebbhr(vcpu, set_reg_val(id, *val)); 775 775 break; 776 776 case KVM_REG_PPC_EBBRR: 777 - vcpu->arch.ebbrr = set_reg_val(id, *val); 777 + kvmppc_set_ebbrr(vcpu, set_reg_val(id, *val)); 778 778 break; 779 779 case KVM_REG_PPC_BESCR: 780 - vcpu->arch.bescr = set_reg_val(id, *val); 780 + kvmppc_set_bescr(vcpu, set_reg_val(id, *val)); 781 781 break; 782 782 case KVM_REG_PPC_IC: 783 - vcpu->arch.ic = set_reg_val(id, *val); 783 + kvmppc_set_ic(vcpu, set_reg_val(id, *val)); 784 784 break; 785 785 default: 786 786 r = -EINVAL;
+2 -2
arch/powerpc/kvm/book3s_64_mmu_radix.c
··· 96 96 void *to, void *from, unsigned long n) 97 97 { 98 98 int lpid = vcpu->kvm->arch.lpid; 99 - int pid = vcpu->arch.pid; 99 + int pid = kvmppc_get_pid(vcpu); 100 100 101 101 /* This would cause a data segment intr so don't allow the access */ 102 102 if (eaddr & (0x3FFUL << 52)) ··· 270 270 /* Work out effective PID */ 271 271 switch (eaddr >> 62) { 272 272 case 0: 273 - pid = vcpu->arch.pid; 273 + pid = kvmppc_get_pid(vcpu); 274 274 break; 275 275 case 3: 276 276 pid = 0;
+6 -6
arch/powerpc/kvm/book3s_hv.c
··· 2310 2310 *val = get_reg_val(id, vcpu->arch.tcscr); 2311 2311 break; 2312 2312 case KVM_REG_PPC_PID: 2313 - *val = get_reg_val(id, vcpu->arch.pid); 2313 + *val = get_reg_val(id, kvmppc_get_pid(vcpu)); 2314 2314 break; 2315 2315 case KVM_REG_PPC_ACOP: 2316 2316 *val = get_reg_val(id, vcpu->arch.acop); ··· 2421 2421 *val = get_reg_val(id, vcpu->arch.vcore->arch_compat); 2422 2422 break; 2423 2423 case KVM_REG_PPC_DEC_EXPIRY: 2424 - *val = get_reg_val(id, vcpu->arch.dec_expires); 2424 + *val = get_reg_val(id, kvmppc_get_dec_expires(vcpu)); 2425 2425 break; 2426 2426 case KVM_REG_PPC_ONLINE: 2427 2427 *val = get_reg_val(id, vcpu->arch.online); ··· 2553 2553 vcpu->arch.tcscr = set_reg_val(id, *val); 2554 2554 break; 2555 2555 case KVM_REG_PPC_PID: 2556 - vcpu->arch.pid = set_reg_val(id, *val); 2556 + kvmppc_set_pid(vcpu, set_reg_val(id, *val)); 2557 2557 break; 2558 2558 case KVM_REG_PPC_ACOP: 2559 2559 vcpu->arch.acop = set_reg_val(id, *val); ··· 2606 2606 * decrementer, which is better than a large one that 2607 2607 * causes a hang. 2608 2608 */ 2609 - if (!vcpu->arch.dec_expires && tb_offset) 2610 - vcpu->arch.dec_expires = get_tb() + tb_offset; 2609 + if (!kvmppc_get_dec_expires(vcpu) && tb_offset) 2610 + kvmppc_set_dec_expires(vcpu, get_tb() + tb_offset); 2611 2611 2612 2612 vcpu->arch.vcore->tb_offset = tb_offset; 2613 2613 break; ··· 2690 2690 r = kvmppc_set_arch_compat(vcpu, set_reg_val(id, *val)); 2691 2691 break; 2692 2692 case KVM_REG_PPC_DEC_EXPIRY: 2693 - vcpu->arch.dec_expires = set_reg_val(id, *val); 2693 + kvmppc_set_dec_expires(vcpu, set_reg_val(id, *val)); 2694 2694 break; 2695 2695 case KVM_REG_PPC_ONLINE: 2696 2696 i = set_reg_val(id, *val);
+2 -2
arch/powerpc/kvm/book3s_hv_p9_entry.c
··· 305 305 u32 pid; 306 306 307 307 lpid = nested ? nested->shadow_lpid : kvm->arch.lpid; 308 - pid = vcpu->arch.pid; 308 + pid = kvmppc_get_pid(vcpu); 309 309 310 310 /* 311 311 * Prior memory accesses to host PID Q3 must be completed before we ··· 330 330 int i; 331 331 332 332 lpid = kvm->arch.lpid; 333 - pid = vcpu->arch.pid; 333 + pid = kvmppc_get_pid(vcpu); 334 334 335 335 /* 336 336 * See switch_mmu_to_guest_radix. ptesync should not be required here
+2 -2
arch/powerpc/kvm/powerpc.c
··· 1729 1729 val = get_reg_val(reg->id, kvmppc_get_vscr(vcpu)); 1730 1730 break; 1731 1731 case KVM_REG_PPC_VRSAVE: 1732 - val = get_reg_val(reg->id, vcpu->arch.vrsave); 1732 + val = get_reg_val(reg->id, kvmppc_get_vrsave(vcpu)); 1733 1733 break; 1734 1734 #endif /* CONFIG_ALTIVEC */ 1735 1735 default: ··· 1784 1784 r = -ENXIO; 1785 1785 break; 1786 1786 } 1787 - vcpu->arch.vrsave = set_reg_val(reg->id, val); 1787 + kvmppc_set_vrsave(vcpu, set_reg_val(reg->id, val)); 1788 1788 break; 1789 1789 #endif /* CONFIG_ALTIVEC */ 1790 1790 default: