Message ID | 20200922204910.7265-6-dbrazdil@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Independent per-CPU data section for nVHE | expand |
On Tue, Sep 22, 2020 at 09:49:05PM +0100, David Brazdil wrote: > The hyp_adr/ldr_this_cpu helpers were introduced for use in hyp code > because they always needed to use TPIDR_EL2 for base, while > adr/ldr_this_cpu from kernel proper would select between TPIDR_EL2 and > _EL1 based on VHE/nVHE. > > Simplify this now that the hyp mode case can be handled using the > __KVM_VHE/NVHE_HYPERVISOR__ macros. > > Acked-by: Andrew Scull <ascull@google.com> > Acked-by: Will Deacon <will@kernel.org> > Signed-off-by: David Brazdil <dbrazdil@google.com> > --- > arch/arm64/include/asm/assembler.h | 29 +++++++++++++++++++---------- > arch/arm64/include/asm/kvm_asm.h | 14 +------------- > arch/arm64/kvm/hyp/hyp-entry.S | 2 +- > 3 files changed, 21 insertions(+), 24 deletions(-) > > diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h > index 54d181177656..86e0ef79a799 100644 > --- a/arch/arm64/include/asm/assembler.h > +++ b/arch/arm64/include/asm/assembler.h > @@ -218,6 +218,23 @@ lr .req x30 // link register > str \src, [\tmp, :lo12:\sym] > .endm > > + /* > + * @dst: destination register (32 or 64 bit wide) nit: this comment is wrong as I don't think mrs can take a W register as the destination argument. I'm assuming Marc can fix that up. Will
On 2020-09-29 18:34, Will Deacon wrote: > On Tue, Sep 22, 2020 at 09:49:05PM +0100, David Brazdil wrote: >> The hyp_adr/ldr_this_cpu helpers were introduced for use in hyp code >> because they always needed to use TPIDR_EL2 for base, while >> adr/ldr_this_cpu from kernel proper would select between TPIDR_EL2 and >> _EL1 based on VHE/nVHE. >> >> Simplify this now that the hyp mode case can be handled using the >> __KVM_VHE/NVHE_HYPERVISOR__ macros. >> >> Acked-by: Andrew Scull <ascull@google.com> >> Acked-by: Will Deacon <will@kernel.org> >> Signed-off-by: David Brazdil <dbrazdil@google.com> >> --- >> arch/arm64/include/asm/assembler.h | 29 +++++++++++++++++++---------- >> arch/arm64/include/asm/kvm_asm.h | 14 +------------- >> arch/arm64/kvm/hyp/hyp-entry.S | 2 +- >> 3 files changed, 21 insertions(+), 24 deletions(-) >> >> diff --git a/arch/arm64/include/asm/assembler.h >> b/arch/arm64/include/asm/assembler.h >> index 54d181177656..86e0ef79a799 100644 >> --- a/arch/arm64/include/asm/assembler.h >> +++ b/arch/arm64/include/asm/assembler.h >> @@ -218,6 +218,23 @@ lr .req x30 // link register >> str \src, [\tmp, :lo12:\sym] >> .endm >> >> + /* >> + * @dst: destination register (32 or 64 bit wide) > > nit: this comment is wrong as I don't think mrs can take a W register > as the destination argument. I'm assuming Marc can fix that up. Indeed. I'll fix it locally. Another thing is that this patch is going to clash with the Ghostbuster branch (the hyp-entry.S hunk goes), but we can deal with that. M.
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index 54d181177656..86e0ef79a799 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -218,6 +218,23 @@ lr .req x30 // link register str \src, [\tmp, :lo12:\sym] .endm + /* + * @dst: destination register (32 or 64 bit wide) + */ +#if defined(__KVM_NVHE_HYPERVISOR__) || defined(__KVM_VHE_HYPERVISOR__) + .macro this_cpu_offset, dst + mrs \dst, tpidr_el2 + .endm +#else + .macro this_cpu_offset, dst +alternative_if_not ARM64_HAS_VIRT_HOST_EXTN + mrs \dst, tpidr_el1 +alternative_else + mrs \dst, tpidr_el2 +alternative_endif + .endm +#endif + /* * @dst: Result of per_cpu(sym, smp_processor_id()) (can be SP) * @sym: The name of the per-cpu variable @@ -226,11 +243,7 @@ lr .req x30 // link register .macro adr_this_cpu, dst, sym, tmp adrp \tmp, \sym add \dst, \tmp, #:lo12:\sym -alternative_if_not ARM64_HAS_VIRT_HOST_EXTN - mrs \tmp, tpidr_el1 -alternative_else - mrs \tmp, tpidr_el2 -alternative_endif + this_cpu_offset \tmp add \dst, \dst, \tmp .endm @@ -241,11 +254,7 @@ alternative_endif */ .macro ldr_this_cpu dst, sym, tmp adr_l \dst, \sym -alternative_if_not ARM64_HAS_VIRT_HOST_EXTN - mrs \tmp, tpidr_el1 -alternative_else - mrs \tmp, tpidr_el2 -alternative_endif + this_cpu_offset \tmp ldr \dst, [\dst, \tmp] .endm diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h index c196eec25498..cf9456663289 100644 --- a/arch/arm64/include/asm/kvm_asm.h +++ b/arch/arm64/include/asm/kvm_asm.h @@ -173,20 +173,8 @@ extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ]; #else /* __ASSEMBLY__ */ -.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_data, \tmp + adr_this_cpu \reg, kvm_host_data, \tmp add \reg, \reg, #HOST_DATA_CONTEXT .endm diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S index 46b4dab933d0..fba91c2ab410 100644 --- a/arch/arm64/kvm/hyp/hyp-entry.S +++ b/arch/arm64/kvm/hyp/hyp-entry.S @@ -132,7 +132,7 @@ alternative_cb_end str x0, [x2, #VCPU_WORKAROUND_FLAGS] /* Check that we actually need to perform the call */ - hyp_ldr_this_cpu x0, arm64_ssbd_callback_required, x2 + ldr_this_cpu x0, arm64_ssbd_callback_required, x2 cbz x0, wa2_end mov w0, #ARM_SMCCC_ARCH_WORKAROUND_2