[PATCH 02/10] bsps/arm: Support recent bootloaders starting kernel in HYP mode

Pavel Pisa pisa at cmp.felk.cvut.cz
Mon Jul 4 08:45:53 UTC 2016


Hello Sebastian,

On Monday 04 of July 2016 10:18:13 Pavel Pisa wrote:
> Hello Sebastian,
>
> On Monday 04 of July 2016 07:40:30 Sebastian Huber wrote:
> > On 04/07/16 01:52, ppisa at cmp.felk.cvut.cz wrote:
> > > --- a/c/src/lib/libbsp/arm/shared/include/start.h
> > > +++ b/c/src/lib/libbsp/arm/shared/include/start.h
> > > @@ -45,6 +45,15 @@ extern "C" {
> > >
> > >   #define BSP_START_DATA_SECTION
> > > __attribute__((section(".bsp_start_data")))
> > >
> > > +/*
> > > +* Many ARM boot loaders pass arguments to loaded OS kernel
> > > +*/
> > > +#ifdef BSP_START_HOOKS_WITH_LOADER_ARGS
> > > +#define BSP_START_HOOKS_LOADER_ARGS int saved_psr, int saved_machid,
> > > int saved_dtb_adr +#else
> > > +#define BSP_START_HOOKS_LOADER_ARGS void
> > > +#endif
> > > +
> > >   /**
> > >   * @brief System start entry.
> > >   */
> > > @@ -57,7 +66,7 @@ void _start(void);
> > >   * stack pointers are initialized but before the copying of the
> > > exception * vectors.
> > >   */
> > > -void bsp_start_hook_0(void);
> > > +void bsp_start_hook_0(BSP_START_HOOKS_LOADER_ARGS);
> >
> > Do we really need the saved_psr and saved_machid? I think it is
> > sufficient to pass the DTB address or NULL to bsp_start_hook_0() for all
> > BSPs. We should avoid this conditional parameter list.
> >
> > >   /**
> > >   * @brief Start entry hook 1.
> > > @@ -65,7 +74,7 @@ void bsp_start_hook_0(void);
> > >   * This hook will be called from the start entry code after copying of
> > > the * exception vectors but before the call to boot_card().
> > >   */
> > > -void bsp_start_hook_1(void);
> > > +void bsp_start_hook_1(BSP_START_HOOKS_LOADER_ARGS);
> >
> > These parameters are not set up in start.S in this patch.
>
> I agree that it is not so necessary but I thought about next
> scenario, we have system where RAM memory is not available
> (for example DRAM needs configuration) when start label
> is reached. The initial part in start.S does not require
> memory and should be kept that way even when HYP is included.
> bsp_start_hook_0 could be implemented in assembly for such
> cache and bring up RAM (only) then more complex parameters
> parsing can and should be done after BSS is cleared and
> memory is ready, so this means to do that in bsp_start_hook_1.
> If we consider that bsp_start_hook_0 is implemented conforming
> ARM EABI calling convention then registers r4, r5 and most
> likely r6 are preserved so calling of bsp_start_hook_1 with
> original parameters is not a problem. But I have forgot
> to repeat sequence
>
> 	mov	r0, r4		/* original cpsr value */
> 	mov	r1, r5		/* machine type number or ~0 for DT boot */
> 	mov	r2, r6		/* physical address of ATAGs or DTB */
>
> before call to bsp_start_hook_1. And I liked the idea that
> both (all) calls have same prototype.

The approach is not to be done easily. There is

bsp_vector_table_copy

	ldmia	r1!, {r2-r9}
	stmia	r0!, {r2-r9}
	ldmia	r1!, {r2-r9}
	stmia	r0!, {r2-r9}

before

	bl	bsp_start_hook_1

so that would require to add

diff --git a/c/src/lib/libbsp/arm/shared/start/start.S b/c/src/lib/libbsp/arm/shared/start/start.S
index 0848fff..8b9ec6b 100644
--- a/c/src/lib/libbsp/arm/shared/start/start.S
+++ b/c/src/lib/libbsp/arm/shared/start/start.S
@@ -325,6 +325,8 @@ bsp_start_hook_0_done:
         * vectors and the pointers to the default exception handlers.
         */

+       stmdb   sp!, {r4, r5, r6}
+
        ldr     r0, =bsp_vector_table_begin
        adr     r1, bsp_start_vector_table_begin
        cmp     r0, r1
@@ -336,6 +338,8 @@ bsp_start_hook_0_done:

 bsp_vector_table_copy_done:

+       ldmia   sp!, {r0, r1, r2}
+
        SWITCH_FROM_ARM_TO_THUMB        r0

        /* Branch to start hook 1 */

So I am not sure if gain worth this price. The complete
updated patch on on GitHub

  https://github.com/ppisa/rtems/commit/2db24a3a6dd4523d0d1ab018d5ffb4a7dfb8a245

Thanks for your opinion in advance,

              Pavel


More information about the devel mailing list