Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- RAM_ARM9:0207C6FC ; =============== S U B R O U T I N E =======================================
- RAM_ARM9:0207C6FC
- RAM_ARM9:0207C6FC
- RAM_ARM9:0207C6FC ; void __fastcall OS_GetLowEntropyData(u32 *buf)
- RAM_ARM9:0207C6FC OS_GetLowEntropyData ; CODE XREF: buildSeed+Ap
- RAM_ARM9:0207C6FC ; sub_2057B2C+14p
- RAM_ARM9:0207C6FC
- RAM_ARM9:0207C6FC pSys_data = -0x18
- RAM_ARM9:0207C6FC
- RAM_ARM9:0207C6FC F8 B5 PUSH {R3-R7,LR} ; should be "(u32 buf[OS_LOW_ENTROPY_DATA_SIZE / sizeof(u32)])"
- RAM_ARM9:0207C6FE 05 1C MOVS R5, R0
- RAM_ARM9:0207C700 21 48 LDR R0, =0x4000006 ; =REG_VCOUNT
- RAM_ARM9:0207C702 22 4E LDR R6, =0x2FFFC00 ; =system_data
- RAM_ARM9:0207C704 07 88 LDRH R7, [R0] ; *REG_VCOUNT
- RAM_ARM9:0207C706 34 1C MOVS R4, R6
- RAM_ARM9:0207C708 00 94 STR R4, [SP,#0x18+pSys_data]
- RAM_ARM9:0207C70A 80 34 ADDS R4, #0x80 ; 'Ç'
- RAM_ARM9:0207C70C 00 94 STR R4, [SP,#0x18+pSys_data]
- RAM_ARM9:0207C70E 74 34 ADDS R4, #0x74 ; 't'
- RAM_ARM9:0207C710 FF F7 4E FA BL OS_GetTickLo ; get data @ REG_T0DAT
- RAM_ARM9:0207C714 39 04 LSLS R1, R7, #0x10
- RAM_ARM9:0207C716 08 43 ORRS R0, R1 ; (*REG_VCOUNT << 16) | *REG_T0DAT
- RAM_ARM9:0207C718 28 60 STR R0, [R5]
- RAM_ARM9:0207C71A A0 88 LDRH R0, [R4,#4] ; last 2 bytes of the MAC
- RAM_ARM9:0207C71C 1C 49 LDR R1, =0x214C5B8 ; vu64 OSi_TickCounter
- RAM_ARM9:0207C71E 03 04 LSLS R3, R0, #0x10
- RAM_ARM9:0207C720 08 68 LDR R0, [R1] ; lower half OSi_TickCounter
- RAM_ARM9:0207C722 4A 68 LDR R2, [R1,#4] ; upper half OSi_TickCounter
- RAM_ARM9:0207C724 58 40 EORS R0, R3
- RAM_ARM9:0207C726 68 60 STR R0, [R5,#4]
- RAM_ARM9:0207C728 0A 68 LDR R2, [R1]
- RAM_ARM9:0207C72A F0 6B LDR R0, [R6,#0x3C]
- RAM_ARM9:0207C72C 4A 68 LDR R2, [R1,#4]
- RAM_ARM9:0207C72E 00 99 LDR R1, [SP,#0x18+pSys_data]
- RAM_ARM9:0207C730 49 6F LDR R1, [R1,#0x74]
- RAM_ARM9:0207C732 51 40 EORS R1, R2
- RAM_ARM9:0207C734 41 40 EORS R1, R0
- RAM_ARM9:0207C736 17 48 LDR R0, =0x4000600 ; =REG_GXSTAT
- RAM_ARM9:0207C738 A9 60 STR R1, [R5,#8]
- RAM_ARM9:0207C73A 00 68 LDR R0, [R0]
- RAM_ARM9:0207C73C 48 40 EORS R0, R1
- RAM_ARM9:0207C73E A8 60 STR R0, [R5,#8]
- RAM_ARM9:0207C740 7A 20 80 00 MOVS R0, 0x1E8 ; 2FFFDE8
- RAM_ARM9:0207C744 31 58 LDR R1, [R6,R0] ; date
- RAM_ARM9:0207C746 00 1D ADDS R0, R0, #4 ; 2FFFDEC
- RAM_ARM9:0207C748 E9 60 STR R1, [R5,#0xC]
- RAM_ARM9:0207C74A 30 58 LDR R0, [R6,R0] ; time
- RAM_ARM9:0207C74C 28 61 STR R0, [R5,#0x10]
- RAM_ARM9:0207C74E E5 20 80 00 MOVS R0, 0x394 ; MIC sampling result
- RAM_ARM9:0207C752 31 5A LDRH R1, [R6,R0]
- RAM_ARM9:0207C754 0A 04 LSLS R2, R1, #0x10
- RAM_ARM9:0207C756 01 1F SUBS R1, R0, #4
- RAM_ARM9:0207C758 71 58 LDR R1, [R6,R1] ; MIC data storage address
- RAM_ARM9:0207C75A 51 40 EORS R1, R2
- RAM_ARM9:0207C75C 69 61 STR R1, [R5,#0x14]
- RAM_ARM9:0207C75E 01 1C MOVS R1, R0
- RAM_ARM9:0207C760 16 31 ADDS R1, #0x16
- RAM_ARM9:0207C762 71 5A LDRH R1, [R6,R1] ; touch_panel_buf[0]
- RAM_ARM9:0207C764 0A 04 LSLS R2, R1, #0x10
- RAM_ARM9:0207C766 01 1C MOVS R1, R0
- RAM_ARM9:0207C768 18 31 ADDS R1, #0x18
- RAM_ARM9:0207C76A 71 5A LDRH R1, [R6,R1] ; touch_panel_buf[2]
- RAM_ARM9:0207C76C 00 1D ADDS R0, R0, #4
- RAM_ARM9:0207C76E 11 43 ORRS R1, R2
- RAM_ARM9:0207C770 A9 61 STR R1, [R5,#0x18]
- RAM_ARM9:0207C772 30 5A LDRH R0, [R6,R0] ; #define HW_WM_RSSI_POOL (HW_MAIN_MEM + 0x007fff98) // Random number source depends on WM received signal intensity
- RAM_ARM9:0207C774 02 04 LSLS R2, R0, #0x10
- RAM_ARM9:0207C776 08 48 LDR R0, =0x4000130
- RAM_ARM9:0207C778 01 88 LDRH R1, [R0] ; gba-compatible input
- RAM_ARM9:0207C77A 08 48 LDR R0, =0x2FFFFA8
- RAM_ARM9:0207C77C 00 88 LDRH R0, [R0] ; nds-only input
- RAM_ARM9:0207C77E 08 43 ORRS R0, R1
- RAM_ARM9:0207C780 10 43 ORRS R0, R2 ; OR the inputs together
- RAM_ARM9:0207C782 E8 61 STR R0, [R5,#0x1C]
- RAM_ARM9:0207C784 F8 BD POP {R3-R7,PC}
- RAM_ARM9:0207C784 ; End of function OS_GetLowEntropyData
- RAM_ARM9:0207C784
- RAM_ARM9:0207C784 ; ---------------------------------------------------------------------------
- RAM_ARM9:0207C786 C0 46 ALIGN 4
- RAM_ARM9:0207C788 06 00 00 04 dword_207C788 DCD 0x4000006 ; DATA XREF: OS_GetLowEntropyData+4r
- RAM_ARM9:0207C78C 00 FC FF 02 dword_207C78C DCD 0x2FFFC00 ; DATA XREF: OS_GetLowEntropyData+6r
- RAM_ARM9:0207C790 B8 C5 14 02 dword_207C790 DCD 0x214C5B8 ; DATA XREF: OS_GetLowEntropyData+20r
- RAM_ARM9:0207C794 00 06 00 04 dword_207C794 DCD 0x4000600 ; DATA XREF: OS_GetLowEntropyData+3Ar
- RAM_ARM9:0207C798 30 01 00 04 dword_207C798 DCD 0x4000130 ; DATA XREF: OS_GetLowEntropyData+7Ar
- RAM_ARM9:0207C79C A8 FF FF 02 dword_207C79C DCD 0x2FFFFA8 ; DATA XREF: OS_GetLowEntropyData+7Er
- extern vu64 OSi_TickCounter;
- /*---------------------------------------------------------------------------*
- Name: OS_GetLowEntropyData
- Description: Gets low entropy data that changes according to the system status.
- Arguments: buffer - Pointer to the array that holds the data string.
- Returns: None.
- *---------------------------------------------------------------------------*/
- void OS_GetLowEntropyData(u32 buffer[OS_LOW_ENTROPY_DATA_SIZE / sizeof(u32)])
- {
- // RTC work area in the System Work Memory
- const OSSystemWork *work = OS_GetSystemWork();
- const u8 *macAddress =
- (u8 *)((u32)(work->nvramUserInfo) + ((sizeof(NVRAMConfig) + 3) & ~0x00000003));
- buffer[0] = (u32)((GX_GetVCount() << 16) | OS_GetTickLo());
- buffer[1] = (u32)(*(u16 *)(macAddress + 4) << 16) ^ (u32)(OSi_TickCounter);
- buffer[2] = (u32)(OSi_TickCounter >> 32) ^ *(u32 *)macAddress ^ work->vblankCount;
- #ifdef reg_G3X_GXSTAT
- buffer[2] ^= reg_G3X_GXSTAT;
- #endif
- buffer[3] = *(u32 *)(&work->real_time_clock[0]);
- buffer[4] = *(u32 *)(&work->real_time_clock[4]);
- buffer[5] = (((u32)work->mic_sampling_data) << 16) ^ work->mic_last_address;
- buffer[6] = (u32)((*(u16 *)(&work->touch_panel[0]) << 16) | *(u16 *)(&work->touch_panel[2]));
- buffer[7] = (u32)((work->wm_rssi_pool << 16) | (reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF));
- }
Advertisement