feat: Mariko warmboot extraction, hekate_ipl.ini update, docs
- Add warmboot_extractor (Sthetix-derived) for PKG1 extraction and sd save - m_entry_fixMarikoWarmbootSleep: generate wb_xx.bin, INI warmboot= for [CFW-EmuMMC] or section chooser; blank-line handling for Hekate parsing - Menu: Mariko Sleep Fix under Bequemlichkeit; theme fix under MainAMS - README: Funktionen + Danksagungen for warmboot/Fuse-Mismatch workaround - Fix listdir memory corruption in Mac special-folder cleanup (apl.c) Made-with: Cursor
This commit is contained in:
86
source/warmboot/warmboot_extractor.h
Normal file
86
source/warmboot/warmboot_extractor.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Warmboot Extractor
|
||||
* Based on Atmosphere fusee_setup_horizon.cpp
|
||||
*
|
||||
* Copyright (c) 2018-2025 Atmosphère-NX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License, version 2, as published
|
||||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _WARMBOOT_EXTRACTOR_H_
|
||||
#define _WARMBOOT_EXTRACTOR_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <utils/types.h>
|
||||
|
||||
// Warmboot binary size constraints
|
||||
#define WARMBOOT_MIN_SIZE 0x800 // 2048 bytes
|
||||
#define WARMBOOT_MAX_SIZE 0x1000 // 4096 bytes
|
||||
|
||||
// Package1 locations
|
||||
#define PKG1_OFFSET 0x100000 // 1MB into BOOT0
|
||||
#define PKG1_SIZE 0x40000 // 256KB
|
||||
|
||||
// PK11 magic
|
||||
#define PK11_MAGIC 0x31314B50 // "PK11" in little endian
|
||||
|
||||
// Known payload signatures to skip
|
||||
#define SIG_NX_BOOTLOADER 0xD5034FDF
|
||||
#define SIG_SECURE_MONITOR_1 0xE328F0C0
|
||||
#define SIG_SECURE_MONITOR_2 0xF0C0A7F0
|
||||
|
||||
// Warmboot metadata structure
|
||||
typedef struct {
|
||||
u32 magic; // "WBT0" (0x30544257)
|
||||
u32 target_firmware; // Target firmware version
|
||||
u32 reserved[2]; // Reserved fields
|
||||
} warmboot_metadata_t;
|
||||
|
||||
// Warmboot extraction result
|
||||
typedef struct {
|
||||
u8 *data; // Warmboot binary data
|
||||
u32 size; // Size of warmboot binary
|
||||
u8 fuse_count; // Burnt fuse count (used for naming: wb_XX.bin)
|
||||
u8 burnt_fuses; // Actual burnt fuses on device (same as fuse_count)
|
||||
u32 target_firmware; // Detected target firmware (0 if unknown, for display only)
|
||||
bool is_erista; // True if Erista, false if Mariko
|
||||
|
||||
// Debug fields for troubleshooting
|
||||
u32 pk11_offset;
|
||||
u32 pk11_header[8];
|
||||
u32 sig_found[3];
|
||||
u32 debug_ptr_offset;
|
||||
u32 debug_layout_type;
|
||||
u8 debug_warmboot_preview[16];
|
||||
u8 pkg1_version; // Package1 version byte at offset 0x1F
|
||||
u8 pkg1_date[12]; // Package1 date string (8 chars + null)
|
||||
} warmboot_info_t;
|
||||
|
||||
// Extraction error codes
|
||||
typedef enum {
|
||||
WB_SUCCESS = 0,
|
||||
WB_ERR_NULL_INFO,
|
||||
WB_ERR_ERISTA_NOT_SUPPORTED,
|
||||
WB_ERR_MALLOC_PKG1,
|
||||
WB_ERR_MMC_INIT,
|
||||
WB_ERR_MMC_PARTITION,
|
||||
WB_ERR_MMC_READ,
|
||||
WB_ERR_DECRYPT_VERIFY,
|
||||
WB_ERR_PK11_MAGIC,
|
||||
WB_ERR_WB_SIZE_INVALID,
|
||||
WB_ERR_MALLOC_WB,
|
||||
} wb_extract_error_t;
|
||||
|
||||
// Function prototypes
|
||||
wb_extract_error_t extract_warmboot_from_pkg1_ex(warmboot_info_t *wb_info);
|
||||
bool extract_warmboot_from_pkg1(warmboot_info_t *wb_info);
|
||||
bool save_warmboot_to_sd(const warmboot_info_t *wb_info, const char *path);
|
||||
u8 get_burnt_fuses(void);
|
||||
bool is_mariko(void);
|
||||
void get_warmboot_path(char *path, size_t path_size, u8 fuse_count);
|
||||
const char *wb_error_to_string(wb_extract_error_t err);
|
||||
|
||||
#endif /* _WARMBOOT_EXTRACTOR_H_ */
|
||||
|
||||
Reference in New Issue
Block a user