mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-22 18:06:40 +00:00
loader: Add array alignment compensation
This commit is contained in:
parent
63d03303a2
commit
8b30bd4b57
1 changed files with 12 additions and 7 deletions
|
@ -73,7 +73,8 @@ void loader_main()
|
||||||
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333; // Set SCLK to PLLP_OUT (408MHz).
|
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333; // Set SCLK to PLLP_OUT (408MHz).
|
||||||
|
|
||||||
// Get Loader and Payload size.
|
// Get Loader and Payload size.
|
||||||
u32 payload_size = sizeof(payload_00) + sizeof(payload_01);
|
u32 payload_size = sizeof(payload_00) + sizeof(payload_01); // Actual payload size.
|
||||||
|
payload_size += (u32)payload_01 - (u32)payload_00 - sizeof(payload_00); // Add array alignment.
|
||||||
u32 *payload_addr = (u32 *)payload_00;
|
u32 *payload_addr = (u32 *)payload_00;
|
||||||
|
|
||||||
// Relocate payload to a safer place.
|
// Relocate payload to a safer place.
|
||||||
|
@ -88,16 +89,20 @@ void loader_main()
|
||||||
bytes--;
|
bytes--;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uncompress payload parts.
|
// Set source address of the first part.
|
||||||
u8 *src_addr = (void *)(IPL_RELOC_TOP - ALIGN(payload_size, 4));
|
u8 *src_addr = (void *)(IPL_RELOC_TOP - ALIGN(payload_size, 4));
|
||||||
u32 pos = LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR, sizeof(payload_00));
|
// Uncompress first part.
|
||||||
src_addr += (u32)payload_01 - (u32)payload_00;
|
u32 dst_pos = LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR, sizeof(payload_00));
|
||||||
LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR + pos, sizeof(payload_01));
|
|
||||||
|
|
||||||
// Copy over boot configuration storage in case it was set.
|
// Set source address of the second part. Includes array alignment.
|
||||||
|
src_addr += (u32)payload_01 - (u32)payload_00;
|
||||||
|
// Uncompress second part.
|
||||||
|
LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR + dst_pos, sizeof(payload_01));
|
||||||
|
|
||||||
|
// Copy over boot configuration storage.
|
||||||
memcpy((u8 *)(IPL_LOAD_ADDR + IPL_PATCHED_RELOC_SZ), &b_cfg, sizeof(boot_cfg_t));
|
memcpy((u8 *)(IPL_LOAD_ADDR + IPL_PATCHED_RELOC_SZ), &b_cfg, sizeof(boot_cfg_t));
|
||||||
|
|
||||||
// Chainload.
|
// Chainload into uncompressed payload.
|
||||||
void (*ipl_ptr)() = (void *)IPL_LOAD_ADDR;
|
void (*ipl_ptr)() = (void *)IPL_LOAD_ADDR;
|
||||||
(*ipl_ptr)();
|
(*ipl_ptr)();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue