Add support for new homebrew ABI keys + loader info

This commit is contained in:
fincs 2019-07-29 21:17:09 +02:00
parent 409957c432
commit 01d648e7ed
3 changed files with 48 additions and 7 deletions

View File

@ -34,6 +34,8 @@ enum {
EntryType_ProcessHandle=10, ///< Provides the process handle. EntryType_ProcessHandle=10, ///< Provides the process handle.
EntryType_LastLoadResult=11, ///< Provides the last load result. EntryType_LastLoadResult=11, ///< Provides the last load result.
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_HosVersion=16, ///< Provides the currently running Horizon OS version.
}; };
enum { enum {
@ -51,6 +53,11 @@ typedef void NORETURN (*LoaderReturnFn)(int result_code);
*/ */
void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr); void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr);
/// Returns information text about the loader, if present.
const char* envGetLoaderInfo(void);
/// Returns the size of the loader information text.
u64 envGetLoaderInfoSize(void);
/// Retrieves the handle to the main thread. /// Retrieves the handle to the main thread.
Handle envGetMainThreadHandle(void); Handle envGetMainThreadHandle(void);
/// Returns true if the application is running as NSO, otherwise NRO. /// Returns true if the application is running as NSO, otherwise NRO.
@ -105,3 +112,6 @@ bool envHasRandomSeed(void);
* @param out Pointer to a u64[2] buffer which will contain the random seed on return. * @param out Pointer to a u64[2] buffer which will contain the random seed on return.
*/ */
void envGetRandomSeed(u64 out[2]); void envGetRandomSeed(u64 out[2]);
/// Returns a pointer to the user id storage area (if present).
u128* envGetUserIdStorage(void);

View File

@ -1,6 +1,7 @@
// Copyright 2018 plutoo // Copyright 2018 plutoo
#include <string.h> #include <string.h>
#include "runtime/env.h" #include "runtime/env.h"
#include "runtime/hosversion.h"
#include "services/sm.h" #include "services/sm.h"
#include "services/fatal.h" #include "services/fatal.h"
#include "services/applet.h" #include "services/applet.h"
@ -8,6 +9,8 @@
void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr); void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
static bool g_isNso = false; static bool g_isNso = false;
static const char* g_loaderInfo = NULL;
static u64 g_loaderInfoSize = 0;
static Handle g_mainThreadHandle = INVALID_HANDLE; static Handle g_mainThreadHandle = INVALID_HANDLE;
static LoaderReturnFn g_loaderRetAddr = NULL; static LoaderReturnFn g_loaderRetAddr = NULL;
static void* g_overrideHeapAddr = NULL; static void* g_overrideHeapAddr = NULL;
@ -20,6 +23,7 @@ static char* g_nextLoadArgv = NULL;
static Result g_lastLoadResult = 0; static Result g_lastLoadResult = 0;
static bool g_hasRandomSeed = false; static bool g_hasRandomSeed = false;
static u64 g_randomSeed[2] = { 0, 0 }; static u64 g_randomSeed[2] = { 0, 0 };
static u128* g_userIdStorage = NULL;
extern __attribute__((weak)) u32 __nx_applet_type; extern __attribute__((weak)) u32 __nx_applet_type;
@ -99,6 +103,14 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
g_randomSeed[1] = ent->Value[1]; g_randomSeed[1] = ent->Value[1];
break; break;
case EntryType_UserIdStorage:
g_userIdStorage = (u128*)(uintptr_t)ent->Value[0];
break;
case EntryType_HosVersion:
hosversionSet(ent->Value[0]);
break;
default: default:
if (ent->Flags & EntryFlag_IsMandatory) if (ent->Flags & EntryFlag_IsMandatory)
{ {
@ -112,6 +124,19 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
ent++; ent++;
} }
g_loaderInfoSize = ent->Value[1];
if (g_loaderInfoSize) {
g_loaderInfo = (const char*)(uintptr_t)ent->Value[0];
}
}
const char* envGetLoaderInfo(void) {
return g_loaderInfo;
}
u64 envGetLoaderInfoSize(void) {
return g_loaderInfoSize;
} }
Handle envGetMainThreadHandle(void) { Handle envGetMainThreadHandle(void) {
@ -196,3 +221,7 @@ void envGetRandomSeed(u64 out[2]) {
out[0] = g_randomSeed[0]; out[0] = g_randomSeed[0];
out[1] = g_randomSeed[1]; out[1] = g_randomSeed[1];
} }
u128* envGetUserIdStorage(void) {
return g_userIdStorage;
}

View File

@ -109,13 +109,15 @@ void __attribute__((weak)) __appInit(void)
if (R_FAILED(rc)) if (R_FAILED(rc))
fatalSimple(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM)); fatalSimple(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM));
rc = setsysInitialize(); if (hosversionGet() == 0) {
if (R_SUCCEEDED(rc)) { rc = setsysInitialize();
SetSysFirmwareVersion fw; if (R_SUCCEEDED(rc)) {
rc = setsysGetFirmwareVersion(&fw); SetSysFirmwareVersion fw;
if (R_SUCCEEDED(rc)) rc = setsysGetFirmwareVersion(&fw);
hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro)); if (R_SUCCEEDED(rc))
setsysExit(); hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro));
setsysExit();
}
} }
rc = appletInitialize(); rc = appletInitialize();