Line 37: |
Line 37: |
| | u8[4] | | | u8[4] |
| | Debug info (read by the SVC handler): | | | Debug info (read by the SVC handler): |
− | 0: Bit0: reschedule. Bit1: switch context. If non zero, and depending on <code>*((u8 *)currentThread + 0x36)</code>, send thread exit debug events after handling valid/authorized SVCs (except 0xFF). Cleared to zero after handling. | + | 0: Bit0: reschedule. Bit1: switch context. If non zero, and depending on <code>currentThread->shallTerminate</code>, send thread exit debug events after handling valid/authorized SVCs (except 0xFF). Cleared to zero after handling. Bit2: lock debug features |
| | | |
− | 1: "Allow debug" flag from the process's exheader. If set, <code>{r0-r7, r12, lr}</code> will be pushed (they'll always be when handling invalid/unauthorized SVCs/SVC 0xFF). | + | 1: "Allow debug" flag from the process's exheader. If set, <code>{r0-r7, r12, lr_svc}</code> will be pushed (they'll always be when handling invalid/unauthorized SVCs/SVC 0xFF). Needed for svcGetThreadContext and svcSetThreadContext to work properly in contexts other than exception handling (incl. hardware breakpoints). If lr_svc is set to one in this frame, the registers are reloaded from it (used with svcBreak, svc 0xff, etc). |
| | | |
| 2: ? | | 2: ? |
| | | |
| 3: ID of the SVC being handled (reset to 0 when done). | | 3: ID of the SVC being handled (reset to 0 when done). |
− | |-
| |
− | | 0xF4C (page_end - 0xB4)
| |
− | | u32
| |
− | | If non-zero, reloads <code>{r0-r7, r12, lr}</code> (otherwise skipped) from the stack after handling a SVC.
| |
| |- | | |- |
| | 0xF50 (page_end - 0xB0) | | | 0xF50 (page_end - 0xB0) |