mirror of
https://github.com/Decscots/Lockpick_RCM
synced 2024-11-15 06:56:35 +00:00
v1.7.1: Heap bugfix, add payload chainloading
This commit is contained in:
parent
fc87643922
commit
aac874f7a3
2 changed files with 323 additions and 136 deletions
2
Makefile
2
Makefile
|
@ -11,7 +11,7 @@ include $(DEVKITARM)/base_rules
|
||||||
IPL_LOAD_ADDR := 0x40003000
|
IPL_LOAD_ADDR := 0x40003000
|
||||||
LPVERSION_MAJOR := 1
|
LPVERSION_MAJOR := 1
|
||||||
LPVERSION_MINOR := 7
|
LPVERSION_MINOR := 7
|
||||||
LPVERSION_BUGFX := 0
|
LPVERSION_BUGFX := 1
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
193
source/main.c
193
source/main.c
|
@ -19,6 +19,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "config/config.h"
|
#include "config/config.h"
|
||||||
|
#include "config/ini.h"
|
||||||
#include "gfx/di.h"
|
#include "gfx/di.h"
|
||||||
#include "gfx/gfx.h"
|
#include "gfx/gfx.h"
|
||||||
#include "gfx/tui.h"
|
#include "gfx/tui.h"
|
||||||
|
@ -33,6 +34,8 @@
|
||||||
#include "storage/emummc.h"
|
#include "storage/emummc.h"
|
||||||
#include "storage/nx_emmc.h"
|
#include "storage/nx_emmc.h"
|
||||||
#include "storage/sdmmc.h"
|
#include "storage/sdmmc.h"
|
||||||
|
#include "utils/btn.h"
|
||||||
|
#include "utils/dirlist.h"
|
||||||
#include "utils/sprintf.h"
|
#include "utils/sprintf.h"
|
||||||
#include "utils/util.h"
|
#include "utils/util.h"
|
||||||
|
|
||||||
|
@ -129,6 +132,9 @@ int sd_save_to_file(void *buf, u32 size, const char *filename)
|
||||||
#define RELOC_META_OFF 0x7C
|
#define RELOC_META_OFF 0x7C
|
||||||
#define PATCHED_RELOC_SZ 0x94
|
#define PATCHED_RELOC_SZ 0x94
|
||||||
#define PATCHED_RELOC_STACK 0x40007000
|
#define PATCHED_RELOC_STACK 0x40007000
|
||||||
|
#define PATCHED_RELOC_ENTRY 0x40010000
|
||||||
|
#define EXT_PAYLOAD_ADDR 0xC03C0000
|
||||||
|
#define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
||||||
#define COREBOOT_ADDR (0xD0000000 - 0x100000)
|
#define COREBOOT_ADDR (0xD0000000 - 0x100000)
|
||||||
#define CBFS_DRAM_EN_ADDR 0x4003e000
|
#define CBFS_DRAM_EN_ADDR 0x4003e000
|
||||||
#define CBFS_DRAM_MAGIC 0x4452414D // "DRAM"
|
#define CBFS_DRAM_MAGIC 0x4452414D // "DRAM"
|
||||||
|
@ -151,6 +157,183 @@ void reloc_patcher(u32 payload_dst, u32 payload_src, u32 payload_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int launch_payload(char *path)
|
||||||
|
{
|
||||||
|
gfx_clear_grey(0x1B);
|
||||||
|
gfx_con_setpos(0, 0);
|
||||||
|
if (!path)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (sd_mount())
|
||||||
|
{
|
||||||
|
FIL fp;
|
||||||
|
if (f_open(&fp, path, FA_READ))
|
||||||
|
{
|
||||||
|
EPRINTFARGS("Payload file is missing!\n(%s)", path);
|
||||||
|
sd_unmount();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and copy the payload to our chosen address
|
||||||
|
void *buf;
|
||||||
|
u32 size = f_size(&fp);
|
||||||
|
|
||||||
|
if (size < 0x30000)
|
||||||
|
buf = (void *)RCM_PAYLOAD_ADDR;
|
||||||
|
else
|
||||||
|
buf = (void *)COREBOOT_ADDR;
|
||||||
|
|
||||||
|
if (f_read(&fp, buf, size, NULL))
|
||||||
|
{
|
||||||
|
f_close(&fp);
|
||||||
|
sd_unmount();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
f_close(&fp);
|
||||||
|
|
||||||
|
sd_unmount();
|
||||||
|
|
||||||
|
if (size < 0x30000)
|
||||||
|
{
|
||||||
|
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, ALIGN(size, 0x10));
|
||||||
|
|
||||||
|
reconfig_hw_workaround(false, byte_swap_32(*(u32 *)(buf + size - sizeof(u32))));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000);
|
||||||
|
reconfig_hw_workaround(true, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.
|
||||||
|
sdmmc_storage_init_wait_sd();
|
||||||
|
|
||||||
|
void (*ext_payload_ptr)() = (void *)EXT_PAYLOAD_ADDR;
|
||||||
|
|
||||||
|
// Launch our payload.
|
||||||
|
(*ext_payload_ptr)();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void launch_tools()
|
||||||
|
{
|
||||||
|
u8 max_entries = 61;
|
||||||
|
char *filelist = NULL;
|
||||||
|
char *file_sec = NULL;
|
||||||
|
char *dir = NULL;
|
||||||
|
|
||||||
|
ment_t *ments = (ment_t *)malloc(sizeof(ment_t) * (max_entries + 3));
|
||||||
|
|
||||||
|
gfx_clear_grey(0x1B);
|
||||||
|
gfx_con_setpos(0, 0);
|
||||||
|
|
||||||
|
if (sd_mount())
|
||||||
|
{
|
||||||
|
dir = (char *)malloc(256);
|
||||||
|
|
||||||
|
memcpy(dir, "sd:/bootloader/payloads", 24);
|
||||||
|
|
||||||
|
filelist = dirlist(dir, NULL, false);
|
||||||
|
|
||||||
|
u32 i = 0;
|
||||||
|
u32 i_off = 2;
|
||||||
|
|
||||||
|
if (filelist)
|
||||||
|
{
|
||||||
|
// Build configuration menu.
|
||||||
|
u32 color_idx = 0;
|
||||||
|
|
||||||
|
ments[0].type = MENT_BACK;
|
||||||
|
ments[0].caption = "Back";
|
||||||
|
ments[0].color = colors[(color_idx++) % 6];
|
||||||
|
ments[1].type = MENT_CHGLINE;
|
||||||
|
ments[1].color = colors[(color_idx++) % 6];
|
||||||
|
if (!f_stat("sd:/atmosphere/reboot_payload.bin", NULL))
|
||||||
|
{
|
||||||
|
ments[i_off].type = INI_CHOICE;
|
||||||
|
ments[i_off].caption = "reboot_payload.bin";
|
||||||
|
ments[i_off].color = colors[(color_idx++) % 6];
|
||||||
|
ments[i_off].data = "sd:/atmosphere/reboot_payload.bin";
|
||||||
|
i_off++;
|
||||||
|
}
|
||||||
|
if (!f_stat("sd:/ReiNX.bin", NULL))
|
||||||
|
{
|
||||||
|
ments[i_off].type = INI_CHOICE;
|
||||||
|
ments[i_off].caption = "ReiNX.bin";
|
||||||
|
ments[i_off].color = colors[(color_idx++) % 6];
|
||||||
|
ments[i_off].data = "sd:/ReiNX.bin";
|
||||||
|
i_off++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (i > max_entries || !filelist[i * 256])
|
||||||
|
break;
|
||||||
|
ments[i + i_off].type = INI_CHOICE;
|
||||||
|
ments[i + i_off].caption = &filelist[i * 256];
|
||||||
|
ments[i + i_off].color = colors[(color_idx++) % 6];
|
||||||
|
ments[i + i_off].data = &filelist[i * 256];
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
memset(&ments[i + i_off], 0, sizeof(ment_t));
|
||||||
|
menu_t menu = { ments, "Choose a file to launch", 0, 0 };
|
||||||
|
|
||||||
|
file_sec = (char *)tui_do_menu(&menu);
|
||||||
|
|
||||||
|
if (!file_sec)
|
||||||
|
{
|
||||||
|
free(ments);
|
||||||
|
free(dir);
|
||||||
|
free(filelist);
|
||||||
|
sd_unmount();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
EPRINTF("No payloads or modules found.");
|
||||||
|
|
||||||
|
free(ments);
|
||||||
|
free(filelist);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free(ments);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_sec)
|
||||||
|
{
|
||||||
|
if (memcmp("sd:/", file_sec, 4)) {
|
||||||
|
memcpy(dir + strlen(dir), "/", 2);
|
||||||
|
memcpy(dir + strlen(dir), file_sec, strlen(file_sec) + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
memcpy(dir, file_sec, strlen(file_sec) + 1);
|
||||||
|
|
||||||
|
if (launch_payload(dir))
|
||||||
|
{
|
||||||
|
EPRINTF("Failed to launch payload.");
|
||||||
|
free(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
sd_unmount();
|
||||||
|
free(dir);
|
||||||
|
|
||||||
|
btn_wait();
|
||||||
|
}
|
||||||
|
|
||||||
void dump_sysnand()
|
void dump_sysnand()
|
||||||
{
|
{
|
||||||
h_cfg.emummc_force_disable = true;
|
h_cfg.emummc_force_disable = true;
|
||||||
|
@ -171,9 +354,11 @@ ment_t ment_top[] = {
|
||||||
MDEF_HANDLER("Dump from SysNAND | Key generation: unk", dump_sysnand, COLOR_RED),
|
MDEF_HANDLER("Dump from SysNAND | Key generation: unk", dump_sysnand, COLOR_RED),
|
||||||
MDEF_HANDLER("Dump from EmuNAND | Key generation: unk", dump_emunand, COLOR_ORANGE),
|
MDEF_HANDLER("Dump from EmuNAND | Key generation: unk", dump_emunand, COLOR_ORANGE),
|
||||||
MDEF_CAPTION("---------------", COLOR_YELLOW),
|
MDEF_CAPTION("---------------", COLOR_YELLOW),
|
||||||
MDEF_HANDLER("Reboot (Normal)", reboot_normal, COLOR_GREEN),
|
MDEF_HANDLER("Payloads...", launch_tools, COLOR_GREEN),
|
||||||
MDEF_HANDLER("Reboot (RCM)", reboot_rcm, COLOR_BLUE),
|
MDEF_CAPTION("---------------", COLOR_BLUE),
|
||||||
MDEF_HANDLER("Power off", power_off, COLOR_VIOLET),
|
MDEF_HANDLER("Reboot (Normal)", reboot_normal, COLOR_VIOLET),
|
||||||
|
MDEF_HANDLER("Reboot (RCM)", reboot_rcm, COLOR_RED),
|
||||||
|
MDEF_HANDLER("Power off", power_off, COLOR_ORANGE),
|
||||||
MDEF_END()
|
MDEF_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -215,6 +400,8 @@ void _get_key_generations(char *sysnand_label, char *emunand_label) {
|
||||||
|
|
||||||
extern void pivot_stack(u32 stack_top);
|
extern void pivot_stack(u32 stack_top);
|
||||||
|
|
||||||
|
// todo: chainload to reboot payload or payloads folder option?
|
||||||
|
|
||||||
void ipl_main()
|
void ipl_main()
|
||||||
{
|
{
|
||||||
config_hw();
|
config_hw();
|
||||||
|
|
Loading…
Reference in a new issue