Started work on services

This commit is contained in:
wheremyfoodat 2022-09-17 19:51:30 +03:00
parent 3259c5c7a6
commit 208c18356b
9 changed files with 169 additions and 18 deletions

View file

@ -6,6 +6,7 @@
#include "kernel_types.hpp"
#include "helpers.hpp"
#include "memory.hpp"
#include "services/service_manager.hpp"
class Kernel {
std::array<u32, 16>& regs;
@ -17,6 +18,7 @@ class Kernel {
std::vector<Handle> portHandles;
u32 currentProcess;
ServiceManager serviceManager;
// Get pointer to the object with the specified handle
KernelObject* getObject(u32 handle) {
@ -49,12 +51,14 @@ class Kernel {
Handle makeProcess();
Handle makePort(const char* name);
Handle makeSession(Handle port);
std::optional<Handle> getPortHandle(const char* name);
void deleteObjectData(KernelObject& object);
KernelObject* getProcessFromPID(Handle handle);
s32 getCurrentResourceValue(const KernelObject* limit, u32 resourceName);
u32 getMaxForResource(const KernelObject* limit, u32 resourceName);
u32 getTLSPointer();
std::string getProcessName(u32 pid);
// SVC implementations
@ -68,7 +72,7 @@ class Kernel {
void connectToPort();
public:
Kernel(std::array<u32, 16>& regs, Memory& mem) : regs(regs), mem(mem), handleCounter(0) {
Kernel(std::array<u32, 16>& regs, Memory& mem) : regs(regs), mem(mem), handleCounter(0), serviceManager(regs, mem) {
objects.reserve(512); // Make room for a few objects to avoid further memory allocs later
portHandles.reserve(32);
}

View file

@ -57,15 +57,21 @@ struct ProcessData {
ResourceLimits limits;
};
enum class PortType {
Generic,
ServiceManager // For the service manager port "srv:"
};
struct PortData {
static constexpr u32 maxNameLen = 11;
char name[maxNameLen + 1] = {};
bool isPublic = false; // Setting name=NULL creates a private port not accessible from svcConnectToPort.
PortType type = PortType::Generic;
};
struct SessionData {
Handle portHandle; // The port this session is subscribed to
};
static const char* kernelObjectTypeToString(KernelObjectType t) {

View file

@ -74,4 +74,6 @@ public:
static constexpr bool isAligned(u32 addr) {
return (addr & pageMask) == 0;
}
std::string readString(u32 vaddr, u32 maxCharacters);
};

View file

@ -0,0 +1,18 @@
#pragma once
#include <array>
#include "helpers.hpp"
#include "memory.hpp"
class ServiceManager {
std::array<u32, 16>& regs;
Memory& mem;
// "srv:" commands
void getServiceHandle(u32 messagePointer);
void registerClient(u32 messagePointer);
public:
ServiceManager(std::array<u32, 16>& regs, Memory& mem);
void reset();
void handleSyncRequest(u32 TLSPointer);
};