diff --git a/exosphere/src/exocfg.c b/exosphere/src/exocfg.c index 82761b318..4fbe8996e 100644 --- a/exosphere/src/exocfg.c +++ b/exosphere/src/exocfg.c @@ -27,9 +27,12 @@ /* TODO: Should this be at a non-static location? */ #define MAILBOX_EXOSPHERE_CONFIG (*((volatile exosphere_config_t *)(MAILBOX_BASE + 0xE40ULL))) -static exosphere_config_t g_exosphere_cfg = {MAGIC_EXOSPHERE_BOOTCONFIG, EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG}; +static exosphere_config_t g_exosphere_cfg = {MAGIC_EXOSPHERE_BOOTCONFIG, EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG, EXOSPHERE_FLAGS_DEFAULT}; static bool g_has_loaded_config = false; +#define EXOSPHERE_CHECK_FLAG(flag) ((g_exosphere_cfg.flags & flag) != 0) + + /* Read config out of IRAM, return target firmware version. */ unsigned int exosphere_load_config(void) { if (g_has_loaded_config) { @@ -37,8 +40,13 @@ unsigned int exosphere_load_config(void) { } g_has_loaded_config = true; - if (MAILBOX_EXOSPHERE_CONFIG.magic == MAGIC_EXOSPHERE_BOOTCONFIG) { + const unsigned int magic = MAILBOX_EXOSPHERE_CONFIG.magic; + + if (magic == MAGIC_EXOSPHERE_BOOTCONFIG) { g_exosphere_cfg = MAILBOX_EXOSPHERE_CONFIG; + } else if (magic == MAGIC_EXOSPHERE_BOOTCONFIG_0) { + g_exosphere_cfg = MAILBOX_EXOSPHERE_CONFIG; + g_exosphere_cfg.flags = EXOSPHERE_FLAGS_DEFAULT; } return g_exosphere_cfg.target_firmware; @@ -50,4 +58,12 @@ unsigned int exosphere_get_target_firmware(void) { } return g_exosphere_cfg.target_firmware; -} \ No newline at end of file +} + +unsigned int exosphere_get_should_perform_620_keygen(void) { + if (!g_has_loaded_config) { + generic_panic(); + } + + return g_exosphere_cfg.target_firmware >= EXOSPHERE_TARGET_FIRMWARE_620 && EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_PERFORM_620_KEYGEN); +} diff --git a/exosphere/src/exocfg.h b/exosphere/src/exocfg.h index 5ed924b48..2a1dc810d 100644 --- a/exosphere/src/exocfg.h +++ b/exosphere/src/exocfg.h @@ -25,7 +25,9 @@ /* This serves to set configuration for *exosphere itself*, separate from the SecMon Exosphere mimics. */ /* "XBC0" */ -#define MAGIC_EXOSPHERE_BOOTCONFIG (0x30434258) +#define MAGIC_EXOSPHERE_BOOTCONFIG_0 (0x30434258) +/* "XBC1" */ +#define MAGIC_EXOSPHERE_BOOTCONFIG (0x31434258) #define EXOSPHERE_TARGET_FIRMWARE_100 1 #define EXOSPHERE_TARGET_FIRMWARE_200 2 @@ -33,9 +35,12 @@ #define EXOSPHERE_TARGET_FIRMWARE_400 4 #define EXOSPHERE_TARGET_FIRMWARE_500 5 #define EXOSPHERE_TARGET_FIRMWARE_600 6 +#define EXOSPHERE_TARGET_FIRMWARE_620 7 + +#define EXOSPHERE_TARGET_FIRMWARE_CURRENT EXOSPHERE_TARGET_FIRMWARE_620 /* TODO: What should this be, for release? */ -#define EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG EXOSPHERE_TARGET_FIRMWARE_600 +#define EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG EXOSPHERE_TARGET_FIRMWARE_CURRENT #define EXOSPHERE_LOOSEN_PACKAGE2_RESTRICTIONS_FOR_DEBUG 1 #define MAILBOX_BASE_PHYS (MMIO_GET_DEVICE_PA(MMIO_DEVID_NXBOOTLOADER_MAILBOX)) @@ -43,17 +48,26 @@ /* TODO: Should this be at a non-static location? */ #define MAILBOX_EXOSPHERE_CONFIG_PHYS (*((volatile exosphere_config_t *)(MAILBOX_BASE_PHYS + 0xE40ULL))) +#define EXOSPHERE_FLAGS_DEFAULT 0x00000000 +#define EXOSPHERE_FLAG_PERFORM_620_KEYGEN (1 << 0u) typedef struct { unsigned int magic; unsigned int target_firmware; + unsigned int flags; } exosphere_config_t; unsigned int exosphere_load_config(void); unsigned int exosphere_get_target_firmware(void); +unsigned int exosphere_get_should_perform_620_keygen(void); static inline unsigned int exosphere_get_target_firmware_for_init(void) { - return MAILBOX_EXOSPHERE_CONFIG_PHYS.magic == MAGIC_EXOSPHERE_BOOTCONFIG ? MAILBOX_EXOSPHERE_CONFIG_PHYS.target_firmware : EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG; + const unsigned int magic = MAILBOX_EXOSPHERE_CONFIG_PHYS.magic; + if (magic == MAGIC_EXOSPHERE_BOOTCONFIG || magic == MAGIC_EXOSPHERE_BOOTCONFIG_0) { + return MAILBOX_EXOSPHERE_CONFIG_PHYS.target_firmware; + } else { + return EXOSPHERE_TARGET_FIRMWARE_DEFAULT_FOR_DEBUG; + } } #endif diff --git a/exosphere/src/package2.c b/exosphere/src/package2.c index 1281f9498..94fa821d5 100644 --- a/exosphere/src/package2.c +++ b/exosphere/src/package2.c @@ -486,6 +486,9 @@ void load_package2(coldboot_crt0_reloc_list_t *reloc_list) { case EXOSPHERE_TARGET_FIRMWARE_600: MAKE_REG32(PMC_BASE + 0x360) = 0x87; break; + case EXOSPHERE_TARGET_FIRMWARE_620: + MAKE_REG32(PMC_BASE + 0x360) = 0xA8; + break; } }