mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-23 13:01:50 +01:00
IPC Episode 1 - Prologue
This commit is contained in:
parent
1e057cb5f9
commit
4cd7c985f0
@ -12,6 +12,7 @@ add_library(lightswitch SHARED
|
|||||||
${source_DIR}/core/arm/cpu.cpp
|
${source_DIR}/core/arm/cpu.cpp
|
||||||
${source_DIR}/core/arm/memory.cpp
|
${source_DIR}/core/arm/memory.cpp
|
||||||
|
|
||||||
|
${source_DIR}/core/hos/kernel/ipc.cpp
|
||||||
${source_DIR}/core/hos/kernel/kernel.cpp
|
${source_DIR}/core/hos/kernel/kernel.cpp
|
||||||
${source_DIR}/core/hos/kernel/svc.cpp
|
${source_DIR}/core/hos/kernel/svc.cpp
|
||||||
${source_DIR}/core/hos/loaders/nro.cpp
|
${source_DIR}/core/hos/loaders/nro.cpp
|
||||||
|
49
app/src/main/cpp/core/hos/kernel/ipc.cpp
Normal file
49
app/src/main/cpp/core/hos/kernel/ipc.cpp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#include <syslog.h>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include "ipc.h"
|
||||||
|
|
||||||
|
namespace core::kernel
|
||||||
|
{
|
||||||
|
IpcRequest::IpcRequest(uint8_t* tlsPtr)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 32; i++)
|
||||||
|
syslog(LOG_DEBUG, "%02x\t%02x %02x %02x %02x %02x %02x %02x %02x", i*8, tlsPtr[0+(i*8)], tlsPtr[1+(i*8)], tlsPtr[2+(i*8)], tlsPtr[3+(i*8)], tlsPtr[4+(i*8)], tlsPtr[5+(i*8)], tlsPtr[6+(i*8)], tlsPtr[7+(i*8)]);
|
||||||
|
syslog(LOG_DEBUG, "-----------------------");
|
||||||
|
uint32_t word1 = ((uint32_t*)tlsPtr)[1];
|
||||||
|
type = *(uint16_t*)tlsPtr;
|
||||||
|
xCount = tlsPtr[2] & 0xF0 >> 4;
|
||||||
|
aCount = tlsPtr[2] & 0x0F;
|
||||||
|
bCount = tlsPtr[3] & 0xF0 >> 4;
|
||||||
|
wCount = tlsPtr[3] & 0x0F;
|
||||||
|
dataSize = word1 & 0x3FF;
|
||||||
|
dataPos = 8;
|
||||||
|
|
||||||
|
if(tlsPtr[2] || tlsPtr[3])
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "IPC - X/A/B/W descriptors");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
syslog(LOG_DEBUG, "Enable handle descriptor: %s", word1 >> 31 ? "yes" : "no");
|
||||||
|
if(word1 >> 31)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "IPC - Handle descriptor");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Align to 16 bytes
|
||||||
|
if((dataPos % 16) != 0)
|
||||||
|
dataPos += 16 - (dataPos % 16);
|
||||||
|
dataPtr = &tlsPtr[dataPos+16];
|
||||||
|
|
||||||
|
syslog(LOG_DEBUG, "Type: %x", type);
|
||||||
|
syslog(LOG_DEBUG, "X descriptors: 0x%x", xCount);
|
||||||
|
syslog(LOG_DEBUG, "A descriptors: 0x%x", aCount);
|
||||||
|
syslog(LOG_DEBUG, "B descriptors: 0x%x", bCount);
|
||||||
|
syslog(LOG_DEBUG, "W descriptors: 0x%x", wCount);
|
||||||
|
syslog(LOG_DEBUG, "Raw data size: 0x%x", word1 & 0x3FF);
|
||||||
|
syslog(LOG_DEBUG, "Data offset=%x, Data size=%x", dataPos, dataSize);
|
||||||
|
syslog(LOG_DEBUG, "Payload CmdId=%i", *((uint32_t*)&tlsPtr[dataPos+8]));
|
||||||
|
syslog(LOG_DEBUG, "Setting dataPtr to %08x", dataPos+16);
|
||||||
|
}
|
||||||
|
}
|
31
app/src/main/cpp/core/hos/kernel/ipc.h
Normal file
31
app/src/main/cpp/core/hos/kernel/ipc.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace core::kernel
|
||||||
|
{
|
||||||
|
class IpcRequest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IpcRequest(uint8_t* tlsPtr);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T GetValue()
|
||||||
|
{
|
||||||
|
dataPos += sizeof(T);
|
||||||
|
return *reinterpret_cast<T*>(&dataPtr[dataPos-sizeof(T)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t type, xCount, aCount, bCount, wCount;
|
||||||
|
uint32_t dataSize;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t* dataPtr;
|
||||||
|
uint32_t dataPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IpcResponse
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IpcResponse() {}
|
||||||
|
};
|
||||||
|
}
|
@ -2,6 +2,8 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#define SM_HANDLE 0xd000 // sm: is hardcoded for now
|
||||||
|
|
||||||
namespace core::kernel
|
namespace core::kernel
|
||||||
{
|
{
|
||||||
class KObject
|
class KObject
|
||||||
|
@ -4,10 +4,40 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include "core/arm/cpu.h"
|
#include "core/arm/cpu.h"
|
||||||
#include "core/arm/memory.h"
|
#include "core/arm/memory.h"
|
||||||
|
#include "kernel.h"
|
||||||
|
#include "ipc.h"
|
||||||
#include "svc.h"
|
#include "svc.h"
|
||||||
|
|
||||||
using namespace core::cpu;
|
using namespace core::cpu;
|
||||||
namespace core::kernel {
|
namespace core::kernel {
|
||||||
|
static uint32_t ConnectToNamedPort()
|
||||||
|
{
|
||||||
|
std::string port(8, '\0');
|
||||||
|
memory::Read((void*)port.data(), GetRegister(UC_ARM64_REG_X1), 8);
|
||||||
|
|
||||||
|
if(std::strcmp(port.c_str(), "sm:") == 0)
|
||||||
|
SetRegister(UC_ARM64_REG_W1, SM_HANDLE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "svcConnectToNamedPort tried connecting to invalid port '%s'", port.c_str());
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t SendSyncRequest()
|
||||||
|
{
|
||||||
|
syslog(LOG_INFO, "svcSendSyncRequest called for handle 0x%x, dumping TLS:", GetRegister(UC_ARM64_REG_X0));
|
||||||
|
uint8_t tls[0x100];
|
||||||
|
memory::Read(&tls, 0x2000000, 0x100);
|
||||||
|
|
||||||
|
core::kernel::IpcRequest* r = new core::kernel::IpcRequest(tls);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t OutputDebugString()
|
static uint32_t OutputDebugString()
|
||||||
{
|
{
|
||||||
std::string debug(GetRegister(UC_ARM64_REG_X1), '\0');
|
std::string debug(GetRegister(UC_ARM64_REG_X1), '\0');
|
||||||
@ -71,9 +101,9 @@ namespace core::kernel {
|
|||||||
{0x1c, nullptr},
|
{0x1c, nullptr},
|
||||||
{0x1d, nullptr},
|
{0x1d, nullptr},
|
||||||
{0x1e, nullptr},
|
{0x1e, nullptr},
|
||||||
{0x1f, nullptr},
|
{0x1f, ConnectToNamedPort},
|
||||||
{0x20, nullptr},
|
{0x20, nullptr},
|
||||||
{0x21, nullptr},
|
{0x21, SendSyncRequest},
|
||||||
{0x22, nullptr},
|
{0x22, nullptr},
|
||||||
{0x23, nullptr},
|
{0x23, nullptr},
|
||||||
{0x24, nullptr},
|
{0x24, nullptr},
|
||||||
|
Loading…
Reference in New Issue
Block a user