From 1cdc74c5e9236cca085544db6bc22106ffe97927 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 21 Feb 2018 16:37:48 +0000 Subject: [PATCH 1/8] core: Fix scheduler-shutdown related crash --- src/core/core.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 8c5dd3761a..4fb0355569 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -139,6 +139,8 @@ void System::Reschedule() { System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { LOG_DEBUG(HW_Memory, "initialized OK"); + CoreTiming::Init(); + switch (Settings::values.cpu_core) { case Settings::CpuCore::Unicorn: cpu_core = std::make_shared(); @@ -154,14 +156,13 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { break; } - scheduler = std::make_unique(cpu_core.get()); gpu_core = std::make_unique(); telemetry_session = std::make_unique(); - CoreTiming::Init(); HW::Init(); Kernel::Init(system_mode); + scheduler = std::make_unique(cpu_core.get()); Service::Init(); GDBStub::Init(); @@ -189,15 +190,18 @@ void System::Shutdown() { perf_results.frametime * 1000.0); // Shutdown emulation session - GDBStub::Shutdown(); VideoCore::Shutdown(); + GDBStub::Shutdown(); Service::Shutdown(); + scheduler = nullptr; Kernel::Shutdown(); HW::Shutdown(); - CoreTiming::Shutdown(); - cpu_core = nullptr; - app_loader = nullptr; telemetry_session = nullptr; + gpu_core = nullptr; + cpu_core = nullptr; + CoreTiming::Shutdown(); + + app_loader = nullptr; LOG_DEBUG(Core, "Shutdown OK"); } From cc368de1a0cf148409cc4b55cf6e616114ebf76d Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 21 Feb 2018 20:03:56 +0000 Subject: [PATCH 2/8] memory: LOG_ERROR when falling off end of page table --- src/core/memory.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index cc1ed16b68..ce62666d78 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -118,6 +118,11 @@ boost::optional ReadSpecial(VAddr addr); template T Read(const VAddr vaddr) { + if ((vaddr >> PAGE_BITS) >= PAGE_TABLE_NUM_ENTRIES) { + LOG_ERROR(HW_Memory, "Read%lu after page table @ 0x%016" PRIX64, sizeof(T) * 8, vaddr); + return 0; + } + const PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (type) { case PageType::Unmapped: @@ -146,6 +151,12 @@ bool WriteSpecial(VAddr addr, const T data); template void Write(const VAddr vaddr, const T data) { + if ((vaddr >> PAGE_BITS) >= PAGE_TABLE_NUM_ENTRIES) { + LOG_ERROR(HW_Memory, "Write%lu after page table 0x%08X @ 0x%016" PRIX64, sizeof(data) * 8, + (u32)data, vaddr); + return; + } + const PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (type) { case PageType::Unmapped: From e8b9731af3a2ee2234a09300d8af7ea3469d22bd Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 21 Feb 2018 20:48:22 +0000 Subject: [PATCH 3/8] arm_dynarmic: LOG_INFO on unicorn fallback --- src/core/arm/dynarmic/arm_dynarmic.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 283d208314..ab10b8a34a 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -6,6 +6,7 @@ #include #include #include +#include "common/logging/log.h" #include "core/arm/dynarmic/arm_dynarmic.h" #include "core/core_timing.h" #include "core/hle/kernel/memory.h" @@ -53,6 +54,9 @@ public: } void InterpreterFallback(u64 pc, size_t num_instructions) override { + LOG_INFO(Core_ARM, "Unicorn fallback @ 0x%" PRIx64 " for %zu instructions (instr = %08x)", + pc, num_instructions, MemoryReadCode(pc)); + ARM_Interface::ThreadContext ctx; parent.SaveContext(ctx); parent.inner_unicorn.LoadContext(ctx); From 32d127ad3e94b09566ca17b83072ff42018b02b3 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Wed, 21 Feb 2018 20:51:54 +0000 Subject: [PATCH 4/8] dynarmic: Update to 6b4c6b0 6b4c6b0 impl: Update PC when raising exception 7a1313a A64: Implement FDIV (vector) b2d781d system: Raise exception for YIELD, WFE, WFI, SEV, SEVL b277bf5 Correct FPSR and FPCR 7673933 A64: Implement USHL 8d0e558 A64: Implement UCVTF (vector, integer), scalar variant da9a4f8 A64: Partially implement FCVTZU (scalar, fixed-point) and FCVTZS (scalar, fixed-point) 7479684 A64: Implement system register TPIDR_EL0 0fd75fd A64: Implement system registers FPCR and FPSR 31e370c A64: Implement system register CNTPCT_EL0 9a88fd3 A64: Implement system register CTR_EL0 1d16896 A64: Implement NEG (vector) 3184edf IR: Add IR instruction ZeroVector 31f8fbc emit_x64_floating_point: Add maybe_unused to preprocess parameter 567eb1a A64: Implement FMINNM (scalar) c6d8fa1 A64: Implement FMAXNM (scalar) 616056d constant_pool: Add frame parameter a3747cb A64: Implement ADDP (scalar) 5cd5d9f reg_alloc: Only exchange GPRs dd0452a A64: Implement DUP (element), scalar variant e5732ea emit_x64_floating_point: Correct FP{Max,Min}{32,64} implementations for -0/+0 40eb9c3 A64: Implement FMAX (scalar), FMIN (scalar) 7cef39b fuzz_with_unicorn: QEMU's implementation of FCVT is incorrect 826dce2 travis: Switch unicorn repository 9605f28 a64/config: Allow NaN emulation accuracy to be set e9435bc a64_emit_x64: Add conf to A64EmitContext 30b596d fuzz_with_unicorn: Explicitly test floating point instructions be292a8 A64: Implement FSQRT (scalar) 3c42d48 backend_x64: Accurately handle NaNs 4aefed0 fuzz_with_unicorn: Print AArch64 disassembly --- externals/dynarmic | 2 +- src/core/arm/dynarmic/arm_dynarmic.cpp | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/externals/dynarmic b/externals/dynarmic index e585e1d49e..6b4c6b06a9 160000 --- a/externals/dynarmic +++ b/externals/dynarmic @@ -1 +1 @@ -Subproject commit e585e1d49ed65c31edd567510e00508d42decb1c +Subproject commit 6b4c6b06a94290690d2132adfa45a8087958c2c7 diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index ab10b8a34a..e7f6bf8c24 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -67,8 +67,17 @@ public: } void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override { - ASSERT_MSG(false, "ExceptionRaised(exception = %zu, pc = %" PRIx64 ")", - static_cast(exception), pc); + switch (exception) { + case Dynarmic::A64::Exception::WaitForInterrupt: + case Dynarmic::A64::Exception::WaitForEvent: + case Dynarmic::A64::Exception::SendEvent: + case Dynarmic::A64::Exception::SendEventLocal: + case Dynarmic::A64::Exception::Yield: + return; + default: + ASSERT_MSG(false, "ExceptionRaised(exception = %zu, pc = %" PRIx64 ")", + static_cast(exception), pc); + } } void CallSVC(u32 swi) override { @@ -85,11 +94,15 @@ public: u64 GetTicksRemaining() override { return ticks_remaining; } + u64 GetCNTPCT() override { + return CoreTiming::GetTicks(); + } ARM_Dynarmic& parent; size_t ticks_remaining = 0; size_t num_interpreted_instructions = 0; u64 tpidrro_el0 = 0; + u64 tpidr_el0 = 0; }; std::unique_ptr MakeJit(const std::unique_ptr& cb) { @@ -98,10 +111,13 @@ std::unique_ptr MakeJit(const std::unique_ptrtpidrro_el0; + config.tpidr_el0 = &cb->tpidr_el0; config.dczid_el0 = 4; + config.ctr_el0 = 0x8444c004; config.page_table = reinterpret_cast(page_table); config.page_table_address_space_bits = Memory::ADDRESS_SPACE_BITS; config.silently_mirror_page_table = false; + return std::make_unique(config); } From 944132dbe5beb5db171cadec9d21537a59f58df9 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Wed, 21 Feb 2018 18:43:05 -0700 Subject: [PATCH 5/8] time: Add GetStandardLocalSystemClock, used by libnx --- src/core/hle/service/time/time.cpp | 7 +++++++ src/core/hle/service/time/time.h | 1 + src/core/hle/service/time/time_u.cpp | 1 + 3 files changed, 9 insertions(+) diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index 364ddcea24..ad49f42658 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp @@ -146,6 +146,13 @@ void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_Time, "called"); } +void Module::Interface::GetStandardLocalSystemClock(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface(); + LOG_DEBUG(Service_Time, "called"); +} + Module::Interface::Interface(std::shared_ptr time, const char* name) : ServiceFramework(name), time(std::move(time)) {} diff --git a/src/core/hle/service/time/time.h b/src/core/hle/service/time/time.h index 1cbbadb21e..197029e7a6 100644 --- a/src/core/hle/service/time/time.h +++ b/src/core/hle/service/time/time.h @@ -56,6 +56,7 @@ public: void GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx); void GetStandardSteadyClock(Kernel::HLERequestContext& ctx); void GetTimeZoneService(Kernel::HLERequestContext& ctx); + void GetStandardLocalSystemClock(Kernel::HLERequestContext& ctx); protected: std::shared_ptr time; diff --git a/src/core/hle/service/time/time_u.cpp b/src/core/hle/service/time/time_u.cpp index ae4f78adf5..fc1ace3255 100644 --- a/src/core/hle/service/time/time_u.cpp +++ b/src/core/hle/service/time/time_u.cpp @@ -13,6 +13,7 @@ TIME_U::TIME_U(std::shared_ptr time) : Module::Interface(std::move(time) {1, &TIME_U::GetStandardNetworkSystemClock, "GetStandardNetworkSystemClock"}, {2, &TIME_U::GetStandardSteadyClock, "GetStandardSteadyClock"}, {3, &TIME_U::GetTimeZoneService, "GetTimeZoneService"}, + {4, &TIME_U::GetStandardLocalSystemClock, "GetStandardLocalSystemClock"}, }; RegisterHandlers(functions); } From 910198a29a7d9679d4286a337aa223543545e798 Mon Sep 17 00:00:00 2001 From: mailwl Date: Thu, 22 Feb 2018 13:04:23 +0300 Subject: [PATCH 6/8] Stub am::SetScreenShotPermission, and bsd::StartMonitoring functions --- src/core/arm/unicorn/arm_unicorn.cpp | 3 ++- src/core/hle/service/am/am.cpp | 8 ++++++++ src/core/hle/service/am/am.h | 1 + src/core/hle/service/sockets/bsd_u.cpp | 10 ++++++++++ src/core/hle/service/sockets/bsd_u.h | 1 + 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index fd64eab39b..5d2956bfd2 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp @@ -52,7 +52,8 @@ static bool UnmappedMemoryHook(uc_engine* uc, uc_mem_type type, u64 addr, int si void* user_data) { ARM_Interface::ThreadContext ctx{}; Core::CPU().SaveContext(ctx); - ASSERT_MSG(false, "Attempted to read from unmapped memory: 0x%llx", addr); + ASSERT_MSG(false, "Attempted to read from unmapped memory: 0x%llx, pc=0x%llx, lr=0x%llx", addr, + ctx.pc, ctx.cpu_registers[30]); return {}; } diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 03305814fe..d36d370897 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -46,6 +46,7 @@ ISelfController::ISelfController(std::shared_ptr nvflinger {1, &ISelfController::LockExit, "LockExit"}, {2, &ISelfController::UnlockExit, "UnlockExit"}, {9, &ISelfController::GetLibraryAppletLaunchableEvent, "GetLibraryAppletLaunchableEvent"}, + {10, &ISelfController::SetScreenShotPermission, "SetScreenShotPermission"}, {11, &ISelfController::SetOperationModeChangedNotification, "SetOperationModeChangedNotification"}, {12, &ISelfController::SetPerformanceModeChangedNotification, @@ -98,6 +99,13 @@ void ISelfController::SetPerformanceModeChangedNotification(Kernel::HLERequestCo LOG_WARNING(Service_AM, "(STUBBED) called flag=%u", static_cast(flag)); } +void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); + + LOG_WARNING(Service_AM, "(STUBBED) called"); +} + void ISelfController::SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 793ac65559..a6740fb299 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -62,6 +62,7 @@ private: void UnlockExit(Kernel::HLERequestContext& ctx); void GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx); void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx); + void SetScreenShotPermission(Kernel::HLERequestContext& ctx); std::shared_ptr nvflinger; Kernel::SharedPtr launchable_event; diff --git a/src/core/hle/service/sockets/bsd_u.cpp b/src/core/hle/service/sockets/bsd_u.cpp index 629ffb0408..2ca1000ca0 100644 --- a/src/core/hle/service/sockets/bsd_u.cpp +++ b/src/core/hle/service/sockets/bsd_u.cpp @@ -17,6 +17,15 @@ void BSD_U::RegisterClient(Kernel::HLERequestContext& ctx) { rb.Push(0); // bsd errno } +void BSD_U::StartMonitoring(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + + rb.Push(RESULT_SUCCESS); + rb.Push(0); // bsd errno +} + void BSD_U::Socket(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; @@ -67,6 +76,7 @@ void BSD_U::Close(Kernel::HLERequestContext& ctx) { BSD_U::BSD_U() : ServiceFramework("bsd:u") { static const FunctionInfo functions[] = {{0, &BSD_U::RegisterClient, "RegisterClient"}, + {1, &BSD_U::StartMonitoring, "StartMonitoring"}, {2, &BSD_U::Socket, "Socket"}, {11, &BSD_U::SendTo, "SendTo"}, {14, &BSD_U::Connect, "Connect"}, diff --git a/src/core/hle/service/sockets/bsd_u.h b/src/core/hle/service/sockets/bsd_u.h index fde08a22b0..4e1252e9d9 100644 --- a/src/core/hle/service/sockets/bsd_u.h +++ b/src/core/hle/service/sockets/bsd_u.h @@ -17,6 +17,7 @@ public: private: void RegisterClient(Kernel::HLERequestContext& ctx); + void StartMonitoring(Kernel::HLERequestContext& ctx); void Socket(Kernel::HLERequestContext& ctx); void Connect(Kernel::HLERequestContext& ctx); void SendTo(Kernel::HLERequestContext& ctx); From e4f94ee30bce782eb9a02cd988a9325a9f97e0d6 Mon Sep 17 00:00:00 2001 From: mailwl Date: Thu, 22 Feb 2018 17:28:15 +0300 Subject: [PATCH 7/8] Stub more functions --- src/core/hle/kernel/svc.cpp | 12 ++++++++- src/core/hle/service/am/am.cpp | 33 ++++++++++++++++++++++++- src/core/hle/service/am/am.h | 7 ++++++ src/core/hle/service/aoc/aoc_u.cpp | 9 ++++++- src/core/hle/service/aoc/aoc_u.h | 1 + src/core/hle/service/audio/audren_u.cpp | 4 +-- src/core/hle/service/nifm/nifm.cpp | 32 +++++++++++++++++++++--- 7 files changed, 90 insertions(+), 8 deletions(-) diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index cbd5b69aa1..533787ce2d 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -761,6 +761,16 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss return RESULT_SUCCESS; } +static ResultCode ClearEvent(Handle handle) { + LOG_TRACE(Kernel_SVC, "called, event=0xX", handle); + + SharedPtr evt = g_handle_table.Get(handle); + if (evt == nullptr) + return ERR_INVALID_HANDLE; + evt->Clear(); + return RESULT_SUCCESS; +} + namespace { struct FunctionDef { using Func = void(); @@ -790,7 +800,7 @@ static const FunctionDef SVC_Table[] = { {0x0F, SvcWrap, "SetThreadCoreMask"}, {0x10, SvcWrap, "GetCurrentProcessorNumber"}, {0x11, nullptr, "SignalEvent"}, - {0x12, nullptr, "ClearEvent"}, + {0x12, SvcWrap, "ClearEvent"}, {0x13, SvcWrap, "MapSharedMemory"}, {0x14, nullptr, "UnmapSharedMemory"}, {0x15, SvcWrap, "CreateTransferMemory"}, diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index d36d370897..d3a674cf63 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -34,7 +34,38 @@ void IWindowController::AcquireForegroundRights(Kernel::HLERequestContext& ctx) rb.Push(RESULT_SUCCESS); } -IAudioController::IAudioController() : ServiceFramework("IAudioController") {} +IAudioController::IAudioController() : ServiceFramework("IAudioController") { + static const FunctionInfo functions[] = { + {0, &IAudioController::SetExpectedMasterVolume, "SetExpectedMasterVolume"}, + {1, &IAudioController::GetMainAppletExpectedMasterVolume, + "GetMainAppletExpectedMasterVolume"}, + {2, &IAudioController::GetLibraryAppletExpectedMasterVolume, + "GetLibraryAppletExpectedMasterVolume"}, + {3, nullptr, "ChangeMainAppletMasterVolume"}, + {4, nullptr, "SetTransparentVolumeRate"}, + }; + RegisterHandlers(functions); +} + +void IAudioController::SetExpectedMasterVolume(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + +void IAudioController::GetMainAppletExpectedMasterVolume(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(volume); +} + +void IAudioController::GetLibraryAppletExpectedMasterVolume(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(volume); +} IDisplayController::IDisplayController() : ServiceFramework("IDisplayController") {} diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index a6740fb299..27dbd8c950 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -36,6 +36,13 @@ private: class IAudioController final : public ServiceFramework { public: IAudioController(); + +private: + void SetExpectedMasterVolume(Kernel::HLERequestContext& ctx); + void GetMainAppletExpectedMasterVolume(Kernel::HLERequestContext& ctx); + void GetLibraryAppletExpectedMasterVolume(Kernel::HLERequestContext& ctx); + + u32 volume{100}; }; class IDisplayController final : public ServiceFramework { diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 430b2a7ada..8b55d2fcb6 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp @@ -13,7 +13,7 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u") { static const FunctionInfo functions[] = { {0, nullptr, "CountAddOnContentByApplicationId"}, {1, nullptr, "ListAddOnContentByApplicationId"}, - {2, nullptr, "CountAddOnContent"}, + {2, &AOC_U::CountAddOnContent, "CountAddOnContent"}, {3, &AOC_U::ListAddOnContent, "ListAddOnContent"}, {4, nullptr, "GetAddOnContentBaseIdByApplicationId"}, {5, nullptr, "GetAddOnContentBaseId"}, @@ -23,6 +23,13 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u") { RegisterHandlers(functions); } +void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 4}; + rb.Push(RESULT_SUCCESS); + rb.Push(0); + LOG_WARNING(Service_AOC, "(STUBBED) called"); +} + void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(RESULT_SUCCESS); diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h index 4d6720a9d7..6e0ba15a5e 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h @@ -15,6 +15,7 @@ public: ~AOC_U() = default; private: + void CountAddOnContent(Kernel::HLERequestContext& ctx); void ListAddOnContent(Kernel::HLERequestContext& ctx); }; diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 4efc789acb..dda135d180 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -178,10 +178,10 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { } void AudRenU::GetAudioRenderersProcessMasterVolume(Kernel::HLERequestContext& ctx) { - IPC::ResponseBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS); - + rb.Push(100); LOG_WARNING(Service_Audio, "(STUBBED) called"); } diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 290a2ee74c..e6f05eae50 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/event.h" #include "core/hle/service/nifm/nifm.h" #include "core/hle/service/nifm/nifm_a.h" #include "core/hle/service/nifm/nifm_s.h" @@ -28,9 +29,9 @@ class IRequest final : public ServiceFramework { public: explicit IRequest() : ServiceFramework("IRequest") { static const FunctionInfo functions[] = { - {0, nullptr, "GetRequestState"}, - {1, nullptr, "GetResult"}, - {2, nullptr, "GetSystemEventReadableHandles"}, + {0, &IRequest::GetRequestState, "GetRequestState"}, + {1, &IRequest::GetResult, "GetResult"}, + {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"}, {3, nullptr, "Cancel"}, {4, nullptr, "Submit"}, {5, nullptr, "SetRequirement"}, @@ -55,7 +56,32 @@ public: {25, nullptr, "UnregisterSocketDescriptor"}, }; RegisterHandlers(functions); + + event1 = Kernel::Event::Create(Kernel::ResetType::OneShot, "IRequest:Event1"); + event2 = Kernel::Event::Create(Kernel::ResetType::OneShot, "IRequest:Event2"); } + +private: + void GetRequestState(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_NIFM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(0); + } + void GetResult(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_NIFM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(0); + } + void GetSystemEventReadableHandles(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_NIFM, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 2, 2}; + rb.Push(RESULT_SUCCESS); + rb.PushCopyObjects(event1, event2); + } + + Kernel::SharedPtr event1, event2; }; class INetworkProfile final : public ServiceFramework { From a63d4fa5b41048104e5280b86cf9a4d0b86f0f1f Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Fri, 23 Feb 2018 00:34:15 -0700 Subject: [PATCH 8/8] time: Add missing time:s functions, used for libnx --- src/core/hle/service/time/time_s.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/hle/service/time/time_s.cpp b/src/core/hle/service/time/time_s.cpp index 1634d3300e..b172b2bd69 100644 --- a/src/core/hle/service/time/time_s.cpp +++ b/src/core/hle/service/time/time_s.cpp @@ -10,6 +10,10 @@ namespace Time { TIME_S::TIME_S(std::shared_ptr time) : Module::Interface(std::move(time), "time:s") { static const FunctionInfo functions[] = { {0, &TIME_S::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, + {1, &TIME_S::GetStandardNetworkSystemClock, "GetStandardNetworkSystemClock"}, + {2, &TIME_S::GetStandardSteadyClock, "GetStandardSteadyClock"}, + {3, &TIME_S::GetTimeZoneService, "GetTimeZoneService"}, + {4, &TIME_S::GetStandardLocalSystemClock, "GetStandardLocalSystemClock"}, }; RegisterHandlers(functions); }