|
Message-ID: <nycvar.YSQ.7.76.1709041257010.8603@knanqh.ubzr> Date: Mon, 4 Sep 2017 12:57:23 -0400 (EDT) From: Nicolas Pitre <nicolas.pitre@...aro.org> To: Ard Biesheuvel <ard.biesheuvel@...aro.org> cc: linux-arm-kernel@...ts.infradead.org, kernel-hardening@...ts.openwall.com, Arnd Bergmann <arnd@...db.de>, Russell King <linux@...linux.org.uk>, Kees Cook <keescook@...omium.org>, Thomas Garnier <thgarnie@...gle.com>, Marc Zyngier <marc.zyngier@....com>, Mark Rutland <mark.rutland@....com>, Tony Lindgren <tony@...mide.com>, Matt Fleming <matt@...eblueprint.co.uk>, Dave Martin <dave.martin@....com> Subject: Re: [PATCH v2 12/29] ARM: kvm: replace open coded VA->PA calculations with adr_l call On Sun, 3 Sep 2017, Ard Biesheuvel wrote: > Replace the open coded calculations of the actual physical address > of the KVM stub vector table with a single adr_l invocation. > > Cc: Marc Zyngier <marc.zyngier@....com> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@...aro.org> Acked-by: Nicolas Pitre <nico@...aro.org> > --- > arch/arm/boot/compressed/head.S | 15 ++------- > arch/arm/kernel/hyp-stub.S | 33 +++++++------------- > arch/arm/kvm/init.S | 8 +---- > 3 files changed, 15 insertions(+), 41 deletions(-) > > diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S > index 8a756870c238..5884e8151376 100644 > --- a/arch/arm/boot/compressed/head.S > +++ b/arch/arm/boot/compressed/head.S > @@ -427,15 +427,10 @@ dtb_check_done: > > /* > * Compute the address of the hyp vectors after relocation. > - * This requires some arithmetic since we cannot directly > - * reference __hyp_stub_vectors in a PC-relative way. > * Call __hyp_set_vectors with the new address so that we > * can HVC again after the copy. > */ > -0: adr r0, 0b > - movw r1, #:lower16:__hyp_stub_vectors - 0b > - movt r1, #:upper16:__hyp_stub_vectors - 0b > - add r0, r0, r1 > + adr_l r0, __hyp_stub_vectors > sub r0, r0, r5 > add r0, r0, r10 > bl __hyp_set_vectors > @@ -568,17 +563,11 @@ not_relocated: mov r0, #0 > cmp r0, #HYP_MODE @ if not booted in HYP mode... > bne __enter_kernel @ boot kernel directly > > - adr r12, .L__hyp_reentry_vectors_offset > - ldr r0, [r12] > - add r0, r0, r12 > - > + adr_l r0, __hyp_reentry_vectors > bl __hyp_set_vectors > __HVC(0) @ otherwise bounce to hyp mode > > b . @ should never be reached > - > - .align 2 > -.L__hyp_reentry_vectors_offset: .long __hyp_reentry_vectors - . > #else > b __enter_kernel > #endif > diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S > index ec7e7377d423..3c2d1738d3f4 100644 > --- a/arch/arm/kernel/hyp-stub.S > +++ b/arch/arm/kernel/hyp-stub.S > @@ -36,41 +36,38 @@ ENTRY(__boot_cpu_mode) > .text > > /* > - * Save the primary CPU boot mode. Requires 3 scratch registers. > + * Save the primary CPU boot mode. Requires 2 scratch registers. > */ > - .macro store_primary_cpu_mode reg1, reg2, reg3 > + .macro store_primary_cpu_mode reg1, reg2 > mrs \reg1, cpsr > and \reg1, \reg1, #MODE_MASK > - adr \reg2, .L__boot_cpu_mode_offset > - ldr \reg3, [\reg2] > - str \reg1, [\reg2, \reg3] > + str_l \reg1, __boot_cpu_mode, \reg2 > .endm > > /* > * Compare the current mode with the one saved on the primary CPU. > * If they don't match, record that fact. The Z bit indicates > * if there's a match or not. > - * Requires 3 additionnal scratch registers. > + * Requires 2 additional scratch registers. > */ > - .macro compare_cpu_mode_with_primary mode, reg1, reg2, reg3 > - adr \reg2, .L__boot_cpu_mode_offset > - ldr \reg3, [\reg2] > - ldr \reg1, [\reg2, \reg3] > + .macro compare_cpu_mode_with_primary mode, reg1, reg2 > + adr_l \reg2, __boot_cpu_mode > + ldr \reg1, [\reg2] > cmp \mode, \reg1 @ matches primary CPU boot mode? > orrne \reg1, \reg1, #BOOT_CPU_MODE_MISMATCH > - strne \reg1, [\reg2, \reg3] @ record what happened and give up > + strne \reg1, [\reg2] @ record what happened and give up > .endm > > #else /* ZIMAGE */ > > - .macro store_primary_cpu_mode reg1:req, reg2:req, reg3:req > + .macro store_primary_cpu_mode reg1:req, reg2:req > .endm > > /* > * The zImage loader only runs on one CPU, so we don't bother with mult-CPU > * consistency checking: > */ > - .macro compare_cpu_mode_with_primary mode, reg1, reg2, reg3 > + .macro compare_cpu_mode_with_primary mode, reg1, reg2 > cmp \mode, \mode > .endm > > @@ -85,7 +82,7 @@ ENTRY(__boot_cpu_mode) > */ > @ Call this from the primary CPU > ENTRY(__hyp_stub_install) > - store_primary_cpu_mode r4, r5, r6 > + store_primary_cpu_mode r4, r5 > ENDPROC(__hyp_stub_install) > > @ fall through... > @@ -99,7 +96,7 @@ ENTRY(__hyp_stub_install_secondary) > * If the secondary has booted with a different mode, give up > * immediately. > */ > - compare_cpu_mode_with_primary r4, r5, r6, r7 > + compare_cpu_mode_with_primary r4, r5, r6 > retne lr > > /* > @@ -264,12 +261,6 @@ ENTRY(__hyp_reset_vectors) > ret lr > ENDPROC(__hyp_reset_vectors) > > -#ifndef ZIMAGE > -.align 2 > -.L__boot_cpu_mode_offset: > - .long __boot_cpu_mode - . > -#endif > - > .align 5 > ENTRY(__hyp_stub_vectors) > __hyp_stub_reset: W(b) . > diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S > index 5386528665b5..d777c6fbd869 100644 > --- a/arch/arm/kvm/init.S > +++ b/arch/arm/kvm/init.S > @@ -143,13 +143,7 @@ reset: > bic r1, r1, r0 > mcr p15, 4, r1, c1, c0, 0 @ HSCTLR > > - /* > - * Install stub vectors, using ardb's VA->PA trick. > - */ > -0: adr r0, 0b @ PA(0) > - movw r1, #:lower16:__hyp_stub_vectors - 0b @ VA(stub) - VA(0) > - movt r1, #:upper16:__hyp_stub_vectors - 0b > - add r1, r1, r0 @ PA(stub) > + adr_l r1, __hyp_stub_vectors @ PA(stub) > mcr p15, 4, r1, c12, c0, 0 @ HVBAR > b exit > > -- > 2.11.0 > >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.