mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-10 07:06:34 +00:00
fusee_cpp: tweaks, now completes SecureInitialize on hardware
This commit is contained in:
parent
c91f95e8f6
commit
f2a1c60218
6 changed files with 24 additions and 41 deletions
|
@ -26,16 +26,11 @@ namespace ams::nxboot::loader {
|
||||||
constexpr size_t ProgramImageSizeMax = ProgramImageEnd - ProgramImageBase;
|
constexpr size_t ProgramImageSizeMax = ProgramImageEnd - ProgramImageBase;
|
||||||
|
|
||||||
void CopyBackwards(void *dst, const void *src, size_t size) {
|
void CopyBackwards(void *dst, const void *src, size_t size) {
|
||||||
/* We want to copy 32-bits at a time from destination to source. */
|
u8 *dst_8 = static_cast<u8 *>(dst) + size;
|
||||||
const size_t words = util::DivideUp(size, sizeof(u32));
|
const u8 *src_8 = static_cast<const u8 *>(src) + size;
|
||||||
|
|
||||||
/* Convert to 32-bit pointers. */
|
for (size_t i = 0; i < size; ++i) {
|
||||||
u32 *dst_32 = static_cast<u32 *>(dst) + words;
|
*(--dst_8) = *(--src_8);
|
||||||
const u32 *src_32 = static_cast<const u32 *>(src) + words;
|
|
||||||
|
|
||||||
/* Copy data. */
|
|
||||||
for (size_t i = 0; i < words; ++i) {
|
|
||||||
*(--dst_32) = *(--src_32);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +38,7 @@ namespace ams::nxboot::loader {
|
||||||
|
|
||||||
NORETURN void UncompressAndExecute(const void *program, size_t program_size) {
|
NORETURN void UncompressAndExecute(const void *program, size_t program_size) {
|
||||||
/* Relocate the compressed binary to a place where we can safely decompress it. */
|
/* Relocate the compressed binary to a place where we can safely decompress it. */
|
||||||
void *relocated_program = reinterpret_cast<void *>(util::AlignDown(ProgramImageEnd - program_size, sizeof(u32)));
|
void *relocated_program = reinterpret_cast<void *>(ProgramImageEnd - program_size);
|
||||||
if (relocated_program != program) {
|
if (relocated_program != program) {
|
||||||
CopyBackwards(relocated_program, program, program_size);
|
CopyBackwards(relocated_program, program, program_size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,9 @@ namespace ams::nxboot::loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Copy(size_t size) {
|
void Copy(size_t size) {
|
||||||
__builtin_memcpy(this->dst + this->dst_offset, this->src + this->src_offset, size);
|
for (size_t i = 0; i < size; ++i) {
|
||||||
|
this->dst[this->dst_offset + i] = this->src[this->src_offset + i];
|
||||||
|
}
|
||||||
this->dst_offset += size;
|
this->dst_offset += size;
|
||||||
this->src_offset += size;
|
this->src_offset += size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,10 @@ SECTIONS
|
||||||
|
|
||||||
.crt0 :
|
.crt0 :
|
||||||
{
|
{
|
||||||
|
FILL(0x00000000)
|
||||||
KEEP (*(.crt0 .crt0.*))
|
KEEP (*(.crt0 .crt0.*))
|
||||||
. = ALIGN(8);
|
. = ORIGIN(main) + 0xC0 - 1;
|
||||||
|
BYTE(00);
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.text :
|
.text :
|
||||||
|
@ -22,37 +24,31 @@ SECTIONS
|
||||||
*(.text.startup .text.startup.*)
|
*(.text.startup .text.startup.*)
|
||||||
*(.text.hot .text.hot.*)
|
*(.text.hot .text.hot.*)
|
||||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.init :
|
.init :
|
||||||
{
|
{
|
||||||
KEEP( *(.init) )
|
KEEP( *(.init) )
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.plt :
|
.plt :
|
||||||
{
|
{
|
||||||
*(.plt)
|
*(.plt)
|
||||||
*(.iplt)
|
*(.iplt)
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.fini :
|
.fini :
|
||||||
{
|
{
|
||||||
KEEP( *(.fini) )
|
KEEP( *(.fini) )
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
|
|
||||||
/* =========== RODATA section =========== */
|
/* =========== RODATA section =========== */
|
||||||
. = ALIGN(8);
|
|
||||||
__rodata_start = . ;
|
__rodata_start = . ;
|
||||||
|
|
||||||
.rodata :
|
.rodata :
|
||||||
{
|
{
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
. = ALIGN(8);
|
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } >main AT>glob
|
.eh_frame_hdr : { __eh_frame_hdr_start = .; *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) __eh_frame_hdr_end = .; } >main AT>glob
|
||||||
|
@ -63,7 +59,6 @@ SECTIONS
|
||||||
.hash : { *(.hash) } >main AT>glob
|
.hash : { *(.hash) } >main AT>glob
|
||||||
|
|
||||||
/* =========== DATA section =========== */
|
/* =========== DATA section =========== */
|
||||||
. = ALIGN(8);
|
|
||||||
__data_start = . ;
|
__data_start = . ;
|
||||||
|
|
||||||
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } >main AT>glob
|
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } >main AT>glob
|
||||||
|
@ -71,14 +66,14 @@ SECTIONS
|
||||||
.gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } >main AT>glob
|
.gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } >main AT>glob
|
||||||
.exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } >main AT>glob
|
.exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } >main AT>glob
|
||||||
|
|
||||||
.preinit_array ALIGN(8) :
|
.preinit_array :
|
||||||
{
|
{
|
||||||
PROVIDE (__preinit_array_start = .);
|
PROVIDE (__preinit_array_start = .);
|
||||||
KEEP (*(.preinit_array))
|
KEEP (*(.preinit_array))
|
||||||
PROVIDE (__preinit_array_end = .);
|
PROVIDE (__preinit_array_end = .);
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.init_array ALIGN(8) :
|
.init_array :
|
||||||
{
|
{
|
||||||
PROVIDE (__init_array_start = .);
|
PROVIDE (__init_array_start = .);
|
||||||
KEEP (*(SORT(.init_array.*)))
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
@ -86,7 +81,7 @@ SECTIONS
|
||||||
PROVIDE (__init_array_end = .);
|
PROVIDE (__init_array_end = .);
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.fini_array ALIGN(8) :
|
.fini_array :
|
||||||
{
|
{
|
||||||
PROVIDE (__fini_array_start = .);
|
PROVIDE (__fini_array_start = .);
|
||||||
KEEP (*(.fini_array))
|
KEEP (*(.fini_array))
|
||||||
|
@ -94,7 +89,7 @@ SECTIONS
|
||||||
PROVIDE (__fini_array_end = .);
|
PROVIDE (__fini_array_end = .);
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.ctors ALIGN(8) :
|
.ctors :
|
||||||
{
|
{
|
||||||
KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */
|
KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
||||||
|
@ -102,7 +97,7 @@ SECTIONS
|
||||||
KEEP (*(.ctors))
|
KEEP (*(.ctors))
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
.dtors ALIGN(8) :
|
.dtors :
|
||||||
{
|
{
|
||||||
KEEP (*crtbegin.o(.dtors))
|
KEEP (*crtbegin.o(.dtors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||||
|
@ -117,30 +112,26 @@ SECTIONS
|
||||||
|
|
||||||
__got_end__ = .;
|
__got_end__ = .;
|
||||||
|
|
||||||
.data ALIGN(8) :
|
.data :
|
||||||
{
|
{
|
||||||
*(.data .data.* .gnu.linkonce.d.*)
|
*(.data .data.* .gnu.linkonce.d.*)
|
||||||
SORT(CONSTRUCTORS)
|
SORT(CONSTRUCTORS)
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
.bss ALIGN(8) :
|
.main.fill :
|
||||||
{
|
{
|
||||||
|
FILL(0x00000000)
|
||||||
*(.dynbss)
|
*(.dynbss)
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN(16);
|
. = ORIGIN(main) + LENGTH(main) - 1;
|
||||||
|
BYTE(0x00);
|
||||||
} >main AT>glob
|
} >main AT>glob
|
||||||
|
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
__main_end__ = ABSOLUTE(.) ;
|
__main_end__ = ABSOLUTE(.) ;
|
||||||
|
|
||||||
.main.fill : {
|
|
||||||
FILL(0x00000000)
|
|
||||||
. = ORIGIN(main) + LENGTH(main) - 1;
|
|
||||||
BYTE(0x00);
|
|
||||||
} >main AT>glob
|
|
||||||
|
|
||||||
/* ==================
|
/* ==================
|
||||||
==== Metadata ====
|
==== Metadata ====
|
||||||
================== */
|
================== */
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace ams::nxboot::crt0 {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize(uintptr_t bss_start, uintptr_t bss_end) {
|
void Initialize() {
|
||||||
/* TODO: Collect timing information? */
|
/* TODO: Collect timing information? */
|
||||||
|
|
||||||
/* Setup exception vectors. */
|
/* Setup exception vectors. */
|
||||||
|
@ -43,9 +43,6 @@ namespace ams::nxboot::crt0 {
|
||||||
SetExceptionVector(7, reinterpret_cast<uintptr_t>(::ams::nxboot::ExceptionHandler7));
|
SetExceptionVector(7, reinterpret_cast<uintptr_t>(::ams::nxboot::ExceptionHandler7));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear bss. */
|
|
||||||
std::memset(reinterpret_cast<void *>(bss_start), 0, bss_end - bss_start);
|
|
||||||
|
|
||||||
/* Call init array. */
|
/* Call init array. */
|
||||||
__libc_init_array();
|
__libc_init_array();
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,9 +62,7 @@ _ZN3ams6nxboot5StartEv:
|
||||||
ldr lr, =_ZN3ams6nxboot16ExceptionHandlerEv
|
ldr lr, =_ZN3ams6nxboot16ExceptionHandlerEv
|
||||||
|
|
||||||
/* Perform runtime initialization. */
|
/* Perform runtime initialization. */
|
||||||
ldr r0, =__bss_start__
|
bl _ZN3ams6nxboot4crt010InitializeEv
|
||||||
ldr r1, =__bss_end__
|
|
||||||
bl _ZN3ams6nxboot4crt010InitializeEjj
|
|
||||||
|
|
||||||
/* Perform nx boot procedure. */
|
/* Perform nx boot procedure. */
|
||||||
bl _ZN3ams6nxboot4MainEv
|
bl _ZN3ams6nxboot4MainEv
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export ATMOSPHERE_DEFINES += -DATMOSPHERE_CPU_ARM7TDMI
|
export ATMOSPHERE_DEFINES += -DATMOSPHERE_CPU_ARM7TDMI
|
||||||
export ATMOSPHERE_SETTINGS += -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork
|
export ATMOSPHERE_SETTINGS += -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork -fstrict-volatile-bitfields
|
||||||
export ATMOSPHERE_CFLAGS +=
|
export ATMOSPHERE_CFLAGS +=
|
||||||
export ATMOSPHERE_CXXFLAGS +=
|
export ATMOSPHERE_CXXFLAGS +=
|
||||||
export ATMOSPHERE_ASFLAGS +=
|
export ATMOSPHERE_ASFLAGS +=
|
Loading…
Reference in a new issue