d0k3 / GodMode9

GodMode9 Explorer - A full access file browser for the Nintendo 3DS console :godmode:
GNU General Public License v3.0
2.07k stars 192 forks source link

Use VA start and end linker symbols instead of length #865

Closed Wolfvak closed 2 weeks ago

Wolfvak commented 3 weeks ago

Fixes #859

profi200 commented 3 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