diff --git a/Cpu.cpp b/Cpu.cpp index 3b14966..08b2d57 100644 --- a/Cpu.cpp +++ b/Cpu.cpp @@ -1,5 +1,6 @@ /* nsemu - LGPL - Copyright 2017 rkx1209 */ #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() { diff --git a/Ipcdefs/Auto.def b/Ipcdefs/Auto.def index ff69239..b6c70de 100644 --- a/Ipcdefs/Auto.def +++ b/Ipcdefs/Auto.def @@ -1793,7 +1793,7 @@ interface nn::hid::IActiveVibrationDeviceList { } interface nn::hid::IAppletResource { - [0] GetSharedMemoryHandle() -> IpcService; + [0] GetSharedMemoryHandle() -> object; } 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); [2451] GetIndirectLayerImageCropMap(f32, f32, f32, f32, i64, i64, u64, nn::applet::AppletResourceUserId, pid) -> (i64, i64, buffer); [2460] GetIndirectLayerImageRequiredMemoryInfo(i64, i64) -> (i64, i64); - [5202] GetDisplayVsyncEvent(u64) -> IpcService; - [5203] GetDisplayVsyncEventForDebug(u64) -> IpcService; + [5202] GetDisplayVsyncEvent(u64) -> object; + [5203] GetDisplayVsyncEventForDebug(u64) -> object; } interface nn::visrv::sf::IApplicationRootService is vi:u { diff --git a/Service/Dispdrv.cpp b/Service/Dispdrv.cpp new file mode 100644 index 0000000..fb2199b --- /dev/null +++ b/Service/Dispdrv.cpp @@ -0,0 +1,48 @@ +/* nsemu - LGPL - Copyright 2018 rkx1209 */ +#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 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; +} + +}; diff --git a/Service/Dispdrv.hpp b/Service/Dispdrv.hpp new file mode 100644 index 0000000..8cae880 --- /dev/null +++ b/Service/Dispdrv.hpp @@ -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 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 layers; + Kernel::Event *vsync_event; +}; + +void Init(); +uint64_t OpenDisplay(const std::string name); +Kernel::Event* GetVsyncEvent(uint64_t display_id); + +}; +#endif diff --git a/Service/Hid.cpp b/Service/Hid.cpp new file mode 100644 index 0000000..f931631 --- /dev/null +++ b/Service/Hid.cpp @@ -0,0 +1,15 @@ +/* nsemu - LGPL - Copyright 2018 rkx1209 */ +#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; +} diff --git a/Service/Vi.cpp b/Service/Vi.cpp new file mode 100644 index 0000000..217e2b9 --- /dev/null +++ b/Service/Vi.cpp @@ -0,0 +1,47 @@ +/* nsemu - LGPL - Copyright 2018 rkx1209 */ +#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; +} diff --git a/include/IpcStubs.hpp b/include/IpcStubs.hpp index 20d3fb5..d3bb852 100644 --- a/include/IpcStubs.hpp +++ b/include/IpcStubs.hpp @@ -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(8)); resp->error_code = GetDisplayVsyncEvent(req->GetData(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(8)); resp->error_code = GetDisplayVsyncEventForDebug(req->GetData(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; diff --git a/include/Kernel.hpp b/include/Kernel.hpp new file mode 100644 index 0000000..261833b --- /dev/null +++ b/include/Kernel.hpp @@ -0,0 +1,11 @@ +#ifndef _KERNEL_HPP +#define _KERNEL_HPP + +namespace Kernel { + +class Event { + +}; + +}; +#endif diff --git a/include/Nsemu.hpp b/include/Nsemu.hpp index 545e97e..20ac0a3 100644 --- a/include/Nsemu.hpp +++ b/include/Nsemu.hpp @@ -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"