Further cleanup in SM code; smEncodeName is now constexpr

This commit is contained in:
fincs 2019-09-19 12:56:21 +02:00
parent 51db782e7a
commit 99c325ed5b
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60
3 changed files with 17 additions and 26 deletions

View File

@ -168,7 +168,13 @@ Service *smGetServiceSession(void);
* @param[in] name Name of the service. * @param[in] name Name of the service.
* @return Encoded name. * @return Encoded name.
*/ */
u64 smEncodeName(const char* name); NX_CONSTEXPR u64 smEncodeName(const char* name)
{
u64 name_encoded = 0;
for (unsigned i = 0; name[i] && i < 8; i ++)
name_encoded |= ((u64) name[i]) << (8*i);
return name_encoded;
}
/** /**
* @brief Overrides a service with a custom IPC service handle. * @brief Overrides a service with a custom IPC service handle.

View File

@ -3,6 +3,7 @@
#include "result.h" #include "result.h"
#include "kernel/detect.h" #include "kernel/detect.h"
#include "kernel/svc.h" #include "kernel/svc.h"
#include "sf/service.h"
#include "services/fatal.h" #include "services/fatal.h"
#include "services/sm.h" #include "services/sm.h"

View File

@ -2,7 +2,7 @@
#include "types.h" #include "types.h"
#include "result.h" #include "result.h"
#include "arm/atomics.h" #include "arm/atomics.h"
#include "kernel/ipc.h" #include "sf/service.h"
#include "services/fatal.h" #include "services/fatal.h"
#include "services/sm.h" #include "services/sm.h"
@ -94,37 +94,24 @@ Service *smGetServiceSession(void)
return &g_smSrv; return &g_smSrv;
} }
u64 smEncodeName(const char* name)
{
u64 name_encoded = 0;
size_t i;
for (i=0; i<8; i++)
{
if (name[i] == '\0')
break;
name_encoded |= ((u64) name[i]) << (8*i);
}
return name_encoded;
}
Result smGetService(Service* service_out, const char* name) Result smGetService(Service* service_out, const char* name)
{ {
u64 name_encoded = smEncodeName(name); u64 name_encoded = smEncodeName(name);
Handle handle = smGetServiceOverride(name_encoded); Handle handle = smGetServiceOverride(name_encoded);
bool own_handle = false;
Result rc = 0;
if (handle != INVALID_HANDLE) if (handle == INVALID_HANDLE)
{ {
serviceCreate(service_out, handle); own_handle = true;
service_out->own_handle = 0; rc = smGetServiceOriginal(&handle, name_encoded);
return 0;
} }
Result rc = smGetServiceOriginal(&handle, name_encoded);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{
serviceCreate(service_out, handle); serviceCreate(service_out, handle);
service_out->own_handle = own_handle;
}
return rc; return rc;
} }
@ -157,9 +144,6 @@ Result smRegisterService(Handle* handle_out, const char* name, bool is_light, in
Result smUnregisterService(const char* name) Result smUnregisterService(const char* name)
{ {
IpcCommand c;
ipcInitialize(&c);
const struct { const struct {
u64 service_name; u64 service_name;
} in = { smEncodeName(name) }; } in = { smEncodeName(name) };