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));
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎