Homebrew ABI: Difference between revisions
No edit summary |
|||
Line 32: | Line 32: | ||
* 1: [[#MainThreadHandle]] [MANDATORY] | * 1: [[#MainThreadHandle]] [MANDATORY] | ||
* 2: [[# | * 2: [[#LoaderReturnAddr]] [MANDATORY] | ||
* 3: [[#OverrideService]] | * 3: [[#OverrideHeap]] | ||
* 4: [[#OverrideService]] | |||
* 5: [[#Argv]] | |||
==== EndOfList ==== | ==== EndOfList ==== | ||
Line 51: | Line 55: | ||
* '''Value[0]:''' Handle to the main thread. | * '''Value[0]:''' Handle to the main thread. | ||
* '''Value[1]:''' Ignored. | * '''Value[1]:''' Ignored. | ||
==== LoaderReturnAddr ==== | |||
When the homebrew has finished executing, it shall jump to this address to return to the homebrew menu. | |||
* '''Key:''' 1 | |||
* '''IsMandatory:''' True | |||
* '''Value[0]:''' Function pointer with type <code>void __noreturn (*)(int result_code);</code> | |||
* '''Value[1]:''' Ignored. | |||
* '''DefaultBehavior:''' Exits process using svcExitProcess. | |||
==== OverrideHeap ==== | ==== OverrideHeap ==== | ||
If the NRO loader has reserved some space in the heap for itself, the application must not manipulate the heap. | If the NRO loader has reserved some space in the heap for itself, the application must not manipulate the heap. | ||
* '''Key:''' | * '''Key:''' 3 | ||
* '''IsMandatory:''' False | * '''IsMandatory:''' False | ||
* '''Value[0]:''' Base address of heap. Must be MemoryType 4, 5, or 9 with all reference counts being zero. | * '''Value[0]:''' Base address of heap. Must be MemoryType 4, 5, or 9 with all reference counts being zero. | ||
Line 66: | Line 79: | ||
Note: For services that authenticate with pid, the app should not attempt re-authentication with an overridden handle. | Note: For services that authenticate with pid, the app should not attempt re-authentication with an overridden handle. | ||
* '''Key:''' | * '''Key:''' 4 | ||
* '''IsMandatory:''' False | * '''IsMandatory:''' False | ||
* '''Value[0]:''' Name of service, same format as for sm. | * '''Value[0]:''' Name of service, same format as for sm. | ||
* '''Value[1]:''' Service handle. | * '''Value[1]:''' Service handle. | ||
* '''DefaultBehavior:''' Fetches service from "sm:" named port. | * '''DefaultBehavior:''' Fetches service from "sm:" named port. | ||
==== Argv ==== | |||
The NRO loader should be able to send argv. | |||
* '''Key:''' 5 | |||
* '''IsMandatory:''' False | |||
* '''Value[0]:''' Argc. | |||
* '''Value[1]:''' Argv pointer. | |||
* '''DefaultBehavior:''' Setting (argc == 0, argv[0] == NULL), or argv parsed in NSO0 fashion. |