Closed Wolfvak closed 2 weeks ago
Works fine now with this PR.
edit: Posting this here too. Now gcc generates the correct while() {} loop:
u32 __fastcall mmuMapArea(u32 va, u32 pa, u32 size, u32 flags)
{
u32 v4; // r4
u32 v8; // r12
int v9; // r3
int v10; // r10
v4 = va;
while ( size )
{
v8 = v4 | pa | size;
v9 = v8 & 0xFFFFF;
if ( (v8 & 0xFFFFF) != 0 )
{
if ( (v8 & 0xFFF) != 0 )
{
while ( 1 )
;
}
v10 = 4096;
v9 = 1;
}
else
{
v10 = 0x100000;
}
va = (*((int (__fastcall **)(u32, u32, u32))&gicDefaultIrqCfg[144].low + 2 * v9))(v4, pa, flags);
v4 += v10;
pa += v10;
size -= v10;
}
return va;
}
Caveat is that it generates some extra sub instructions now. But better than crashing code.
.text:1FF817F0 C4 02 9F E5 LDR R0, =__text_va_end ; va
.text:1FF817F4 C4 22 9F E5 LDR R2, =__text_va_end
.text:1FF817F8 C4 32 9F E5 LDR R3, =0x3000206 ; flags
.text:1FF817FC 00 20 42 E0 SUB R2, R2, R0 ; size
.text:1FF81800 C0 12 9F E5 LDR R1, =__text_va_end ; pa
.text:1FF81804 52 FB FF EB BL mmuMapArea
Fixes #859