mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-06-02 23:59:49 -04:00
Stratosphere: Skeleton all services for sm.
This commit is contained in:
parent
7dc5a5914b
commit
d0ef3b1c71
7 changed files with 366 additions and 0 deletions
65
stratosphere/sm/source/sm_main.cpp
Normal file
65
stratosphere/sm/source/sm_main.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
#include <cstdlib>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <malloc.h>
|
||||
|
||||
#include <switch.h>
|
||||
#include <stratosphere.hpp>
|
||||
|
||||
#include "sm_manager_service.hpp"
|
||||
#include "sm_user_service.hpp"
|
||||
|
||||
extern "C" {
|
||||
extern u32 __start__;
|
||||
|
||||
u32 __nx_applet_type = AppletType_None;
|
||||
|
||||
#define INNER_HEAP_SIZE 0x200000
|
||||
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
|
||||
char nx_inner_heap[INNER_HEAP_SIZE];
|
||||
|
||||
void __libnx_initheap(void);
|
||||
void __appInit(void);
|
||||
void __appExit(void);
|
||||
}
|
||||
|
||||
|
||||
void __libnx_initheap(void) {
|
||||
void* addr = nx_inner_heap;
|
||||
size_t size = nx_inner_heap_size;
|
||||
|
||||
/* Newlib */
|
||||
extern char* fake_heap_start;
|
||||
extern char* fake_heap_end;
|
||||
|
||||
fake_heap_start = (char*)addr;
|
||||
fake_heap_end = (char*)addr + size;
|
||||
}
|
||||
|
||||
void __appInit(void) {
|
||||
/* We must do nothing here, because we are sm. */
|
||||
}
|
||||
|
||||
void __appExit(void) {
|
||||
/* Nothing to clean up, because we're sm. */
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
consoleDebugInit(debugDevice_SVC);
|
||||
|
||||
/* TODO: What's a good timeout value to use here? */
|
||||
WaitableManager *server_manager = new WaitableManager(U64_MAX);
|
||||
|
||||
/* Add services to manager. */
|
||||
server_manager->add_waitable(new ManagedPortServer<UserService>("sm:", 0x40));
|
||||
server_manager->add_waitable(new ServiceServer<ManagerService>("sm:m", 1));
|
||||
|
||||
/* Loop forever, servicing our services. */
|
||||
server_manager->process();
|
||||
|
||||
/* Cleanup. */
|
||||
delete server_manager;
|
||||
return 0;
|
||||
}
|
||||
|
29
stratosphere/sm/source/sm_manager_service.cpp
Normal file
29
stratosphere/sm/source/sm_manager_service.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include <switch.h>
|
||||
#include "sm_manager_service.hpp"
|
||||
|
||||
Result ManagerService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) {
|
||||
Result rc = 0xF601;
|
||||
|
||||
switch ((ManagerServiceCmd)cmd_id) {
|
||||
case Manager_Cmd_RegisterProcess:
|
||||
rc = WrapIpcCommandImpl<&ManagerService::register_process>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
case Manager_Cmd_UnregisterProcess:
|
||||
rc = WrapIpcCommandImpl<&ManagerService::unregister_process>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
std::tuple<Result> ManagerService::register_process(u64 pid, InBuffer<u8> acid_sac, InBuffer<u8> aci0_sac) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601);
|
||||
}
|
||||
|
||||
std::tuple<Result> ManagerService::unregister_process(u64 pid) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601);
|
||||
}
|
18
stratosphere/sm/source/sm_manager_service.hpp
Normal file
18
stratosphere/sm/source/sm_manager_service.hpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <stratosphere/iserviceobject.hpp>
|
||||
|
||||
enum ManagerServiceCmd {
|
||||
Manager_Cmd_RegisterProcess = 0,
|
||||
Manager_Cmd_UnregisterProcess = 1
|
||||
};
|
||||
|
||||
class ManagerService : IServiceObject {
|
||||
public:
|
||||
Result dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size);
|
||||
|
||||
private:
|
||||
/* Actual commands. */
|
||||
std::tuple<Result> register_process(u64 pid, InBuffer<u8> acid_sac, InBuffer<u8> aci0_sac);
|
||||
std::tuple<Result> unregister_process(u64 pid);
|
||||
};
|
45
stratosphere/sm/source/sm_user_service.cpp
Normal file
45
stratosphere/sm/source/sm_user_service.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include <switch.h>
|
||||
#include "sm_user_service.hpp"
|
||||
|
||||
Result UserService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) {
|
||||
Result rc = 0xF601;
|
||||
|
||||
switch ((UserServiceCmd)cmd_id) {
|
||||
case User_Cmd_Initialize:
|
||||
rc = WrapIpcCommandImpl<&UserService::initialize>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
case User_Cmd_GetService:
|
||||
rc = WrapIpcCommandImpl<&UserService::get_service>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
case User_Cmd_RegisterService:
|
||||
rc = WrapIpcCommandImpl<&UserService::register_service>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
case User_Cmd_UnregisterService:
|
||||
rc = WrapIpcCommandImpl<&UserService::unregister_service>(this, r, out_c, pointer_buffer, pointer_buffer_size);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
std::tuple<Result> UserService::initialize(PidDescriptor pid) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601);
|
||||
}
|
||||
|
||||
std::tuple<Result, MovedHandle> UserService::get_service(u64 service) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601, MovedHandle{0});
|
||||
}
|
||||
|
||||
std::tuple<Result, MovedHandle> UserService::register_service(u64 service, u8 is_light, u32 max_sessions) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601, MovedHandle{0});
|
||||
}
|
||||
|
||||
std::tuple<Result> UserService::unregister_service(u64 service) {
|
||||
/* TODO */
|
||||
return std::make_tuple(0xF601);
|
||||
}
|
22
stratosphere/sm/source/sm_user_service.hpp
Normal file
22
stratosphere/sm/source/sm_user_service.hpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <stratosphere/iserviceobject.hpp>
|
||||
|
||||
enum UserServiceCmd {
|
||||
User_Cmd_Initialize = 0,
|
||||
User_Cmd_GetService = 1,
|
||||
User_Cmd_RegisterService = 2,
|
||||
User_Cmd_UnregisterService = 3
|
||||
};
|
||||
|
||||
class UserService : IServiceObject {
|
||||
public:
|
||||
Result dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size);
|
||||
|
||||
private:
|
||||
/* Actual commands. */
|
||||
std::tuple<Result> initialize(PidDescriptor pid);
|
||||
std::tuple<Result, MovedHandle> get_service(u64 service);
|
||||
std::tuple<Result, MovedHandle> register_service(u64 service, u8 is_light, u32 max_sessions);
|
||||
std::tuple<Result> unregister_service(u64 service);
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue