2015-08-04 21:57:37 -04:00
|
|
|
/*
|
|
|
|
|
* firm.h
|
|
|
|
|
*/
|
2016-03-06 03:41:07 +01:00
|
|
|
|
2016-03-11 15:08:05 +01:00
|
|
|
#pragma once
|
2015-08-04 21:57:37 -04:00
|
|
|
|
2015-08-21 14:11:23 -04:00
|
|
|
#include "types.h"
|
|
|
|
|
|
2016-04-02 22:02:08 +02:00
|
|
|
#define PDN_MPCORE_CFG (*(vu32 *)0x10140FFC)
|
|
|
|
|
#define PDN_SPI_CNT (*(vu32 *)0x101401C0)
|
2016-05-09 03:41:00 +02:00
|
|
|
#define CFG_BOOTENV (*(vu32 *)0x10010000)
|
2016-02-08 03:37:03 +01:00
|
|
|
|
2016-03-11 15:08:05 +01:00
|
|
|
//FIRM Header layout
|
|
|
|
|
typedef struct firmSectionHeader {
|
|
|
|
|
u32 offset;
|
|
|
|
|
u8 *address;
|
|
|
|
|
u32 size;
|
|
|
|
|
u32 procType;
|
|
|
|
|
u8 hash[0x20];
|
|
|
|
|
} firmSectionHeader;
|
|
|
|
|
|
|
|
|
|
typedef struct firmHeader {
|
|
|
|
|
u32 magic;
|
|
|
|
|
u32 reserved1;
|
|
|
|
|
u8 *arm11Entry;
|
|
|
|
|
u8 *arm9Entry;
|
|
|
|
|
u8 reserved2[0x30];
|
|
|
|
|
firmSectionHeader section[4];
|
|
|
|
|
} firmHeader;
|
|
|
|
|
|
2016-04-05 05:27:28 +02:00
|
|
|
typedef struct patchData {
|
|
|
|
|
u32 offset[2];
|
|
|
|
|
union {
|
|
|
|
|
u8 type0[8];
|
|
|
|
|
u16 type1;
|
|
|
|
|
} patch;
|
|
|
|
|
u32 type;
|
|
|
|
|
} patchData;
|
|
|
|
|
|
2016-04-11 05:15:44 +02:00
|
|
|
static inline void loadFirm(u32 firmType, u32 externalFirm);
|
2016-05-03 01:17:22 +02:00
|
|
|
static inline void patchNativeFirm(u32 nandType, u32 emuHeader, u32 a9lhMode);
|
2016-04-11 05:15:44 +02:00
|
|
|
static inline void patchEmuNAND(u8 *arm9Section, u8 *proc9Offset, u32 emuHeader);
|
|
|
|
|
static inline void patchReboots(u8 *arm9Section, u8 *proc9Offset);
|
2016-05-07 23:40:02 +02:00
|
|
|
static inline void copySection0AndInjectLoader(void);
|
2016-05-03 01:17:22 +02:00
|
|
|
static inline void patchLegacyFirm(u32 firmType);
|
|
|
|
|
static inline void patchSafeFirm(void);
|
|
|
|
|
static void patchFirmWrites(u8 *arm9Section, u32 mode);
|
2016-05-09 03:41:00 +02:00
|
|
|
static inline void launchFirm(u32 firstSectionToCopy, u32 bootType);
|