mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-26 22:02:15 +00:00
Fix section alignment, attempt to clean up the crt0 a bit
This commit is contained in:
parent
661bcaa3ec
commit
92d2abaf1c
2 changed files with 18 additions and 32 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in a new issue