Add guest sysreg access macros in asm/kvm_host_arm64.h using easr()/sasr()-based helpers for sysregs that map to the SAE save area. Also add the guest-visible sysreg enum and per-vCPU/per-VM storage for state that is not directly covered by the save area, such as CLIDR_EL1, CSSELR_EL1, MPIDR_EL1, and VM-wide ID register state. This lays out the header-side definitions needed to ensure compilation success during for the share-code-patches and later sysreg handling during vCPU setup and runtime. Signed-off-by: Steffen Eiden --- arch/s390/include/asm/kvm_host_arm64.h | 165 +++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/arch/s390/include/asm/kvm_host_arm64.h b/arch/s390/include/asm/kvm_host_arm64.h index 8c3214c5b004..d6d9e3ad7a8e 100644 --- a/arch/s390/include/asm/kvm_host_arm64.h +++ b/arch/s390/include/asm/kvm_host_arm64.h @@ -44,10 +44,19 @@ struct kvm_vcpu_arch { struct kvm_sae_save_area save_area; struct kvm_cpu_context ctxt; + /* Guest system registers not part of save area or ID registers */ + u64 sys_reg_clidr_el1; + u64 sys_reg_csselr_el1; + /* Per-vcpu CCSIDR override or NULL */ + u32 *ccsidr; + u32 host_acrs[NUM_ACRS]; /* Hypervisor Configuration Register */ u64 hcr_elz; + u64 hcrx_elz; + + u64 mpidr; /* Configuration flags, set once and for all before the vcpu can run */ u8 cflags; @@ -209,4 +218,160 @@ static inline void kvm_arch_async_page_present_queued(struct kvm_vcpu *vcpu) #define kvm_supports_32bit_el0() false +#define vcpu_read_sys_reg(_v, _r) 0xbad1234bad +#define vcpu_write_sys_reg(_v, _p, _r) ((void)0) + +#define __vcpu_sys_reg(__vcpu, __reg) \ + vcpu_read_sys_reg(__vcpu, __reg) + +#define __vcpu_assign_sys_reg(__vcpu, __reg, __val) \ + vcpu_write_sys_reg(__vcpu, __val, __reg) + +/* Read, modify and write system register + * + */ +#define _vcpu_rmw_sys_reg(C, V, OP, R) \ +({ \ + u64 __val = vcpu_read_sys_reg(C, R); \ + __val OP V; \ + vcpu_write_sys_reg(C, __val, R); \ +}) + +/** + * _vcpu_read_sys_reg() - read a guest sysreg with easr + * - R - sysreg id; must be readable by easr; must be compile time constant + * + * if SYSREGS_ON_CPU: proceed with flags = 0 + * otherwise: proceed with either + * read: flags = EASR_FLAG_SA + * write: flags = SASR_FLAG_INITIALIZED + * + */ +#define _vcpu_read_sys_reg(C, R) \ + ({ BUILD_BUG_ON(!__builtin_constant_p((R))); \ + BUG_ON(vcpu_is_loaded(C) && smp_processor_id() != (C)->cpu); \ + (vcpu_is_loaded(C)) \ + ? __vcpu_read_sr((C), (R), 0) \ + : __vcpu_read_sr((C), (R), EASR_FLAG_SA); }) + +/** + * _vcpu_write_sys_reg() - write a guest sysreg with sasr + * - R - sysreg id; must be readable by sasr; must be compile time constant + + * if SYSREGS_ON_CPU: proceed with flags = 0 + * otherwise: proceed with either + * read: flags = EASR_FLAG_SA + * write: flags = SASR_FLAG_INITIALIZED + */ +#define _vcpu_write_sys_reg(C, V, R) \ + ({ BUILD_BUG_ON(!__builtin_constant_p((R))); \ + BUG_ON(vcpu_is_loaded(C) && smp_processor_id() != (C)->cpu); \ + (vcpu_is_loaded(C)) \ + ? __vcpu_write_sr((C), (V), (R), 0) \ + : __vcpu_write_sr((C), (V), (R), SASR_FLAG_INITIALIZED); }) + +/* Forward to easr / sasr + * assert that F and R are constant + */ +#define __vcpu_read_sr(C, R, F) \ + ({ BUILD_BUG_ON(!__builtin_constant_p((R))); \ + BUILD_BUG_ON(!__builtin_constant_p((F))); \ + easr((R), &(C)->arch.save_area, (F)); }) + +#define __vcpu_write_sr(C, V, R, F) \ + ({ BUILD_BUG_ON(!__builtin_constant_p((R))); \ + BUILD_BUG_ON(!__builtin_constant_p((F))); \ + sasr((R), (V), &(C)->arch.save_area, (F)); }) + +#define SR_GROUP(NAME, ...) \ + __##NAME##_BEGIN__, \ + __VA_ARGS__ \ + __##NAME##_END__ + +/** enum vcpu_sysreg - available guest sysregs + * + * Contains all arm64 guest-syregs supported by s390. + */ +enum vcpu_sysreg { + __INVALID_SYSREG__, /* 0 is reserved as an invalid value */ + + /* EL 0,1 Register from state description in order of appearance */ + SR_GROUP(STATE_DESC, + CNTP_CTL_EL0, + CNTV_CTL_EL0, + CONTEXTIDR_EL1, + SP_EL1, + ), + + /* EL 0,1 Register requiring special handling. */ + SR_GROUP(SPECIAL, + CSSELR_EL1, + CLIDR_EL1, + MPIDR_EL1, + ), + + /* EL 0,1 register from save area in order of appearance */ + SR_GROUP(SAVE_AREA, + ACTLR_EL1, + AFSR0_EL1, + AFSR1_EL1, + CNTFRQ_EL0, + CNTP_CVAL_EL0, + CNTV_CVAL_EL0, + DISR_EL1, + MIDR_EL1, + OSLSR_EL1, + PAR_EL1, + OSLAR_EL1, + SCTLR_EL1, + CPACR_EL1, + VBAR_EL1, + SPSR_EL1, + ELR_EL1, + ESR_EL1, + TCR_EL1, + MAIR_EL1, + TTBR0_EL1, + TTBR1_EL1, + FAR_EL1, + TPIDR_EL0, + TPIDR_EL1, + TPIDRRO_EL0, + CNTKCTL_EL1, + ZCR_EL1, + SCXTNUM_EL0, + SCXTNUM_EL1, + APIBKEYLO_EL1, + APIBKEYHI_EL1, + APIAKEYLO_EL1, + APIAKEYHI_EL1, + APGAKEYLO_EL1, + APGAKEYHI_EL1, + APDBKEYLO_EL1, + APDBKEYHI_EL1, + APDAKEYLO_EL1, + APDAKEYHI_EL1, + MDSCR_EL1, + ), + + NR_SYS_REGS /* Nothing after this line! */ +}; + +void vcpu_write_host_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg); +u64 vcpu_read_host_sys_reg(const struct kvm_vcpu *vcpu, int reg); + +#define kvm_debug_handle_oslar(_v, _val) /* debug not implemented yet*/ + +static inline u8 kvm_arm_pmu_get_pmuver_limit(void) +{ + return 0; +} + +int __init kvm_sys_reg_table_init(void); + +static inline u64 kvm_sanitised_host_ftr_reg(u32 id) +{ + return 0xbad1234bad; +} + #endif /* ASM_KVM_HOST_ARM64_H */ -- 2.53.0