[NDS] ARM7 Stack Corruption — PC springt in unmapped Adressraum (0xE1A01C00) #169

Closed
opened 2026-03-15 21:40:28 +00:00 by krugi20 · 1 comment
Owner

Bug

ARM7 springt bei Schritt ~226521 (innerhalb Frame 0) in unmapped Adressraum.

Symptome

  • PC = 0xE1A01C00 (sieht aus wie ein ARM-Opcode-Wert)
  • r14/LR = 0xE1A01C01 (Bit 0 gesetzt = Thumb-Mode)
  • SP = 0x0380FB94 (ARM7-WRAM)
  • ARM7 läuft danach in Thumb-Mode durch lauter 0x0000-NOPs (unmapped → read 0)

Root Cause (Hypothese)

Ein STM/PUSH schreibt einen falschen Wert (0xE1A01C01) auf den Stack.
Dieser Wert ist ein ARM-Instruction-Opcode, nicht eine gültige Rücksprungadresse.

Mögliche Ursachen:

  1. BL mit falschem LR-Wert (PC+4 falsch berechnet)
  2. STMDB schreibt aus dem falschen Register
  3. Thumb-Interworking in BX/BLX falsch implementiert

Debugging

  • 200k ARM7-Steps solo: kein Drift
  • nds_run_frame mit ARM9 gleichzeitig: Drift bei Schritt ~226521 🐛
  • Watchpoint auf [0x0380FB94] läuft...

Commits

  • 5d4fa32 — LDM/STM fix (ARM9 gefixt, ARM7 noch nicht)
  • 1e72687 — BIOS HLE, IF-Clear fix

Files

  • src/core/cpu/arm7.c — wahrscheinlich BL/STMDB/BX
  • src/systems/nds/nds.c — nds7_write/read Pfade
## Bug ARM7 springt bei Schritt ~226521 (innerhalb Frame 0) in unmapped Adressraum. ## Symptome - PC = `0xE1A01C00` (sieht aus wie ein ARM-Opcode-Wert) - `r14/LR = 0xE1A01C01` (Bit 0 gesetzt = Thumb-Mode) - SP = `0x0380FB94` (ARM7-WRAM) - ARM7 läuft danach in Thumb-Mode durch lauter `0x0000`-NOPs (unmapped → read 0) ## Root Cause (Hypothese) Ein STM/PUSH schreibt einen falschen Wert (`0xE1A01C01`) auf den Stack. Dieser Wert ist ein ARM-Instruction-Opcode, nicht eine gültige Rücksprungadresse. Mögliche Ursachen: 1. BL mit falschem LR-Wert (PC+4 falsch berechnet) 2. STMDB schreibt aus dem falschen Register 3. Thumb-Interworking in BX/BLX falsch implementiert ## Debugging - `200k ARM7-Steps solo:` kein Drift ✅ - `nds_run_frame` mit ARM9 gleichzeitig: Drift bei Schritt ~226521 🐛 - Watchpoint auf `[0x0380FB94]` läuft... ## Commits - `5d4fa32` — LDM/STM fix (ARM9 gefixt, ARM7 noch nicht) - `1e72687` — BIOS HLE, IF-Clear fix ## Files - `src/core/cpu/arm7.c` — wahrscheinlich BL/STMDB/BX - `src/systems/nds/nds.c` — nds7_write/read Pfade
Author
Owner

Root Cause gefunden & gefixt:

WRAMCNT war auf 0 initialisiert statt 3. Mit WRAMCNT=0 hat ARM7 kein Shared WRAM — Zugriffe auf 0x037Fxxxx landeten als Alias in ARM7 IWRAM (0x0380xxxx), direkt im aktiven Stack-Frame.

Das Spiel kopiert Code nach 0x037FFB94 → mit WRAMCNT=0 überschreibt das den saved LR auf dem Stack mit 0xE1A01C01LDMIA SP! popt korruptes LR → BX LR crasht.

Fixes:

  • 657a77f — WRAMCNT=3 (32KB Shared WRAM → ARM7), Banked SP für IRQ/SVC Modes

Verifiziert: 2M+ ARM7 Steps über 4 Frames ohne Crash.

**Root Cause gefunden & gefixt:** `WRAMCNT` war auf `0` initialisiert statt `3`. Mit WRAMCNT=0 hat ARM7 kein Shared WRAM — Zugriffe auf `0x037Fxxxx` landeten als Alias in ARM7 IWRAM (`0x0380xxxx`), direkt im aktiven Stack-Frame. Das Spiel kopiert Code nach `0x037FFB94` → mit WRAMCNT=0 überschreibt das den saved LR auf dem Stack mit `0xE1A01C01` → `LDMIA SP!` popt korruptes LR → `BX LR` crasht. **Fixes:** - `657a77f` — WRAMCNT=3 (32KB Shared WRAM → ARM7), Banked SP für IRQ/SVC Modes Verifiziert: 2M+ ARM7 Steps über 4 Frames ohne Crash. ✅
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
krugi20/retroverse#169
No description provided.