diff options
-rw-r--r-- | arm9/lib/include/OS_entropy.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 3 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 14 | ||||
-rw-r--r-- | arm9/lib/include/OS_thread.h | 23 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 49 | ||||
-rw-r--r-- | arm9/lib/src/OS_entropy.c | 28 |
6 files changed, 127 insertions, 0 deletions
diff --git a/arm9/lib/include/OS_entropy.h b/arm9/lib/include/OS_entropy.h new file mode 100644 index 00000000..f4eef4b5 --- /dev/null +++ b/arm9/lib/include/OS_entropy.h @@ -0,0 +1,10 @@ +// +// Created by red031000 on 2020-05-03. +// + +#ifndef POKEDIAMOND_OS_ENTROPY_H +#define POKEDIAMOND_OS_ENTROPY_H + +void OS_GetLowEntropyData(u32 * arr); + +#endif //POKEDIAMOND_OS_ENTROPY_H diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index c556253a..1ff2837c 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -7,7 +7,10 @@ #include "types.h" #include "consts.h" +#include "OS_spinLock.h" +#include "OS_thread.h" #include "OS_protectionRegion.h" +#include "OS_entropy.h" #include "OS_arena.h" #include "OS_alloc.h" #include "OS_system.h" diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h new file mode 100644 index 00000000..b7f0a571 --- /dev/null +++ b/arm9/lib/include/OS_spinLock.h @@ -0,0 +1,14 @@ +// +// Created by red031000 on 2020-05-03. +// + +#ifndef POKEDIAMOND_OS_SPINLOCK_H +#define POKEDIAMOND_OS_SPINLOCK_H + +typedef volatile struct OSLockWord { + u32 lockFlag; + u16 ownerID; + u16 extension; +} OSLockWord; + +#endif //POKEDIAMOND_OS_SPINLOCK_H diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h new file mode 100644 index 00000000..4fb70bf7 --- /dev/null +++ b/arm9/lib/include/OS_thread.h @@ -0,0 +1,23 @@ +// +// Created by red031000 on 2020-05-03. +// + +#ifndef POKEDIAMOND_OS_THREAD_H +#define POKEDIAMOND_OS_THREAD_H + +typedef struct _OSThread OSThread; + +typedef struct OSThreadInfo { + u16 isNeedRescheduling; + u16 irqDepth; + OSThread* current; + OSThread* list; + void* switchCallback; // type: OSSwitchThreadCallback +} OSThreadInfo; + +struct _OSThread +{ + u8 padding[0x80]; //todo: not the correct size but idfk +}; + +#endif //POKEDIAMOND_OS_THREAD_H diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h index 14820c39..ddbd8883 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -26,6 +26,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure #define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer #define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory +#define HW_MAIN_MEM_SYSTEM (HW_MAIN_MEM + 0x007ffc00) #define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE) #define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) #define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE) @@ -42,4 +43,52 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM) #define OSi_WRAM_MAIN_ARENA_LO_DEFAULT (HW_WRAM) +#include "OS_thread.h" //not ideal but it's necessary +#include "OS_spinLock.h" + +typedef struct { + u8 bootCheckInfo[0x20]; // 000-01f: 32byte boot check info + u32 resetParameter; // 020-023: 4byte reset parameter + u8 padding5[0x8]; // 024-02c: (8byte) + u32 romBaseOffset; // 02c-02f: 4byte ROM offset of own program + u8 cartridgeModuleInfo[12]; // 030-03b: 12byte cartridge module info + u32 vblankCount; // 03c-03f: 4byte V-Blank Count + u8 wmBootBuf[0x40]; // 040-07f: 64byte WM multiboot buffer + u8 nvramUserInfo[0x100]; // 080-17f: 256bytes NVRAM user info + u8 isd_reserved1[0x20]; // 180-19f: 32bytes ISDebugger reserved + u8 arenaInfo[0x48]; // 1a0-1e7: 72byte Arena information + u8 real_time_clock[8]; // 1e8-1ef: 8bytes RTC + u32 dmaClearBuf[4]; // 1f0-1ff: 16bytes DMA clear information buffer (for ARM9-TEG) + u8 rom_header[0x160]; // 200-35f: 352bytes ROM registration area info storage buffer + u8 isd_reserved2[32]; // 360-37f: 32bytes ISDebugger reserved + u32 pxiSignalParam[2]; // 380-387: 8bytes Param for PXI Signal + u32 pxiHandleChecker[2]; // 388-38f: 8bytes Flag for PXI Command Handler Installed + u32 mic_last_address; // 390-393: 4bytes MIC latest sampling result storage address + u16 mic_sampling_data; // 394-395: 2bytes MIC sampling result + u16 wm_callback_control; // 396-397: 2bytes Parameter for WM callback synchronization + u16 wm_rssi_pool; // 398-399: 2bytes Random number source depends on WM received signal intensity + u8 padding3[2]; // 39a-39b: (2bytes) + u32 component_param; // 39c-39f: 4bytes Parameter for Component synchronization + OSThreadInfo *threadinfo_mainp; // 3a0-3a3: 4bytes Verify that the pointer to ARM9 thread information is initial value 0 + OSThreadInfo *threadinfo_subp; // 3a4-3a7: 4bytes Verify that the pointer to ARM7 thread information is initial value 0 + u16 button_XY; // 3a8-3a9: 2bytes XY button information storage location + u8 touch_panel[4]; // 3aa-3ad: 4bytes Touch Screen information storage location + u16 autoloadSync; // 3ae-3af: 2bytes autoload sync between processors + u32 lockIDFlag_mainp[2]; // 3b0-3b7: 8bytes lockID management flag (ARM9) + u32 lockIDFlag_subp[2]; // 3b8-3bf: 8bytes lockID management flag (ARM7) + struct OSLockWord lock_VRAM_C; // 3c0-3c7: 8bytes C - lock buffer + struct OSLockWord lock_VRAM_D; // 3c8-3cf: 8bytes VRAM-D - lock buffer + struct OSLockWord lock_WRAM_BLOCK0; // 3d0-3d7: 8bytes Block0 - lock buffer + struct OSLockWord lock_WRAM_BLOCK1; // 3d8-3df: 8bytes CPU internal work RAM - Block1 - lock buffer + struct OSLockWord lock_CARD; // 3e0-3e7: 8bytes Game Card - lock buffer + struct OSLockWord lock_CARTRIDGE; // 3e8-3ef: 8bytes DS Pak - lock buffer + struct OSLockWord lock_INIT; // 3f0-3f7: 8bytes Initialization lock buffer + u16 mmem_checker_mainp; // 3f8-3f9: 2bytes MainMomory Size Checker for Main processor + u16 mmem_checker_subp; // 3fa-3fb: 2bytes MainMomory Size Checker for Sub processor + u8 padding4[2]; // 3fc-3fd: (2bytes) + u16 command_area; // 3fe-3ff: 2bytes Command Area +} OSSystemWork; + +#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM) + #endif
\ No newline at end of file diff --git a/arm9/lib/src/OS_entropy.c b/arm9/lib/src/OS_entropy.c new file mode 100644 index 00000000..bfc95882 --- /dev/null +++ b/arm9/lib/src/OS_entropy.c @@ -0,0 +1,28 @@ +// +// Created by red031000 on 2020-05-03. +// + +#include "function_target.h" +#include "consts.h" +#include "OS_entropy.h" + +u32 * const HW_REG_006 = (u32 *) 0x04000006; +u32 * const HW_REG_130 = (u32 *) 0x04000130; +u32 * const HW_REG_600 = (u32 *) 0x04000600; + +u32 * const OSi_TickCounter = (u32 *) 0x021D37B4; + +ARM_FUNC void OS_GetLowEntropyData(u32 * arr) +{ + OSSystemWork* work = OS_GetSystemWork(); + u16 x = *((u16 *)HW_REG_006); + u8 * nvramUserInfo = work->nvramUserInfo; + u8 r5 = nvramUserInfo[0x74]; + arr[0] = (OS_GetTickLo()<<0x10) | x ; + arr[1] = (OSi_TickCounter[0]<<0x10) ^ r5[2]; + u32 what = OSi_TickCounter[0]; + what = OSi_TickCounter[1]; + arr[2] = *((u32 *)r4) ^ what ^ *(u32 *)((u8 *)work+0x3c); + arr[2] ^= *HW_REG_600; + // ... +}
\ No newline at end of file |