mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-09 22:56:35 +00:00
Unstub lma2vma code
This commit is contained in:
parent
b0cb819b06
commit
24b15dad40
2 changed files with 65 additions and 44 deletions
|
@ -42,6 +42,8 @@ SECTIONS
|
||||||
.warm_crt0 :
|
.warm_crt0 :
|
||||||
{
|
{
|
||||||
. = ALIGN(64);
|
. = ALIGN(64);
|
||||||
|
__warmboot_crt0_lma__ = LOADADDR(.warm_crt0);
|
||||||
|
__warmboot_crt0_start__ = ABSOLUTE(.);
|
||||||
KEEP (*(.warm_crt0.text*))
|
KEEP (*(.warm_crt0.text*))
|
||||||
KEEP (build/warmboot_init.o(.text*))
|
KEEP (build/warmboot_init.o(.text*))
|
||||||
*(.warm_crt0.rodata*)
|
*(.warm_crt0.rodata*)
|
||||||
|
@ -52,26 +54,46 @@ SECTIONS
|
||||||
*(.warm_crt0.bss*)
|
*(.warm_crt0.bss*)
|
||||||
build/warmboot_init.o(.bss*)
|
build/warmboot_init.o(.bss*)
|
||||||
. = ALIGN(64);
|
. = ALIGN(64);
|
||||||
|
__warmboot_crt0_end__ = ABSOLUTE(.);
|
||||||
} >warmboot_crt0 AT>fake
|
} >warmboot_crt0 AT>fake
|
||||||
|
|
||||||
.pk2ldr :
|
.pk2ldr :
|
||||||
{
|
{
|
||||||
. = ALIGN(4096);
|
. = ALIGN(4096);
|
||||||
|
__pk2ldr_lma__ = LOADADDR(.pk2ldr);
|
||||||
|
__pk2ldr_start__ = ABSOLUTE(.);
|
||||||
KEEP (build/package2.o(.text*))
|
KEEP (build/package2.o(.text*))
|
||||||
build/package2.o(.rodata*)
|
build/package2.o(.rodata*)
|
||||||
build/package2.o(.data*)
|
build/package2.o(.data*)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
build/package2.o(.bss*)
|
build/package2.o(.bss*)
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
|
__pk2ldr_end__ = ABSOLUTE(.);
|
||||||
} >pk2ldr AT>fake
|
} >pk2ldr AT>fake
|
||||||
|
|
||||||
.vectors :
|
.vectors :
|
||||||
{
|
{
|
||||||
. = ALIGN(2048);
|
. = ALIGN(2048);
|
||||||
|
__vectors_lma__ = LOADADDR(.vectors);
|
||||||
|
__vectors_start__ = ABSOLUTE(.);
|
||||||
KEEP (*(.vectors*))
|
KEEP (*(.vectors*))
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
|
__vectors_end__ = ABSOLUTE(.);
|
||||||
} >evt AT>fake
|
} >evt AT>fake
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
. = ALIGN(256);
|
||||||
|
__main_lma__ = LOADADDR(.text);
|
||||||
|
__main_start__ = ABSOLUTE(.);
|
||||||
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
||||||
|
*(.text.exit .text.exit.*)
|
||||||
|
*(.text.startup .text.startup.*)
|
||||||
|
*(.text.hot .text.hot.*)
|
||||||
|
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >main AT>fake
|
||||||
|
|
||||||
.init :
|
.init :
|
||||||
{
|
{
|
||||||
KEEP( *(.init) )
|
KEEP( *(.init) )
|
||||||
|
@ -85,15 +107,6 @@ SECTIONS
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
} >main AT>fake
|
} >main AT>fake
|
||||||
|
|
||||||
.text :
|
|
||||||
{
|
|
||||||
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
|
||||||
*(.text.exit .text.exit.*)
|
|
||||||
*(.text.startup .text.startup.*)
|
|
||||||
*(.text.hot .text.hot.*)
|
|
||||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>fake
|
|
||||||
|
|
||||||
.fini :
|
.fini :
|
||||||
{
|
{
|
||||||
|
@ -108,8 +121,8 @@ SECTIONS
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
} >main AT>fake
|
} >main AT>fake
|
||||||
|
|
||||||
.got : { __got_start__ = .; *(.got) *(.igot) } >main AT>fake
|
.got : { __got_start__ = ABSOLUTE(.); *(.got) *(.igot) } >main AT>fake
|
||||||
.got.plt : { *(.got.plt) *(.igot.plt) __got_end__ = .;} >main AT>fake
|
.got.plt : { *(.got.plt) *(.igot.plt) __got_end__ = ABSOLUTE(.);} >main AT>fake
|
||||||
|
|
||||||
.preinit_array :
|
.preinit_array :
|
||||||
{
|
{
|
||||||
|
@ -167,12 +180,12 @@ SECTIONS
|
||||||
We're too lazy to clear BSS so we integrate it into .data.
|
We're too lazy to clear BSS so we integrate it into .data.
|
||||||
Nintendo does the same for this main segment's BSS.
|
Nintendo does the same for this main segment's BSS.
|
||||||
*/
|
*/
|
||||||
__bss_start__ = .;
|
__bss_start__ = ABSOLUTE(.);
|
||||||
*(.dynbss)
|
*(.dynbss)
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__bss_end__ = .;
|
__bss_end__ = ABSOLUTE(.);
|
||||||
} >main AT>fake
|
} >main AT>fake
|
||||||
|
|
||||||
|
|
||||||
|
@ -192,7 +205,7 @@ SECTIONS
|
||||||
.gnu.version_r : { *(.gnu.version_r) } >main AT>fake
|
.gnu.version_r : { *(.gnu.version_r) } >main AT>fake
|
||||||
.dynsym : { *(.dynsym) } >main AT>fake
|
.dynsym : { *(.dynsym) } >main AT>fake
|
||||||
.dynstr : { *(.dynstr) } >main AT>fake
|
.dynstr : { *(.dynstr) } >main AT>fake
|
||||||
.rela.dyn : { *(.rela.*) } >main AT>fake
|
.rela.dyn : { *(.rela.*); __main_end__ = ABSOLUTE(.);} >main AT>fake
|
||||||
|
|
||||||
__end__ = ABSOLUTE(.) ;
|
__end__ = ABSOLUTE(.) ;
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,19 @@
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
#include "memory_map.h"
|
#include "memory_map.h"
|
||||||
|
|
||||||
/*
|
extern void (*const __preinit_array_start[])(void);
|
||||||
extern void (*__preinit_array_start[])(void);
|
extern void (*const __preinit_array_end[])(void);
|
||||||
extern void (*__preinit_array_end[])(void);
|
extern void ( *const __init_array_start[])(void);
|
||||||
extern void (*__init_array_start[])(void);
|
extern void (*const __init_array_end[])(void);
|
||||||
extern void (*__init_array_end[])(void);
|
|
||||||
extern void _init(void);
|
extern void _init(void);
|
||||||
|
|
||||||
extern uint8_t __warmboot_crt0_start__[], __warmboot_crt0_end__[], __warmboot_crt0_lma__[];
|
extern const uint8_t __start_cold[];
|
||||||
extern uint8_t __main_start__[], __main_end__[], __main_lma__[];
|
|
||||||
extern uint8_t __pk2ldr_start__[], __pk2ldr_end__[], __pk2ldr_lma__[];
|
extern const uint8_t __warmboot_crt0_start__[], __warmboot_crt0_end__[], __warmboot_crt0_lma__[];
|
||||||
extern uint8_t __vectors_start__[], __vectors_end__[], __vectors_lma__[];*/
|
extern const uint8_t __main_start__[], __main_end__[], __main_lma__[];
|
||||||
|
extern const uint8_t __pk2ldr_start__[], __pk2ldr_end__[], __pk2ldr_lma__[];
|
||||||
|
extern const uint8_t __vectors_start__[], __vectors_end__[], __vectors_lma__[];
|
||||||
|
|
||||||
extern void flush_dcache_all_tzram_pa(void);
|
extern void flush_dcache_all_tzram_pa(void);
|
||||||
extern void invalidate_icache_all_tzram_pa(void);
|
extern void invalidate_icache_all_tzram_pa(void);
|
||||||
|
|
||||||
|
@ -102,45 +104,51 @@ static void configure_ttbls(void) {
|
||||||
tzram_map_all_segments(mmu_l3_tbl);
|
tzram_map_all_segments(mmu_l3_tbl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
__attribute__((noinline)) static void copy_lma_to_vma(const void *vma, const void *lma, size_t size) {
|
||||||
|
|
||||||
static void copy_lma_to_vma(unsigned int segment_id, void *lma, size_t size, bool vma_is_pa) {
|
|
||||||
uintptr_t vma = vma_is_pa ? TZRAM_GET_SEGMENT_PA(segment_id) : TZRAM_GET_SEGMENT_ADDRESS(segment_id);
|
|
||||||
uintptr_t vma_offset = (uintptr_t)lma & 0xFFF;
|
|
||||||
uint64_t *p_vma = (uint64_t *)vma;
|
uint64_t *p_vma = (uint64_t *)vma;
|
||||||
uint64_t *p_lma = (uint64_t *)lma;
|
const uint64_t *p_lma = (const uint64_t *)((size_t)lma + __start_cold);
|
||||||
for (size_t i = 0; i < size / 8; i++) {
|
for (size_t i = 0; i < size / 8; i++) {
|
||||||
p_vma[vma_offset / 8 + i] = p_lma[i];
|
p_vma[i] = p_lma[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __libc_init_array(void) {
|
|
||||||
for (size_t i = 0; i < __preinit_array_end - __preinit_array_start; i++)
|
|
||||||
__preinit_array_start[i]();
|
|
||||||
_init(); /* FIXME: do we have this gcc-provided symbol if we build with -nostartfiles? */
|
|
||||||
for (size_t i = 0; i < __init_array_end - __init_array_start; i++)
|
|
||||||
__init_array_start[i]();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uintptr_t get_coldboot_crt0_stack_address(void) {
|
uintptr_t get_coldboot_crt0_stack_address(void) {
|
||||||
return TZRAM_GET_SEGMENT_PA(TZRAM_SEGMENT_ID_CORE3_STACK) + 0x800;
|
return TZRAM_GET_SEGMENT_PA(TZRAM_SEGMENT_ID_CORE3_STACK) + 0x800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((target("cmodel=large"), noinline)) static void copy_warmboot_crt0(void) {
|
||||||
|
copy_lma_to_vma(__warmboot_crt0_start__, __warmboot_crt0_lma__, __warmboot_crt0_end__ - __warmboot_crt0_start__);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((target("cmodel=large"), noinline)) static void copy_other_sections(void) {
|
||||||
|
copy_lma_to_vma(__main_start__, __main_lma__, __main_end__ - __main_start__);
|
||||||
|
copy_lma_to_vma(__pk2ldr_start__, __pk2ldr_lma__, __pk2ldr_end__ - __pk2ldr_start__);
|
||||||
|
copy_lma_to_vma(__vectors_start__, __vectors_lma__, __vectors_end__ - __vectors_start__);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((target("cmodel=large"), noinline)) static void __libc_init_array(void) {
|
||||||
|
/* On the stock secmon the init array lives in crt0 rodata, but whatever... */
|
||||||
|
for (size_t i = 0; i < __preinit_array_end - __preinit_array_start; i++)
|
||||||
|
__preinit_array_start[i]();
|
||||||
|
//_init(); /* FIXME: do we have this gcc-provided symbol if we build with -nostartfiles? */
|
||||||
|
for (size_t i = 0; i < __init_array_end - __init_array_start; i++)
|
||||||
|
__init_array_start[i]();
|
||||||
|
}
|
||||||
|
|
||||||
void coldboot_init(void) {
|
void coldboot_init(void) {
|
||||||
/* TODO: Set NX BOOTLOADER clock time field */
|
/* TODO: Set NX BOOTLOADER clock time field */
|
||||||
/*copy_lma_to_vma(TZRAM_SEGMENT_ID_WARMBOOT_CRT0_AND_MAIN, __warmboot_crt0_lma__, __warmboot_crt0_end__ - __warmboot_crt0_start__, true);*/
|
copy_warmboot_crt0();
|
||||||
/* TODO: set some mmio regs, etc. */
|
/* TODO: set some mmio regs, etc. */
|
||||||
/* TODO: initialize DMA controllers */
|
/* TODO: initialize DMA controllers */
|
||||||
configure_ttbls();
|
configure_ttbls();
|
||||||
/*copy_lma_to_vma(TZRAM_SEGMENT_ID_WARMBOOT_CRT0_AND_MAIN, __main_lma__, __main_end__ - __main_start__, false);
|
copy_other_sections();
|
||||||
copy_lma_to_vma(TZRAM_SEGMENT_ID_PK2LDR, __pk2ldr_lma__, __pk2ldr_end__ - __pk2ldr_start__, false);
|
|
||||||
copy_lma_to_vma(TZRAM_SEGEMENT_ID_SECMON_EVT, __vectors_lma__, __vectors_end__ - __vectors_start__, false);*/
|
|
||||||
/* TODO: set the MMU regs & tlbi & enable MMU */
|
/* TODO: set the MMU regs & tlbi & enable MMU */
|
||||||
|
|
||||||
flush_dcache_all_tzram_pa();
|
flush_dcache_all_tzram_pa();
|
||||||
invalidate_icache_all_tzram_pa();
|
invalidate_icache_all_tzram_pa();
|
||||||
|
/* At this point we can access the mapped segments */
|
||||||
/* TODO: zero-initialize the cpu context */
|
/* TODO: zero-initialize the cpu context */
|
||||||
/* Nintendo clears the (emtpy) pk2ldr's BSS section, but we embed it 0-filled in the binary */
|
/* Nintendo clears the (emtpy) pk2ldr's BSS section, but we embed it 0-filled in the binary */
|
||||||
/*__libc_init_array(); construct global objects */
|
__libc_init_array(); /* construct global objects */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue