[U-Boot] [PATCH v2] armv8: aarch64: Fix the warning about x1-x3 nonzero issue

Alison Wang alison.wang at nxp.com
Tue Jan 17 02:46:51 CET 2017


> On 16 January 2017 at 08:34, Alexander Graf <agraf at suse.de> wrote:
> >
> >
> > On 16/01/2017 07:16, Alison Wang wrote:
> >>
> >> For 64-bit kernel, there is a warning about x1-x3 nonzero in
> >> violation of boot protocol. To fix this issue, input argument 4 is
> >> added for
> >> armv8_switch_to_el2 and armv8_switch_to_el1. The input argument 4
> >> will be set to the right value, such as zero.
> >>
> >> Signed-off-by: Alison Wang <alison.wang at nxp.com>
> 
> Thanks Alison, this removes the warning for me now and still boots fine.
> I tested with Juno R0/1/2 and FVP Foundation and AEMv8 models.
> 
> Tested-by: Ryan Harkin <ryan.harkin at linaro.org>
[Alison Wang] Ryan, thanks for your test. :)

Best Regards,
Alison Wang
> 
> 
> >> ---
> >> Changes in v2:
> >> - Add another input argument 4 for armv8_switch_to_el2 and
> >> armv8_switch_to_el1.
> >> - Give up the previous way to adjust the parameters to transfer and
> >> make sure x3 is zero.
> >>
> >>  arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S | 28
> >> ++++++++++++++--------------
> >>  arch/arm/cpu/armv8/sec_firmware_asm.S        |  5 +++--
> >>  arch/arm/cpu/armv8/start.S                   |  8 ++++----
> >>  arch/arm/cpu/armv8/transition.S              | 22 +++++++++++------
> -----
> >>  arch/arm/include/asm/system.h                |  8 +++++---
> >>  arch/arm/lib/bootm.c                         | 10 +++++-----
> >>  arch/arm/mach-rmobile/lowlevel_init_gen3.S   |  8 ++++----
> >>  cmd/bootefi.c                                |  2 +-
> >>  8 files changed, 47 insertions(+), 44 deletions(-)
> >>
> >> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
> >> b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
> >> index 72f2c11..63215f0 100644
> >> --- a/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
> >> +++ b/arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
> >> @@ -378,29 +378,29 @@ cpu_is_le:
> >>         b.eq    1f
> >>
> >>  #ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> >> -       adr     x3, secondary_switch_to_el1
> >> -       ldr     x4, =ES_TO_AARCH64
> >> +       adr     x4, secondary_switch_to_el1
> >> +       ldr     x5, =ES_TO_AARCH64
> >>  #else
> >> -       ldr     x3, [x11]
> >> -       ldr     x4, =ES_TO_AARCH32
> >> +       ldr     x4, [x11]
> >> +       ldr     x5, =ES_TO_AARCH32
> >>  #endif
> >>         bl      secondary_switch_to_el2
> >>
> >>  1:
> >>  #ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> >> -       adr     x3, secondary_switch_to_el1
> >> +       adr     x4, secondary_switch_to_el1
> >>  #else
> >> -       ldr     x3, [x11]
> >> +       ldr     x4, [x11]
> >>  #endif
> >> -       ldr     x4, =ES_TO_AARCH64
> >> +       ldr     x5, =ES_TO_AARCH64
> >>         bl      secondary_switch_to_el2
> >>
> >>  ENDPROC(secondary_boot_func)
> >>
> >>  ENTRY(secondary_switch_to_el2)
> >> -       switch_el x5, 1f, 0f, 0f
> >> +       switch_el x6, 1f, 0f, 0f
> >>  0:     ret
> >> -1:     armv8_switch_to_el2_m x3, x4, x5
> >> +1:     armv8_switch_to_el2_m x4, x5, x6
> >>  ENDPROC(secondary_switch_to_el2)
> >>
> >>  ENTRY(secondary_switch_to_el1)
> >> @@ -414,22 +414,22 @@ ENTRY(secondary_switch_to_el1)
> >>         /* physical address of this cpus spin table element */
> >>         add     x11, x1, x0
> >>
> >> -       ldr     x3, [x11]
> >> +       ldr     x4, [x11]
> >>
> >>         ldr     x5, [x11, #24]
> >>         ldr     x6, =IH_ARCH_DEFAULT
> >>         cmp     x6, x5
> >>         b.eq    2f
> >>
> >> -       ldr     x4, =ES_TO_AARCH32
> >> +       ldr     x5, =ES_TO_AARCH32
> >>         bl      switch_to_el1
> >>
> >> -2:     ldr     x4, =ES_TO_AARCH64
> >> +2:     ldr     x5, =ES_TO_AARCH64
> >>
> >>  switch_to_el1:
> >> -       switch_el x5, 0f, 1f, 0f
> >> +       switch_el x6, 0f, 1f, 0f
> >>  0:     ret
> >> -1:     armv8_switch_to_el1_m x3, x4, x5
> >> +1:     armv8_switch_to_el1_m x4, x5, x6
> >>  ENDPROC(secondary_switch_to_el1)
> >>
> >>         /* Ensure that the literals used by the secondary boot code
> >> are diff --git a/arch/arm/cpu/armv8/sec_firmware_asm.S
> >> b/arch/arm/cpu/armv8/sec_firmware_asm.S
> >> index 903195d..747b53f 100644
> >> --- a/arch/arm/cpu/armv8/sec_firmware_asm.S
> >> +++ b/arch/arm/cpu/armv8/sec_firmware_asm.S
> >> @@ -57,7 +57,8 @@ ENDPROC(_sec_firmware_support_psci_version)
> >>   * x0: argument, zero
> >>   * x1: machine nr
> >>   * x2: fdt address
> >> - * x3: kernel entry point
> >> + * x3: input argument
> >> + * x4: kernel entry point
> >>   * @param outputs for secure firmware:
> >>   * x0: function id
> >>   * x1: kernel entry point
> >> @@ -65,7 +66,7 @@ ENDPROC(_sec_firmware_support_psci_version)
> >>   * x3: fdt address
> >>  */
> >>  ENTRY(armv8_el2_to_aarch32)
> >> -       mov     x0, x3
> >> +       mov     x0, x4
> >
> >
> > You no longer need x0 as scratch register. Just write ...
> >
> >>         mov     x3, x2
> >>         mov     x2, x1
> >>         mov     x1, x0
> >
> >
> > ... x4 directly into x1 here.
> >
> >
> > Otherwise looks good to me. So with the change above you can add my
> >
> >   Reviewed-by: Alexander Graf <agraf at suse.de>
> >
> > tag in the next version.
> >
> >
> > Alex


More information about the U-Boot mailing list