Added nvmemp, Added /dev/nvhost-ctrl, SetClientPID now stores pid (#114)
* Added nvmemp, Added /dev/nvhost-ctrl, SetClientPID now stores pid * used clang-format-3.9 instead * lowercase pid * Moved nvmemp handlers to cpp * Removed unnecessary logging for NvOsGetConfigU32. Cleaned up log and changed to LOG_DEBUG * using std::arrays instead of c arrays * nvhost get config now uses std::array completely * added pid logging back * updated cmakelist * missing includes * added array, removed memcpy * clang-format6.0
This commit is contained in:
		
							parent
							
								
									173cd959e8
								
							
						
					
					
						commit
						e08fdd4101
					
				
					 9 changed files with 163 additions and 5 deletions
				
			
		|  | @ -55,6 +55,7 @@ enum class Class : ClassType { | ||||||
|     Service_CFG,       ///< The CFG (Configuration) service
 |     Service_CFG,       ///< The CFG (Configuration) service
 | ||||||
|     Service_DSP,       ///< The DSP (DSP control) service
 |     Service_DSP,       ///< The DSP (DSP control) service
 | ||||||
|     Service_HID,       ///< The HID (Human interface device) service
 |     Service_HID,       ///< The HID (Human interface device) service
 | ||||||
|  |     Service_NVDRV,     ///< The NVDRV (Nvidia driver) service
 | ||||||
|     HW,                ///< Low-level hardware emulation
 |     HW,                ///< Low-level hardware emulation
 | ||||||
|     HW_Memory,         ///< Memory-map and address translation
 |     HW_Memory,         ///< Memory-map and address translation
 | ||||||
|     HW_LCD,            ///< LCD register emulation
 |     HW_LCD,            ///< LCD register emulation
 | ||||||
|  |  | ||||||
|  | @ -110,12 +110,16 @@ add_library(core STATIC | ||||||
|     hle/service/nvdrv/devices/nvdisp_disp0.h |     hle/service/nvdrv/devices/nvdisp_disp0.h | ||||||
|     hle/service/nvdrv/devices/nvhost_as_gpu.cpp |     hle/service/nvdrv/devices/nvhost_as_gpu.cpp | ||||||
|     hle/service/nvdrv/devices/nvhost_as_gpu.h |     hle/service/nvdrv/devices/nvhost_as_gpu.h | ||||||
|  |     hle/service/nvdrv/devices/nvhost_ctrl.cpp | ||||||
|  |     hle/service/nvdrv/devices/nvhost_ctrl.h | ||||||
|     hle/service/nvdrv/devices/nvmap.cpp |     hle/service/nvdrv/devices/nvmap.cpp | ||||||
|     hle/service/nvdrv/devices/nvmap.h |     hle/service/nvdrv/devices/nvmap.h | ||||||
|     hle/service/nvdrv/interface.cpp |     hle/service/nvdrv/interface.cpp | ||||||
|     hle/service/nvdrv/interface.h |     hle/service/nvdrv/interface.h | ||||||
|     hle/service/nvdrv/nvdrv.cpp |     hle/service/nvdrv/nvdrv.cpp | ||||||
|     hle/service/nvdrv/nvdrv.h |     hle/service/nvdrv/nvdrv.h | ||||||
|  |     hle/service/nvdrv/nvmemp.cpp | ||||||
|  |     hle/service/nvdrv/nvmemp.h | ||||||
|     hle/service/pctl/pctl.cpp |     hle/service/pctl/pctl.cpp | ||||||
|     hle/service/pctl/pctl.h |     hle/service/pctl/pctl.h | ||||||
|     hle/service/pctl/pctl_a.cpp |     hle/service/pctl/pctl_a.cpp | ||||||
|  |  | ||||||
							
								
								
									
										46
									
								
								src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | // Copyright 2018 yuzu emulator team
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include "common/assert.h" | ||||||
|  | #include "common/logging/log.h" | ||||||
|  | #include "core/hle/service/nvdrv/devices/nvhost_ctrl.h" | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | namespace Nvidia { | ||||||
|  | namespace Devices { | ||||||
|  | 
 | ||||||
|  | u32 nvhost_ctrl::ioctl(u32 command, const std::vector<u8>& input, std::vector<u8>& output) { | ||||||
|  |     LOG_DEBUG(Service_NVDRV, "called, command=0x%08x, input_size=0x%lx, output_size=0x%lx", command, | ||||||
|  |               input.size(), output.size()); | ||||||
|  | 
 | ||||||
|  |     switch (command) { | ||||||
|  |     case IocGetConfigCommand: | ||||||
|  |         return NvOsGetConfigU32(input, output); | ||||||
|  |     } | ||||||
|  |     UNIMPLEMENTED(); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | u32 nvhost_ctrl::NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output) { | ||||||
|  |     IocGetConfigParams params; | ||||||
|  |     std::memcpy(¶ms, input.data(), sizeof(params)); | ||||||
|  |     LOG_DEBUG(Service_NVDRV, "called, setting=%s!%s", params.domain_str.data(), | ||||||
|  |               params.param_str.data()); | ||||||
|  | 
 | ||||||
|  |     if (!strcmp(params.domain_str.data(), "nv")) { | ||||||
|  |         if (!strcmp(params.param_str.data(), "NV_MEMORY_PROFILER")) { | ||||||
|  |             params.config_str[0] = '1'; | ||||||
|  |         } else { | ||||||
|  |             UNIMPLEMENTED(); | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         UNIMPLEMENTED(); | ||||||
|  |     } | ||||||
|  |     std::memcpy(output.data(), ¶ms, sizeof(params)); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Devices
 | ||||||
|  | } // namespace Nvidia
 | ||||||
|  | } // namespace Service
 | ||||||
							
								
								
									
										48
									
								
								src/core/hle/service/nvdrv/devices/nvhost_ctrl.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/core/hle/service/nvdrv/devices/nvhost_ctrl.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | // Copyright 2018 yuzu emulator team
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <array> | ||||||
|  | #include <cstdlib> | ||||||
|  | #include <cstring> | ||||||
|  | #include <vector> | ||||||
|  | #include "common/common_types.h" | ||||||
|  | #include "core/hle/service/nvdrv/devices/nvdevice.h" | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | namespace Nvidia { | ||||||
|  | namespace Devices { | ||||||
|  | 
 | ||||||
|  | class nvhost_ctrl final : public nvdevice { | ||||||
|  | public: | ||||||
|  |     nvhost_ctrl() = default; | ||||||
|  |     ~nvhost_ctrl() override = default; | ||||||
|  | 
 | ||||||
|  |     u32 ioctl(u32 command, const std::vector<u8>& input, std::vector<u8>& output) override; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     enum IoctlCommands { | ||||||
|  |         IocSyncptReadCommand = 0xC0080014, | ||||||
|  |         IocSyncptIncrCommand = 0x40040015, | ||||||
|  |         IocSyncptWaitCommand = 0xC00C0016, | ||||||
|  |         IocModuleMutexCommand = 0x40080017, | ||||||
|  |         IocModuleRegRDWRCommand = 0xC008010E, | ||||||
|  |         IocSyncptWaitexCommand = 0xC0100019, | ||||||
|  |         IocSyncptReadMaxCommand = 0xC008001A, | ||||||
|  |         IocGetConfigCommand = 0xC183001B, | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     struct IocGetConfigParams { | ||||||
|  |         std::array<char, 0x41> domain_str; | ||||||
|  |         std::array<char, 0x41> param_str; | ||||||
|  |         std::array<char, 0x101> config_str; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     u32 NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace Devices
 | ||||||
|  | } // namespace Nvidia
 | ||||||
|  | } // namespace Service
 | ||||||
|  | @ -69,13 +69,12 @@ void NVDRV::Initialize(Kernel::HLERequestContext& ctx) { | ||||||
| 
 | 
 | ||||||
| void NVDRV::SetClientPID(Kernel::HLERequestContext& ctx) { | void NVDRV::SetClientPID(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp{ctx}; |     IPC::RequestParser rp{ctx}; | ||||||
|     u64 pid = rp.Pop<u64>(); |     pid = rp.Pop<u64>(); | ||||||
|     u64 unk = rp.Pop<u64>(); |  | ||||||
| 
 | 
 | ||||||
|     LOG_WARNING(Service, "(STUBBED) called, pid=0x%llx, unk=0x%llx", pid, unk); |     LOG_INFO(Service, "called, pid=0x%lx", pid); | ||||||
| 
 |     IPC::RequestBuilder rb{ctx, 3}; | ||||||
|     IPC::RequestBuilder rb{ctx, 2}; |  | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push<u32>(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name) | NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name) | ||||||
|  |  | ||||||
|  | @ -25,6 +25,8 @@ private: | ||||||
|     void SetClientPID(Kernel::HLERequestContext& ctx); |     void SetClientPID(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|     std::shared_ptr<Module> nvdrv; |     std::shared_ptr<Module> nvdrv; | ||||||
|  | 
 | ||||||
|  |     u64 pid{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Nvidia
 | } // namespace Nvidia
 | ||||||
|  |  | ||||||
|  | @ -6,9 +6,11 @@ | ||||||
| #include "core/hle/service/nvdrv/devices/nvdevice.h" | #include "core/hle/service/nvdrv/devices/nvdevice.h" | ||||||
| #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | ||||||
| #include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" | #include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" | ||||||
|  | #include "core/hle/service/nvdrv/devices/nvhost_ctrl.h" | ||||||
| #include "core/hle/service/nvdrv/devices/nvmap.h" | #include "core/hle/service/nvdrv/devices/nvmap.h" | ||||||
| #include "core/hle/service/nvdrv/interface.h" | #include "core/hle/service/nvdrv/interface.h" | ||||||
| #include "core/hle/service/nvdrv/nvdrv.h" | #include "core/hle/service/nvdrv/nvdrv.h" | ||||||
|  | #include "core/hle/service/nvdrv/nvmemp.h" | ||||||
| 
 | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace Nvidia { | namespace Nvidia { | ||||||
|  | @ -19,6 +21,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||||
|     auto module_ = std::make_shared<Module>(); |     auto module_ = std::make_shared<Module>(); | ||||||
|     std::make_shared<NVDRV>(module_, "nvdrv")->InstallAsService(service_manager); |     std::make_shared<NVDRV>(module_, "nvdrv")->InstallAsService(service_manager); | ||||||
|     std::make_shared<NVDRV>(module_, "nvdrv:a")->InstallAsService(service_manager); |     std::make_shared<NVDRV>(module_, "nvdrv:a")->InstallAsService(service_manager); | ||||||
|  |     std::make_shared<NVMEMP>()->InstallAsService(service_manager); | ||||||
|     nvdrv = module_; |     nvdrv = module_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -27,6 +30,7 @@ Module::Module() { | ||||||
|     devices["/dev/nvhost-as-gpu"] = std::make_shared<Devices::nvhost_as_gpu>(); |     devices["/dev/nvhost-as-gpu"] = std::make_shared<Devices::nvhost_as_gpu>(); | ||||||
|     devices["/dev/nvmap"] = nvmap_dev; |     devices["/dev/nvmap"] = nvmap_dev; | ||||||
|     devices["/dev/nvdisp_disp0"] = std::make_shared<Devices::nvdisp_disp0>(nvmap_dev); |     devices["/dev/nvdisp_disp0"] = std::make_shared<Devices::nvdisp_disp0>(nvmap_dev); | ||||||
|  |     devices["/dev/nvhost-ctrl"] = std::make_shared<Devices::nvhost_ctrl>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| u32 Module::Open(std::string device_name) { | u32 Module::Open(std::string device_name) { | ||||||
|  |  | ||||||
							
								
								
									
										31
									
								
								src/core/hle/service/nvdrv/nvmemp.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/core/hle/service/nvdrv/nvmemp.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | // Copyright 2018 yuzu emulator team
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include "common/assert.h" | ||||||
|  | #include "common/logging/log.h" | ||||||
|  | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/service/nvdrv/nvdrv.h" | ||||||
|  | #include "core/hle/service/nvdrv/nvmemp.h" | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | namespace Nvidia { | ||||||
|  | 
 | ||||||
|  | NVMEMP::NVMEMP() : ServiceFramework("nvmemp") { | ||||||
|  |     static const FunctionInfo functions[] = { | ||||||
|  |         {0, &NVMEMP::Unknown0, "Unknown0"}, | ||||||
|  |         {1, &NVMEMP::Unknown1, "Unknown1"}, | ||||||
|  |     }; | ||||||
|  |     RegisterHandlers(functions); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NVMEMP::Unknown0(Kernel::HLERequestContext& ctx) { | ||||||
|  |     UNIMPLEMENTED(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NVMEMP::Unknown1(Kernel::HLERequestContext& ctx) { | ||||||
|  |     UNIMPLEMENTED(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Nvidia
 | ||||||
|  | } // namespace Service
 | ||||||
							
								
								
									
										23
									
								
								src/core/hle/service/nvdrv/nvmemp.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/core/hle/service/nvdrv/nvmemp.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | // Copyright 2018 yuzu emulator team
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "core/hle/service/service.h" | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | namespace Nvidia { | ||||||
|  | 
 | ||||||
|  | class NVMEMP final : public ServiceFramework<NVMEMP> { | ||||||
|  | public: | ||||||
|  |     NVMEMP(); | ||||||
|  |     ~NVMEMP() = default; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void Unknown0(Kernel::HLERequestContext& ctx); | ||||||
|  |     void Unknown1(Kernel::HLERequestContext& ctx); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace Nvidia
 | ||||||
|  | } // namespace Service
 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David
						David