xen/arm32: head: Rework and document launch()

Boot CPU and secondary CPUs will use different entry point to C code. At
the moment, the decision on which entry to use is taken within launch().

In order to avoid using conditional instruction and make the call
clearer, launch() is reworked to take in parameters the entry point and its
arguments.

Lastly, document the behavior and the main registers usage within the
function.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Julien Grall committed 2019-09-17 17:45:21 +01:00
1 parent a5853e7d31
commit 54c4ae18d1
1 file changed
+24 -10
+24 -10
View File
@@ -163,6 +163,11 @@ primary_switched:
/* Use a virtual address to access the UART. */
mov_w r11, EARLY_UART_VIRTUAL_ADDRESS
#endif
PRINT("- Ready -\r\n")
/* Setup the arguments for start_xen and jump to C world */
mov r0, r10 /* r0 := Physical offset */
mov r1, r8 /* r1 := paddr(FDT) */
ldr r2, =start_xen
b launch
ENDPROC(start)
@@ -227,6 +232,9 @@ secondary_switched:
/* Use a virtual address to access the UART. */
mov_w r11, EARLY_UART_VIRTUAL_ADDRESS
#endif
PRINT("- Ready -\r\n")
/* Jump to C world */
ldr r2, =start_secondary
b launch
ENDPROC(init_secondary)
@@ -517,19 +525,25 @@ setup_fixmap:
mov pc, lr
ENDPROC(setup_fixmap)
/*
* Setup the initial stack and jump to the C world
*
* Inputs:
* r0 : Argument 0 of the C function to call
* r1 : Argument 1 of the C function to call
* r2 : C entry point
*
* Clobbers r3
*/
launch:
PRINT("- Ready -\r\n")
ldr r0, =init_data
add r0, #INITINFO_stack /* Find the boot-time stack */
ldr sp, [r0]
ldr r3, =init_data
add r3, #INITINFO_stack /* Find the boot-time stack */
ldr sp, [r3]
add sp, #STACK_SIZE /* (which grows down from the top). */
sub sp, #CPUINFO_sizeof /* Make room for CPU save record */
teq r12, #0
moveq r0, r10 /* Marshal args: - phys_offset */
moveq r1, r8 /* - DTB address */
beq start_xen /* and disappear into the land of C */
b start_secondary /* (to the appropriate entry point) */
/* Jump to C world */
bx r2
ENDPROC(launch)
/* Fail-stop */
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.