hos: add NX BIT/BC structures and utilize them

These are used to communicate between bootloader stages and pass config.
The NX Boot Config is now passed as is from PKG2 partition.
This commit is contained in:
CTCaer
2025-08-08 15:49:47 +03:00
parent 216f579527
commit 3a9689b46e
3 changed files with 128 additions and 70 deletions

View File

@@ -110,6 +110,56 @@ typedef struct _pk11_hdr_t
/* 0x1C */ u32 sm_off;
} pk11_hdr_t;
/*
* NX BIT - Secure monitor mailbox
*
* On older versions the Tegra BIT was remaining intact.
* The bootloader info from BCT was copied in the mailbox at 0x40002E10.
* On >= 4.0.0 the boot reason was replaced by BCT boot type.
* On newer versions (>= 7.0.0) the Tegra BIT is replaced with NX BIT.
* That also includes secmon state mailbox and pkg1 and pkg11 headers.
*/
#define NX_BIT1_MAILBOX_ADDR 0x40002E00
#define NX_BIT7_MAILBOX_ADDR 0x40000000
enum
{
SECMON_STATE_NOT_READY = 0,
PKG1_STATE_NOT_READY = 0,
PKG1_STATE_NXBC_COPIED = 1,
PKG1_STATE_DRAM_READY = 2,
PKG1_STATE_PKG2_READY_OLD = 3,
PKG1_STATE_PKG2_READY = 4
};
#define NX_BIT_BL_ATTR_SAFE_MODE BIT(0)
#define NX_BIT_BL_ATTR_SMC_BLACKLIST_STANDARD BIT(1) // Accounted only on >= 8.0.0.
#define NX_BIT_BL_ATTR_SMC_BLACKLIST_DEVICEUD BIT(2) // Accounted only on >= 8.0.0.
#define NX_BIT_BL_ATTR_SMC_BLACKLIST_SAFEMODE BIT(3) // Accounted only on >= 8.0.0.
typedef struct _nx_bit_t
{
/* 0x00 */ u32 secldr_tmr_start;
/* 0x04 */ u32 secldr_tmr_end;
/* 0x08 */ u32 secmon_tmr_start;
/* 0x0C */ u32 secmon_tmr_end;
/* 0x10 */ u32 bl_version;
/* 0x14 */ u32 bl_start_block;
/* 0x18 */ u32 bl_start_page;
/* 0x1C */ u32 bl_attribute; // bit0: Safe, bit1-4: SMC blacklist mask.
/* 0x20 */ u32 boot_type; // 0: None, 1: Coldboot, 2: RMC, 3: UART, 4: Exit RCM.
/* 0x24 */ u8 padding_nxbit[12];
/* 0x30 */ pk1_hdr_t pk1_hdr; // (>= 7.0.0).
/* 0x50 */ pk11_hdr_t pk11_hdr; // (>= 7.0.0).
/* 0x70 */ u8 padding_pkg1[0x88];
/* 0xF8 */ vu32 secldr_state;
/* 0xFC */ vu32 secmon_state;
u8 padding_mail[0x100];
} nx_bit_t;
const pkg1_id_t *pkg1_get_latest();
const pkg1_id_t *pkg1_identify(u8 *pkg1);
int pkg1_decrypt(const pkg1_id_t *id, u8 *pkg1);