NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
OSHardware.h
1/**
2 * For more details, see:
3 * https://www.gc-forever.com/yagcd/chap4.html#sec4
4 * https://www.gc-forever.com/yagcd/chap13.html#sec13
5 * https://wiibrew.org/wiki/Memory_map
6 */
7
8#ifndef RVL_SDK_OS_HARDWARE_H
9#define RVL_SDK_OS_HARDWARE_H
10#include <types.h>
11
12#include <revolution/DVD/dvd.h>
13#include <revolution/OS/OSAddress.h>
14#include <revolution/OS/OSThread.h>
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19// Forward declarations
20typedef struct OSContext OSContext;
21typedef struct OSExecParams OSExecParams;
22
23// Derive offsets for use with OSAddress functions
24#define __DEF_ADDR_OFFSETS(name, addr) \
25 static const u32 OS_PHYS_##name = (addr) - 0x80000000; \
26 static const u32 OS_CACHED_##name = (addr); \
27 static const u32 OS_UNCACHED_##name = (addr) + (0xC0000000 - 0x80000000);
28
29// Define a global variable in *CACHED* MEM1.
30// Can be accessed directly or with OSAddress functions.
31#define OS_DEF_GLOBAL_VAR(type, name, addr) \
32 /* Memory-mapped value for direct access */ \
33 type OS_##name AT_ADDRESS(addr); \
34 __DEF_ADDR_OFFSETS(name, addr)
35
36// Define a global array in *CACHED* MEM1.
37// Can be accessed directly or with OSAddress functions.
38#define OS_DEF_GLOBAL_ARR(type, name, arr, addr) \
39 /* Memory-mapped value for direct access */ \
40 type OS_##name arr AT_ADDRESS(addr); \
41 __DEF_ADDR_OFFSETS(name, addr)
42
43// Define an global variable in the hardware-register range.
44#define OS_DEF_HW_REG(type, name, addr) \
45 /* Memory-mapped value for direct access */ \
46 type OS_##name AT_ADDRESS(addr);
47
48typedef enum {
49 OS_BOOT_MAGIC_BOOTROM = 0xD15EA5E,
50 OS_BOOT_MAGIC_JTAG = 0xE5207C22,
51} OSBootMagic;
52
53typedef struct OSBootInfo {
54 DVDDiskID diskID; // at 0x0
55 u32 bootMagic; // at 0x20
56 u32 aplVersion; // at 0x24
57 u32 physMemSize; // at 0x28
58 u32 consoleType; // at 0x2C
59 void* arenaLo; // at 0x30
60 void* arenaHi; // at 0x34
61 void* fstStart; // at 0x38
62 u32 fstSize; // at 0x3C
64
65typedef struct OSDebugInterface {
66 BOOL usingDebugger; // at 0x0
67 u32 exceptionMask; // at 0x4
68 void* exceptionHook; // at 0x8
69 void* exceptionHookLR; // at 0xC
71
72typedef struct OSBI2 {
73 u32 dbgMonitorSize; // at 0x0
74 u32 simulatedMemSize; // at 0x4
75 u32 argumentOfs; // at 0x8
76 u32 debugFlag; // at 0xC
77 u32 trackLocation; // at 0x10
78 u32 trackSize; // at 0x14
79 u32 countryCode; // at 0x18
80 u32 WORD_0x1C;
81 u32 lastInsert;
82 u32 padSpec; // at 0x24
83 u32 totalTextDataLimit; // at 0x28
84 u32 simulatedMem2Size; // at 0x2C
85} OSBI2;
86
87/**
88 * 0x80000000 - 0x80000100
89 */
90// clang-format off
91OS_DEF_GLOBAL_VAR(OSBootInfo, BOOT_INFO, 0x80000000);
92OS_DEF_GLOBAL_VAR(OSDebugInterface, DEBUG_INTERFACE, 0x80000040);
93OS_DEF_GLOBAL_ARR(u8, DB_INTEGRATOR_HOOK, [0x24], 0x80000060);
94OS_DEF_GLOBAL_VAR(OSContext*, CURRENT_CONTEXT_PHYS, 0x800000C0);
95OS_DEF_GLOBAL_VAR(u32, PREV_INTR_MASK, 0x800000C4);
96OS_DEF_GLOBAL_VAR(u32, CURRENT_INTR_MASK, 0x800000C8);
97OS_DEF_GLOBAL_VAR(u32, TV_FORMAT, 0x800000CC);
98OS_DEF_GLOBAL_VAR(u32, ARAM_SIZE, 0x800000D0);
99OS_DEF_GLOBAL_VAR(OSContext*, CURRENT_CONTEXT, 0x800000D4);
100OS_DEF_GLOBAL_VAR(OSContext*, CURRENT_FPU_CONTEXT, 0x800000D8);
101OS_DEF_GLOBAL_VAR(OSThreadQueue, THREAD_QUEUE, 0x800000DC);
102OS_DEF_GLOBAL_VAR(OSThread*, CURRENT_THREAD, 0x800000E4);
103OS_DEF_GLOBAL_VAR(u32, DEBUG_MONITOR_SIZE, 0x800000E8);
104OS_DEF_GLOBAL_VAR(void*, DEBUG_MONITOR, 0x800000EC);
105OS_DEF_GLOBAL_VAR(u32, SIMULATED_MEM_SIZE, 0x800000F0);
106OS_DEF_GLOBAL_VAR(OSBI2*, DVD_BI2, 0x800000F4);
107OS_DEF_GLOBAL_VAR(u32, BUS_CLOCK_SPEED, 0x800000F8);
108OS_DEF_GLOBAL_VAR(u32, CPU_CLOCK_SPEED, 0x800000FC);
109// clang-format on
110
111/**
112 * 0x80003000 - 0x80003F00
113 */
114// clang-format off
115OS_DEF_GLOBAL_ARR(void*, EXCEPTION_TABLE, [15], 0x80003000);
116OS_DEF_GLOBAL_VAR(void*, INTR_HANDLER_TABLE, 0x80003040);
117OS_DEF_GLOBAL_ARR(volatile s32, EXI_LAST_INSERT, [2], 0x800030C0);
118OS_DEF_GLOBAL_VAR(void*, FIRST_REL, 0x800030C8);
119OS_DEF_GLOBAL_VAR(void*, LAST_REL, 0x800030CC);
120OS_DEF_GLOBAL_VAR(void*, REL_NAME_TABLE, 0x800030D0);
121OS_DEF_GLOBAL_VAR(u32, DOL_TOTAL_TEXT_DATA, 0x800030D4);
122OS_DEF_GLOBAL_VAR(s64, SYSTEM_TIME, 0x800030D8);
123OS_DEF_GLOBAL_VAR(u8, PAD_FLAGS, 0x800030E3);
124OS_DEF_GLOBAL_VAR(u16, GC_PAD_3_BTN, 0x800030E4);
125OS_DEF_GLOBAL_VAR(volatile u16, DVD_DEVICE_CODE, 0x800030E6);
126OS_DEF_GLOBAL_VAR(u8, BI2_DEBUG_FLAG, 0x800030E8);
127OS_DEF_GLOBAL_VAR(u8, PAD_SPEC, 0x800030E9);
128OS_DEF_GLOBAL_VAR(OSExecParams*, DOL_EXEC_PARAMS, 0x800030F0);
129OS_DEF_GLOBAL_VAR(u32, PHYSICAL_MEM1_SIZE, 0x80003100);
130OS_DEF_GLOBAL_VAR(u32, SIMULATED_MEM1_SIZE, 0x80003104);
131OS_DEF_GLOBAL_VAR(void*, USABLE_MEM1_START, 0x8000310C);
132OS_DEF_GLOBAL_VAR(void*, USABLE_MEM1_END, 0x80003110);
133OS_DEF_GLOBAL_VAR(u32, PHYSICAL_MEM2_SIZE, 0x80003118);
134OS_DEF_GLOBAL_VAR(u32, SIMULATED_MEM2_SIZE, 0x8000311C);
135OS_DEF_GLOBAL_VAR(void*, ACCESSIBLE_MEM2_END, 0x80003120);
136OS_DEF_GLOBAL_VAR(void*, USABLE_MEM2_START, 0x80003124);
137OS_DEF_GLOBAL_VAR(void*, USABLE_MEM2_END, 0x80003128);
138OS_DEF_GLOBAL_VAR(void*, IPC_BUFFER_START, 0x80003130);
139OS_DEF_GLOBAL_VAR(void*, IPC_BUFFER_END, 0x80003134);
140OS_DEF_GLOBAL_VAR(u32, HOLLYWOOD_REV, 0x80003138);
141OS_DEF_GLOBAL_VAR(u32, IOS_VERSION, 0x80003140);
142OS_DEF_GLOBAL_VAR(u32, IOS_BUILD_DATE, 0x80003144);
143OS_DEF_GLOBAL_VAR(void*, IOS_HEAP_START, 0x80003148);
144OS_DEF_GLOBAL_VAR(void*, IOS_HEAP_END, 0x8000314C);
145OS_DEF_GLOBAL_VAR(u32, GDDR_VENDOR_CODE, 0x80003158);
146OS_DEF_GLOBAL_VAR(u8, BOOT_PROGRAM_TARGET, 0x8000315C);
147OS_DEF_GLOBAL_VAR(u8, APPLOADER_TARGET, 0x8000315D);
148OS_DEF_GLOBAL_VAR(BOOL, MIOS_SHUTDOWN_FLAG, 0x80003164);
149OS_DEF_GLOBAL_VAR(u32, CURRENT_APP_NAME, 0x80003180);
150OS_DEF_GLOBAL_VAR(u8, CURRENT_APP_TYPE, 0x80003184);
151OS_DEF_GLOBAL_VAR(u32, MINIMUM_IOS_VERSION, 0x80003188);
152OS_DEF_GLOBAL_VAR(u32, NAND_TITLE_LAUNCH_CODE, 0x8000318C);
153OS_DEF_GLOBAL_VAR(u32, NAND_TITLE_RETURN_CODE, 0x80003190);
154OS_DEF_GLOBAL_VAR(u32, BOOT_PARTITION_TYPE, 0x80003194);
155OS_DEF_GLOBAL_VAR(u32, BOOT_PARTITION_OFFSET, 0x80003198);
156OS_DEF_GLOBAL_VAR(s8, WIFI_AFH_CHANNEL, 0x800031A2);
157OS_DEF_GLOBAL_ARR(u8, NWC24_USER_ID_BUFFER, [32], 0x800031C0);
158OS_DEF_GLOBAL_VAR(u64, NWC24_USER_ID, 0x800031C0);
159OS_DEF_GLOBAL_ARR(u8, SC_PRDINFO, [0x100], 0x80003800);
160// clang-format on
161
162/**
163 * PI hardware globals
164 */
165volatile u32 PI_HW_REGS[10] AT_ADDRESS(0xCC003000);
166typedef enum {
167 PI_INTSR, //!< 0xCC003000
168 PI_INTMR, //!< 0xCC003004
169 PI_REG_0x8, //!< 0xCC003008
170 PI_REG_0xC, //!< 0xCC00300C
171 PI_REG_0x10, //!< 0xCC003010
172 PI_REG_0x14, //!< 0xCC003014
173 PI_REG_0x18, //!< 0xCC003018
174 PI_REG_0x1C, //!< 0xCC00301C
175 PI_REG_0x20, //!< 0xCC003020
176 PI_RESET, //!< 0xCC003024
177 // . . .
178} PIHwReg;
179
180// INTSR - Interrupt Cause Register
181#define PI_INTSR_ERROR (1 << 0)
182#define PI_INTSR_RSW (1 << 1)
183#define PI_INTSR_DI (1 << 2)
184#define PI_INTSR_SI (1 << 3)
185#define PI_INTSR_EXI (1 << 4)
186#define PI_INTSR_AI (1 << 5)
187#define PI_INTSR_DSP (1 << 6)
188#define PI_INTSR_MEM (1 << 7)
189#define PI_INTSR_VI (1 << 8)
190#define PI_INTSR_PE_TOKEN (1 << 9)
191#define PI_INTSR_PE_FINISH (1 << 10)
192#define PI_INTSR_CP (1 << 11)
193#define PI_INTSR_DEBUG (1 << 12)
194#define PI_INTSR_HSP (1 << 13)
195#define PI_INTSR_ACR (1 << 14)
196#define PI_INTSR_RSWST (1 << 16)
197
198// INTMR - Interrupt Mask Register
199#define PI_INTMR_ERROR (1 << 0)
200#define PI_INTMR_RSW (1 << 1)
201#define PI_INTMR_DI (1 << 2)
202#define PI_INTMR_SI (1 << 3)
203#define PI_INTMR_EXI (1 << 4)
204#define PI_INTMR_AI (1 << 5)
205#define PI_INTMR_DSP (1 << 6)
206#define PI_INTMR_MEM (1 << 7)
207#define PI_INTMR_VI (1 << 8)
208#define PI_INTMR_PE_TOKEN (1 << 9)
209#define PI_INTMR_PE_FINISH (1 << 10)
210#define PI_INTMR_CP (1 << 11)
211#define PI_INTMR_DEBUG (1 << 12)
212#define PI_INTMR_HSP (1 << 13)
213#define PI_INTMR_ACR (1 << 14)
214
215/**
216 * MI hardware registers
217 */
218volatile u16 MI_HW_REGS[20] AT_ADDRESS(0xCC004000);
219typedef enum {
220 MI_PAGE_MEM0_H, //!< 0xCC004000
221 MI_PAGE_MEM0_L, //!< 0xCC004002
222 MI_PAGE_MEM1_H, //!< 0xCC004004
223 MI_PAGE_MEM1_L, //!< 0xCC004006
224 MI_PAGE_MEM2_H, //!< 0xCC004008
225 MI_PAGE_MEM2_L, //!< 0xCC00400A
226 MI_PAGE_MEM3_H, //!< 0xCC00400C
227 MI_PAGE_MEM3_L, //!< 0xCC00400E
228 MI_PROT_MEM0, //!< 0xCC004010
229 MI_PROT_MEM1, //!< 0xCC004012
230 MI_PROT_MEM2, //!< 0xCC004014
231 MI_PROT_MEM3, //!< 0xCC004016
232 MI_REG_0x18, //!< 0xCC004018
233 MI_REG_0x1A, //!< 0xCC00401A
234 MI_INTMR, //!< 0xCC00401C
235 MI_INTSR, //!< 0xCC00401E
236 MI_REG_0x20, //!< 0xCC004020
237 MI_ADDRLO, //!< 0xCC004022
238 MI_ADDRHI, //!< 0xCC004024
239 MI_REG_0x26, //!< 0xCC004026
240 MI_REG_0x28, //!< 0xCC004028
241 // . . .
242} MIHwReg;
243
244// INTMR - Interrupt Mask Register
245#define MI_INTMR_MEM0 (1 << 0)
246#define MI_INTMR_MEM1 (1 << 1)
247#define MI_INTMR_MEM2 (1 << 2)
248#define MI_INTMR_MEM3 (1 << 3)
249#define MI_INTMR_ADDR (1 << 4)
250
251// INTSR - Interrupt Cause Register
252#define MI_INTSR_MEM0 (1 << 0)
253#define MI_INTSR_MEM1 (1 << 1)
254#define MI_INTSR_MEM2 (1 << 2)
255#define MI_INTSR_MEM3 (1 << 3)
256#define MI_INTSR_ADDR (1 << 4)
257
258/**
259 * DI hardware registers
260 */
261volatile u32 DI_HW_REGS[10] AT_ADDRESS(0xCD006000);
262typedef enum {
263 DI_DMA_ADDR = 5, // !< 0xCD006014
264 DI_CONFIG = 9, // !< 0xCD006024
265} DIHwReg;
266
267#ifdef __cplusplus
268}
269#endif
270#endif