mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-06 22:25:41 +12:00
[Kernel] Start implementing address arbiters
This commit is contained in:
parent
f100601caf
commit
8bfa29568a
7 changed files with 58 additions and 13 deletions
|
@ -21,11 +21,12 @@ class Kernel {
|
||||||
Handle currentThread;
|
Handle currentThread;
|
||||||
Handle mainThread;
|
Handle mainThread;
|
||||||
Handle srvHandle; // Handle for the special service manager port "srv:"
|
Handle srvHandle; // Handle for the special service manager port "srv:"
|
||||||
|
u32 arbiterCount;
|
||||||
u32 threadCount;
|
u32 threadCount;
|
||||||
ServiceManager serviceManager;
|
ServiceManager serviceManager;
|
||||||
|
|
||||||
// Get pointer to the object with the specified handle
|
// Get pointer to the object with the specified handle
|
||||||
KernelObject* getObject(u32 handle) {
|
KernelObject* getObject(Handle handle) {
|
||||||
// Accessing an object that has not been created
|
// Accessing an object that has not been created
|
||||||
if (handle >= objects.size()) [[unlikely]] {
|
if (handle >= objects.size()) [[unlikely]] {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -35,7 +36,7 @@ class Kernel {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get pointer to the object with the specified handle and type
|
// Get pointer to the object with the specified handle and type
|
||||||
KernelObject* getObject(u32 handle, KernelObjectType type) {
|
KernelObject* getObject(Handle handle, KernelObjectType type) {
|
||||||
if (handle >= objects.size() || objects[handle].type != type) [[unlikely]] {
|
if (handle >= objects.size() || objects[handle].type != type) [[unlikely]] {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +54,7 @@ class Kernel {
|
||||||
return handleCounter++;
|
return handleCounter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Handle makeArbiter();
|
||||||
Handle makeEvent(ResetType resetType);
|
Handle makeEvent(ResetType resetType);
|
||||||
Handle makeProcess();
|
Handle makeProcess();
|
||||||
Handle makePort(const char* name);
|
Handle makePort(const char* name);
|
||||||
|
@ -71,6 +73,7 @@ class Kernel {
|
||||||
const char* resetTypeToString(u32 type);
|
const char* resetTypeToString(u32 type);
|
||||||
|
|
||||||
// SVC implementations
|
// SVC implementations
|
||||||
|
void arbitrateAddress();
|
||||||
void createAddressArbiter();
|
void createAddressArbiter();
|
||||||
void createEvent();
|
void createEvent();
|
||||||
void createThread();
|
void createThread();
|
||||||
|
|
|
@ -88,7 +88,13 @@ struct Session {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Thread {
|
struct Thread {
|
||||||
|
u32 initialSP; // Initial r13 value
|
||||||
|
u32 entrypoint; // Initial r15 value
|
||||||
|
u32 priority;
|
||||||
|
u32 processorID;
|
||||||
|
|
||||||
|
Thread(u32 initialSP, u32 entrypoint, u32 priority, u32 processorID) : initialSP(initialSP), entrypoint(entrypoint),
|
||||||
|
priority(priority), processorID(processorID) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* kernelObjectTypeToString(KernelObjectType t) {
|
static const char* kernelObjectTypeToString(KernelObjectType t) {
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
#include "kernel.hpp"
|
||||||
|
#include "resource_limits.hpp"
|
||||||
|
|
||||||
|
Handle Kernel::makeArbiter() {
|
||||||
|
if (arbiterCount >= appResourceLimits.maxAddressArbiters) {
|
||||||
|
Helpers::panic("Overflowed the number of address arbiters");
|
||||||
|
}
|
||||||
|
arbiterCount++;
|
||||||
|
|
||||||
|
Handle ret = makeObject(KernelObjectType::AddressArbiter);
|
||||||
|
objects[ret].data = new AddressArbiter();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result CreateAddressArbiter(Handle* arbiter)
|
||||||
|
void Kernel::createAddressArbiter() {
|
||||||
|
regs[0] = SVCResult::Success;
|
||||||
|
regs[1] = makeArbiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result ArbitrateAddress(Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds)
|
||||||
|
void Kernel::arbitrateAddress() {
|
||||||
|
const Handle handle = regs[0];
|
||||||
|
const u32 address = regs[1];
|
||||||
|
const u32 type = regs[2];
|
||||||
|
const u32 value = regs[3];
|
||||||
|
const s64 ns = s64(u64(regs[4]) | (u64(regs[5]) << 32));
|
||||||
|
|
||||||
|
printf("ArbitrateAddress(Handle = %X, address = %08X, type = %d, value = %d, ns = %lld)\n", handle, address, type,
|
||||||
|
value, ns);
|
||||||
|
|
||||||
|
const auto arbiter = getObject(handle, KernelObjectType::AddressArbiter);
|
||||||
|
if (arbiter == nullptr) [[unlikely]] {
|
||||||
|
regs[0] = SVCResult::BadHandle;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Helpers::panic("My balls\n");
|
||||||
|
regs[0] = SVCResult::Success;
|
||||||
|
}
|
|
@ -25,7 +25,6 @@ void Kernel::createEvent() {
|
||||||
|
|
||||||
printf("CreateEvent(handle pointer = %08X, resetType = %s)\n", outPointer, resetTypeToString(resetType));
|
printf("CreateEvent(handle pointer = %08X, resetType = %s)\n", outPointer, resetTypeToString(resetType));
|
||||||
|
|
||||||
Handle handle = makeEvent(static_cast<ResetType>(resetType));
|
|
||||||
regs[0] = SVCResult::Success;
|
regs[0] = SVCResult::Success;
|
||||||
regs[1] = handle;
|
regs[1] = makeEvent(static_cast<ResetType>(resetType));
|
||||||
}
|
}
|
|
@ -10,6 +10,7 @@ void Kernel::serviceSVC(u32 svc) {
|
||||||
case 0x17: createEvent(); break;
|
case 0x17: createEvent(); break;
|
||||||
case 0x1F: mapMemoryBlock(); break;
|
case 0x1F: mapMemoryBlock(); break;
|
||||||
case 0x21: createAddressArbiter(); break;
|
case 0x21: createAddressArbiter(); break;
|
||||||
|
case 0x22: arbitrateAddress(); break;
|
||||||
case 0x23: svcCloseHandle(); break;
|
case 0x23: svcCloseHandle(); break;
|
||||||
case 0x2D: connectToPort(); break;
|
case 0x2D: connectToPort(); break;
|
||||||
case 0x32: sendSyncRequest(); break;
|
case 0x32: sendSyncRequest(); break;
|
||||||
|
@ -58,6 +59,7 @@ void Kernel::deleteObjectData(KernelObject& object) {
|
||||||
|
|
||||||
void Kernel::reset() {
|
void Kernel::reset() {
|
||||||
handleCounter = 0;
|
handleCounter = 0;
|
||||||
|
arbiterCount = 0;
|
||||||
threadCount = 0;
|
threadCount = 0;
|
||||||
|
|
||||||
for (auto& object : objects) {
|
for (auto& object : objects) {
|
||||||
|
@ -85,12 +87,6 @@ u32 Kernel::getTLSPointer() {
|
||||||
return VirtualAddrs::TLSBase;
|
return VirtualAddrs::TLSBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result CreateAddressArbiter(Handle* arbiter)
|
|
||||||
void Kernel::createAddressArbiter() {
|
|
||||||
printf("Stubbed call to CreateAddressArbiter. Handle address: %08X\n", regs[0]);
|
|
||||||
regs[0] = SVCResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Result CloseHandle(Handle handle)
|
// Result CloseHandle(Handle handle)
|
||||||
void Kernel::svcCloseHandle() {
|
void Kernel::svcCloseHandle() {
|
||||||
printf("CloseHandle(handle = %d) (Unimplemented)\n", regs[0]);
|
printf("CloseHandle(handle = %d) (Unimplemented)\n", regs[0]);
|
||||||
|
|
|
@ -56,7 +56,7 @@ void Kernel::connectToPort() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle portHandle = optionalHandle.value();
|
Handle portHandle = optionalHandle.value();
|
||||||
printf("ConnectToPort(handle pointer = %08X, port = \"%s\")\n", handlePointer, port.c_str());
|
printf("ConnectToPort(handle pointer = %X, port = \"%s\")\n", handlePointer, port.c_str());
|
||||||
|
|
||||||
const auto portData = objects[portHandle].getData<Port>();
|
const auto portData = objects[portHandle].getData<Port>();
|
||||||
if (!portData->isPublic) {
|
if (!portData->isPublic) {
|
||||||
|
|
|
@ -8,8 +8,9 @@ Handle Kernel::makeThread(u32 entrypoint, u32 initialSP, u32 priority, u32 id) {
|
||||||
}
|
}
|
||||||
threadCount++;
|
threadCount++;
|
||||||
|
|
||||||
// TODO: Actually create the thread
|
Handle ret = makeObject(KernelObjectType::Thread);
|
||||||
return makeObject(KernelObjectType::Thread);
|
objects[ret].data = new Thread(initialSP, entrypoint, priority, id);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result CreateThread(s32 priority, ThreadFunc entrypoint, u32 arg, u32 stacktop, s32 threadPriority, s32 processorID)
|
// Result CreateThread(s32 priority, ThreadFunc entrypoint, u32 arg, u32 stacktop, s32 threadPriority, s32 processorID)
|
||||||
|
|
Loading…
Add table
Reference in a new issue