fatal: update for new-ipc

This commit is contained in:
Michael Scire 2019-10-17 19:39:22 -07:00 committed by SciresM
parent 8d16d2152b
commit 799c158b86
9 changed files with 113 additions and 73 deletions

View file

@ -17,7 +17,6 @@
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <malloc.h>
#include <switch.h>
#include <atmosphere.h>
@ -32,6 +31,7 @@ extern "C" {
extern u32 __start__;
u32 __nx_applet_type = AppletType_None;
u32 __nx_fs_num_sessions = 1;
#define INNER_HEAP_SIZE 0x2A0000
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
@ -69,8 +69,10 @@ void __libnx_initheap(void) {
fake_heap_end = (char*)addr + size;
}
using namespace sts;
void __appInit(void) {
SetFirmwareVersionForLibnx();
hos::SetVersionForLibnx();
DoWithSmSession([&]() {
R_ASSERT(setInitialize());
@ -79,7 +81,7 @@ void __appInit(void) {
R_ASSERT(i2cInitialize());
R_ASSERT(bpcInitialize());
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_800) {
if (hos::GetVersion() >= hos::Version_800) {
R_ASSERT(clkrstInitialize());
} else {
R_ASSERT(pcvInitialize());
@ -107,7 +109,7 @@ void __appExit(void) {
spsmExit();
psmExit();
lblExit();
if (GetRuntimeFirmwareVersion() >= FirmwareVersion_800) {
if (hos::GetVersion() >= hos::Version_800) {
clkrstExit();
} else {
pcvExit();
@ -119,26 +121,55 @@ void __appExit(void) {
setExit();
}
namespace {
using ServerOptions = sf::hipc::DefaultServerManagerOptions;
constexpr sm::ServiceName UserServiceName = sm::ServiceName::Encode("fatal:u");
constexpr size_t UserMaxSessions = 4;
constexpr sm::ServiceName PrivateServiceName = sm::ServiceName::Encode("fatal:p");
constexpr size_t PrivateMaxSessions = 4;
/* fatal:u, fatal:p. */
/* TODO: Consider max sessions enforcement? */
constexpr size_t NumServers = 2;
constexpr size_t NumSessions = UserMaxSessions + PrivateMaxSessions;
sf::hipc::ServerManager<NumServers, ServerOptions, NumSessions> g_server_manager;
}
int main(int argc, char **argv)
{
/* Load shared font. */
R_ASSERT(sts::fatal::srv::font::InitializeSharedFont());
R_ASSERT(fatal::srv::font::InitializeSharedFont());
/* Check whether we should throw fatal due to repair process. */
sts::fatal::srv::CheckRepairStatus();
/* Create waitable manager. */
static auto s_server_manager = WaitableManager(1);
fatal::srv::CheckRepairStatus();
/* Create services. */
s_server_manager.AddWaitable(new ServiceServer<sts::fatal::srv::PrivateService>("fatal:p", 4));
s_server_manager.AddWaitable(new ServiceServer<sts::fatal::srv::UserService>("fatal:u", 4));
R_ASSERT((g_server_manager.RegisterServer<fatal::srv::PrivateService>(PrivateServiceName, PrivateMaxSessions)));
R_ASSERT((g_server_manager.RegisterServer<fatal::srv::UserService>(UserServiceName, UserMaxSessions)));
/* Add dirty event holder. */
/* TODO: s_server_manager.AddWaitable(sts::fatal::srv::GetFatalDirtyEvent()); */
auto dirty_event_holder = sts::fatal::srv::GetFatalDirtyWaitableHolder();
(void)dirty_event_holder;
auto *dirty_event_holder = sts::fatal::srv::GetFatalDirtyWaitableHolder();
g_server_manager.AddUserWaitableHolder(dirty_event_holder);
/* Loop forever, servicing our services. */
s_server_manager.Process();
/* Because fatal has a user wait holder, we need to specify how to process manually. */
while (auto *signaled_holder = g_server_manager.WaitSignaled()) {
if (signaled_holder == dirty_event_holder) {
/* Dirty event holder was signaled. */
fatal::srv::OnFatalDirtyEvent();
g_server_manager.AddUserWaitableHolder(signaled_holder);
} else {
/* A server/session was signaled. Have the manager handle it. */
R_ASSERT(g_server_manager.Process(signaled_holder));
}
}
return 0;
}