SVC: Difference between revisions
No edit summary |
|||
Line 5: | Line 5: | ||
| 0x1 || svcSetupHeap || X1=size || W0=result, X1=outaddr | | 0x1 || svcSetupHeap || X1=size || W0=result, X1=outaddr | ||
|- | |- | ||
| 0x2 || svcProtectMemory || X0=addr, X1=size, W2=prot || W0=result | | 0x2 || [[#svcProtectMemory]] || X0=addr, X1=size, W2=prot || W0=result | ||
|- | |- | ||
| 0x3 || svcSetMemoryState || X0=addr, X1=size, W2=state0, W3=state1 || W0=result | | 0x3 || [[#svcSetMemoryState]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result | ||
|- | |- | ||
| 0x4 || svcMirrorStack || X0=dstaddr, X1=srcaddr, X2=size || W0=result | | 0x4 || [[#svcMirrorStack]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result | ||
|- | |- | ||
| 0x5 || svcUnmirrorStack || X0=dstaddr, X1=srcaddr, X2=size || W0=result | | 0x5 || svcUnmirrorStack || X0=dstaddr, X1=srcaddr, X2=size || W0=result | ||
Line 23: | Line 23: | ||
| 0xA || svcExitThread || None || | | 0xA || svcExitThread || None || | ||
|- | |- | ||
| 0xB || svcSleepThread || X0=nano || | | 0xB || [[#svcSleepThread]] || X0=nano || | ||
|- | |- | ||
| 0xC || svcGetThreadPriority || W1=thread_handle || W0=result, W1=prio | | 0xC || svcGetThreadPriority || W1=thread_handle || W0=result, W1=prio | ||
Line 43: | Line 43: | ||
| 0x14 || svcUnmapMemoryBlock || W0=memblk_handle, X1=addr, X2=size || W0=result | | 0x14 || svcUnmapMemoryBlock || W0=memblk_handle, X1=addr, X2=size || W0=result | ||
|- | |- | ||
| 0x15 || svcCreateMemoryMirror || X1=addr, X2=size, W3=perm || W0=result, W1=handle | | 0x15 || [[#svcCreateMemoryMirror]] || X1=addr, X2=size, W3=perm || W0=result, W1=handle | ||
|- | |- | ||
| 0x16 || svcCloseHandle || W0=handle || W0=result | | 0x16 || svcCloseHandle || W0=handle || W0=result | ||
Line 49: | Line 49: | ||
| 0x17 || ? || ? || ? | | 0x17 || ? || ? || ? | ||
|- | |- | ||
| 0x18 || svcWaitSynchronizationN || X1=handles_ptr, X2=num_handles. X3=timeout || W1=out | | 0x18 || [[#svcWaitSynchronizationN]] || X1=handles_ptr, X2=num_handles. X3=timeout || W1=out | ||
|- | |- | ||
| 0x19 || ? || W0=handle? || ? | | 0x19 || ? || W0=handle? || ? | ||
Line 99: | Line 99: | ||
| 0x50 || svcCreateMemoryBlock || W1=size?, W2=perm0, W3=perm1 || W0=result, W1=handle | | 0x50 || svcCreateMemoryBlock || W1=size?, W2=perm0, W3=perm1 || W0=result, W1=handle | ||
|- | |- | ||
| 0x51 || svcMapMemoryMirror || X0=mirror_handle, X1=addr, X2=size, W3=perm || W0=result | | 0x51 || [[#svcMapMemoryMirror]] || X0=mirror_handle, X1=addr, X2=size, W3=perm || W0=result | ||
|- | |- | ||
| 0x52 || svcUnmapMemoryMirror || W0=mirror_handle, X1=addr, X2=size || W0=result | | 0x52 || [[#svcUnmapMemoryMirror]] || W0=mirror_handle, X1=addr, X2=size || W0=result | ||
|} | |} | ||
== svcProtectMemory == | |||
Bit2 of permission (exec) is not allowed. | |||
Setting write-only is not allowed either (bit1). | |||
== svcSetMemoryState == | |||
{| class=wikitable | |||
! State0 || State1 || Action | |||
|- | |||
| 0 || 0 || Clear bit35 in [[#MemoryState]]. | |||
|- | |||
| 8 || 0 || Clear bit35 in [[#MemoryState]]. | |||
|- | |||
| 8 || 8 || Set bit35 in [[#MemoryState]]. | |||
|} | |||
This might used for switching between cached and non-cached mappings. | |||
== svcMirrorStack == | |||
Memory is only allowed to be mapped into a special region. | |||
Code can get the range of this region from [[#svcGetHandleInfo]]. | |||
The source region gets reprotected to ---, and sets bit32 is set in [[#MemoryState]]. | |||
== svcSleepThread == | |||
Setting nano=0 means "yield thread". | |||
== svcCreateMemoryMirror == | |||
This one reprotects the src block with perms you give it. It also sets bit32 into [[#MemoryState]]. | |||
Executable bit perm not allowed. | |||
Closing the returned handle automatically causes the bit32 in [[#MemoryState]] to clear. | |||
== svcWaitSynchronizationN == | |||
Works with num_handles <= 0x40, error on num_handles == 0. | |||
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles. | |||
== svcMapMemoryMirror == | |||
The newly mapped pages will have [[#MemoryState]] type 0xE. | |||
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error. | |||
== svcUnmapMemoryMirror == | |||
Size must match size given in map syscall, otherwise there's an invalid-size error. | |||
== MemoryState == | |||
{| class=wikitable | |||
! Lower 8 bits || Type || Meaning | |||
|- | |||
| 0x3 || Code static || .text and .rodata | |||
|- | |||
| 0x4 || Code || .data | |||
|- | |||
| 0x5 || Heap || | |||
|- | |||
| 0x6 || Shared memory block || | |||
|- | |||
| 0x8 || Module code static || .text and .rodata | |||
|- | |||
| 0x9 || Module code || .data | |||
|- | |||
| 0xB || Stack mirror || | |||
|- | |||
| 0xC || Thread local storage || | |||
|- | |||
| 0xE || Memory mirror || | |||
|- | |||
| 0x10 || Reserved || | |||
|} | |||
Bit32: is_mirrored | |||
Bit35: is_uncached? |