From f3137d3bc12253ed0406ef01406b3b62c563bbd7 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Sat, 21 Apr 2018 22:04:24 -0700 Subject: [PATCH] Implemented GetIUserInterface properly, Playreport and SSL::SetInterfaceVersion. Fixed ipc issues with IAudioDevice(wrong ids) --- src/core/CMakeLists.txt | 2 + src/core/hle/service/audio/audren_u.cpp | 15 ++++--- src/core/hle/service/nfp/nfp.cpp | 21 +++++++++- src/core/hle/service/nfp/nfp.h | 2 +- src/core/hle/service/nfp/nfp_user.cpp | 2 +- .../service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 1 + src/core/hle/service/prepo/prepo.cpp | 40 +++++++++++++++++++ src/core/hle/service/prepo/prepo.h | 23 +++++++++++ src/core/hle/service/service.cpp | 2 + src/core/hle/service/ssl/ssl.cpp | 11 ++++- src/core/hle/service/ssl/ssl.h | 1 + 11 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 src/core/hle/service/prepo/prepo.cpp create mode 100644 src/core/hle/service/prepo/prepo.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index c1a645460c..c2a6f56cd2 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -187,6 +187,8 @@ add_library(core STATIC hle/service/pctl/pctl.h hle/service/pctl/pctl_a.cpp hle/service/pctl/pctl_a.h + hle/service/prepo/prepo.cpp + hle/service/prepo/prepo.h hle/service/service.cpp hle/service/service.h hle/service/set/set.cpp diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index d9245cb192..fe445552ad 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -162,12 +162,15 @@ public: {0x3, &IAudioDevice::GetActiveAudioDeviceName, "GetActiveAudioDeviceName"}, {0x4, &IAudioDevice::QueryAudioDeviceSystemEvent, "QueryAudioDeviceSystemEvent"}, {0x5, &IAudioDevice::GetActiveChannelCount, "GetActiveChannelCount"}, - {0x6, nullptr, "ListAudioDeviceNameAuto"}, - {0x7, nullptr, "SetAudioDeviceOutputVolumeAuto"}, + {0x6, &IAudioDevice::ListAudioDeviceName, + "ListAudioDeviceNameAuto"}, // Are these any different? + {0x7, &IAudioDevice::SetAudioDeviceOutputVolume, + "SetAudioDeviceOutputVolumeAuto"}, // Are these any different? {0x8, nullptr, "GetAudioDeviceOutputVolumeAuto"}, - {0x10, nullptr, "GetActiveAudioDeviceNameAuto"}, - {0x11, nullptr, "QueryAudioDeviceInputEvent"}, - {0x12, nullptr, "QueryAudioDeviceOutputEvent"}}; + {0xa, &IAudioDevice::GetActiveAudioDeviceName, + "GetActiveAudioDeviceNameAuto"}, // Are these any different? + {0xb, nullptr, "QueryAudioDeviceInputEvent"}, + {0xc, nullptr, "QueryAudioDeviceOutputEvent"}}; RegisterHandlers(functions); buffer_event = @@ -257,7 +260,7 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(RESULT_SUCCESS); - rb.Push(0x400); + rb.Push(0x4000); LOG_WARNING(Service_Audio, "(STUBBED) called"); } diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index 91e5f527aa..2f21d8f565 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -12,10 +12,27 @@ namespace Service::NFP { Module::Interface::Interface(std::shared_ptr module, const char* name) : ServiceFramework(name), module(std::move(module)) {} -void Module::Interface::Unknown(Kernel::HLERequestContext& ctx) { +class IUser final : public ServiceFramework { +public: + IUser() : ServiceFramework("IUser") { + static const FunctionInfo functions[] = { + {0, &IUser::Initialize, "Initialize"}, + }; + RegisterHandlers(functions); + } + +private: + void Initialize(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); + } +}; + +void Module::Interface::GetIUserInterface(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_NFP, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface(); } void InstallInterfaces(SM::ServiceManager& service_manager) { diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index 095209ad84..c0688f232a 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h @@ -14,7 +14,7 @@ public: public: Interface(std::shared_ptr module, const char* name); - void Unknown(Kernel::HLERequestContext& ctx); + void GetIUserInterface(Kernel::HLERequestContext& ctx); protected: std::shared_ptr module; diff --git a/src/core/hle/service/nfp/nfp_user.cpp b/src/core/hle/service/nfp/nfp_user.cpp index e94c271e77..678f7a9276 100644 --- a/src/core/hle/service/nfp/nfp_user.cpp +++ b/src/core/hle/service/nfp/nfp_user.cpp @@ -9,7 +9,7 @@ namespace Service::NFP { NFP_User::NFP_User(std::shared_ptr module) : Module::Interface(std::move(module), "nfp:user") { static const FunctionInfo functions[] = { - {0, &NFP_User::Unknown, "Unknown"}, + {0, &NFP_User::GetIUserInterface, "GetIUserInterface"}, }; RegisterHandlers(functions); } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index 18ea12ef55..44ae9c08a6 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -79,6 +79,7 @@ u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector& input, std::vector& std::memcpy(¶ms, input.data(), input.size()); LOG_WARNING(Service_NVDRV, "(STUBBED) called, mask=0x%x, mask_buf_addr=0x%" PRIx64, params.mask_buf_size, params.mask_buf_addr); + params.unk = 0xcafe; // Needs to be non 0, what does this actually do? std::memcpy(output.data(), ¶ms, sizeof(params)); return 0; } diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp new file mode 100644 index 0000000000..b9a7e1ff0c --- /dev/null +++ b/src/core/hle/service/prepo/prepo.cpp @@ -0,0 +1,40 @@ +#include +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/event.h" +#include "core/hle/service/prepo/prepo.h" + +namespace Service::Playreport { +Playreport::Playreport(const char* name) : ServiceFramework(name) { + static const FunctionInfo functions[] = { + {10101, &Playreport::SaveReportWithUser, "SaveReportWithUser"}, + }; + RegisterHandlers(functions); +}; + +void Playreport::SaveReportWithUser(Kernel::HLERequestContext& ctx) { + /*IPC::RequestParser rp{ctx}; + auto Uid = rp.PopRaw>(); + u64 unk = rp.Pop(); + std::vector buffer; + buffer.reserve(ctx.BufferDescriptorX()[0].Size()); + Memory::ReadBlock(ctx.BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); + + std::vector buffer2; + buffer.reserve(ctx.BufferDescriptorA()[0].Size()); + Memory::ReadBlock(ctx.BufferDescriptorA()[0].Address(), buffer.data(), buffer.size());*/ + + // If we ever want to add play reports + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +}; + +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared("prepo:a")->InstallAsService(service_manager); + std::make_shared("prepo:m")->InstallAsService(service_manager); + std::make_shared("prepo:s")->InstallAsService(service_manager); + std::make_shared("prepo:u")->InstallAsService(service_manager); +} + +} // namespace Service::Playreport diff --git a/src/core/hle/service/prepo/prepo.h b/src/core/hle/service/prepo/prepo.h new file mode 100644 index 0000000000..77457b7bdd --- /dev/null +++ b/src/core/hle/service/prepo/prepo.h @@ -0,0 +1,23 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include "core/hle/kernel/event.h" +#include "core/hle/service/service.h" + +namespace Service::Playreport { + +class Playreport final : public ServiceFramework { +public: + Playreport(const char* name); + ~Playreport() = default; + +private: + void SaveReportWithUser(Kernel::HLERequestContext& ctx); +}; + +void InstallInterfaces(SM::ServiceManager& service_manager); + +}; // namespace Service::Playreport diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 08ce296772..1e759b21ea 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -30,6 +30,7 @@ #include "core/hle/service/ns/ns.h" #include "core/hle/service/nvdrv/nvdrv.h" #include "core/hle/service/pctl/pctl.h" +#include "core/hle/service/prepo/prepo.h" #include "core/hle/service/service.h" #include "core/hle/service/set/settings.h" #include "core/hle/service/sm/controller.h" @@ -192,6 +193,7 @@ void Init(std::shared_ptr& sm) { NS::InstallInterfaces(*sm); Nvidia::InstallInterfaces(*sm); PCTL::InstallInterfaces(*sm); + Playreport::InstallInterfaces(*sm); Sockets::InstallInterfaces(*sm); SPL::InstallInterfaces(*sm); SSL::InstallInterfaces(*sm); diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 11d438728f..7e21fec8e9 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -96,12 +96,21 @@ SSL::SSL() : ServiceFramework("ssl") { {2, nullptr, "GetCertificates"}, {3, nullptr, "GetCertificateBufSize"}, {4, nullptr, "DebugIoctl"}, - {5, nullptr, "SetInterfaceVersion"}, + {5, &SSL::SetInterfaceVersion, "SetInterfaceVersion"}, {6, nullptr, "FlushSessionCache"}, }; RegisterHandlers(functions); } +void SSL::SetInterfaceVersion(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + u32 unk1 = rp.Pop(); // Probably minor/major? + u32 unk2 = rp.Pop(); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + void InstallInterfaces(SM::ServiceManager& service_manager) { std::make_shared()->InstallAsService(service_manager); } diff --git a/src/core/hle/service/ssl/ssl.h b/src/core/hle/service/ssl/ssl.h index 87538a6396..8fef130226 100644 --- a/src/core/hle/service/ssl/ssl.h +++ b/src/core/hle/service/ssl/ssl.h @@ -15,6 +15,7 @@ public: private: void CreateContext(Kernel::HLERequestContext& ctx); + void SetInterfaceVersion(Kernel::HLERequestContext& ctx); }; /// Registers all SSL services with the specified service manager.