aboutsummaryrefslogtreecommitdiffstats
path: root/psp_out/HW-RAS-ON-CARD.md (follow)
Commit message (Collapse)AuthorAge
* Drive RAS on real silicon: the 0xE575B8 blocker is missing state, confirmeduser2026-09-23
The emulator cannot open RAS's init gate because SYS_DRV opcode 0x000d fails a capacity check on the zero context at 0xE575B8, and a bounded search found nothing that fills it. Whether that is our missing state or something the firmware never does is not answerable inside the emulator. It is answerable on a card. tinygrad has no TA loading path, so psp_out/load_ta.py builds one over AM_PSP._ring_submit: VRAM for the signed container and a shared command buffer, cmd_load_ta with MC addresses, LOAD_TA for a session id, INVOKE_CMD per command, UNLOAD_TA at the end, with the PSP heartbeat checked before and after every submit. The TA driven is the card's own signed RAS 27.0.2.5, whose body is byte-identical to our ras2.elf -- the exact code the emulator runs. A control saved this from being a fabricated result. The first run reported status=0 for commands 1-4 and looked like a clean sweep. But resp.status is RING DELIVERY only: 0xdead and 0x7fff also returned status=0 with byte-identical output. The TA's own verdict is ras_status in the shared buffer (struct ta_ras_shared_memory: cmd_id/resp_id/ras_status/if_version), and the command id goes IN THE BUFFER, the same shape as the HDCP invoke ABI decoded earlier here. With that fixed, valid and invalid commands separate cleanly. Measured surface on this card: cmd 1 ras_status 0x0 -- success cmd 2 0xa002 cmd 3, 4 0xa010 cmd 5..0x10 rejected at the ring, 0xFFFF000A Command 1 succeeding means RAS processed it rather than short-circuiting on its init gate at 0x4060E0, and that gate is only written on a path bottoming out in the SYS_DRV RPC chain containing 0x000d. So 0xE575B8 IS populated on a real boot, and the blocker is our missing boot state, not firmware behaviour. The harness's existing "uninitialised SYS_DRV state, NOT a defect" call is now confirmed from outside the emulator instead of resting on careful reading. Bounded, so it is not overread: this does NOT reveal what populates 0xE575B8. That is PSP-internal on a path the host cannot observe; hardware confirms the destination, finding the writer stays an emulator-side problem. It also does not make emulated RAS coverage reportable -- but it does give an oracle the emulator must match once the gate opens. Housekeeping: LOAD_TA allocates a fresh session per call (seen climbing 0,1,2,... across runs), so load_ta.py releases it. Card verified healthy after every run -- heartbeat advancing, LTSSM 0x78. No ATX cycle was needed.