mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
env: Add support for svc 0x80..0xBF hinting
This commit is contained in:
parent
de4d19df1a
commit
8b77139a04
@ -28,7 +28,7 @@ enum {
|
|||||||
EntryType_OverrideHeap=3, ///< Provides heap override information.
|
EntryType_OverrideHeap=3, ///< Provides heap override information.
|
||||||
EntryType_OverrideService=4, ///< Provides service override information.
|
EntryType_OverrideService=4, ///< Provides service override information.
|
||||||
EntryType_Argv=5, ///< Provides argv.
|
EntryType_Argv=5, ///< Provides argv.
|
||||||
EntryType_SyscallAvailableHint=6, ///< Provides syscall availability hints.
|
EntryType_SyscallAvailableHint=6, ///< Provides syscall availability hints (SVCs 0x00..0x7F).
|
||||||
EntryType_AppletType=7, ///< Provides APT applet type.
|
EntryType_AppletType=7, ///< Provides APT applet type.
|
||||||
EntryType_AppletWorkaround=8, ///< Indicates that APT is broken and should not be used.
|
EntryType_AppletWorkaround=8, ///< Indicates that APT is broken and should not be used.
|
||||||
EntryType_Reserved9=9, ///< Unused/reserved entry type, formerly used by StdioSockets.
|
EntryType_Reserved9=9, ///< Unused/reserved entry type, formerly used by StdioSockets.
|
||||||
@ -37,6 +37,7 @@ enum {
|
|||||||
EntryType_RandomSeed=14, ///< Provides random data used to seed the pseudo-random number generator.
|
EntryType_RandomSeed=14, ///< Provides random data used to seed the pseudo-random number generator.
|
||||||
EntryType_UserIdStorage=15, ///< Provides persistent storage for the preselected user id.
|
EntryType_UserIdStorage=15, ///< Provides persistent storage for the preselected user id.
|
||||||
EntryType_HosVersion=16, ///< Provides the currently running Horizon OS version.
|
EntryType_HosVersion=16, ///< Provides the currently running Horizon OS version.
|
||||||
|
EntryType_SyscallAvailableHint2=17, ///< Provides syscall availability hints (SVCs 0x80..0xBF).
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -81,7 +82,7 @@ void* envGetArgv(void);
|
|||||||
* @param svc Syscall number to test.
|
* @param svc Syscall number to test.
|
||||||
* @returns true if the syscall is available.
|
* @returns true if the syscall is available.
|
||||||
*/
|
*/
|
||||||
bool envIsSyscallHinted(u8 svc);
|
bool envIsSyscallHinted(unsigned svc);
|
||||||
|
|
||||||
/// Returns the handle to the running homebrew process.
|
/// Returns the handle to the running homebrew process.
|
||||||
Handle envGetOwnProcessHandle(void);
|
Handle envGetOwnProcessHandle(void);
|
||||||
|
@ -17,7 +17,7 @@ static LoaderReturnFn g_loaderRetAddr = NULL;
|
|||||||
static void* g_overrideHeapAddr = NULL;
|
static void* g_overrideHeapAddr = NULL;
|
||||||
static u64 g_overrideHeapSize = 0;
|
static u64 g_overrideHeapSize = 0;
|
||||||
static void* g_overrideArgv = NULL;
|
static void* g_overrideArgv = NULL;
|
||||||
static u64 g_syscallHints[2];
|
static u64 g_syscallHints[3];
|
||||||
static Handle g_processHandle = INVALID_HANDLE;
|
static Handle g_processHandle = INVALID_HANDLE;
|
||||||
static char* g_nextLoadPath = NULL;
|
static char* g_nextLoadPath = NULL;
|
||||||
static char* g_nextLoadArgv = NULL;
|
static char* g_nextLoadArgv = NULL;
|
||||||
@ -37,7 +37,7 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
|
|||||||
g_isNso = true;
|
g_isNso = true;
|
||||||
g_mainThreadHandle = main_thread;
|
g_mainThreadHandle = main_thread;
|
||||||
g_loaderRetAddr = (LoaderReturnFn) &svcExitProcess;
|
g_loaderRetAddr = (LoaderReturnFn) &svcExitProcess;
|
||||||
g_syscallHints[0] = g_syscallHints[1] = UINT64_MAX;
|
g_syscallHints[0] = g_syscallHints[1] = g_syscallHints[2] = UINT64_MAX;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,6 +110,10 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case EntryType_SyscallAvailableHint2:
|
||||||
|
g_syscallHints[2] = ent->Value[0];
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (ent->Flags & EntryFlag_IsMandatory)
|
if (ent->Flags & EntryFlag_IsMandatory)
|
||||||
{
|
{
|
||||||
@ -170,7 +174,8 @@ void* envGetArgv(void) {
|
|||||||
return g_overrideArgv;
|
return g_overrideArgv;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool envIsSyscallHinted(u8 svc) {
|
bool envIsSyscallHinted(unsigned svc) {
|
||||||
|
if (svc >= 0xC0) return false;
|
||||||
return !!(g_syscallHints[svc/64] & (1ull << (svc%64)));
|
return !!(g_syscallHints[svc/64] & (1ull << (svc%64)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user