On Tue, May 22, 2018 at 04:06:45PM +0100, Marc Zyngier wrote: > As we're going to require to access per-cpu variables at EL2, > let's craft the minimum set of accessors required to implement > reading a per-cpu variable, relying on tpidr_el2 to contain the > per-cpu offset. > > Reviewed-by: Christoffer Dall <christoffer.dall@xxxxxxx> > Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> Reviewed-by: Mark Rutland <mark.rutland@xxxxxxx> Mark. > --- > arch/arm64/include/asm/kvm_asm.h | 27 +++++++++++++++++++++++++-- > 1 file changed, 25 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h > index f6648a3e4152..fefd8cf42c35 100644 > --- a/arch/arm64/include/asm/kvm_asm.h > +++ b/arch/arm64/include/asm/kvm_asm.h > @@ -71,14 +71,37 @@ extern u32 __kvm_get_mdcr_el2(void); > > extern u32 __init_stage2_translation(void); > > +/* Home-grown __this_cpu_{ptr,read} variants that always work at HYP */ > +#define __hyp_this_cpu_ptr(sym) \ > + ({ \ > + void *__ptr = hyp_symbol_addr(sym); \ > + __ptr += read_sysreg(tpidr_el2); \ > + (typeof(&sym))__ptr; \ > + }) > + > +#define __hyp_this_cpu_read(sym) \ > + ({ \ > + *__hyp_this_cpu_ptr(sym); \ > + }) > + > #else /* __ASSEMBLY__ */ > > -.macro get_host_ctxt reg, tmp > - adr_l \reg, kvm_host_cpu_state > +.macro hyp_adr_this_cpu reg, sym, tmp > + adr_l \reg, \sym > mrs \tmp, tpidr_el2 > add \reg, \reg, \tmp > .endm > > +.macro hyp_ldr_this_cpu reg, sym, tmp > + adr_l \reg, \sym > + mrs \tmp, tpidr_el2 > + ldr \reg, [\reg, \tmp] > +.endm > + > +.macro get_host_ctxt reg, tmp > + hyp_adr_this_cpu \reg, kvm_host_cpu_state, \tmp > +.endm > + > .macro get_vcpu_ptr vcpu, ctxt > get_host_ctxt \ctxt, \vcpu > ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU] > -- > 2.14.2 > _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm