Add initial support of VI and HID services

This commit is contained in:
rkx1209 2018-08-22 19:04:31 +09:00
parent 0d5c892a62
commit 4171675ae0
9 changed files with 180 additions and 58 deletions

View file

@ -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() {

View file

@ -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
View 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
View 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
View 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
View 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;
}

View file

@ -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
View file

@ -0,0 +1,11 @@
#ifndef _KERNEL_HPP
#define _KERNEL_HPP
namespace Kernel {
class Event {
};
};
#endif

View file

@ -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"