Fix section alignment, attempt to clean up the crt0 a bit

This commit is contained in:
TuxSH 2018-03-03 02:02:10 +01:00
parent 661bcaa3ec
commit 92d2abaf1c
2 changed files with 18 additions and 32 deletions

View File

@ -155,7 +155,7 @@ void coldboot_init_dma_controllers(void) {
(*((volatile uint32_t *)(0x6000C054))) = 0x80; (*((volatile uint32_t *)(0x6000C054))) = 0x80;
} }
void coldboot_init(coldboot_crt0_reloc_list_t *reloc_list, boot_func_list_t *func_list) { void coldboot_init(coldboot_crt0_reloc_list_t *reloc_list, boot_func_list_t *func_list, boot_func_list_t *func_list_warmboot) {
/* Custom approach */ /* Custom approach */
reloc_list->reloc_base = (uintptr_t)__start_cold; reloc_list->reloc_base = (uintptr_t)__start_cold;
@ -183,4 +183,6 @@ void coldboot_init(coldboot_crt0_reloc_list_t *reloc_list, boot_func_list_t *fun
func_list->funcs.flush_dcache_all(); func_list->funcs.flush_dcache_all();
func_list->funcs.invalidate_icache_all(); func_list->funcs.invalidate_icache_all();
/* At this point we can access all the mapped segments (all other functions, data...) normally */ /* At this point we can access all the mapped segments (all other functions, data...) normally */
*func_list_warmboot = *func_list;
} }

View File

@ -70,8 +70,8 @@
msr oslar_el1, x0 msr oslar_el1, x0
.endm .endm
.align 6
.section .cold_crt0.text.start, "ax", %progbits .section .cold_crt0.text.start, "ax", %progbits
.align 6
.global __start_cold .global __start_cold
__start_cold: __start_cold:
ERRATUM_INVALIDATE_BTB_AT_BOOT ERRATUM_INVALIDATE_BTB_AT_BOOT
@ -82,17 +82,16 @@ __start_cold:
mov fp, #0 mov fp, #0
adr x0, g_coldboot_crt0_relocation_list adr x0, g_coldboot_crt0_relocation_list
mov x19, x0
adr x1, g_coldboot_crt0_main_func_list adr x1, g_coldboot_crt0_main_func_list
ldr x2, =g_warmboot_crt0_main_func_list
bl coldboot_init bl coldboot_init
adr x0, g_coldboot_crt0_relocation_list
ldr x1, =__start_reloc_list_addr
str x0, [x1]
ldr x16, =__jump_to_main_cold ldr x16, =__jump_to_main_cold
br x16 br x16
.align 6
.section .warm_crt0.text.start, "ax", %progbits .section .warm_crt0.text.start, "ax", %progbits
.align 6
.global __start_warm .global __start_warm
__start_warm: __start_warm:
ERRATUM_INVALIDATE_BTB_AT_BOOT ERRATUM_INVALIDATE_BTB_AT_BOOT
@ -103,14 +102,14 @@ __start_warm:
mov sp, x0 mov sp, x0
mov fp, #0 mov fp, #0
adrp x0, g_warmboot_crt0_main_func_list adr x0, g_warmboot_crt0_main_func_list
add x0, x0, #:lo12:g_warmboot_crt0_main_func_list
bl warmboot_init bl warmboot_init
ldr x16, =__jump_to_main_warm ldr x16, =__jump_to_main_warm
br x16 br x16
/* Used by coldboot as well */ /* Used by coldboot as well */
.section .warm_crt0.text.__set_memory_registers, "ax", %progbits .section .warm_crt0.text.__set_memory_registers, "ax", %progbits
.align 4
.global __set_memory_registers .global __set_memory_registers
.type __set_memory_registers, %function .type __set_memory_registers, %function
__set_memory_registers: __set_memory_registers:
@ -134,8 +133,8 @@ __set_memory_registers:
isb isb
ret ret
.align 4
.section .text.__jump_to_main_cold, "ax", %progbits .section .text.__jump_to_main_cold, "ax", %progbits
.align 4
__jump_to_main_cold: __jump_to_main_cold:
/* This is inspired by Nintendo's code but significantly different */ /* This is inspired by Nintendo's code but significantly different */
bl __set_exception_entry_stack_pointer bl __set_exception_entry_stack_pointer
@ -150,8 +149,7 @@ __jump_to_main_cold:
bl get_pk2ldr_stack_address bl get_pk2ldr_stack_address
mov sp, x0 mov sp, x0
ldr x1, =__start_reloc_list_addr mov x0, x19
ldr x0, [x1]
bl load_package2 bl load_package2
mov w0, #3 /* use core3 stack temporarily */ mov w0, #3 /* use core3 stack temporarily */
@ -168,11 +166,7 @@ __jump_to_main_warm:
/* Nintendo doesn't do that here, causing issues if an exception occurs */ /* Nintendo doesn't do that here, causing issues if an exception occurs */
bl __set_exception_entry_stack_pointer bl __set_exception_entry_stack_pointer
bl get_pk2ldr_stack_address mov w0, #0 /* use core0,1,2 stack bottom + 0x800 (VA of warmboot crt0 sp) temporarily */
mov sp, x0
bl load_package2
mov w0, #3 /* use core0,1,2 stack bottom + 0x800 (VA of warmboot crt0 sp) temporarily */
bl get_exception_entry_stack_address bl get_exception_entry_stack_address
add sp, x0, #0x800 add sp, x0, #0x800
b warmboot_main b warmboot_main
@ -210,8 +204,8 @@ __jump_to_lower_el:
eret eret
/* Custom stuff */ /* Custom stuff */
.align 3
.section .cold_crt0.data.g_coldboot_crt0_relocation_list, "aw", %progbits .section .cold_crt0.data.g_coldboot_crt0_relocation_list, "aw", %progbits
.align 3
.global g_coldboot_crt0_relocation_list .global g_coldboot_crt0_relocation_list
g_coldboot_crt0_relocation_list: g_coldboot_crt0_relocation_list:
.quad 0, __loaded_end_lma__ /* __start_cold, to be set & loaded size */ .quad 0, __loaded_end_lma__ /* __start_cold, to be set & loaded size */
@ -225,8 +219,8 @@ g_coldboot_crt0_relocation_list:
.quad __main_bss_start__, __main_end__, 0 .quad __main_bss_start__, __main_end__, 0
.quad __pk2ldr_bss_start__, __pk2ldr_end__, 0 .quad __pk2ldr_bss_start__, __pk2ldr_end__, 0
.align 3
.section .cold_crt0.data.g_coldboot_crt0_main_func_list, "aw", %progbits .section .cold_crt0.data.g_coldboot_crt0_main_func_list, "aw", %progbits
.align 3
.global g_coldboot_crt0_main_func_list .global g_coldboot_crt0_main_func_list
g_coldboot_crt0_main_func_list: g_coldboot_crt0_main_func_list:
.quad 3 /* Number of functions */ .quad 3 /* Number of functions */
@ -235,18 +229,8 @@ g_coldboot_crt0_main_func_list:
.quad flush_dcache_all .quad flush_dcache_all
.quad invalidate_icache_all .quad invalidate_icache_all
.align 3
.section .warm_crt0.data.g_warmboot_crt0_main_func_list, "aw", %progbits .section .warm_crt0.data.g_warmboot_crt0_main_func_list, "aw", %progbits
.align 3
.global g_warmboot_crt0_main_func_list .global g_warmboot_crt0_main_func_list
g_warmboot_crt0_main_func_list: g_warmboot_crt0_main_func_list:
.quad 3 /* Number of functions */ .space (4 * 8)
/* Functions */
.quad set_memory_registers_enable_mmu
.quad flush_dcache_all
.quad invalidate_icache_all
.align 3
.section .bss.__start_reloc_list_addr, "w", %nobits
.global __start_reloc_list_addr
__start_reloc_list_addr:
.space 8