On Friday, December 7, 2012, Jon Medhurst (Tixy) wrote:

> To enable CPU hotplug the need to provide some boot code at the reset
> vector and which survives after the kernel has booted without being
> overwritten. We achieve this by the getting the linker script to place
> the code in boot.S at address zero. This now means we can delete the
> code that relocates the secondary CPU pen code to "a location less
> likely to be overridden".
>

not knowing these dev boards's memory maps I assume that the sysflags are
initialized to 0 and that the first part of the physical memory space is
reserved for secure access?

Otherwise I can't see any issues with this code.

Acked-by: Christoffer Dall <c.d...@virtualopensystems.com>


>
> We then modify the boot protocol slightly to allow hot-plugging of any
> CPU, including CPU #0, when the system is already booted. This is done
> by checking if SYS_FLAGS is already set before the normal check for CPU0
> and the boot-or-wait decision made.
>
> This patch is based on work by Nicolas Pitre.
>
> Signed-off-by: Nicolas Pitre <n...@linaro.org <javascript:;>>
> Signed-off-by: Jon Medhurst <t...@linaro.org <javascript:;>>
> ---
>  boot.S      |   41 ++++++++++++++++++++++++-----------------
>  model.lds.S |    3 ++-
>  2 files changed, 26 insertions(+), 18 deletions(-)
>
> diff --git a/boot.S b/boot.S
> index dd453e3..fb56693 100644
> --- a/boot.S
> +++ b/boot.S
> @@ -12,6 +12,8 @@
>         .arch_extension virt
>         .text
>
> +       b       start   @ Must be first instruction for power on reset
> vector
> +
>  .macro enter_hyp
>         @ We assume we're entered in Secure Supervisor mode. To
>         @ get to Hyp mode we have to pass through Monitor mode
> @@ -119,27 +121,32 @@ start:
>         orr     r0, r0, r1
>         mcr     p15, 0, r0, c1, c1, 2
>
> -       @ Check CPU nr again
> -       mrc     p15, 0, r0, c0, c0, 5           @ MPIDR (ARMv7 only)
> -       bfc     r0, #24, #8                     @ CPU number, taking
> multicluster into account
> -       cmp     r0, #0                          @ primary CPU?
> -       beq     2f
> -
> -       @
> -       @ Secondary CPUs (following the RealView SMP booting protocol)
> -       @
> -       enter_hyp
> -
> -       ldr     r1, =fs_start - 0x100
> -       adr     r2, 1f
> -       ldmia   r2, {r3 - r7}                   @ move the code to a
> location
> -       stmia   r1, {r3 - r7}                   @ less likely to be
> overridden
> +       /*
> +        * If SYS_FLAGS is already set, this is a warm boot and we blindly
> +        * branch to the indicated address right away, irrespective of the
> +        * CPU we are.
> +        */
>  #ifdef VEXPRESS
>         ldr     r0, =0x1c010030                 @ VE SYS_FLAGS register
>  #else
>         ldr     r0, =0x10000030                 @ RealView SYS_FLAGS
> register
>  #endif
> -       mov     pc, r1                          @ branch to the relocated
> code
> +       ldr     r1, [r0]
> +       cmp     r1, #0
> +       beq     1f
> +       enter_hyp
> +       bx      r1
> +1:
> +       /*
> +        * Otherwise this is a cold boot.  In this case it depends if
> +        * we are the primary CPU or not.  The primary CPU boots the system
> +        * while the secondaries wait for the primary to set SYS_FLAGS.
> +        */
> +       mrc     p15, 0, r1, c0, c0, 5
> +       bics    r1, #0xff000000
> +       beq     2f
> +
> +       enter_hyp
>  1:
>  #ifdef VEXPRESS
>         wfe
> @@ -147,7 +154,7 @@ start:
>         ldr     r1, [r0]
>         cmp     r1, #0
>         beq     1b
> -       mov     pc, r1                          @ branch to the given
> address
> +       bx      r1                              @ branch to the given
> address
>  #endif
>
>  2:
> diff --git a/model.lds.S b/model.lds.S
> index 793df89..f37824e 100644
> --- a/model.lds.S
> +++ b/model.lds.S
> @@ -27,7 +27,8 @@ STACKTOP = 0xff000000;
>
>  SECTIONS
>  {
> - . = PHYS_OFFSET;
> + . = 0;
> + .boot : { boot.o }
>
>   . = PHYS_OFFSET + 0x8000 - 0x40;
>
> --
> 1.7.10.4
>
>
>
> _______________________________________________
> kvmarm mailing list
> kvm...@lists.cs.columbia.edu <javascript:;>
> https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm
>
_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to