mirror of
https://github.com/RKX1209/nsemu.git
synced 2024-05-12 01:25:24 -04:00
Add initial support of VI and HID services
This commit is contained in:
parent
0d5c892a62
commit
4171675ae0
6
Cpu.cpp
6
Cpu.cpp
|
@ -1,5 +1,6 @@
|
|||
/* nsemu - LGPL - Copyright 2017 rkx1209<rkx1209dev@gmail.com> */
|
||||
#include "Nsemu.hpp"
|
||||
#include "Service/Dispdrv.hpp"
|
||||
namespace Cpu {
|
||||
|
||||
static State state = State::PowerDown;
|
||||
|
@ -7,9 +8,10 @@ FILE *TraceOut;
|
|||
bool DeepTrace;
|
||||
|
||||
void Init() {
|
||||
ARMv8::Init ();
|
||||
SVC::Init ();
|
||||
ARMv8::Init();
|
||||
SVC::Init();
|
||||
ThreadManager::Init();
|
||||
NVFlinger::Init();
|
||||
}
|
||||
|
||||
void Run() {
|
||||
|
|
|
@ -1793,7 +1793,7 @@ interface nn::hid::IActiveVibrationDeviceList {
|
|||
}
|
||||
|
||||
interface nn::hid::IAppletResource {
|
||||
[0] GetSharedMemoryHandle() -> IpcService;
|
||||
[0] GetSharedMemoryHandle() -> object<uint8_t>;
|
||||
}
|
||||
|
||||
interface nn::hid::IHidDebugServer is hid:dbg {
|
||||
|
@ -4004,8 +4004,8 @@ interface nn::visrv::sf::IApplicationDisplayService {
|
|||
[2450] GetIndirectLayerImageMap(i64, i64, u64, nn::applet::AppletResourceUserId, pid) -> (i64, i64, buffer<unknown, 0x46, 0>);
|
||||
[2451] GetIndirectLayerImageCropMap(f32, f32, f32, f32, i64, i64, u64, nn::applet::AppletResourceUserId, pid) -> (i64, i64, buffer<unknown, 0x46, 0>);
|
||||
[2460] GetIndirectLayerImageRequiredMemoryInfo(i64, i64) -> (i64, i64);
|
||||
[5202] GetDisplayVsyncEvent(u64) -> IpcService;
|
||||
[5203] GetDisplayVsyncEventForDebug(u64) -> IpcService;
|
||||
[5202] GetDisplayVsyncEvent(u64) -> object<Kernel::Event>;
|
||||
[5203] GetDisplayVsyncEventForDebug(u64) -> object<Kernel::Event>;
|
||||
}
|
||||
|
||||
interface nn::visrv::sf::IApplicationRootService is vi:u {
|
||||
|
|
48
Service/Dispdrv.cpp
Normal file
48
Service/Dispdrv.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
/* nsemu - LGPL - Copyright 2018 rkx1209<rkx1209dev@gmail.com> */
|
||||
#include "Nsemu.hpp"
|
||||
#include "IpcStubs.hpp"
|
||||
#include "Dispdrv.hpp"
|
||||
namespace NVFlinger {
|
||||
|
||||
Display::Display(uint64_t id, std::string name) : id(id), name(name) {
|
||||
vsync_event = new Kernel::Event();
|
||||
}
|
||||
|
||||
Layer::Layer(uint64_t id, BufferQueue* queue) : id(id), buffer_queue(queue) {}
|
||||
|
||||
static std::vector<Display> displays;
|
||||
|
||||
void Init() {
|
||||
displays.push_back(Display(0, "Default"));
|
||||
}
|
||||
|
||||
uint64_t OpenDisplay(const std::string name) {
|
||||
ns_print("Opening display %s\n", name.c_str());
|
||||
auto itr = std::find_if(displays.begin(), displays.end(),
|
||||
[&](const Display& display) { return display.name == name; });
|
||||
if (itr == displays.end()) {
|
||||
ns_abort("Cannnot find display\n");
|
||||
}
|
||||
return itr->id;
|
||||
}
|
||||
|
||||
Display GetDisplay(uint64_t display_id) {
|
||||
auto itr = std::find_if(displays.begin(), displays.end(),
|
||||
[&](const Display& display) { return display.id == display_id; });
|
||||
return *itr;
|
||||
}
|
||||
|
||||
Layer GetLayer(uint64_t display_id, uint64_t layer_id) {
|
||||
auto display = GetDisplay(display_id);
|
||||
|
||||
auto itr = std::find_if(display.layers.begin(), display.layers.end(),
|
||||
[&](const Layer& layer) { return layer.id == layer_id; });
|
||||
return *itr;
|
||||
}
|
||||
|
||||
Kernel::Event* GetVsyncEvent(uint64_t display_id) {
|
||||
auto display = GetDisplay(display_id);
|
||||
return display.vsync_event;
|
||||
}
|
||||
|
||||
};
|
38
Service/Dispdrv.hpp
Normal file
38
Service/Dispdrv.hpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
#ifndef _DISPDRV_HPP
|
||||
#define _DISPDRV_HPP
|
||||
|
||||
namespace NVFlinger {
|
||||
|
||||
class BufferQueue {
|
||||
public:
|
||||
BufferQueue(uint32_t id, uint64_t layer_id);
|
||||
struct Buffer {
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t format;
|
||||
};
|
||||
private:
|
||||
std::vector<Buffer> queue;
|
||||
|
||||
};
|
||||
|
||||
struct Layer {
|
||||
Layer(uint64_t id, BufferQueue* queue);
|
||||
uint64_t id;
|
||||
BufferQueue* buffer_queue;
|
||||
};
|
||||
|
||||
struct Display {
|
||||
Display(uint64_t id, std::string name);
|
||||
uint64_t id;
|
||||
std::string name;
|
||||
std::vector<Layer> layers;
|
||||
Kernel::Event *vsync_event;
|
||||
};
|
||||
|
||||
void Init();
|
||||
uint64_t OpenDisplay(const std::string name);
|
||||
Kernel::Event* GetVsyncEvent(uint64_t display_id);
|
||||
|
||||
};
|
||||
#endif
|
15
Service/Hid.cpp
Normal file
15
Service/Hid.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* nsemu - LGPL - Copyright 2018 rkx1209<rkx1209dev@gmail.com> */
|
||||
#include "Nsemu.hpp"
|
||||
#include "IpcStubs.hpp"
|
||||
|
||||
static uint8_t hid_shared_mem[0x40000];
|
||||
uint32_t nn::hid::IHidServer::CreateAppletResource(nn::applet::AppletResourceUserId pid, uint64_t uid, nn::hid::IAppletResource*& res) {
|
||||
res = new IAppletResource();
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t nn::hid::IAppletResource::GetSharedMemoryHandle(uint8_t *&handle) {
|
||||
ns_print("nn::hid::IAppletResource::GetSharedMemoryHandle\n");
|
||||
handle = hid_shared_mem;
|
||||
return 0;
|
||||
}
|
47
Service/Vi.cpp
Normal file
47
Service/Vi.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
/* nsemu - LGPL - Copyright 2018 rkx1209<rkx1209dev@gmail.com> */
|
||||
#include "Nsemu.hpp"
|
||||
#include "Dispdrv.hpp"
|
||||
#include "IpcStubs.hpp"
|
||||
|
||||
uint32_t nn::visrv::sf::IManagerRootService::GetDisplayService(uint32_t user, nn::visrv::sf::IApplicationDisplayService*& dis) {
|
||||
ns_print("nn::visrv::sf::IManagerRootService::GetDisplayService\n");
|
||||
dis = new nn::visrv::sf::IApplicationDisplayService();
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t nn::visrv::sf::ISystemRootService::GetDisplayService(uint32_t user, nn::visrv::sf::IApplicationDisplayService*& dis) {
|
||||
ns_print("nn::visrv::sf::ISystemRootService::GetDisplayService\n");
|
||||
dis = new nn::visrv::sf::IApplicationDisplayService();
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetIndirectDisplayTransactionService(nns::hosbinder::IHOSBinderDriver*& drv) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::GetIndirectDisplayTransactionService\n");
|
||||
drv = new nns::hosbinder::IHOSBinderDriver();
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetManagerDisplayService(nn::visrv::sf::IManagerDisplayService*& dis) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::GetManagerDisplayService\n");
|
||||
dis = new nn::visrv::sf::IManagerDisplayService();
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetRelayService(nns::hosbinder::IHOSBinderDriver*& ihos) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::GetRelayService\n");
|
||||
ihos = new nns::hosbinder::IHOSBinderDriver();
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetSystemDisplayService(nn::visrv::sf::ISystemDisplayService*& dis) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::GetSystemDisplayService\n");
|
||||
dis = new nn::visrv::sf::ISystemDisplayService();
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::OpenDisplay(nn::vi::DisplayName _name, uint64_t& dispid) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::OpenDisplay\n");
|
||||
char *name = (char *) _name;
|
||||
dispid = NVFlinger::OpenDisplay(std::string(name));
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEvent(uint64_t dispid, Kernel::Event*& event) {
|
||||
ns_print("nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEvent\n");
|
||||
event = NVFlinger::GetVsyncEvent(dispid);
|
||||
return 0;
|
||||
}
|
|
@ -16899,19 +16899,19 @@ namespace nn::hid {
|
|||
uint32_t Dispatch(IpcMessage *req, IpcMessage *resp) {
|
||||
switch(req->cmd_id) {
|
||||
case 0: {
|
||||
resp->GenBuf(0, 1, 0);
|
||||
IpcService *temp1;
|
||||
resp->GenBuf(1, 0, 0);
|
||||
uint8_t* temp1;
|
||||
ns_print("IPC message to nn::hid::IAppletResource::GetSharedMemoryHandle\n");
|
||||
resp->error_code = GetSharedMemoryHandle(temp1);
|
||||
if(temp1 != nullptr)
|
||||
resp->SetCopy(0, NewHandle(temp1));
|
||||
resp->SetMove(0, NewHandle((IpcService *)temp1));
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
ns_abort("Unknown message cmdId %u to interface nn::hid::IAppletResource", req->cmd_id);
|
||||
}
|
||||
}
|
||||
uint32_t GetSharedMemoryHandle(IpcService*& _0);
|
||||
uint32_t GetSharedMemoryHandle(uint8_t*& _0);
|
||||
};
|
||||
class IHidDebugServer : public IpcService {
|
||||
public:
|
||||
|
@ -18380,10 +18380,6 @@ uint32_t nn::hid::IActiveVibrationDeviceList::ActivateVibrationDevice(nn::hid::V
|
|||
ns_print("Stub implementation for nn::hid::IActiveVibrationDeviceList::ActivateVibrationDevice\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::hid::IAppletResource::GetSharedMemoryHandle(IpcService*& _0) {
|
||||
ns_print("Stub implementation for nn::hid::IAppletResource::GetSharedMemoryHandle\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::hid::IHidDebugServer::ActivateFirmwareUpdate() {
|
||||
ns_print("Stub implementation for nn::hid::IHidDebugServer::ActivateFirmwareUpdate\n");
|
||||
return 0;
|
||||
|
@ -18608,10 +18604,6 @@ uint32_t nn::hid::IHidServer::CreateActiveVibrationDeviceList(nn::hid::IActiveVi
|
|||
ns_print("Stub implementation for nn::hid::IHidServer::CreateActiveVibrationDeviceList\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::hid::IHidServer::CreateAppletResource(nn::applet::AppletResourceUserId _0, uint64_t _1, nn::hid::IAppletResource*& _2) {
|
||||
ns_print("Stub implementation for nn::hid::IHidServer::CreateAppletResource\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::hid::IHidServer::DeactivateJoySixAxisSensor(nn::hid::JoyXpadId _0) {
|
||||
ns_print("Stub implementation for nn::hid::IHidServer::DeactivateJoySixAxisSensor\n");
|
||||
return 0;
|
||||
|
@ -40032,21 +40024,21 @@ namespace nn::visrv::sf {
|
|||
return 0;
|
||||
}
|
||||
case 5202: {
|
||||
resp->GenBuf(0, 1, 0);
|
||||
IpcService *temp1;
|
||||
resp->GenBuf(1, 0, 0);
|
||||
Kernel::Event* temp1;
|
||||
ns_print("IPC message to nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEvent: uint64_t = 0x%%lx\n", req->GetData<uint64_t>(8));
|
||||
resp->error_code = GetDisplayVsyncEvent(req->GetData<uint64_t>(8), temp1);
|
||||
if(temp1 != nullptr)
|
||||
resp->SetCopy(0, NewHandle(temp1));
|
||||
resp->SetMove(0, NewHandle((IpcService *)temp1));
|
||||
return 0;
|
||||
}
|
||||
case 5203: {
|
||||
resp->GenBuf(0, 1, 0);
|
||||
IpcService *temp1;
|
||||
resp->GenBuf(1, 0, 0);
|
||||
Kernel::Event* temp1;
|
||||
ns_print("IPC message to nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEventForDebug: uint64_t = 0x%%lx\n", req->GetData<uint64_t>(8));
|
||||
resp->error_code = GetDisplayVsyncEventForDebug(req->GetData<uint64_t>(8), temp1);
|
||||
if(temp1 != nullptr)
|
||||
resp->SetCopy(0, NewHandle(temp1));
|
||||
resp->SetMove(0, NewHandle((IpcService *)temp1));
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
|
@ -40058,8 +40050,8 @@ namespace nn::visrv::sf {
|
|||
uint32_t CreateStrayLayer(uint32_t _0, uint64_t _1, uint64_t& _2, int64_t& _3, uint8_t *& _4, unsigned int _4_size);
|
||||
uint32_t DestroyStrayLayer(uint64_t _0);
|
||||
uint32_t GetDisplayResolution(uint64_t _0, int64_t& _1, int64_t& _2);
|
||||
uint32_t GetDisplayVsyncEvent(uint64_t _0, IpcService*& _1);
|
||||
uint32_t GetDisplayVsyncEventForDebug(uint64_t _0, IpcService*& _1);
|
||||
uint32_t GetDisplayVsyncEvent(uint64_t _0, Kernel::Event*& _1);
|
||||
uint32_t GetDisplayVsyncEventForDebug(uint64_t _0, Kernel::Event*& _1);
|
||||
uint32_t GetIndirectDisplayTransactionService(nns::hosbinder::IHOSBinderDriver*& _0);
|
||||
uint32_t GetIndirectLayerImageCropMap(float _0, float _1, float _2, float _3, int64_t _4, int64_t _5, uint64_t _6, nn::applet::AppletResourceUserId _7, uint64_t _8, int64_t& _9, int64_t& _10, uint8_t *& _11, unsigned int _11_size);
|
||||
uint32_t GetIndirectLayerImageMap(int64_t _0, int64_t _1, uint64_t _2, nn::applet::AppletResourceUserId _3, uint64_t _4, int64_t& _5, int64_t& _6, uint8_t *& _7, unsigned int _7_size);
|
||||
|
@ -40612,18 +40604,10 @@ uint32_t nn::visrv::sf::IApplicationDisplayService::GetDisplayResolution(uint64_
|
|||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetDisplayResolution\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEvent(uint64_t _0, IpcService*& _1) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEvent\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEventForDebug(uint64_t _0, IpcService*& _1) {
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEventForDebug(uint64_t _0, Kernel::Event*& _1) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetDisplayVsyncEventForDebug\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetIndirectDisplayTransactionService(nns::hosbinder::IHOSBinderDriver*& _0) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetIndirectDisplayTransactionService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetIndirectLayerImageCropMap(float _0, float _1, float _2, float _3, int64_t _4, int64_t _5, uint64_t _6, nn::applet::AppletResourceUserId _7, uint64_t _8, int64_t& _9, int64_t& _10, uint8_t *& _11, unsigned int _11_size) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetIndirectLayerImageCropMap\n");
|
||||
return 0;
|
||||
|
@ -40636,18 +40620,6 @@ uint32_t nn::visrv::sf::IApplicationDisplayService::GetIndirectLayerImageRequire
|
|||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetManagerDisplayService(nn::visrv::sf::IManagerDisplayService*& _0) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetManagerDisplayService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetRelayService(nns::hosbinder::IHOSBinderDriver*& _0) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetRelayService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::GetSystemDisplayService(nn::visrv::sf::ISystemDisplayService*& _0) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::GetSystemDisplayService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::ListDisplays(int64_t& _0, nn::vi::DisplayInfo *& _1, unsigned int _1_size) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::ListDisplays\n");
|
||||
return 0;
|
||||
|
@ -40656,10 +40628,6 @@ uint32_t nn::visrv::sf::IApplicationDisplayService::OpenDefaultDisplay(uint64_t&
|
|||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::OpenDefaultDisplay\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::OpenDisplay(nn::vi::DisplayName _0, uint64_t& _1) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::OpenDisplay\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IApplicationDisplayService::OpenLayer(nn::vi::DisplayName _0, uint64_t _1, nn::applet::AppletResourceUserId _2, uint64_t _3, int64_t& _4, uint8_t *& _5, unsigned int _5_size) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IApplicationDisplayService::OpenLayer\n");
|
||||
return 0;
|
||||
|
@ -40764,10 +40732,6 @@ uint32_t nn::visrv::sf::IManagerDisplayService::SetLayerVisibility(bool _0, uint
|
|||
ns_print("Stub implementation for nn::visrv::sf::IManagerDisplayService::SetLayerVisibility\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IManagerRootService::GetDisplayService(uint32_t _0, nn::visrv::sf::IApplicationDisplayService*& _1) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IManagerRootService::GetDisplayService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::IManagerRootService::GetDisplayServiceWithProxyNameExchange(nn::vi::ProxyName _0, uint32_t _1, nn::visrv::sf::IApplicationDisplayService*& _2) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::IManagerRootService::GetDisplayServiceWithProxyNameExchange\n");
|
||||
return 0;
|
||||
|
@ -40904,10 +40868,6 @@ uint32_t nn::visrv::sf::ISystemDisplayService::SetLayerZ(uint64_t _0, int64_t _1
|
|||
ns_print("Stub implementation for nn::visrv::sf::ISystemDisplayService::SetLayerZ\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::ISystemRootService::GetDisplayService(uint32_t _0, nn::visrv::sf::IApplicationDisplayService*& _1) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::ISystemRootService::GetDisplayService\n");
|
||||
return 0;
|
||||
}
|
||||
uint32_t nn::visrv::sf::ISystemRootService::GetDisplayServiceWithProxyNameExchange(nn::vi::ProxyName _0, uint32_t _1, nn::visrv::sf::IApplicationDisplayService*& _2) {
|
||||
ns_print("Stub implementation for nn::visrv::sf::ISystemRootService::GetDisplayServiceWithProxyNameExchange\n");
|
||||
return 0;
|
||||
|
|
11
include/Kernel.hpp
Normal file
11
include/Kernel.hpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef _KERNEL_HPP
|
||||
#define _KERNEL_HPP
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
class Event {
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
#endif
|
|
@ -31,6 +31,7 @@ using namespace std;
|
|||
#include "Util.hpp"
|
||||
#include "NintendoObject.hpp"
|
||||
#include "Cpu.hpp"
|
||||
#include "Kernel.hpp"
|
||||
#include "Svc.hpp"
|
||||
#include "ARMv8/ARMv8.hpp"
|
||||
#include "ARMv8/Disassembler.hpp"
|
||||
|
|
Loading…
Reference in a new issue