1// SPDX-License-Identifier: GPL-2.0-only 2 3/* 4 * Privileged (non-hypervisor) host registers to save. 5 */ 6#include "asm/guest-state-buffer.h" 7 8struct p9_host_os_sprs { 9 unsigned long iamr; 10 unsigned long amr; 11 12 unsigned int pmc1; 13 unsigned int pmc2; 14 unsigned int pmc3; 15 unsigned int pmc4; 16 unsigned int pmc5; 17 unsigned int pmc6; 18 unsigned long mmcr0; 19 unsigned long mmcr1; 20 unsigned long mmcr2; 21 unsigned long mmcr3; 22 unsigned long mmcra; 23 unsigned long siar; 24 unsigned long sier1; 25 unsigned long sier2; 26 unsigned long sier3; 27 unsigned long sdar; 28}; 29 30static inline bool nesting_enabled(struct kvm *kvm) 31{ 32 return kvm->arch.nested_enable && kvm_is_radix(kvm); 33} 34 35bool load_vcpu_state(struct kvm_vcpu *vcpu, 36 struct p9_host_os_sprs *host_os_sprs); 37void store_vcpu_state(struct kvm_vcpu *vcpu); 38void save_p9_host_os_sprs(struct p9_host_os_sprs *host_os_sprs); 39void restore_p9_host_os_sprs(struct kvm_vcpu *vcpu, 40 struct p9_host_os_sprs *host_os_sprs); 41void switch_pmu_to_guest(struct kvm_vcpu *vcpu, 42 struct p9_host_os_sprs *host_os_sprs); 43void switch_pmu_to_host(struct kvm_vcpu *vcpu, 44 struct p9_host_os_sprs *host_os_sprs); 45 46#ifdef CONFIG_KVM_BOOK3S_HV_P9_TIMING 47void accumulate_time(struct kvm_vcpu *vcpu, struct kvmhv_tb_accumulator *next); 48#define start_timing(vcpu, next) accumulate_time(vcpu, next) 49#define end_timing(vcpu) accumulate_time(vcpu, NULL) 50#else 51#define accumulate_time(vcpu, next) do {} while (0) 52#define start_timing(vcpu, next) do {} while (0) 53#define end_timing(vcpu) do {} while (0) 54#endif 55 56static inline void __kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 val) 57{ 58 vcpu->arch.shregs.msr = val; 59 kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_MSR); 60} 61 62static inline u64 __kvmppc_get_msr_hv(struct kvm_vcpu *vcpu) 63{ 64 WARN_ON(kvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_MSR) < 0); 65 return vcpu->arch.shregs.msr; 66} 67 68#define KVMPPC_BOOK3S_HV_VCPU_ACCESSOR_SET(reg, size, iden) \ 69static inline void kvmppc_set_##reg ##_hv(struct kvm_vcpu *vcpu, u##size val) \ 70{ \ 71 vcpu->arch.reg = val; \ 72 kvmhv_nestedv2_mark_dirty(vcpu, iden); \ 73} 74 75#define KVMPPC_BOOK3S_HV_VCPU_ACCESSOR_GET(reg, size, iden) \ 76static inline u##size kvmppc_get_##reg ##_hv(struct kvm_vcpu *vcpu) \ 77{ \ 78 kvmhv_nestedv2_cached_reload(vcpu, iden); \ 79 return vcpu->arch.reg; \ 80} 81 82#define KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(reg, size, iden) \ 83 KVMPPC_BOOK3S_HV_VCPU_ACCESSOR_SET(reg, size, iden) \ 84 KVMPPC_BOOK3S_HV_VCPU_ACCESSOR_GET(reg, size, iden) \ 85 86#define KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR_SET(reg, size, iden) \ 87static inline void kvmppc_set_##reg ##_hv(struct kvm_vcpu *vcpu, int i, u##size val) \ 88{ \ 89 vcpu->arch.reg[i] = val; \ 90 kvmhv_nestedv2_mark_dirty(vcpu, iden(i)); \ 91} 92 93#define KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR_GET(reg, size, iden) \ 94static inline u##size kvmppc_get_##reg ##_hv(struct kvm_vcpu *vcpu, int i) \ 95{ \ 96 WARN_ON(kvmhv_nestedv2_cached_reload(vcpu, iden(i)) < 0); \ 97 return vcpu->arch.reg[i]; \ 98} 99 100#define KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR(reg, size, iden) \ 101 KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR_SET(reg, size, iden) \ 102 KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR_GET(reg, size, iden) \ 103 104KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(mmcra, 64, KVMPPC_GSID_MMCRA) 105KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(hfscr, 64, KVMPPC_GSID_HFSCR) 106KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(fscr, 64, KVMPPC_GSID_FSCR) 107KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(dscr, 64, KVMPPC_GSID_DSCR) 108KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(purr, 64, KVMPPC_GSID_PURR) 109KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(spurr, 64, KVMPPC_GSID_SPURR) 110KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(amr, 64, KVMPPC_GSID_AMR) 111KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(uamor, 64, KVMPPC_GSID_UAMOR) 112KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(siar, 64, KVMPPC_GSID_SIAR) 113KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(sdar, 64, KVMPPC_GSID_SDAR) 114KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(iamr, 64, KVMPPC_GSID_IAMR) 115KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(dawr0, 64, KVMPPC_GSID_DAWR0) 116KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(dawr1, 64, KVMPPC_GSID_DAWR1) 117KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(dawrx0, 64, KVMPPC_GSID_DAWRX0) 118KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(dawrx1, 64, KVMPPC_GSID_DAWRX1) 119KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(ciabr, 64, KVMPPC_GSID_CIABR) 120KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(wort, 64, KVMPPC_GSID_WORT) 121KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(ppr, 64, KVMPPC_GSID_PPR) 122KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(ctrl, 64, KVMPPC_GSID_CTRL); 123 124KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR(mmcr, 64, KVMPPC_GSID_MMCR) 125KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR(sier, 64, KVMPPC_GSID_SIER) 126KVMPPC_BOOK3S_HV_VCPU_ARRAY_ACCESSOR(pmc, 32, KVMPPC_GSID_PMC) 127 128KVMPPC_BOOK3S_HV_VCPU_ACCESSOR(pspb, 32, KVMPPC_GSID_PSPB) 129