mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-25 20:24:21 -04:00
fatal: update for new-ipc
This commit is contained in:
parent
8d16d2152b
commit
799c158b86
9 changed files with 113 additions and 73 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue