1
0
Fork 0
mirror of https://github.com/CTCaer/hekate.git synced 2024-11-26 19:52:11 +00:00

r2p: Update r2p payload

2 modes:
- With updater2p; Forces the reboot to payload binary to be hekate
- Without; Checks if hekate and then if old
This commit is contained in:
CTCaer 2019-12-12 00:13:32 +02:00
parent 87d376654b
commit a664118fc7
9 changed files with 48 additions and 3 deletions

View file

@ -55,6 +55,7 @@ You can find a template [Here](./res/hekate_ipl_template.ini)
| verification=2 | 0: Disable Backup/Restore verification, 1: Sparse (block based, fast and not 100% reliable), 2: Full (sha256 based, slow and 100% reliable). | | verification=2 | 0: Disable Backup/Restore verification, 1: Sparse (block based, fast and not 100% reliable), 2: Full (sha256 based, slow and 100% reliable). |
| autohosoff=1 | 0: Disable, 1: If woke up from HOS via an RTC alarm, shows logo, then powers off completely, 2: No logo, immediately powers off.| | autohosoff=1 | 0: Disable, 1: If woke up from HOS via an RTC alarm, shows logo, then powers off completely, 2: No logo, immediately powers off.|
| autonogc=1 | 0: Disable, 1: Automatically applies nogc patch if unburnt fuses found and a >= 4.0.0 HOS is booted. | | autonogc=1 | 0: Disable, 1: Automatically applies nogc patch if unburnt fuses found and a >= 4.0.0 HOS is booted. |
| updater2p=0 | 0: Disable, 1: Force updates (if needed) the reboot2payload binary to be hekate. |
| backlight=100 | Screen backlight level. 0-255. | | backlight=100 | Screen backlight level. 0-255. |

View file

@ -43,6 +43,7 @@ void set_default_configuration()
h_cfg.backlight = 100; h_cfg.backlight = 100;
h_cfg.autohosoff = 0; h_cfg.autohosoff = 0;
h_cfg.autonogc = 1; h_cfg.autonogc = 1;
h_cfg.updater2p = 0;
h_cfg.brand = NULL; h_cfg.brand = NULL;
h_cfg.tagline = NULL; h_cfg.tagline = NULL;
h_cfg.errors = 0; h_cfg.errors = 0;
@ -108,6 +109,9 @@ int create_config_entry()
f_puts("\nautonogc=", &fp); f_puts("\nautonogc=", &fp);
itoa(h_cfg.autonogc, lbuf, 10); itoa(h_cfg.autonogc, lbuf, 10);
f_puts(lbuf, &fp); f_puts(lbuf, &fp);
f_puts("\nupdater2p=", &fp);
itoa(h_cfg.updater2p, lbuf, 10);
f_puts(lbuf, &fp);
if (h_cfg.brand) if (h_cfg.brand)
{ {
f_puts("\nbrand=", &fp); f_puts("\nbrand=", &fp);

View file

@ -29,6 +29,7 @@ typedef struct _hekate_config
u32 backlight; u32 backlight;
u32 autohosoff; u32 autohosoff;
u32 autonogc; u32 autonogc;
u32 updater2p;
char *brand; char *brand;
char *tagline; char *tagline;
// Global temporary config. // Global temporary config.

View file

@ -30,6 +30,9 @@
extern hekate_config h_cfg; extern hekate_config h_cfg;
extern void *sd_file_read(const char *path, u32 *fsize);
extern bool is_ipl_updated(void *buf, char *path, bool force);
#define FSS0_MAGIC 0x30535346 #define FSS0_MAGIC 0x30535346
#define CNT_TYPE_FSP 0 #define CNT_TYPE_FSP 0
#define CNT_TYPE_EXO 1 #define CNT_TYPE_EXO 1
@ -62,7 +65,32 @@ typedef struct _fss_content_t
char name[0x10]; char name[0x10];
} fss_content_t; } fss_content_t;
int parse_fss(launch_ctxt_t *ctxt, const char *value) static void _update_r2p(const char *path)
{
char *r2p_path = malloc(256);
u32 path_len = strlen(path);
strcpy(r2p_path, path);
while(path_len)
{
if ((r2p_path[path_len - 1] == '/') || (r2p_path[path_len - 1] == 0x5C))
{
r2p_path[path_len] = 0;
strcat(r2p_path, "reboot_payload.bin");
u8 *r2p_payload = sd_file_read(r2p_path, NULL);
is_ipl_updated(r2p_payload, r2p_path, h_cfg.updater2p ? true : false);
free(r2p_payload);
break;
}
path_len--;
}
free(r2p_path);
}
int parse_fss(launch_ctxt_t *ctxt, const char *path)
{ {
FIL fp; FIL fp;
@ -78,7 +106,7 @@ int parse_fss(launch_ctxt_t *ctxt, const char *value)
if (stock && ctxt->pkg1_id->kb <= KB_FIRMWARE_VERSION_620 && (!emu_cfg.enabled || h_cfg.emummc_force_disable)) if (stock && ctxt->pkg1_id->kb <= KB_FIRMWARE_VERSION_620 && (!emu_cfg.enabled || h_cfg.emummc_force_disable))
return 1; return 1;
if (f_open(&fp, value, FA_READ) != FR_OK) if (f_open(&fp, path, FA_READ) != FR_OK)
return 0; return 0;
ctxt->atmosphere = true; ctxt->atmosphere = true;
@ -139,6 +167,8 @@ int parse_fss(launch_ctxt_t *ctxt, const char *value)
gfx_printf("Done!\n"); gfx_printf("Done!\n");
f_close(&fp); f_close(&fp);
_update_r2p(path);
return 1; return 1;
} }

View file

@ -19,6 +19,6 @@
#include "hos.h" #include "hos.h"
int parse_fss(launch_ctxt_t *ctxt, const char *value); int parse_fss(launch_ctxt_t *ctxt, const char *path);
#endif #endif

View file

@ -862,6 +862,8 @@ static void _auto_launch_firmware()
h_cfg.autohosoff = atoi(kv->val); h_cfg.autohosoff = atoi(kv->val);
else if (!strcmp("autonogc", kv->key)) else if (!strcmp("autonogc", kv->key))
h_cfg.autonogc = atoi(kv->val); h_cfg.autonogc = atoi(kv->val);
else if (!strcmp("updater2p", kv->key))
h_cfg.updater2p = atoi(kv->val);
else if (!strcmp("brand", kv->key)) else if (!strcmp("brand", kv->key))
{ {
h_cfg.brand = malloc(strlen(kv->val) + 1); h_cfg.brand = malloc(strlen(kv->val) + 1);

View file

@ -43,6 +43,7 @@ void set_default_configuration()
h_cfg.backlight = 100; h_cfg.backlight = 100;
h_cfg.autohosoff = 0; h_cfg.autohosoff = 0;
h_cfg.autonogc = 1; h_cfg.autonogc = 1;
h_cfg.updater2p = 0;
h_cfg.brand = NULL; h_cfg.brand = NULL;
h_cfg.tagline = NULL; h_cfg.tagline = NULL;
h_cfg.errors = 0; h_cfg.errors = 0;
@ -108,6 +109,9 @@ int create_config_entry()
f_puts("\nautonogc=", &fp); f_puts("\nautonogc=", &fp);
itoa(h_cfg.autonogc, lbuf, 10); itoa(h_cfg.autonogc, lbuf, 10);
f_puts(lbuf, &fp); f_puts(lbuf, &fp);
f_puts("\nupdater2p=", &fp);
itoa(h_cfg.updater2p, lbuf, 10);
f_puts(lbuf, &fp);
if (h_cfg.brand) if (h_cfg.brand)
{ {
f_puts("\nbrand=", &fp); f_puts("\nbrand=", &fp);

View file

@ -29,6 +29,7 @@ typedef struct _hekate_config
u32 backlight; u32 backlight;
u32 autohosoff; u32 autohosoff;
u32 autonogc; u32 autonogc;
u32 updater2p;
char *brand; char *brand;
char *tagline; char *tagline;
// Global temporary config. // Global temporary config.

View file

@ -341,6 +341,8 @@ void load_saved_configuration()
h_cfg.autohosoff = atoi(kv->val); h_cfg.autohosoff = atoi(kv->val);
else if (!strcmp("autonogc", kv->key)) else if (!strcmp("autonogc", kv->key))
h_cfg.autonogc = atoi(kv->val); h_cfg.autonogc = atoi(kv->val);
else if (!strcmp("updater2p", kv->key))
h_cfg.updater2p = atoi(kv->val);
else if (!strcmp("brand", kv->key)) else if (!strcmp("brand", kv->key))
{ {
h_cfg.brand = malloc(strlen(kv->val) + 1); h_cfg.brand = malloc(strlen(kv->val) + 1);