diff options
Diffstat (limited to 'src/core')
65 files changed, 1446 insertions, 551 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 47418006b..efbad628f 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -547,6 +547,8 @@ add_library(core STATIC | |||
| 547 | hle/service/vi/vi_u.h | 547 | hle/service/vi/vi_u.h |
| 548 | hle/service/wlan/wlan.cpp | 548 | hle/service/wlan/wlan.cpp |
| 549 | hle/service/wlan/wlan.h | 549 | hle/service/wlan/wlan.h |
| 550 | host_timing.cpp | ||
| 551 | host_timing.h | ||
| 550 | loader/deconstructed_rom_directory.cpp | 552 | loader/deconstructed_rom_directory.cpp |
| 551 | loader/deconstructed_rom_directory.h | 553 | loader/deconstructed_rom_directory.h |
| 552 | loader/elf.cpp | 554 | loader/elf.cpp |
| @@ -606,11 +608,11 @@ endif() | |||
| 606 | create_target_directory_groups(core) | 608 | create_target_directory_groups(core) |
| 607 | 609 | ||
| 608 | target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) | 610 | target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) |
| 609 | target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn) | 611 | target_link_libraries(core PUBLIC Boost::boost PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls Opus::Opus unicorn zip) |
| 610 | 612 | ||
| 611 | if (YUZU_ENABLE_BOXCAT) | 613 | if (YUZU_ENABLE_BOXCAT) |
| 612 | target_compile_definitions(core PRIVATE -DYUZU_ENABLE_BOXCAT) | 614 | target_compile_definitions(core PRIVATE -DYUZU_ENABLE_BOXCAT) |
| 613 | target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json zip) | 615 | target_link_libraries(core PRIVATE httplib nlohmann_json::nlohmann_json) |
| 614 | endif() | 616 | endif() |
| 615 | 617 | ||
| 616 | if (ENABLE_WEB_SERVICE) | 618 | if (ENABLE_WEB_SERVICE) |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 9bc86e3b9..4c8663d03 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -50,7 +50,8 @@ public: | |||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | void InterpreterFallback(u32 pc, std::size_t num_instructions) override { | 52 | void InterpreterFallback(u32 pc, std::size_t num_instructions) override { |
| 53 | UNIMPLEMENTED(); | 53 | UNIMPLEMENTED_MSG("This should never happen, pc = {:08X}, code = {:08X}", pc, |
| 54 | MemoryReadCode(pc)); | ||
| 54 | } | 55 | } |
| 55 | 56 | ||
| 56 | void ExceptionRaised(u32 pc, Dynarmic::A32::Exception exception) override { | 57 | void ExceptionRaised(u32 pc, Dynarmic::A32::Exception exception) override { |
| @@ -61,7 +62,7 @@ public: | |||
| 61 | case Dynarmic::A32::Exception::Breakpoint: | 62 | case Dynarmic::A32::Exception::Breakpoint: |
| 62 | break; | 63 | break; |
| 63 | } | 64 | } |
| 64 | LOG_CRITICAL(HW_GPU, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", | 65 | LOG_CRITICAL(Core_ARM, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", |
| 65 | static_cast<std::size_t>(exception), pc, MemoryReadCode(pc)); | 66 | static_cast<std::size_t>(exception), pc, MemoryReadCode(pc)); |
| 66 | UNIMPLEMENTED(); | 67 | UNIMPLEMENTED(); |
| 67 | } | 68 | } |
| @@ -89,8 +90,6 @@ public: | |||
| 89 | 90 | ||
| 90 | ARM_Dynarmic_32& parent; | 91 | ARM_Dynarmic_32& parent; |
| 91 | std::size_t num_interpreted_instructions{}; | 92 | std::size_t num_interpreted_instructions{}; |
| 92 | u64 tpidrro_el0{}; | ||
| 93 | u64 tpidr_el0{}; | ||
| 94 | }; | 93 | }; |
| 95 | 94 | ||
| 96 | std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& page_table, | 95 | std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& page_table, |
| @@ -99,7 +98,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& | |||
| 99 | config.callbacks = cb.get(); | 98 | config.callbacks = cb.get(); |
| 100 | // TODO(bunnei): Implement page table for 32-bit | 99 | // TODO(bunnei): Implement page table for 32-bit |
| 101 | // config.page_table = &page_table.pointers; | 100 | // config.page_table = &page_table.pointers; |
| 102 | config.coprocessors[15] = std::make_shared<DynarmicCP15>((u32*)&CP15_regs[0]); | 101 | config.coprocessors[15] = cp15; |
| 103 | config.define_unpredictable_behaviour = true; | 102 | config.define_unpredictable_behaviour = true; |
| 104 | return std::make_unique<Dynarmic::A32::Jit>(config); | 103 | return std::make_unique<Dynarmic::A32::Jit>(config); |
| 105 | } | 104 | } |
| @@ -112,13 +111,13 @@ void ARM_Dynarmic_32::Run() { | |||
| 112 | } | 111 | } |
| 113 | 112 | ||
| 114 | void ARM_Dynarmic_32::Step() { | 113 | void ARM_Dynarmic_32::Step() { |
| 115 | cb->InterpreterFallback(jit->Regs()[15], 1); | 114 | jit->Step(); |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | ARM_Dynarmic_32::ARM_Dynarmic_32(System& system, ExclusiveMonitor& exclusive_monitor, | 117 | ARM_Dynarmic_32::ARM_Dynarmic_32(System& system, ExclusiveMonitor& exclusive_monitor, |
| 119 | std::size_t core_index) | 118 | std::size_t core_index) |
| 120 | : ARM_Interface{system}, | 119 | : ARM_Interface{system}, cb(std::make_unique<DynarmicCallbacks32>(*this)), |
| 121 | cb(std::make_unique<DynarmicCallbacks32>(*this)), core_index{core_index}, | 120 | cp15(std::make_shared<DynarmicCP15>(*this)), core_index{core_index}, |
| 122 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} {} | 121 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} {} |
| 123 | 122 | ||
| 124 | ARM_Dynarmic_32::~ARM_Dynarmic_32() = default; | 123 | ARM_Dynarmic_32::~ARM_Dynarmic_32() = default; |
| @@ -154,19 +153,19 @@ void ARM_Dynarmic_32::SetPSTATE(u32 cpsr) { | |||
| 154 | } | 153 | } |
| 155 | 154 | ||
| 156 | u64 ARM_Dynarmic_32::GetTlsAddress() const { | 155 | u64 ARM_Dynarmic_32::GetTlsAddress() const { |
| 157 | return CP15_regs[static_cast<std::size_t>(CP15Register::CP15_THREAD_URO)]; | 156 | return cp15->uro; |
| 158 | } | 157 | } |
| 159 | 158 | ||
| 160 | void ARM_Dynarmic_32::SetTlsAddress(VAddr address) { | 159 | void ARM_Dynarmic_32::SetTlsAddress(VAddr address) { |
| 161 | CP15_regs[static_cast<std::size_t>(CP15Register::CP15_THREAD_URO)] = static_cast<u32>(address); | 160 | cp15->uro = static_cast<u32>(address); |
| 162 | } | 161 | } |
| 163 | 162 | ||
| 164 | u64 ARM_Dynarmic_32::GetTPIDR_EL0() const { | 163 | u64 ARM_Dynarmic_32::GetTPIDR_EL0() const { |
| 165 | return cb->tpidr_el0; | 164 | return cp15->uprw; |
| 166 | } | 165 | } |
| 167 | 166 | ||
| 168 | void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) { | 167 | void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) { |
| 169 | cb->tpidr_el0 = value; | 168 | cp15->uprw = static_cast<u32>(value); |
| 170 | } | 169 | } |
| 171 | 170 | ||
| 172 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { | 171 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 8ba9cea8f..e5b92d7bb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -22,6 +22,7 @@ class Memory; | |||
| 22 | namespace Core { | 22 | namespace Core { |
| 23 | 23 | ||
| 24 | class DynarmicCallbacks32; | 24 | class DynarmicCallbacks32; |
| 25 | class DynarmicCP15; | ||
| 25 | class DynarmicExclusiveMonitor; | 26 | class DynarmicExclusiveMonitor; |
| 26 | class System; | 27 | class System; |
| 27 | 28 | ||
| @@ -66,12 +67,14 @@ private: | |||
| 66 | std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A32::Jit>, Common::PairHash>; | 67 | std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A32::Jit>, Common::PairHash>; |
| 67 | 68 | ||
| 68 | friend class DynarmicCallbacks32; | 69 | friend class DynarmicCallbacks32; |
| 70 | friend class DynarmicCP15; | ||
| 71 | |||
| 69 | std::unique_ptr<DynarmicCallbacks32> cb; | 72 | std::unique_ptr<DynarmicCallbacks32> cb; |
| 70 | JitCacheType jit_cache; | 73 | JitCacheType jit_cache; |
| 71 | std::shared_ptr<Dynarmic::A32::Jit> jit; | 74 | std::shared_ptr<Dynarmic::A32::Jit> jit; |
| 75 | std::shared_ptr<DynarmicCP15> cp15; | ||
| 72 | std::size_t core_index; | 76 | std::size_t core_index; |
| 73 | DynarmicExclusiveMonitor& exclusive_monitor; | 77 | DynarmicExclusiveMonitor& exclusive_monitor; |
| 74 | std::array<u32, 84> CP15_regs{}; | ||
| 75 | }; | 78 | }; |
| 76 | 79 | ||
| 77 | } // namespace Core | 80 | } // namespace Core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 337b97be9..5f5e36d94 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -98,8 +98,8 @@ public: | |||
| 98 | } | 98 | } |
| 99 | [[fallthrough]]; | 99 | [[fallthrough]]; |
| 100 | default: | 100 | default: |
| 101 | ASSERT_MSG(false, "ExceptionRaised(exception = {}, pc = {:X})", | 101 | ASSERT_MSG(false, "ExceptionRaised(exception = {}, pc = {:08X}, code = {:08X})", |
| 102 | static_cast<std::size_t>(exception), pc); | 102 | static_cast<std::size_t>(exception), pc, MemoryReadCode(pc)); |
| 103 | } | 103 | } |
| 104 | } | 104 | } |
| 105 | 105 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp index 3fdcdebde..d43e4dd70 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | |||
| @@ -2,79 +2,132 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <fmt/format.h> | ||
| 6 | #include "common/logging/log.h" | ||
| 7 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | ||
| 5 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 8 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" |
| 9 | #include "core/core.h" | ||
| 10 | #include "core/core_timing.h" | ||
| 11 | #include "core/core_timing_util.h" | ||
| 6 | 12 | ||
| 7 | using Callback = Dynarmic::A32::Coprocessor::Callback; | 13 | using Callback = Dynarmic::A32::Coprocessor::Callback; |
| 8 | using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord; | 14 | using CallbackOrAccessOneWord = Dynarmic::A32::Coprocessor::CallbackOrAccessOneWord; |
| 9 | using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords; | 15 | using CallbackOrAccessTwoWords = Dynarmic::A32::Coprocessor::CallbackOrAccessTwoWords; |
| 10 | 16 | ||
| 17 | template <> | ||
| 18 | struct fmt::formatter<Dynarmic::A32::CoprocReg> { | ||
| 19 | constexpr auto parse(format_parse_context& ctx) { | ||
| 20 | return ctx.begin(); | ||
| 21 | } | ||
| 22 | template <typename FormatContext> | ||
| 23 | auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) { | ||
| 24 | return format_to(ctx.out(), "cp{}", static_cast<size_t>(reg)); | ||
| 25 | } | ||
| 26 | }; | ||
| 27 | |||
| 28 | namespace Core { | ||
| 29 | |||
| 30 | static u32 dummy_value; | ||
| 31 | |||
| 11 | std::optional<Callback> DynarmicCP15::CompileInternalOperation(bool two, unsigned opc1, | 32 | std::optional<Callback> DynarmicCP15::CompileInternalOperation(bool two, unsigned opc1, |
| 12 | CoprocReg CRd, CoprocReg CRn, | 33 | CoprocReg CRd, CoprocReg CRn, |
| 13 | CoprocReg CRm, unsigned opc2) { | 34 | CoprocReg CRm, unsigned opc2) { |
| 35 | LOG_CRITICAL(Core_ARM, "CP15: cdp{} p15, {}, {}, {}, {}, {}", two ? "2" : "", opc1, CRd, CRn, | ||
| 36 | CRm, opc2); | ||
| 14 | return {}; | 37 | return {}; |
| 15 | } | 38 | } |
| 16 | 39 | ||
| 17 | CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1, CoprocReg CRn, | 40 | CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1, CoprocReg CRn, |
| 18 | CoprocReg CRm, unsigned opc2) { | 41 | CoprocReg CRm, unsigned opc2) { |
| 19 | // TODO(merry): Privileged CP15 registers | ||
| 20 | |||
| 21 | if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C5 && opc2 == 4) { | 42 | if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C5 && opc2 == 4) { |
| 43 | // CP15_FLUSH_PREFETCH_BUFFER | ||
| 22 | // This is a dummy write, we ignore the value written here. | 44 | // This is a dummy write, we ignore the value written here. |
| 23 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_FLUSH_PREFETCH_BUFFER)]; | 45 | return &dummy_value; |
| 24 | } | 46 | } |
| 25 | 47 | ||
| 26 | if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C10) { | 48 | if (!two && CRn == CoprocReg::C7 && opc1 == 0 && CRm == CoprocReg::C10) { |
| 27 | switch (opc2) { | 49 | switch (opc2) { |
| 28 | case 4: | 50 | case 4: |
| 51 | // CP15_DATA_SYNC_BARRIER | ||
| 29 | // This is a dummy write, we ignore the value written here. | 52 | // This is a dummy write, we ignore the value written here. |
| 30 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_DATA_SYNC_BARRIER)]; | 53 | return &dummy_value; |
| 31 | case 5: | 54 | case 5: |
| 55 | // CP15_DATA_MEMORY_BARRIER | ||
| 32 | // This is a dummy write, we ignore the value written here. | 56 | // This is a dummy write, we ignore the value written here. |
| 33 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_DATA_MEMORY_BARRIER)]; | 57 | return &dummy_value; |
| 34 | default: | ||
| 35 | return {}; | ||
| 36 | } | 58 | } |
| 37 | } | 59 | } |
| 38 | 60 | ||
| 39 | if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0 && opc2 == 2) { | 61 | if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0 && opc2 == 2) { |
| 40 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_THREAD_UPRW)]; | 62 | // CP15_THREAD_UPRW |
| 63 | return &uprw; | ||
| 41 | } | 64 | } |
| 42 | 65 | ||
| 66 | LOG_CRITICAL(Core_ARM, "CP15: mcr{} p15, {}, <Rt>, {}, {}, {}", two ? "2" : "", opc1, CRn, CRm, | ||
| 67 | opc2); | ||
| 43 | return {}; | 68 | return {}; |
| 44 | } | 69 | } |
| 45 | 70 | ||
| 46 | CallbackOrAccessTwoWords DynarmicCP15::CompileSendTwoWords(bool two, unsigned opc, CoprocReg CRm) { | 71 | CallbackOrAccessTwoWords DynarmicCP15::CompileSendTwoWords(bool two, unsigned opc, CoprocReg CRm) { |
| 72 | LOG_CRITICAL(Core_ARM, "CP15: mcrr{} p15, {}, <Rt>, <Rt2>, {}", two ? "2" : "", opc, CRm); | ||
| 47 | return {}; | 73 | return {}; |
| 48 | } | 74 | } |
| 49 | 75 | ||
| 50 | CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, CoprocReg CRn, | 76 | CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, CoprocReg CRn, |
| 51 | CoprocReg CRm, unsigned opc2) { | 77 | CoprocReg CRm, unsigned opc2) { |
| 52 | // TODO(merry): Privileged CP15 registers | ||
| 53 | |||
| 54 | if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0) { | 78 | if (!two && CRn == CoprocReg::C13 && opc1 == 0 && CRm == CoprocReg::C0) { |
| 55 | switch (opc2) { | 79 | switch (opc2) { |
| 56 | case 2: | 80 | case 2: |
| 57 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_THREAD_UPRW)]; | 81 | // CP15_THREAD_UPRW |
| 82 | return &uprw; | ||
| 58 | case 3: | 83 | case 3: |
| 59 | return &CP15[static_cast<std::size_t>(CP15Register::CP15_THREAD_URO)]; | 84 | // CP15_THREAD_URO |
| 60 | default: | 85 | return &uro; |
| 61 | return {}; | ||
| 62 | } | 86 | } |
| 63 | } | 87 | } |
| 64 | 88 | ||
| 89 | LOG_CRITICAL(Core_ARM, "CP15: mrc{} p15, {}, <Rt>, {}, {}, {}", two ? "2" : "", opc1, CRn, CRm, | ||
| 90 | opc2); | ||
| 65 | return {}; | 91 | return {}; |
| 66 | } | 92 | } |
| 67 | 93 | ||
| 68 | CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { | 94 | CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { |
| 95 | if (!two && opc == 0 && CRm == CoprocReg::C14) { | ||
| 96 | // CNTPCT | ||
| 97 | const auto callback = static_cast<u64 (*)(Dynarmic::A32::Jit*, void*, u32, u32)>( | ||
| 98 | [](Dynarmic::A32::Jit*, void* arg, u32, u32) -> u64 { | ||
| 99 | ARM_Dynarmic_32& parent = *(ARM_Dynarmic_32*)arg; | ||
| 100 | return Timing::CpuCyclesToClockCycles(parent.system.CoreTiming().GetTicks()); | ||
| 101 | }); | ||
| 102 | return Dynarmic::A32::Coprocessor::Callback{callback, (void*)&parent}; | ||
| 103 | } | ||
| 104 | |||
| 105 | LOG_CRITICAL(Core_ARM, "CP15: mrrc{} p15, {}, <Rt>, <Rt2>, {}", two ? "2" : "", opc, CRm); | ||
| 69 | return {}; | 106 | return {}; |
| 70 | } | 107 | } |
| 71 | 108 | ||
| 72 | std::optional<Callback> DynarmicCP15::CompileLoadWords(bool two, bool long_transfer, CoprocReg CRd, | 109 | std::optional<Callback> DynarmicCP15::CompileLoadWords(bool two, bool long_transfer, CoprocReg CRd, |
| 73 | std::optional<u8> option) { | 110 | std::optional<u8> option) { |
| 111 | if (option) { | ||
| 112 | LOG_CRITICAL(Core_ARM, "CP15: mrrc{}{} p15, {}, [...], {}", two ? "2" : "", | ||
| 113 | long_transfer ? "l" : "", CRd, *option); | ||
| 114 | } else { | ||
| 115 | LOG_CRITICAL(Core_ARM, "CP15: mrrc{}{} p15, {}, [...]", two ? "2" : "", | ||
| 116 | long_transfer ? "l" : "", CRd); | ||
| 117 | } | ||
| 74 | return {}; | 118 | return {}; |
| 75 | } | 119 | } |
| 76 | 120 | ||
| 77 | std::optional<Callback> DynarmicCP15::CompileStoreWords(bool two, bool long_transfer, CoprocReg CRd, | 121 | std::optional<Callback> DynarmicCP15::CompileStoreWords(bool two, bool long_transfer, CoprocReg CRd, |
| 78 | std::optional<u8> option) { | 122 | std::optional<u8> option) { |
| 123 | if (option) { | ||
| 124 | LOG_CRITICAL(Core_ARM, "CP15: mrrc{}{} p15, {}, [...], {}", two ? "2" : "", | ||
| 125 | long_transfer ? "l" : "", CRd, *option); | ||
| 126 | } else { | ||
| 127 | LOG_CRITICAL(Core_ARM, "CP15: mrrc{}{} p15, {}, [...]", two ? "2" : "", | ||
| 128 | long_transfer ? "l" : "", CRd); | ||
| 129 | } | ||
| 79 | return {}; | 130 | return {}; |
| 80 | } | 131 | } |
| 132 | |||
| 133 | } // namespace Core | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/arm_dynarmic_cp15.h index 07bcde5f9..7356d252e 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.h | |||
| @@ -10,128 +10,15 @@ | |||
| 10 | #include <dynarmic/A32/coprocessor.h> | 10 | #include <dynarmic/A32/coprocessor.h> |
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | 12 | ||
| 13 | enum class CP15Register { | 13 | namespace Core { |
| 14 | // c0 - Information registers | ||
| 15 | CP15_MAIN_ID, | ||
| 16 | CP15_CACHE_TYPE, | ||
| 17 | CP15_TCM_STATUS, | ||
| 18 | CP15_TLB_TYPE, | ||
| 19 | CP15_CPU_ID, | ||
| 20 | CP15_PROCESSOR_FEATURE_0, | ||
| 21 | CP15_PROCESSOR_FEATURE_1, | ||
| 22 | CP15_DEBUG_FEATURE_0, | ||
| 23 | CP15_AUXILIARY_FEATURE_0, | ||
| 24 | CP15_MEMORY_MODEL_FEATURE_0, | ||
| 25 | CP15_MEMORY_MODEL_FEATURE_1, | ||
| 26 | CP15_MEMORY_MODEL_FEATURE_2, | ||
| 27 | CP15_MEMORY_MODEL_FEATURE_3, | ||
| 28 | CP15_ISA_FEATURE_0, | ||
| 29 | CP15_ISA_FEATURE_1, | ||
| 30 | CP15_ISA_FEATURE_2, | ||
| 31 | CP15_ISA_FEATURE_3, | ||
| 32 | CP15_ISA_FEATURE_4, | ||
| 33 | 14 | ||
| 34 | // c1 - Control registers | 15 | class ARM_Dynarmic_32; |
| 35 | CP15_CONTROL, | ||
| 36 | CP15_AUXILIARY_CONTROL, | ||
| 37 | CP15_COPROCESSOR_ACCESS_CONTROL, | ||
| 38 | |||
| 39 | // c2 - Translation table registers | ||
| 40 | CP15_TRANSLATION_BASE_TABLE_0, | ||
| 41 | CP15_TRANSLATION_BASE_TABLE_1, | ||
| 42 | CP15_TRANSLATION_BASE_CONTROL, | ||
| 43 | CP15_DOMAIN_ACCESS_CONTROL, | ||
| 44 | CP15_RESERVED, | ||
| 45 | |||
| 46 | // c5 - Fault status registers | ||
| 47 | CP15_FAULT_STATUS, | ||
| 48 | CP15_INSTR_FAULT_STATUS, | ||
| 49 | CP15_COMBINED_DATA_FSR = CP15_FAULT_STATUS, | ||
| 50 | CP15_INST_FSR, | ||
| 51 | |||
| 52 | // c6 - Fault Address registers | ||
| 53 | CP15_FAULT_ADDRESS, | ||
| 54 | CP15_COMBINED_DATA_FAR = CP15_FAULT_ADDRESS, | ||
| 55 | CP15_WFAR, | ||
| 56 | CP15_IFAR, | ||
| 57 | |||
| 58 | // c7 - Cache operation registers | ||
| 59 | CP15_WAIT_FOR_INTERRUPT, | ||
| 60 | CP15_PHYS_ADDRESS, | ||
| 61 | CP15_INVALIDATE_INSTR_CACHE, | ||
| 62 | CP15_INVALIDATE_INSTR_CACHE_USING_MVA, | ||
| 63 | CP15_INVALIDATE_INSTR_CACHE_USING_INDEX, | ||
| 64 | CP15_FLUSH_PREFETCH_BUFFER, | ||
| 65 | CP15_FLUSH_BRANCH_TARGET_CACHE, | ||
| 66 | CP15_FLUSH_BRANCH_TARGET_CACHE_ENTRY, | ||
| 67 | CP15_INVALIDATE_DATA_CACHE, | ||
| 68 | CP15_INVALIDATE_DATA_CACHE_LINE_USING_MVA, | ||
| 69 | CP15_INVALIDATE_DATA_CACHE_LINE_USING_INDEX, | ||
| 70 | CP15_INVALIDATE_DATA_AND_INSTR_CACHE, | ||
| 71 | CP15_CLEAN_DATA_CACHE, | ||
| 72 | CP15_CLEAN_DATA_CACHE_LINE_USING_MVA, | ||
| 73 | CP15_CLEAN_DATA_CACHE_LINE_USING_INDEX, | ||
| 74 | CP15_DATA_SYNC_BARRIER, | ||
| 75 | CP15_DATA_MEMORY_BARRIER, | ||
| 76 | CP15_CLEAN_AND_INVALIDATE_DATA_CACHE, | ||
| 77 | CP15_CLEAN_AND_INVALIDATE_DATA_CACHE_LINE_USING_MVA, | ||
| 78 | CP15_CLEAN_AND_INVALIDATE_DATA_CACHE_LINE_USING_INDEX, | ||
| 79 | |||
| 80 | // c8 - TLB operations | ||
| 81 | CP15_INVALIDATE_ITLB, | ||
| 82 | CP15_INVALIDATE_ITLB_SINGLE_ENTRY, | ||
| 83 | CP15_INVALIDATE_ITLB_ENTRY_ON_ASID_MATCH, | ||
| 84 | CP15_INVALIDATE_ITLB_ENTRY_ON_MVA, | ||
| 85 | CP15_INVALIDATE_DTLB, | ||
| 86 | CP15_INVALIDATE_DTLB_SINGLE_ENTRY, | ||
| 87 | CP15_INVALIDATE_DTLB_ENTRY_ON_ASID_MATCH, | ||
| 88 | CP15_INVALIDATE_DTLB_ENTRY_ON_MVA, | ||
| 89 | CP15_INVALIDATE_UTLB, | ||
| 90 | CP15_INVALIDATE_UTLB_SINGLE_ENTRY, | ||
| 91 | CP15_INVALIDATE_UTLB_ENTRY_ON_ASID_MATCH, | ||
| 92 | CP15_INVALIDATE_UTLB_ENTRY_ON_MVA, | ||
| 93 | |||
| 94 | // c9 - Data cache lockdown register | ||
| 95 | CP15_DATA_CACHE_LOCKDOWN, | ||
| 96 | |||
| 97 | // c10 - TLB/Memory map registers | ||
| 98 | CP15_TLB_LOCKDOWN, | ||
| 99 | CP15_PRIMARY_REGION_REMAP, | ||
| 100 | CP15_NORMAL_REGION_REMAP, | ||
| 101 | |||
| 102 | // c13 - Thread related registers | ||
| 103 | CP15_PID, | ||
| 104 | CP15_CONTEXT_ID, | ||
| 105 | CP15_THREAD_UPRW, // Thread ID register - User/Privileged Read/Write | ||
| 106 | CP15_THREAD_URO, // Thread ID register - User Read Only (Privileged R/W) | ||
| 107 | CP15_THREAD_PRW, // Thread ID register - Privileged R/W only. | ||
| 108 | |||
| 109 | // c15 - Performance and TLB lockdown registers | ||
| 110 | CP15_PERFORMANCE_MONITOR_CONTROL, | ||
| 111 | CP15_CYCLE_COUNTER, | ||
| 112 | CP15_COUNT_0, | ||
| 113 | CP15_COUNT_1, | ||
| 114 | CP15_READ_MAIN_TLB_LOCKDOWN_ENTRY, | ||
| 115 | CP15_WRITE_MAIN_TLB_LOCKDOWN_ENTRY, | ||
| 116 | CP15_MAIN_TLB_LOCKDOWN_VIRT_ADDRESS, | ||
| 117 | CP15_MAIN_TLB_LOCKDOWN_PHYS_ADDRESS, | ||
| 118 | CP15_MAIN_TLB_LOCKDOWN_ATTRIBUTE, | ||
| 119 | CP15_TLB_DEBUG_CONTROL, | ||
| 120 | |||
| 121 | // Skyeye defined | ||
| 122 | CP15_TLB_FAULT_ADDR, | ||
| 123 | CP15_TLB_FAULT_STATUS, | ||
| 124 | |||
| 125 | // Not an actual register. | ||
| 126 | // All registers should be defined above this. | ||
| 127 | CP15_REGISTER_COUNT, | ||
| 128 | }; | ||
| 129 | 16 | ||
| 130 | class DynarmicCP15 final : public Dynarmic::A32::Coprocessor { | 17 | class DynarmicCP15 final : public Dynarmic::A32::Coprocessor { |
| 131 | public: | 18 | public: |
| 132 | using CoprocReg = Dynarmic::A32::CoprocReg; | 19 | using CoprocReg = Dynarmic::A32::CoprocReg; |
| 133 | 20 | ||
| 134 | explicit DynarmicCP15(u32* cp15) : CP15(cp15){}; | 21 | explicit DynarmicCP15(ARM_Dynarmic_32& parent) : parent(parent) {} |
| 135 | 22 | ||
| 136 | std::optional<Callback> CompileInternalOperation(bool two, unsigned opc1, CoprocReg CRd, | 23 | std::optional<Callback> CompileInternalOperation(bool two, unsigned opc1, CoprocReg CRd, |
| 137 | CoprocReg CRn, CoprocReg CRm, | 24 | CoprocReg CRn, CoprocReg CRm, |
| @@ -147,6 +34,9 @@ public: | |||
| 147 | std::optional<Callback> CompileStoreWords(bool two, bool long_transfer, CoprocReg CRd, | 34 | std::optional<Callback> CompileStoreWords(bool two, bool long_transfer, CoprocReg CRd, |
| 148 | std::optional<u8> option) override; | 35 | std::optional<u8> option) override; |
| 149 | 36 | ||
| 150 | private: | 37 | ARM_Dynarmic_32& parent; |
| 151 | u32* CP15{}; | 38 | u32 uprw; |
| 39 | u32 uro; | ||
| 152 | }; | 40 | }; |
| 41 | |||
| 42 | } // namespace Core | ||
diff --git a/src/core/core_timing_util.cpp b/src/core/core_timing_util.cpp index de50d3b14..be34b26fe 100644 --- a/src/core/core_timing_util.cpp +++ b/src/core/core_timing_util.cpp | |||
| @@ -49,6 +49,21 @@ s64 nsToCycles(std::chrono::nanoseconds ns) { | |||
| 49 | return (Hardware::BASE_CLOCK_RATE * ns.count()) / 1000000000; | 49 | return (Hardware::BASE_CLOCK_RATE * ns.count()) / 1000000000; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | u64 msToClockCycles(std::chrono::milliseconds ns) { | ||
| 53 | const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ); | ||
| 54 | return Common::Divide128On32(temp, 1000).first; | ||
| 55 | } | ||
| 56 | |||
| 57 | u64 usToClockCycles(std::chrono::microseconds ns) { | ||
| 58 | const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ); | ||
| 59 | return Common::Divide128On32(temp, 1000000).first; | ||
| 60 | } | ||
| 61 | |||
| 62 | u64 nsToClockCycles(std::chrono::nanoseconds ns) { | ||
| 63 | const u128 temp = Common::Multiply64Into128(ns.count(), Hardware::CNTFREQ); | ||
| 64 | return Common::Divide128On32(temp, 1000000000).first; | ||
| 65 | } | ||
| 66 | |||
| 52 | u64 CpuCyclesToClockCycles(u64 ticks) { | 67 | u64 CpuCyclesToClockCycles(u64 ticks) { |
| 53 | const u128 temporal = Common::Multiply64Into128(ticks, Hardware::CNTFREQ); | 68 | const u128 temporal = Common::Multiply64Into128(ticks, Hardware::CNTFREQ); |
| 54 | return Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; | 69 | return Common::Divide128On32(temporal, static_cast<u32>(Hardware::BASE_CLOCK_RATE)).first; |
diff --git a/src/core/core_timing_util.h b/src/core/core_timing_util.h index addc72b19..b3c58447d 100644 --- a/src/core/core_timing_util.h +++ b/src/core/core_timing_util.h | |||
| @@ -13,6 +13,9 @@ namespace Core::Timing { | |||
| 13 | s64 msToCycles(std::chrono::milliseconds ms); | 13 | s64 msToCycles(std::chrono::milliseconds ms); |
| 14 | s64 usToCycles(std::chrono::microseconds us); | 14 | s64 usToCycles(std::chrono::microseconds us); |
| 15 | s64 nsToCycles(std::chrono::nanoseconds ns); | 15 | s64 nsToCycles(std::chrono::nanoseconds ns); |
| 16 | u64 msToClockCycles(std::chrono::milliseconds ns); | ||
| 17 | u64 usToClockCycles(std::chrono::microseconds ns); | ||
| 18 | u64 nsToClockCycles(std::chrono::nanoseconds ns); | ||
| 16 | 19 | ||
| 17 | inline std::chrono::milliseconds CyclesToMs(s64 cycles) { | 20 | inline std::chrono::milliseconds CyclesToMs(s64 cycles) { |
| 18 | return std::chrono::milliseconds(cycles * 1000 / Hardware::BASE_CLOCK_RATE); | 21 | return std::chrono::milliseconds(cycles * 1000 / Hardware::BASE_CLOCK_RATE); |
diff --git a/src/core/file_sys/system_archive/mii_model.cpp b/src/core/file_sys/system_archive/mii_model.cpp index 6a9add87c..61bb67945 100644 --- a/src/core/file_sys/system_archive/mii_model.cpp +++ b/src/core/file_sys/system_archive/mii_model.cpp | |||
| @@ -40,7 +40,7 @@ VirtualDir MiiModel() { | |||
| 40 | out->AddFile(std::make_shared<ArrayVfsFile<MiiModelData::SHAPE_MID.size()>>( | 40 | out->AddFile(std::make_shared<ArrayVfsFile<MiiModelData::SHAPE_MID.size()>>( |
| 41 | MiiModelData::SHAPE_MID, "ShapeMid.dat")); | 41 | MiiModelData::SHAPE_MID, "ShapeMid.dat")); |
| 42 | 42 | ||
| 43 | return std::move(out); | 43 | return out; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | } // namespace FileSys::SystemArchive | 46 | } // namespace FileSys::SystemArchive |
diff --git a/src/core/file_sys/system_archive/shared_font.cpp b/src/core/file_sys/system_archive/shared_font.cpp index 2c05eb42e..c5cdf7d9b 100644 --- a/src/core/file_sys/system_archive/shared_font.cpp +++ b/src/core/file_sys/system_archive/shared_font.cpp | |||
| @@ -23,7 +23,7 @@ VirtualFile PackBFTTF(const std::array<u8, Size>& data, const std::string& name) | |||
| 23 | 23 | ||
| 24 | std::vector<u8> bfttf(Size + sizeof(u64)); | 24 | std::vector<u8> bfttf(Size + sizeof(u64)); |
| 25 | 25 | ||
| 26 | u64 offset = 0; | 26 | size_t offset = 0; |
| 27 | Service::NS::EncryptSharedFont(vec, bfttf, offset); | 27 | Service::NS::EncryptSharedFont(vec, bfttf, offset); |
| 28 | return std::make_shared<VectorVfsFile>(std::move(bfttf), name); | 28 | return std::make_shared<VectorVfsFile>(std::move(bfttf), name); |
| 29 | } | 29 | } |
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index ba0eac4c2..0d01a7047 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -282,18 +282,18 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) { | |||
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | std::vector<u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { | 284 | std::vector<u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { |
| 285 | std::vector<u8> buffer; | 285 | std::vector<u8> buffer{}; |
| 286 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | 286 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && |
| 287 | BufferDescriptorA()[buffer_index].Size()}; | 287 | BufferDescriptorA()[buffer_index].Size()}; |
| 288 | 288 | ||
| 289 | if (is_buffer_a) { | 289 | if (is_buffer_a) { |
| 290 | ASSERT_MSG(BufferDescriptorA().size() > buffer_index, | 290 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorA().size() > buffer_index, { return buffer; }, |
| 291 | "BufferDescriptorA invalid buffer_index {}", buffer_index); | 291 | "BufferDescriptorA invalid buffer_index {}", buffer_index); |
| 292 | buffer.resize(BufferDescriptorA()[buffer_index].Size()); | 292 | buffer.resize(BufferDescriptorA()[buffer_index].Size()); |
| 293 | memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), buffer.size()); | 293 | memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), buffer.size()); |
| 294 | } else { | 294 | } else { |
| 295 | ASSERT_MSG(BufferDescriptorX().size() > buffer_index, | 295 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorX().size() > buffer_index, { return buffer; }, |
| 296 | "BufferDescriptorX invalid buffer_index {}", buffer_index); | 296 | "BufferDescriptorX invalid buffer_index {}", buffer_index); |
| 297 | buffer.resize(BufferDescriptorX()[buffer_index].Size()); | 297 | buffer.resize(BufferDescriptorX()[buffer_index].Size()); |
| 298 | memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), buffer.size()); | 298 | memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), buffer.size()); |
| 299 | } | 299 | } |
| @@ -318,16 +318,16 @@ std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | |||
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | if (is_buffer_b) { | 320 | if (is_buffer_b) { |
| 321 | ASSERT_MSG(BufferDescriptorB().size() > buffer_index, | 321 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorB().size() > buffer_index && |
| 322 | "BufferDescriptorB invalid buffer_index {}", buffer_index); | 322 | BufferDescriptorB()[buffer_index].Size() >= size, |
| 323 | ASSERT_MSG(BufferDescriptorB()[buffer_index].Size() >= size, | 323 | { return 0; }, "BufferDescriptorB is invalid, index={}, size={}", |
| 324 | "BufferDescriptorB buffer_index {} is not large enough", buffer_index); | 324 | buffer_index, size); |
| 325 | memory.WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); | 325 | memory.WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); |
| 326 | } else { | 326 | } else { |
| 327 | ASSERT_MSG(BufferDescriptorC().size() > buffer_index, | 327 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorC().size() > buffer_index && |
| 328 | "BufferDescriptorC invalid buffer_index {}", buffer_index); | 328 | BufferDescriptorC()[buffer_index].Size() >= size, |
| 329 | ASSERT_MSG(BufferDescriptorC()[buffer_index].Size() >= size, | 329 | { return 0; }, "BufferDescriptorC is invalid, index={}, size={}", |
| 330 | "BufferDescriptorC buffer_index {} is not large enough", buffer_index); | 330 | buffer_index, size); |
| 331 | memory.WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); | 331 | memory.WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); |
| 332 | } | 332 | } |
| 333 | 333 | ||
| @@ -338,16 +338,12 @@ std::size_t HLERequestContext::GetReadBufferSize(std::size_t buffer_index) const | |||
| 338 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && | 338 | const bool is_buffer_a{BufferDescriptorA().size() > buffer_index && |
| 339 | BufferDescriptorA()[buffer_index].Size()}; | 339 | BufferDescriptorA()[buffer_index].Size()}; |
| 340 | if (is_buffer_a) { | 340 | if (is_buffer_a) { |
| 341 | ASSERT_MSG(BufferDescriptorA().size() > buffer_index, | 341 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorA().size() > buffer_index, { return 0; }, |
| 342 | "BufferDescriptorA invalid buffer_index {}", buffer_index); | 342 | "BufferDescriptorA invalid buffer_index {}", buffer_index); |
| 343 | ASSERT_MSG(BufferDescriptorA()[buffer_index].Size() > 0, | ||
| 344 | "BufferDescriptorA buffer_index {} is empty", buffer_index); | ||
| 345 | return BufferDescriptorA()[buffer_index].Size(); | 343 | return BufferDescriptorA()[buffer_index].Size(); |
| 346 | } else { | 344 | } else { |
| 347 | ASSERT_MSG(BufferDescriptorX().size() > buffer_index, | 345 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorX().size() > buffer_index, { return 0; }, |
| 348 | "BufferDescriptorX invalid buffer_index {}", buffer_index); | 346 | "BufferDescriptorX invalid buffer_index {}", buffer_index); |
| 349 | ASSERT_MSG(BufferDescriptorX()[buffer_index].Size() > 0, | ||
| 350 | "BufferDescriptorX buffer_index {} is empty", buffer_index); | ||
| 351 | return BufferDescriptorX()[buffer_index].Size(); | 347 | return BufferDescriptorX()[buffer_index].Size(); |
| 352 | } | 348 | } |
| 353 | } | 349 | } |
| @@ -356,14 +352,15 @@ std::size_t HLERequestContext::GetWriteBufferSize(std::size_t buffer_index) cons | |||
| 356 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && | 352 | const bool is_buffer_b{BufferDescriptorB().size() > buffer_index && |
| 357 | BufferDescriptorB()[buffer_index].Size()}; | 353 | BufferDescriptorB()[buffer_index].Size()}; |
| 358 | if (is_buffer_b) { | 354 | if (is_buffer_b) { |
| 359 | ASSERT_MSG(BufferDescriptorB().size() > buffer_index, | 355 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorB().size() > buffer_index, { return 0; }, |
| 360 | "BufferDescriptorB invalid buffer_index {}", buffer_index); | 356 | "BufferDescriptorB invalid buffer_index {}", buffer_index); |
| 361 | return BufferDescriptorB()[buffer_index].Size(); | 357 | return BufferDescriptorB()[buffer_index].Size(); |
| 362 | } else { | 358 | } else { |
| 363 | ASSERT_MSG(BufferDescriptorC().size() > buffer_index, | 359 | ASSERT_OR_EXECUTE_MSG(BufferDescriptorC().size() > buffer_index, { return 0; }, |
| 364 | "BufferDescriptorC invalid buffer_index {}", buffer_index); | 360 | "BufferDescriptorC invalid buffer_index {}", buffer_index); |
| 365 | return BufferDescriptorC()[buffer_index].Size(); | 361 | return BufferDescriptorC()[buffer_index].Size(); |
| 366 | } | 362 | } |
| 363 | return 0; | ||
| 367 | } | 364 | } |
| 368 | 365 | ||
| 369 | std::string HLERequestContext::Description() const { | 366 | std::string HLERequestContext::Description() const { |
diff --git a/src/core/hle/kernel/memory/memory_manager.cpp b/src/core/hle/kernel/memory/memory_manager.cpp index 6b432e1b2..acf13585c 100644 --- a/src/core/hle/kernel/memory/memory_manager.cpp +++ b/src/core/hle/kernel/memory/memory_manager.cpp | |||
| @@ -104,7 +104,7 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa | |||
| 104 | // Ensure that we don't leave anything un-freed | 104 | // Ensure that we don't leave anything un-freed |
| 105 | auto group_guard = detail::ScopeExit([&] { | 105 | auto group_guard = detail::ScopeExit([&] { |
| 106 | for (const auto& it : page_list.Nodes()) { | 106 | for (const auto& it : page_list.Nodes()) { |
| 107 | const auto min_num_pages{std::min( | 107 | const auto min_num_pages{std::min<size_t>( |
| 108 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; | 108 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; |
| 109 | chosen_manager.Free(it.GetAddress(), min_num_pages); | 109 | chosen_manager.Free(it.GetAddress(), min_num_pages); |
| 110 | } | 110 | } |
| @@ -139,7 +139,6 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa | |||
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | // Only succeed if we allocated as many pages as we wanted | 141 | // Only succeed if we allocated as many pages as we wanted |
| 142 | ASSERT(num_pages >= 0); | ||
| 143 | if (num_pages) { | 142 | if (num_pages) { |
| 144 | return ERR_OUT_OF_MEMORY; | 143 | return ERR_OUT_OF_MEMORY; |
| 145 | } | 144 | } |
| @@ -165,7 +164,7 @@ ResultCode MemoryManager::Free(PageLinkedList& page_list, std::size_t num_pages, | |||
| 165 | 164 | ||
| 166 | // Free all of the pages | 165 | // Free all of the pages |
| 167 | for (const auto& it : page_list.Nodes()) { | 166 | for (const auto& it : page_list.Nodes()) { |
| 168 | const auto min_num_pages{std::min( | 167 | const auto min_num_pages{std::min<size_t>( |
| 169 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; | 168 | it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)}; |
| 170 | chosen_manager.Free(it.GetAddress(), min_num_pages); | 169 | chosen_manager.Free(it.GetAddress(), min_num_pages); |
| 171 | } | 170 | } |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 36724569f..c4c5199b1 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -132,7 +132,8 @@ std::shared_ptr<ResourceLimit> Process::GetResourceLimit() const { | |||
| 132 | 132 | ||
| 133 | u64 Process::GetTotalPhysicalMemoryAvailable() const { | 133 | u64 Process::GetTotalPhysicalMemoryAvailable() const { |
| 134 | const u64 capacity{resource_limit->GetCurrentResourceValue(ResourceType::PhysicalMemory) + | 134 | const u64 capacity{resource_limit->GetCurrentResourceValue(ResourceType::PhysicalMemory) + |
| 135 | page_table->GetTotalHeapSize() + image_size + main_thread_stack_size}; | 135 | page_table->GetTotalHeapSize() + GetSystemResourceSize() + image_size + |
| 136 | main_thread_stack_size}; | ||
| 136 | 137 | ||
| 137 | if (capacity < memory_usage_capacity) { | 138 | if (capacity < memory_usage_capacity) { |
| 138 | return capacity; | 139 | return capacity; |
| @@ -146,7 +147,8 @@ u64 Process::GetTotalPhysicalMemoryAvailableWithoutSystemResource() const { | |||
| 146 | } | 147 | } |
| 147 | 148 | ||
| 148 | u64 Process::GetTotalPhysicalMemoryUsed() const { | 149 | u64 Process::GetTotalPhysicalMemoryUsed() const { |
| 149 | return image_size + main_thread_stack_size + page_table->GetTotalHeapSize(); | 150 | return image_size + main_thread_stack_size + page_table->GetTotalHeapSize() + |
| 151 | GetSystemResourceSize(); | ||
| 150 | } | 152 | } |
| 151 | 153 | ||
| 152 | u64 Process::GetTotalPhysicalMemoryUsedWithoutSystemResource() const { | 154 | u64 Process::GetTotalPhysicalMemoryUsedWithoutSystemResource() const { |
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp index 00860fcbd..ef5e19e63 100644 --- a/src/core/hle/kernel/readable_event.cpp +++ b/src/core/hle/kernel/readable_event.cpp | |||
| @@ -38,7 +38,7 @@ void ReadableEvent::Clear() { | |||
| 38 | 38 | ||
| 39 | ResultCode ReadableEvent::Reset() { | 39 | ResultCode ReadableEvent::Reset() { |
| 40 | if (!is_signaled) { | 40 | if (!is_signaled) { |
| 41 | LOG_ERROR(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}", | 41 | LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}", |
| 42 | GetObjectId(), GetTypeName(), GetName()); | 42 | GetObjectId(), GetTypeName(), GetName()); |
| 43 | return ERR_INVALID_STATE; | 43 | return ERR_INVALID_STATE; |
| 44 | } | 44 | } |
diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp index d9beaa3a4..212e442f4 100644 --- a/src/core/hle/kernel/resource_limit.cpp +++ b/src/core/hle/kernel/resource_limit.cpp | |||
| @@ -24,13 +24,9 @@ bool ResourceLimit::Reserve(ResourceType resource, s64 amount, u64 timeout) { | |||
| 24 | const std::size_t index{ResourceTypeToIndex(resource)}; | 24 | const std::size_t index{ResourceTypeToIndex(resource)}; |
| 25 | 25 | ||
| 26 | s64 new_value = current[index] + amount; | 26 | s64 new_value = current[index] + amount; |
| 27 | while (new_value > limit[index] && available[index] + amount <= limit[index]) { | 27 | if (new_value > limit[index] && available[index] + amount <= limit[index]) { |
| 28 | // TODO(bunnei): This is wrong for multicore, we should wait the calling thread for timeout | 28 | // TODO(bunnei): This is wrong for multicore, we should wait the calling thread for timeout |
| 29 | new_value = current[index] + amount; | 29 | new_value = current[index] + amount; |
| 30 | |||
| 31 | if (timeout >= 0) { | ||
| 32 | break; | ||
| 33 | } | ||
| 34 | } | 30 | } |
| 35 | 31 | ||
| 36 | if (new_value <= limit[index]) { | 32 | if (new_value <= limit[index]) { |
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 630a8b048..94d8c1fc6 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp | |||
| @@ -44,6 +44,218 @@ static constexpr u32 SanitizeJPEGSize(std::size_t size) { | |||
| 44 | return static_cast<u32>(std::min(size, max_jpeg_image_size)); | 44 | return static_cast<u32>(std::min(size, max_jpeg_image_size)); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | class IManagerForSystemService final : public ServiceFramework<IManagerForSystemService> { | ||
| 48 | public: | ||
| 49 | explicit IManagerForSystemService(Common::UUID user_id) | ||
| 50 | : ServiceFramework("IManagerForSystemService") { | ||
| 51 | // clang-format off | ||
| 52 | static const FunctionInfo functions[] = { | ||
| 53 | {0, nullptr, "CheckAvailability"}, | ||
| 54 | {1, nullptr, "GetAccountId"}, | ||
| 55 | {2, nullptr, "EnsureIdTokenCacheAsync"}, | ||
| 56 | {3, nullptr, "LoadIdTokenCache"}, | ||
| 57 | {100, nullptr, "SetSystemProgramIdentification"}, | ||
| 58 | {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ | ||
| 59 | {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ | ||
| 60 | {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ | ||
| 61 | {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 | ||
| 62 | {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ | ||
| 63 | {120, nullptr, "GetNintendoAccountId"}, | ||
| 64 | {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ | ||
| 65 | {130, nullptr, "GetNintendoAccountUserResourceCache"}, | ||
| 66 | {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, | ||
| 67 | {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, | ||
| 68 | {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ | ||
| 69 | {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+ | ||
| 70 | {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ | ||
| 71 | {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ | ||
| 72 | {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ | ||
| 73 | {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ | ||
| 74 | {150, nullptr, "CreateAuthorizationRequest"}, | ||
| 75 | }; | ||
| 76 | // clang-format on | ||
| 77 | |||
| 78 | RegisterHandlers(functions); | ||
| 79 | } | ||
| 80 | }; | ||
| 81 | |||
| 82 | // 3.0.0+ | ||
| 83 | class IFloatingRegistrationRequest final : public ServiceFramework<IFloatingRegistrationRequest> { | ||
| 84 | public: | ||
| 85 | explicit IFloatingRegistrationRequest(Common::UUID user_id) | ||
| 86 | : ServiceFramework("IFloatingRegistrationRequest") { | ||
| 87 | // clang-format off | ||
| 88 | static const FunctionInfo functions[] = { | ||
| 89 | {0, nullptr, "GetSessionId"}, | ||
| 90 | {12, nullptr, "GetAccountId"}, | ||
| 91 | {13, nullptr, "GetLinkedNintendoAccountId"}, | ||
| 92 | {14, nullptr, "GetNickname"}, | ||
| 93 | {15, nullptr, "GetProfileImage"}, | ||
| 94 | {21, nullptr, "LoadIdTokenCache"}, | ||
| 95 | {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync | ||
| 96 | {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync | ||
| 97 | {102, nullptr, "RegisterNetworkServiceAccountAsync"}, // 4.0.0+ | ||
| 98 | {103, nullptr, "RegisterNetworkServiceAccountWithUidAsync"}, // 4.0.0+ | ||
| 99 | {110, nullptr, "SetSystemProgramIdentification"}, | ||
| 100 | {111, nullptr, "EnsureIdTokenCacheAsync"}, | ||
| 101 | }; | ||
| 102 | // clang-format on | ||
| 103 | |||
| 104 | RegisterHandlers(functions); | ||
| 105 | } | ||
| 106 | }; | ||
| 107 | |||
| 108 | class IAdministrator final : public ServiceFramework<IAdministrator> { | ||
| 109 | public: | ||
| 110 | explicit IAdministrator(Common::UUID user_id) : ServiceFramework("IAdministrator") { | ||
| 111 | // clang-format off | ||
| 112 | static const FunctionInfo functions[] = { | ||
| 113 | {0, nullptr, "CheckAvailability"}, | ||
| 114 | {1, nullptr, "GetAccountId"}, | ||
| 115 | {2, nullptr, "EnsureIdTokenCacheAsync"}, | ||
| 116 | {3, nullptr, "LoadIdTokenCache"}, | ||
| 117 | {100, nullptr, "SetSystemProgramIdentification"}, | ||
| 118 | {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ | ||
| 119 | {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ | ||
| 120 | {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ | ||
| 121 | {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 | ||
| 122 | {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ | ||
| 123 | {120, nullptr, "GetNintendoAccountId"}, | ||
| 124 | {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ | ||
| 125 | {130, nullptr, "GetNintendoAccountUserResourceCache"}, | ||
| 126 | {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, | ||
| 127 | {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, | ||
| 128 | {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ | ||
| 129 | {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+ | ||
| 130 | {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ | ||
| 131 | {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ | ||
| 132 | {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ | ||
| 133 | {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ | ||
| 134 | {150, nullptr, "CreateAuthorizationRequest"}, | ||
| 135 | {200, nullptr, "IsRegistered"}, | ||
| 136 | {201, nullptr, "RegisterAsync"}, | ||
| 137 | {202, nullptr, "UnregisterAsync"}, | ||
| 138 | {203, nullptr, "DeleteRegistrationInfoLocally"}, | ||
| 139 | {220, nullptr, "SynchronizeProfileAsync"}, | ||
| 140 | {221, nullptr, "UploadProfileAsync"}, | ||
| 141 | {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, | ||
| 142 | {250, nullptr, "IsLinkedWithNintendoAccount"}, | ||
| 143 | {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, | ||
| 144 | {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, | ||
| 145 | {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, | ||
| 146 | {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, | ||
| 147 | {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ | ||
| 148 | {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ | ||
| 149 | {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, | ||
| 150 | {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+ | ||
| 151 | {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+ | ||
| 152 | {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+ | ||
| 153 | {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+ | ||
| 154 | {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+ | ||
| 155 | {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+ | ||
| 156 | {997, nullptr, "DebugUnlinkNintendoAccountAsync"}, | ||
| 157 | {998, nullptr, "DebugSetAvailabilityErrorDetail"}, | ||
| 158 | }; | ||
| 159 | // clang-format on | ||
| 160 | |||
| 161 | RegisterHandlers(functions); | ||
| 162 | } | ||
| 163 | }; | ||
| 164 | |||
| 165 | class IAuthorizationRequest final : public ServiceFramework<IAuthorizationRequest> { | ||
| 166 | public: | ||
| 167 | explicit IAuthorizationRequest(Common::UUID user_id) | ||
| 168 | : ServiceFramework("IAuthorizationRequest") { | ||
| 169 | // clang-format off | ||
| 170 | static const FunctionInfo functions[] = { | ||
| 171 | {0, nullptr, "GetSessionId"}, | ||
| 172 | {10, nullptr, "InvokeWithoutInteractionAsync"}, | ||
| 173 | {19, nullptr, "IsAuthorized"}, | ||
| 174 | {20, nullptr, "GetAuthorizationCode"}, | ||
| 175 | {21, nullptr, "GetIdToken"}, | ||
| 176 | {22, nullptr, "GetState"}, | ||
| 177 | }; | ||
| 178 | // clang-format on | ||
| 179 | |||
| 180 | RegisterHandlers(functions); | ||
| 181 | } | ||
| 182 | }; | ||
| 183 | |||
| 184 | class IOAuthProcedure final : public ServiceFramework<IOAuthProcedure> { | ||
| 185 | public: | ||
| 186 | explicit IOAuthProcedure(Common::UUID user_id) : ServiceFramework("IOAuthProcedure") { | ||
| 187 | // clang-format off | ||
| 188 | static const FunctionInfo functions[] = { | ||
| 189 | {0, nullptr, "PrepareAsync"}, | ||
| 190 | {1, nullptr, "GetRequest"}, | ||
| 191 | {2, nullptr, "ApplyResponse"}, | ||
| 192 | {3, nullptr, "ApplyResponseAsync"}, | ||
| 193 | {10, nullptr, "Suspend"}, | ||
| 194 | }; | ||
| 195 | // clang-format on | ||
| 196 | |||
| 197 | RegisterHandlers(functions); | ||
| 198 | } | ||
| 199 | }; | ||
| 200 | |||
| 201 | // 3.0.0+ | ||
| 202 | class IOAuthProcedureForExternalNsa final : public ServiceFramework<IOAuthProcedureForExternalNsa> { | ||
| 203 | public: | ||
| 204 | explicit IOAuthProcedureForExternalNsa(Common::UUID user_id) | ||
| 205 | : ServiceFramework("IOAuthProcedureForExternalNsa") { | ||
| 206 | // clang-format off | ||
| 207 | static const FunctionInfo functions[] = { | ||
| 208 | {0, nullptr, "PrepareAsync"}, | ||
| 209 | {1, nullptr, "GetRequest"}, | ||
| 210 | {2, nullptr, "ApplyResponse"}, | ||
| 211 | {3, nullptr, "ApplyResponseAsync"}, | ||
| 212 | {10, nullptr, "Suspend"}, | ||
| 213 | {100, nullptr, "GetAccountId"}, | ||
| 214 | {101, nullptr, "GetLinkedNintendoAccountId"}, | ||
| 215 | {102, nullptr, "GetNickname"}, | ||
| 216 | {103, nullptr, "GetProfileImage"}, | ||
| 217 | }; | ||
| 218 | // clang-format on | ||
| 219 | |||
| 220 | RegisterHandlers(functions); | ||
| 221 | } | ||
| 222 | }; | ||
| 223 | |||
| 224 | class IOAuthProcedureForNintendoAccountLinkage final | ||
| 225 | : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> { | ||
| 226 | public: | ||
| 227 | explicit IOAuthProcedureForNintendoAccountLinkage(Common::UUID user_id) | ||
| 228 | : ServiceFramework("IOAuthProcedureForNintendoAccountLinkage") { | ||
| 229 | // clang-format off | ||
| 230 | static const FunctionInfo functions[] = { | ||
| 231 | {0, nullptr, "PrepareAsync"}, | ||
| 232 | {1, nullptr, "GetRequest"}, | ||
| 233 | {2, nullptr, "ApplyResponse"}, | ||
| 234 | {3, nullptr, "ApplyResponseAsync"}, | ||
| 235 | {10, nullptr, "Suspend"}, | ||
| 236 | {100, nullptr, "GetRequestWithTheme"}, | ||
| 237 | {101, nullptr, "IsNetworkServiceAccountReplaced"}, | ||
| 238 | {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0 | ||
| 239 | }; | ||
| 240 | // clang-format on | ||
| 241 | |||
| 242 | RegisterHandlers(functions); | ||
| 243 | } | ||
| 244 | }; | ||
| 245 | |||
| 246 | class INotifier final : public ServiceFramework<INotifier> { | ||
| 247 | public: | ||
| 248 | explicit INotifier(Common::UUID user_id) : ServiceFramework("INotifier") { | ||
| 249 | // clang-format off | ||
| 250 | static const FunctionInfo functions[] = { | ||
| 251 | {0, nullptr, "GetSystemEvent"}, | ||
| 252 | }; | ||
| 253 | // clang-format on | ||
| 254 | |||
| 255 | RegisterHandlers(functions); | ||
| 256 | } | ||
| 257 | }; | ||
| 258 | |||
| 47 | class IProfileCommon : public ServiceFramework<IProfileCommon> { | 259 | class IProfileCommon : public ServiceFramework<IProfileCommon> { |
| 48 | public: | 260 | public: |
| 49 | explicit IProfileCommon(const char* name, bool editor_commands, Common::UUID user_id, | 261 | explicit IProfileCommon(const char* name, bool editor_commands, Common::UUID user_id, |
| @@ -226,6 +438,54 @@ public: | |||
| 226 | : IProfileCommon("IProfileEditor", true, user_id, profile_manager) {} | 438 | : IProfileCommon("IProfileEditor", true, user_id, profile_manager) {} |
| 227 | }; | 439 | }; |
| 228 | 440 | ||
| 441 | class IAsyncContext final : public ServiceFramework<IAsyncContext> { | ||
| 442 | public: | ||
| 443 | explicit IAsyncContext(Common::UUID user_id) : ServiceFramework("IAsyncContext") { | ||
| 444 | // clang-format off | ||
| 445 | static const FunctionInfo functions[] = { | ||
| 446 | {0, nullptr, "GetSystemEvent"}, | ||
| 447 | {1, nullptr, "Cancel"}, | ||
| 448 | {2, nullptr, "HasDone"}, | ||
| 449 | {3, nullptr, "GetResult"}, | ||
| 450 | }; | ||
| 451 | // clang-format on | ||
| 452 | |||
| 453 | RegisterHandlers(functions); | ||
| 454 | } | ||
| 455 | }; | ||
| 456 | |||
| 457 | class ISessionObject final : public ServiceFramework<ISessionObject> { | ||
| 458 | public: | ||
| 459 | explicit ISessionObject(Common::UUID user_id) : ServiceFramework("ISessionObject") { | ||
| 460 | // clang-format off | ||
| 461 | static const FunctionInfo functions[] = { | ||
| 462 | {999, nullptr, "Dummy"}, | ||
| 463 | }; | ||
| 464 | // clang-format on | ||
| 465 | |||
| 466 | RegisterHandlers(functions); | ||
| 467 | } | ||
| 468 | }; | ||
| 469 | |||
| 470 | class IGuestLoginRequest final : public ServiceFramework<IGuestLoginRequest> { | ||
| 471 | public: | ||
| 472 | explicit IGuestLoginRequest(Common::UUID) : ServiceFramework("IGuestLoginRequest") { | ||
| 473 | // clang-format off | ||
| 474 | static const FunctionInfo functions[] = { | ||
| 475 | {0, nullptr, "GetSessionId"}, | ||
| 476 | {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew) | ||
| 477 | {12, nullptr, "GetAccountId"}, | ||
| 478 | {13, nullptr, "GetLinkedNintendoAccountId"}, | ||
| 479 | {14, nullptr, "GetNickname"}, | ||
| 480 | {15, nullptr, "GetProfileImage"}, | ||
| 481 | {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ | ||
| 482 | }; | ||
| 483 | // clang-format on | ||
| 484 | |||
| 485 | RegisterHandlers(functions); | ||
| 486 | } | ||
| 487 | }; | ||
| 488 | |||
| 229 | class IManagerForApplication final : public ServiceFramework<IManagerForApplication> { | 489 | class IManagerForApplication final : public ServiceFramework<IManagerForApplication> { |
| 230 | public: | 490 | public: |
| 231 | explicit IManagerForApplication(Common::UUID user_id) | 491 | explicit IManagerForApplication(Common::UUID user_id) |
| @@ -265,6 +525,87 @@ private: | |||
| 265 | Common::UUID user_id; | 525 | Common::UUID user_id; |
| 266 | }; | 526 | }; |
| 267 | 527 | ||
| 528 | // 6.0.0+ | ||
| 529 | class IAsyncNetworkServiceLicenseKindContext final | ||
| 530 | : public ServiceFramework<IAsyncNetworkServiceLicenseKindContext> { | ||
| 531 | public: | ||
| 532 | explicit IAsyncNetworkServiceLicenseKindContext(Common::UUID user_id) | ||
| 533 | : ServiceFramework("IAsyncNetworkServiceLicenseKindContext") { | ||
| 534 | // clang-format off | ||
| 535 | static const FunctionInfo functions[] = { | ||
| 536 | {0, nullptr, "GetSystemEvent"}, | ||
| 537 | {1, nullptr, "Cancel"}, | ||
| 538 | {2, nullptr, "HasDone"}, | ||
| 539 | {3, nullptr, "GetResult"}, | ||
| 540 | {4, nullptr, "GetNetworkServiceLicenseKind"}, | ||
| 541 | }; | ||
| 542 | // clang-format on | ||
| 543 | |||
| 544 | RegisterHandlers(functions); | ||
| 545 | } | ||
| 546 | }; | ||
| 547 | |||
| 548 | // 8.0.0+ | ||
| 549 | class IOAuthProcedureForUserRegistration final | ||
| 550 | : public ServiceFramework<IOAuthProcedureForUserRegistration> { | ||
| 551 | public: | ||
| 552 | explicit IOAuthProcedureForUserRegistration(Common::UUID user_id) | ||
| 553 | : ServiceFramework("IOAuthProcedureForUserRegistration") { | ||
| 554 | // clang-format off | ||
| 555 | static const FunctionInfo functions[] = { | ||
| 556 | {0, nullptr, "PrepareAsync"}, | ||
| 557 | {1, nullptr, "GetRequest"}, | ||
| 558 | {2, nullptr, "ApplyResponse"}, | ||
| 559 | {3, nullptr, "ApplyResponseAsync"}, | ||
| 560 | {10, nullptr, "Suspend"}, | ||
| 561 | {100, nullptr, "GetAccountId"}, | ||
| 562 | {101, nullptr, "GetLinkedNintendoAccountId"}, | ||
| 563 | {102, nullptr, "GetNickname"}, | ||
| 564 | {103, nullptr, "GetProfileImage"}, | ||
| 565 | {110, nullptr, "RegisterUserAsync"}, | ||
| 566 | {111, nullptr, "GetUid"}, | ||
| 567 | }; | ||
| 568 | // clang-format on | ||
| 569 | |||
| 570 | RegisterHandlers(functions); | ||
| 571 | } | ||
| 572 | }; | ||
| 573 | |||
| 574 | class DAUTH_O final : public ServiceFramework<DAUTH_O> { | ||
| 575 | public: | ||
| 576 | explicit DAUTH_O(Common::UUID) : ServiceFramework("dauth:o") { | ||
| 577 | // clang-format off | ||
| 578 | static const FunctionInfo functions[] = { | ||
| 579 | {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, // [5.0.0-5.1.0] GeneratePostData | ||
| 580 | {1, nullptr, "LoadAuthenticationTokenCache"}, // 6.0.0+ | ||
| 581 | {2, nullptr, "InvalidateAuthenticationTokenCache"}, // 6.0.0+ | ||
| 582 | {10, nullptr, "EnsureEdgeTokenCacheAsync"}, // 6.0.0+ | ||
| 583 | {11, nullptr, "LoadEdgeTokenCache"}, // 6.0.0+ | ||
| 584 | {12, nullptr, "InvalidateEdgeTokenCache"}, // 6.0.0+ | ||
| 585 | }; | ||
| 586 | // clang-format on | ||
| 587 | |||
| 588 | RegisterHandlers(functions); | ||
| 589 | } | ||
| 590 | }; | ||
| 591 | |||
| 592 | // 6.0.0+ | ||
| 593 | class IAsyncResult final : public ServiceFramework<IAsyncResult> { | ||
| 594 | public: | ||
| 595 | explicit IAsyncResult(Common::UUID user_id) : ServiceFramework("IAsyncResult") { | ||
| 596 | // clang-format off | ||
| 597 | static const FunctionInfo functions[] = { | ||
| 598 | {0, nullptr, "GetResult"}, | ||
| 599 | {1, nullptr, "Cancel"}, | ||
| 600 | {2, nullptr, "IsAvailable"}, | ||
| 601 | {3, nullptr, "GetSystemEvent"}, | ||
| 602 | }; | ||
| 603 | // clang-format on | ||
| 604 | |||
| 605 | RegisterHandlers(functions); | ||
| 606 | } | ||
| 607 | }; | ||
| 608 | |||
| 268 | void Module::Interface::GetUserCount(Kernel::HLERequestContext& ctx) { | 609 | void Module::Interface::GetUserCount(Kernel::HLERequestContext& ctx) { |
| 269 | LOG_DEBUG(Service_ACC, "called"); | 610 | LOG_DEBUG(Service_ACC, "called"); |
| 270 | IPC::ResponseBuilder rb{ctx, 3}; | 611 | IPC::ResponseBuilder rb{ctx, 3}; |
diff --git a/src/core/hle/service/acc/acc_aa.cpp b/src/core/hle/service/acc/acc_aa.cpp index 3bac6bcd1..51f119b12 100644 --- a/src/core/hle/service/acc/acc_aa.cpp +++ b/src/core/hle/service/acc/acc_aa.cpp | |||
| @@ -13,8 +13,8 @@ ACC_AA::ACC_AA(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 13 | {0, nullptr, "EnsureCacheAsync"}, | 13 | {0, nullptr, "EnsureCacheAsync"}, |
| 14 | {1, nullptr, "LoadCache"}, | 14 | {1, nullptr, "LoadCache"}, |
| 15 | {2, nullptr, "GetDeviceAccountId"}, | 15 | {2, nullptr, "GetDeviceAccountId"}, |
| 16 | {50, nullptr, "RegisterNotificationTokenAsync"}, | 16 | {50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 |
| 17 | {51, nullptr, "UnregisterNotificationTokenAsync"}, | 17 | {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 |
| 18 | }; | 18 | }; |
| 19 | RegisterHandlers(functions); | 19 | RegisterHandlers(functions); |
| 20 | } | 20 | } |
diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp index 2eefc6df5..85620bde3 100644 --- a/src/core/hle/service/acc/acc_su.cpp +++ b/src/core/hle/service/acc/acc_su.cpp | |||
| @@ -17,28 +17,28 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, | 17 | {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, |
| 18 | {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, | 18 | {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, |
| 19 | {5, &ACC_SU::GetProfile, "GetProfile"}, | 19 | {5, &ACC_SU::GetProfile, "GetProfile"}, |
| 20 | {6, nullptr, "GetProfileDigest"}, | 20 | {6, nullptr, "GetProfileDigest"}, // 3.0.0+ |
| 21 | {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 21 | {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 22 | {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, | 22 | {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 23 | {60, nullptr, "ListOpenContextStoredUsers"}, | 23 | {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 |
| 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, | 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ |
| 25 | {100, nullptr, "GetUserRegistrationNotifier"}, | 25 | {100, nullptr, "GetUserRegistrationNotifier"}, |
| 26 | {101, nullptr, "GetUserStateChangeNotifier"}, | 26 | {101, nullptr, "GetUserStateChangeNotifier"}, |
| 27 | {102, nullptr, "GetBaasAccountManagerForSystemService"}, | 27 | {102, nullptr, "GetBaasAccountManagerForSystemService"}, |
| 28 | {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, | 28 | {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, |
| 29 | {104, nullptr, "GetProfileUpdateNotifier"}, | 29 | {104, nullptr, "GetProfileUpdateNotifier"}, |
| 30 | {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, | 30 | {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ |
| 31 | {106, nullptr, "GetProfileSyncNotifier"}, | 31 | {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ |
| 32 | {110, nullptr, "StoreSaveDataThumbnail"}, | 32 | {110, nullptr, "StoreSaveDataThumbnail"}, |
| 33 | {111, nullptr, "ClearSaveDataThumbnail"}, | 33 | {111, nullptr, "ClearSaveDataThumbnail"}, |
| 34 | {112, nullptr, "LoadSaveDataThumbnail"}, | 34 | {112, nullptr, "LoadSaveDataThumbnail"}, |
| 35 | {113, nullptr, "GetSaveDataThumbnailExistence"}, | 35 | {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ |
| 36 | {120, nullptr, "ListOpenUsersInApplication"}, | 36 | {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ |
| 37 | {130, nullptr, "ActivateOpenContextRetention"}, | 37 | {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ |
| 38 | {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, | 38 | {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ |
| 39 | {150, nullptr, "AuthenticateApplicationAsync"}, | 39 | {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ |
| 40 | {190, nullptr, "GetUserLastOpenedApplication"}, | 40 | {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 |
| 41 | {191, nullptr, "ActivateOpenContextHolder"}, | 41 | {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+ |
| 42 | {200, nullptr, "BeginUserRegistration"}, | 42 | {200, nullptr, "BeginUserRegistration"}, |
| 43 | {201, nullptr, "CompleteUserRegistration"}, | 43 | {201, nullptr, "CompleteUserRegistration"}, |
| 44 | {202, nullptr, "CancelUserRegistration"}, | 44 | {202, nullptr, "CancelUserRegistration"}, |
| @@ -46,15 +46,15 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 46 | {204, nullptr, "SetUserPosition"}, | 46 | {204, nullptr, "SetUserPosition"}, |
| 47 | {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, | 47 | {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, |
| 48 | {206, nullptr, "CompleteUserRegistrationForcibly"}, | 48 | {206, nullptr, "CompleteUserRegistrationForcibly"}, |
| 49 | {210, nullptr, "CreateFloatingRegistrationRequest"}, | 49 | {210, nullptr, "CreateFloatingRegistrationRequest"}, // 3.0.0+ |
| 50 | {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, | 50 | {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+ |
| 51 | {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, | 51 | {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+ |
| 52 | {230, nullptr, "AuthenticateServiceAsync"}, | 52 | {230, nullptr, "AuthenticateServiceAsync"}, |
| 53 | {250, nullptr, "GetBaasAccountAdministrator"}, | 53 | {250, nullptr, "GetBaasAccountAdministrator"}, |
| 54 | {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, | 54 | {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, |
| 55 | {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, | 55 | {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, // 3.0.0+ |
| 56 | {299, nullptr, "SuspendBackgroundDaemon"}, | 56 | {299, nullptr, "SuspendBackgroundDaemon"}, |
| 57 | {997, nullptr, "DebugInvalidateTokenCacheForUser"}, | 57 | {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+ |
| 58 | {998, nullptr, "DebugSetUserStateClose"}, | 58 | {998, nullptr, "DebugSetUserStateClose"}, |
| 59 | {999, nullptr, "DebugSetUserStateOpen"}, | 59 | {999, nullptr, "DebugSetUserStateOpen"}, |
| 60 | }; | 60 | }; |
diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index fb4e7e772..49f6e20f1 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp | |||
| @@ -17,23 +17,23 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, | 17 | {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, |
| 18 | {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, | 18 | {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, |
| 19 | {5, &ACC_U0::GetProfile, "GetProfile"}, | 19 | {5, &ACC_U0::GetProfile, "GetProfile"}, |
| 20 | {6, nullptr, "GetProfileDigest"}, | 20 | {6, nullptr, "GetProfileDigest"}, // 3.0.0+ |
| 21 | {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 21 | {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 22 | {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, | 22 | {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 23 | {60, nullptr, "ListOpenContextStoredUsers"}, | 23 | {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 |
| 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, | 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ |
| 25 | {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, | 25 | {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, |
| 26 | {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, | 26 | {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, |
| 27 | {102, nullptr, "AuthenticateApplicationAsync"}, | 27 | {102, nullptr, "AuthenticateApplicationAsync"}, |
| 28 | {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, | 28 | {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ |
| 29 | {110, nullptr, "StoreSaveDataThumbnail"}, | 29 | {110, nullptr, "StoreSaveDataThumbnail"}, |
| 30 | {111, nullptr, "ClearSaveDataThumbnail"}, | 30 | {111, nullptr, "ClearSaveDataThumbnail"}, |
| 31 | {120, nullptr, "CreateGuestLoginRequest"}, | 31 | {120, nullptr, "CreateGuestLoginRequest"}, |
| 32 | {130, nullptr, "LoadOpenContext"}, | 32 | {130, nullptr, "LoadOpenContext"}, // 5.0.0+ |
| 33 | {131, nullptr, "ListOpenContextStoredUsers"}, | 33 | {131, nullptr, "ListOpenContextStoredUsers"}, // 6.0.0+ |
| 34 | {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, | 34 | {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+ |
| 35 | {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, | 35 | {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ |
| 36 | {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, | 36 | {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+ |
| 37 | }; | 37 | }; |
| 38 | // clang-format on | 38 | // clang-format on |
| 39 | 39 | ||
diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp index 9f29cdc82..f47004f84 100644 --- a/src/core/hle/service/acc/acc_u1.cpp +++ b/src/core/hle/service/acc/acc_u1.cpp | |||
| @@ -17,28 +17,29 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | |||
| 17 | {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, | 17 | {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, |
| 18 | {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, | 18 | {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, |
| 19 | {5, &ACC_U1::GetProfile, "GetProfile"}, | 19 | {5, &ACC_U1::GetProfile, "GetProfile"}, |
| 20 | {6, nullptr, "GetProfileDigest"}, | 20 | {6, nullptr, "GetProfileDigest"}, // 3.0.0+ |
| 21 | {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, | 21 | {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, |
| 22 | {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, | 22 | {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, |
| 23 | {60, nullptr, "ListOpenContextStoredUsers"}, | 23 | {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 |
| 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, | 24 | {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ |
| 25 | {100, nullptr, "GetUserRegistrationNotifier"}, | 25 | {100, nullptr, "GetUserRegistrationNotifier"}, |
| 26 | {101, nullptr, "GetUserStateChangeNotifier"}, | 26 | {101, nullptr, "GetUserStateChangeNotifier"}, |
| 27 | {102, nullptr, "GetBaasAccountManagerForSystemService"}, | 27 | {102, nullptr, "GetBaasAccountManagerForSystemService"}, |
| 28 | {103, nullptr, "GetProfileUpdateNotifier"}, | 28 | {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, |
| 29 | {104, nullptr, "CheckNetworkServiceAvailabilityAsync"}, | 29 | {104, nullptr, "GetProfileUpdateNotifier"}, |
| 30 | {105, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, | 30 | {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ |
| 31 | {106, nullptr, "GetProfileSyncNotifier"}, | 31 | {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ |
| 32 | {110, nullptr, "StoreSaveDataThumbnail"}, | 32 | {110, nullptr, "StoreSaveDataThumbnail"}, |
| 33 | {111, nullptr, "ClearSaveDataThumbnail"}, | 33 | {111, nullptr, "ClearSaveDataThumbnail"}, |
| 34 | {112, nullptr, "LoadSaveDataThumbnail"}, | 34 | {112, nullptr, "LoadSaveDataThumbnail"}, |
| 35 | {113, nullptr, "GetSaveDataThumbnailExistence"}, | 35 | {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ |
| 36 | {130, nullptr, "ActivateOpenContextRetention"}, | 36 | {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ |
| 37 | {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, | 37 | {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ |
| 38 | {150, nullptr, "AuthenticateApplicationAsync"}, | 38 | {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ |
| 39 | {190, nullptr, "GetUserLastOpenedApplication"}, | 39 | {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ |
| 40 | {191, nullptr, "ActivateOpenContextHolder"}, | 40 | {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 |
| 41 | {997, nullptr, "DebugInvalidateTokenCacheForUser"}, | 41 | {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+ |
| 42 | {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+ | ||
| 42 | {998, nullptr, "DebugSetUserStateClose"}, | 43 | {998, nullptr, "DebugSetUserStateClose"}, |
| 43 | {999, nullptr, "DebugSetUserStateOpen"}, | 44 | {999, nullptr, "DebugSetUserStateOpen"}, |
| 44 | }; | 45 | }; |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 4df74c4f9..20f366635 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -68,6 +68,7 @@ IWindowController::IWindowController(Core::System& system_) | |||
| 68 | static const FunctionInfo functions[] = { | 68 | static const FunctionInfo functions[] = { |
| 69 | {0, nullptr, "CreateWindow"}, | 69 | {0, nullptr, "CreateWindow"}, |
| 70 | {1, &IWindowController::GetAppletResourceUserId, "GetAppletResourceUserId"}, | 70 | {1, &IWindowController::GetAppletResourceUserId, "GetAppletResourceUserId"}, |
| 71 | {2, nullptr, "GetAppletResourceUserIdOfCallerApplet"}, | ||
| 71 | {10, &IWindowController::AcquireForegroundRights, "AcquireForegroundRights"}, | 72 | {10, &IWindowController::AcquireForegroundRights, "AcquireForegroundRights"}, |
| 72 | {11, nullptr, "ReleaseForegroundRights"}, | 73 | {11, nullptr, "ReleaseForegroundRights"}, |
| 73 | {12, nullptr, "RejectToChangeIntoBackground"}, | 74 | {12, nullptr, "RejectToChangeIntoBackground"}, |
| @@ -189,8 +190,8 @@ IDisplayController::IDisplayController() : ServiceFramework("IDisplayController" | |||
| 189 | {5, nullptr, "GetLastForegroundCaptureImageEx"}, | 190 | {5, nullptr, "GetLastForegroundCaptureImageEx"}, |
| 190 | {6, nullptr, "GetLastApplicationCaptureImageEx"}, | 191 | {6, nullptr, "GetLastApplicationCaptureImageEx"}, |
| 191 | {7, nullptr, "GetCallerAppletCaptureImageEx"}, | 192 | {7, nullptr, "GetCallerAppletCaptureImageEx"}, |
| 192 | {8, nullptr, "TakeScreenShotOfOwnLayer"}, // 2.0.0+ | 193 | {8, nullptr, "TakeScreenShotOfOwnLayer"}, |
| 193 | {9, nullptr, "CopyBetweenCaptureBuffers"}, // 5.0.0+ | 194 | {9, nullptr, "CopyBetweenCaptureBuffers"}, |
| 194 | {10, nullptr, "AcquireLastApplicationCaptureBuffer"}, | 195 | {10, nullptr, "AcquireLastApplicationCaptureBuffer"}, |
| 195 | {11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, | 196 | {11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, |
| 196 | {12, nullptr, "AcquireLastForegroundCaptureBuffer"}, | 197 | {12, nullptr, "AcquireLastForegroundCaptureBuffer"}, |
| @@ -200,17 +201,14 @@ IDisplayController::IDisplayController() : ServiceFramework("IDisplayController" | |||
| 200 | {16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, | 201 | {16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, |
| 201 | {17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, | 202 | {17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, |
| 202 | {18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, | 203 | {18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, |
| 203 | // 2.0.0+ | ||
| 204 | {20, nullptr, "ClearCaptureBuffer"}, | 204 | {20, nullptr, "ClearCaptureBuffer"}, |
| 205 | {21, nullptr, "ClearAppletTransitionBuffer"}, | 205 | {21, nullptr, "ClearAppletTransitionBuffer"}, |
| 206 | // 4.0.0+ | ||
| 207 | {22, nullptr, "AcquireLastApplicationCaptureSharedBuffer"}, | 206 | {22, nullptr, "AcquireLastApplicationCaptureSharedBuffer"}, |
| 208 | {23, nullptr, "ReleaseLastApplicationCaptureSharedBuffer"}, | 207 | {23, nullptr, "ReleaseLastApplicationCaptureSharedBuffer"}, |
| 209 | {24, nullptr, "AcquireLastForegroundCaptureSharedBuffer"}, | 208 | {24, nullptr, "AcquireLastForegroundCaptureSharedBuffer"}, |
| 210 | {25, nullptr, "ReleaseLastForegroundCaptureSharedBuffer"}, | 209 | {25, nullptr, "ReleaseLastForegroundCaptureSharedBuffer"}, |
| 211 | {26, nullptr, "AcquireCallerAppletCaptureSharedBuffer"}, | 210 | {26, nullptr, "AcquireCallerAppletCaptureSharedBuffer"}, |
| 212 | {27, nullptr, "ReleaseCallerAppletCaptureSharedBuffer"}, | 211 | {27, nullptr, "ReleaseCallerAppletCaptureSharedBuffer"}, |
| 213 | // 6.0.0+ | ||
| 214 | {28, nullptr, "TakeScreenShotOfOwnLayerEx"}, | 212 | {28, nullptr, "TakeScreenShotOfOwnLayerEx"}, |
| 215 | }; | 213 | }; |
| 216 | // clang-format on | 214 | // clang-format on |
| @@ -225,7 +223,7 @@ IDebugFunctions::IDebugFunctions() : ServiceFramework{"IDebugFunctions"} { | |||
| 225 | static const FunctionInfo functions[] = { | 223 | static const FunctionInfo functions[] = { |
| 226 | {0, nullptr, "NotifyMessageToHomeMenuForDebug"}, | 224 | {0, nullptr, "NotifyMessageToHomeMenuForDebug"}, |
| 227 | {1, nullptr, "OpenMainApplication"}, | 225 | {1, nullptr, "OpenMainApplication"}, |
| 228 | {10, nullptr, "EmulateButtonEvent"}, | 226 | {10, nullptr, "PerformSystemButtonPressing"}, |
| 229 | {20, nullptr, "InvalidateTransitionLayer"}, | 227 | {20, nullptr, "InvalidateTransitionLayer"}, |
| 230 | {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, | 228 | {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, |
| 231 | {40, nullptr, "GetAppletResourceUsageInfo"}, | 229 | {40, nullptr, "GetAppletResourceUsageInfo"}, |
| @@ -267,7 +265,7 @@ ISelfController::ISelfController(Core::System& system, | |||
| 267 | {16, &ISelfController::SetOutOfFocusSuspendingEnabled, "SetOutOfFocusSuspendingEnabled"}, | 265 | {16, &ISelfController::SetOutOfFocusSuspendingEnabled, "SetOutOfFocusSuspendingEnabled"}, |
| 268 | {17, nullptr, "SetControllerFirmwareUpdateSection"}, | 266 | {17, nullptr, "SetControllerFirmwareUpdateSection"}, |
| 269 | {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, | 267 | {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, |
| 270 | {19, &ISelfController::SetScreenShotImageOrientation, "SetScreenShotImageOrientation"}, | 268 | {19, &ISelfController::SetAlbumImageOrientation, "SetAlbumImageOrientation"}, |
| 271 | {20, nullptr, "SetDesirableKeyboardLayout"}, | 269 | {20, nullptr, "SetDesirableKeyboardLayout"}, |
| 272 | {40, &ISelfController::CreateManagedDisplayLayer, "CreateManagedDisplayLayer"}, | 270 | {40, &ISelfController::CreateManagedDisplayLayer, "CreateManagedDisplayLayer"}, |
| 273 | {41, nullptr, "IsSystemBufferSharingEnabled"}, | 271 | {41, nullptr, "IsSystemBufferSharingEnabled"}, |
| @@ -443,7 +441,7 @@ void ISelfController::SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& | |||
| 443 | rb.Push(RESULT_SUCCESS); | 441 | rb.Push(RESULT_SUCCESS); |
| 444 | } | 442 | } |
| 445 | 443 | ||
| 446 | void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { | 444 | void ISelfController::SetAlbumImageOrientation(Kernel::HLERequestContext& ctx) { |
| 447 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 445 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| 448 | 446 | ||
| 449 | IPC::ResponseBuilder rb{ctx, 2}; | 447 | IPC::ResponseBuilder rb{ctx, 2}; |
| @@ -607,6 +605,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system, | |||
| 607 | {20, nullptr, "PushToGeneralChannel"}, | 605 | {20, nullptr, "PushToGeneralChannel"}, |
| 608 | {30, nullptr, "GetHomeButtonReaderLockAccessor"}, | 606 | {30, nullptr, "GetHomeButtonReaderLockAccessor"}, |
| 609 | {31, nullptr, "GetReaderLockAccessorEx"}, | 607 | {31, nullptr, "GetReaderLockAccessorEx"}, |
| 608 | {32, nullptr, "GetWriterLockAccessorEx"}, | ||
| 610 | {40, nullptr, "GetCradleFwVersion"}, | 609 | {40, nullptr, "GetCradleFwVersion"}, |
| 611 | {50, &ICommonStateGetter::IsVrModeEnabled, "IsVrModeEnabled"}, | 610 | {50, &ICommonStateGetter::IsVrModeEnabled, "IsVrModeEnabled"}, |
| 612 | {51, &ICommonStateGetter::SetVrModeEnabled, "SetVrModeEnabled"}, | 611 | {51, &ICommonStateGetter::SetVrModeEnabled, "SetVrModeEnabled"}, |
| @@ -1132,6 +1131,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) | |||
| 1132 | {24, nullptr, "GetLaunchStorageInfoForDebug"}, | 1131 | {24, nullptr, "GetLaunchStorageInfoForDebug"}, |
| 1133 | {25, &IApplicationFunctions::ExtendSaveData, "ExtendSaveData"}, | 1132 | {25, &IApplicationFunctions::ExtendSaveData, "ExtendSaveData"}, |
| 1134 | {26, &IApplicationFunctions::GetSaveDataSize, "GetSaveDataSize"}, | 1133 | {26, &IApplicationFunctions::GetSaveDataSize, "GetSaveDataSize"}, |
| 1134 | {27, nullptr, "CreateCacheStorage"}, | ||
| 1135 | {30, &IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed, "BeginBlockingHomeButtonShortAndLongPressed"}, | 1135 | {30, &IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed, "BeginBlockingHomeButtonShortAndLongPressed"}, |
| 1136 | {31, &IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed, "EndBlockingHomeButtonShortAndLongPressed"}, | 1136 | {31, &IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed, "EndBlockingHomeButtonShortAndLongPressed"}, |
| 1137 | {32, &IApplicationFunctions::BeginBlockingHomeButton, "BeginBlockingHomeButton"}, | 1137 | {32, &IApplicationFunctions::BeginBlockingHomeButton, "BeginBlockingHomeButton"}, |
| @@ -1157,6 +1157,8 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) | |||
| 1157 | {120, nullptr, "ExecuteProgram"}, | 1157 | {120, nullptr, "ExecuteProgram"}, |
| 1158 | {121, nullptr, "ClearUserChannel"}, | 1158 | {121, nullptr, "ClearUserChannel"}, |
| 1159 | {122, nullptr, "UnpopToUserChannel"}, | 1159 | {122, nullptr, "UnpopToUserChannel"}, |
| 1160 | {123, nullptr, "GetPreviousProgramIndex"}, | ||
| 1161 | {124, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, | ||
| 1160 | {130, &IApplicationFunctions::GetGpuErrorDetectedSystemEvent, "GetGpuErrorDetectedSystemEvent"}, | 1162 | {130, &IApplicationFunctions::GetGpuErrorDetectedSystemEvent, "GetGpuErrorDetectedSystemEvent"}, |
| 1161 | {140, &IApplicationFunctions::GetFriendInvitationStorageChannelEvent, "GetFriendInvitationStorageChannelEvent"}, | 1163 | {140, &IApplicationFunctions::GetFriendInvitationStorageChannelEvent, "GetFriendInvitationStorageChannelEvent"}, |
| 1162 | {141, nullptr, "TryPopFromFriendInvitationStorageChannel"}, | 1164 | {141, nullptr, "TryPopFromFriendInvitationStorageChannel"}, |
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 469f7f814..2f69466ec 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -138,7 +138,7 @@ private: | |||
| 138 | void SetFocusHandlingMode(Kernel::HLERequestContext& ctx); | 138 | void SetFocusHandlingMode(Kernel::HLERequestContext& ctx); |
| 139 | void SetRestartMessageEnabled(Kernel::HLERequestContext& ctx); | 139 | void SetRestartMessageEnabled(Kernel::HLERequestContext& ctx); |
| 140 | void SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx); | 140 | void SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx); |
| 141 | void SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx); | 141 | void SetAlbumImageOrientation(Kernel::HLERequestContext& ctx); |
| 142 | void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx); | 142 | void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx); |
| 143 | void SetHandlesRequestToDisplay(Kernel::HLERequestContext& ctx); | 143 | void SetHandlesRequestToDisplay(Kernel::HLERequestContext& ctx); |
| 144 | void SetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); | 144 | void SetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); |
diff --git a/src/core/hle/service/am/applets/software_keyboard.cpp b/src/core/hle/service/am/applets/software_keyboard.cpp index 54e63c138..fbe3686ae 100644 --- a/src/core/hle/service/am/applets/software_keyboard.cpp +++ b/src/core/hle/service/am/applets/software_keyboard.cpp | |||
| @@ -30,7 +30,7 @@ static Core::Frontend::SoftwareKeyboardParameters ConvertToFrontendParameters( | |||
| 30 | config.sub_text.size()); | 30 | config.sub_text.size()); |
| 31 | params.guide_text = Common::UTF16StringFromFixedZeroTerminatedBuffer(config.guide_text.data(), | 31 | params.guide_text = Common::UTF16StringFromFixedZeroTerminatedBuffer(config.guide_text.data(), |
| 32 | config.guide_text.size()); | 32 | config.guide_text.size()); |
| 33 | params.initial_text = initial_text; | 33 | params.initial_text = std::move(initial_text); |
| 34 | params.max_length = config.length_limit == 0 ? DEFAULT_MAX_LENGTH : config.length_limit; | 34 | params.max_length = config.length_limit == 0 ? DEFAULT_MAX_LENGTH : config.length_limit; |
| 35 | params.password = static_cast<bool>(config.is_password); | 35 | params.password = static_cast<bool>(config.is_password); |
| 36 | params.cursor_at_beginning = static_cast<bool>(config.initial_cursor_position); | 36 | params.cursor_at_beginning = static_cast<bool>(config.initial_cursor_position); |
| @@ -60,7 +60,7 @@ void SoftwareKeyboard::Initialize() { | |||
| 60 | std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig)); | 60 | std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig)); |
| 61 | 61 | ||
| 62 | const auto work_buffer_storage = broker.PopNormalDataToApplet(); | 62 | const auto work_buffer_storage = broker.PopNormalDataToApplet(); |
| 63 | ASSERT(work_buffer_storage != nullptr); | 63 | ASSERT_OR_EXECUTE(work_buffer_storage != nullptr, { return; }); |
| 64 | const auto& work_buffer = work_buffer_storage->GetData(); | 64 | const auto& work_buffer = work_buffer_storage->GetData(); |
| 65 | 65 | ||
| 66 | if (config.initial_string_size == 0) | 66 | if (config.initial_string_size == 0) |
| @@ -109,7 +109,7 @@ void SoftwareKeyboard::Execute() { | |||
| 109 | 109 | ||
| 110 | const auto parameters = ConvertToFrontendParameters(config, initial_text); | 110 | const auto parameters = ConvertToFrontendParameters(config, initial_text); |
| 111 | 111 | ||
| 112 | frontend.RequestText([this](std::optional<std::u16string> text) { WriteText(text); }, | 112 | frontend.RequestText([this](std::optional<std::u16string> text) { WriteText(std::move(text)); }, |
| 113 | parameters); | 113 | parameters); |
| 114 | } | 114 | } |
| 115 | 115 | ||
diff --git a/src/core/hle/service/am/spsm.cpp b/src/core/hle/service/am/spsm.cpp index 003ee8667..f27729ce7 100644 --- a/src/core/hle/service/am/spsm.cpp +++ b/src/core/hle/service/am/spsm.cpp | |||
| @@ -10,17 +10,17 @@ SPSM::SPSM() : ServiceFramework{"spsm"} { | |||
| 10 | // clang-format off | 10 | // clang-format off |
| 11 | static const FunctionInfo functions[] = { | 11 | static const FunctionInfo functions[] = { |
| 12 | {0, nullptr, "GetState"}, | 12 | {0, nullptr, "GetState"}, |
| 13 | {1, nullptr, "SleepSystemAndWaitAwake"}, | 13 | {1, nullptr, "EnterSleep"}, |
| 14 | {2, nullptr, "Unknown1"}, | 14 | {2, nullptr, "GetLastWakeReason"}, |
| 15 | {3, nullptr, "Unknown2"}, | 15 | {3, nullptr, "Shutdown"}, |
| 16 | {4, nullptr, "GetNotificationMessageEventHandle"}, | 16 | {4, nullptr, "GetNotificationMessageEventHandle"}, |
| 17 | {5, nullptr, "Unknown3"}, | 17 | {5, nullptr, "ReceiveNotificationMessage"}, |
| 18 | {6, nullptr, "Unknown4"}, | 18 | {6, nullptr, "AnalyzeLogForLastSleepWakeSequence"}, |
| 19 | {7, nullptr, "Unknown5"}, | 19 | {7, nullptr, "ResetEventLog"}, |
| 20 | {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, | 20 | {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, |
| 21 | {9, nullptr, "ChangeHomeButtonLongPressingTime"}, | 21 | {9, nullptr, "ChangeHomeButtonLongPressingTime"}, |
| 22 | {10, nullptr, "Unknown6"}, | 22 | {10, nullptr, "PutErrorState"}, |
| 23 | {11, nullptr, "Unknown7"}, | 23 | {11, nullptr, "InvalidateCurrentHomeButtonPressing"}, |
| 24 | }; | 24 | }; |
| 25 | // clang-format on | 25 | // clang-format on |
| 26 | 26 | ||
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 4227a4adf..8e79f707b 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp | |||
| @@ -60,6 +60,7 @@ AOC_U::AOC_U(Core::System& system) | |||
| 60 | {6, nullptr, "PrepareAddOnContentByApplicationId"}, | 60 | {6, nullptr, "PrepareAddOnContentByApplicationId"}, |
| 61 | {7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"}, | 61 | {7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"}, |
| 62 | {8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"}, | 62 | {8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"}, |
| 63 | {9, nullptr, "GetAddOnContentLostErrorCode"}, | ||
| 63 | {100, nullptr, "CreateEcPurchasedEventManager"}, | 64 | {100, nullptr, "CreateEcPurchasedEventManager"}, |
| 64 | {101, nullptr, "CreatePermanentEcPurchasedEventManager"}, | 65 | {101, nullptr, "CreatePermanentEcPurchasedEventManager"}, |
| 65 | }; | 66 | }; |
diff --git a/src/core/hle/service/bcat/bcat.cpp b/src/core/hle/service/bcat/bcat.cpp index 8bb2528c9..b31766212 100644 --- a/src/core/hle/service/bcat/bcat.cpp +++ b/src/core/hle/service/bcat/bcat.cpp | |||
| @@ -14,6 +14,8 @@ BCAT::BCAT(Core::System& system, std::shared_ptr<Module> module, | |||
| 14 | {0, &BCAT::CreateBcatService, "CreateBcatService"}, | 14 | {0, &BCAT::CreateBcatService, "CreateBcatService"}, |
| 15 | {1, &BCAT::CreateDeliveryCacheStorageService, "CreateDeliveryCacheStorageService"}, | 15 | {1, &BCAT::CreateDeliveryCacheStorageService, "CreateDeliveryCacheStorageService"}, |
| 16 | {2, &BCAT::CreateDeliveryCacheStorageServiceWithApplicationId, "CreateDeliveryCacheStorageServiceWithApplicationId"}, | 16 | {2, &BCAT::CreateDeliveryCacheStorageServiceWithApplicationId, "CreateDeliveryCacheStorageServiceWithApplicationId"}, |
| 17 | {3, nullptr, "CreateDeliveryCacheProgressService"}, | ||
| 18 | {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, | ||
| 17 | }; | 19 | }; |
| 18 | // clang-format on | 20 | // clang-format on |
| 19 | RegisterHandlers(functions); | 21 | RegisterHandlers(functions); |
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp index 34aba7a27..603b64d4f 100644 --- a/src/core/hle/service/bcat/module.cpp +++ b/src/core/hle/service/bcat/module.cpp | |||
| @@ -143,10 +143,13 @@ public: | |||
| 143 | {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, | 143 | {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, |
| 144 | {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, | 144 | {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, |
| 145 | {30100, &IBcatService::SetPassphrase, "SetPassphrase"}, | 145 | {30100, &IBcatService::SetPassphrase, "SetPassphrase"}, |
| 146 | {30101, nullptr, "Unknown"}, | ||
| 147 | {30102, nullptr, "Unknown2"}, | ||
| 146 | {30200, nullptr, "RegisterBackgroundDeliveryTask"}, | 148 | {30200, nullptr, "RegisterBackgroundDeliveryTask"}, |
| 147 | {30201, nullptr, "UnregisterBackgroundDeliveryTask"}, | 149 | {30201, nullptr, "UnregisterBackgroundDeliveryTask"}, |
| 148 | {30202, nullptr, "BlockDeliveryTask"}, | 150 | {30202, nullptr, "BlockDeliveryTask"}, |
| 149 | {30203, nullptr, "UnblockDeliveryTask"}, | 151 | {30203, nullptr, "UnblockDeliveryTask"}, |
| 152 | {30210, nullptr, "SetDeliveryTaskTimer"}, | ||
| 150 | {30300, nullptr, "RegisterSystemApplicationDeliveryTasks"}, | 153 | {30300, nullptr, "RegisterSystemApplicationDeliveryTasks"}, |
| 151 | {90100, nullptr, "EnumerateBackgroundDeliveryTask"}, | 154 | {90100, nullptr, "EnumerateBackgroundDeliveryTask"}, |
| 152 | {90200, nullptr, "GetDeliveryList"}, | 155 | {90200, nullptr, "GetDeliveryList"}, |
diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 1c1ecdb60..fac6b2f9c 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp | |||
| @@ -23,9 +23,14 @@ public: | |||
| 23 | {5, nullptr, "GetBoardPowerControlEvent"}, | 23 | {5, nullptr, "GetBoardPowerControlEvent"}, |
| 24 | {6, nullptr, "GetSleepButtonState"}, | 24 | {6, nullptr, "GetSleepButtonState"}, |
| 25 | {7, nullptr, "GetPowerEvent"}, | 25 | {7, nullptr, "GetPowerEvent"}, |
| 26 | {8, nullptr, "Unknown1"}, | 26 | {8, nullptr, "CreateWakeupTimer"}, |
| 27 | {9, nullptr, "Unknown2"}, | 27 | {9, nullptr, "CancelWakeupTimer"}, |
| 28 | {10, nullptr, "Unknown3"}, | 28 | {10, nullptr, "EnableWakeupTimerOnDevice"}, |
| 29 | {11, nullptr, "CreateWakeupTimerEx"}, | ||
| 30 | {12, nullptr, "GetLastEnabledWakeupTimerType"}, | ||
| 31 | {13, nullptr, "CleanAllWakeupTimers"}, | ||
| 32 | {14, nullptr, "Unknown"}, | ||
| 33 | {15, nullptr, "Unknown2"}, | ||
| 29 | }; | 34 | }; |
| 30 | // clang-format on | 35 | // clang-format on |
| 31 | 36 | ||
| @@ -38,10 +43,11 @@ public: | |||
| 38 | explicit BPC_R() : ServiceFramework{"bpc:r"} { | 43 | explicit BPC_R() : ServiceFramework{"bpc:r"} { |
| 39 | // clang-format off | 44 | // clang-format off |
| 40 | static const FunctionInfo functions[] = { | 45 | static const FunctionInfo functions[] = { |
| 41 | {0, nullptr, "GetExternalRtcValue"}, | 46 | {0, nullptr, "GetRtcTime"}, |
| 42 | {1, nullptr, "SetExternalRtcValue"}, | 47 | {1, nullptr, "SetRtcTime"}, |
| 43 | {2, nullptr, "ReadExternalRtcResetFlag"}, | 48 | {2, nullptr, "GetRtcResetDetected"}, |
| 44 | {3, nullptr, "ClearExternalRtcResetFlag"}, | 49 | {3, nullptr, "ClearRtcResetDetected"}, |
| 50 | {4, nullptr, "SetUpRtcResetOnShutdown"}, | ||
| 45 | }; | 51 | }; |
| 46 | // clang-format on | 52 | // clang-format on |
| 47 | 53 | ||
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 40a06c9fd..f311afa2f 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp | |||
| @@ -58,102 +58,103 @@ public: | |||
| 58 | {1, nullptr, "InitializeBluetooth"}, | 58 | {1, nullptr, "InitializeBluetooth"}, |
| 59 | {2, nullptr, "EnableBluetooth"}, | 59 | {2, nullptr, "EnableBluetooth"}, |
| 60 | {3, nullptr, "DisableBluetooth"}, | 60 | {3, nullptr, "DisableBluetooth"}, |
| 61 | {4, nullptr, "CleanupBluetooth"}, | 61 | {4, nullptr, "FinalizeBluetooth"}, |
| 62 | {5, nullptr, "GetAdapterProperties"}, | 62 | {5, nullptr, "GetAdapterProperties"}, |
| 63 | {6, nullptr, "GetAdapterProperty"}, | 63 | {6, nullptr, "GetAdapterProperty"}, |
| 64 | {7, nullptr, "SetAdapterProperty"}, | 64 | {7, nullptr, "SetAdapterProperty"}, |
| 65 | {8, nullptr, "StartDiscovery"}, | 65 | {8, nullptr, "StartInquiry"}, |
| 66 | {9, nullptr, "CancelDiscovery"}, | 66 | {9, nullptr, "StopInquiry"}, |
| 67 | {10, nullptr, "CreateBond"}, | 67 | {10, nullptr, "CreateBond"}, |
| 68 | {11, nullptr, "RemoveBond"}, | 68 | {11, nullptr, "RemoveBond"}, |
| 69 | {12, nullptr, "CancelBond"}, | 69 | {12, nullptr, "CancelBond"}, |
| 70 | {13, nullptr, "PinReply"}, | 70 | {13, nullptr, "RespondToPinRequest"}, |
| 71 | {14, nullptr, "SspReply"}, | 71 | {14, nullptr, "RespondToSspRequest"}, |
| 72 | {15, nullptr, "GetEventInfo"}, | 72 | {15, nullptr, "GetEventInfo"}, |
| 73 | {16, nullptr, "InitializeHid"}, | 73 | {16, nullptr, "InitializeHid"}, |
| 74 | {17, nullptr, "HidConnect"}, | 74 | {17, nullptr, "OpenHidConnection"}, |
| 75 | {18, nullptr, "HidDisconnect"}, | 75 | {18, nullptr, "CloseHidConnection"}, |
| 76 | {19, nullptr, "HidSendData"}, | 76 | {19, nullptr, "WriteHidData"}, |
| 77 | {20, nullptr, "HidSendData2"}, | 77 | {20, nullptr, "WriteHidData2"}, |
| 78 | {21, nullptr, "HidSetReport"}, | 78 | {21, nullptr, "SetHidReport"}, |
| 79 | {22, nullptr, "HidGetReport"}, | 79 | {22, nullptr, "GetHidReport"}, |
| 80 | {23, nullptr, "HidWakeController"}, | 80 | {23, nullptr, "TriggerConnection"}, |
| 81 | {24, nullptr, "HidAddPairedDevice"}, | 81 | {24, nullptr, "AddPairedDeviceInfo"}, |
| 82 | {25, nullptr, "HidGetPairedDevice"}, | 82 | {25, nullptr, "GetPairedDeviceInfo"}, |
| 83 | {26, nullptr, "CleanupHid"}, | 83 | {26, nullptr, "FinalizeHid"}, |
| 84 | {27, nullptr, "HidGetEventInfo"}, | 84 | {27, nullptr, "GetHidEventInfo"}, |
| 85 | {28, nullptr, "ExtSetTsi"}, | 85 | {28, nullptr, "SetTsi"}, |
| 86 | {29, nullptr, "ExtSetBurstMode"}, | 86 | {29, nullptr, "EnableBurstMode"}, |
| 87 | {30, nullptr, "ExtSetZeroRetran"}, | 87 | {30, nullptr, "SetZeroRetransmission"}, |
| 88 | {31, nullptr, "ExtSetMcMode"}, | 88 | {31, nullptr, "EnableMcMode"}, |
| 89 | {32, nullptr, "ExtStartLlrMode"}, | 89 | {32, nullptr, "EnableLlrScan"}, |
| 90 | {33, nullptr, "ExtExitLlrMode"}, | 90 | {33, nullptr, "DisableLlrScan"}, |
| 91 | {34, nullptr, "ExtSetRadio"}, | 91 | {34, nullptr, "EnableRadio"}, |
| 92 | {35, nullptr, "ExtSetVisibility"}, | 92 | {35, nullptr, "SetVisibility"}, |
| 93 | {36, nullptr, "ExtSetTbfcScan"}, | 93 | {36, nullptr, "EnableTbfcScan"}, |
| 94 | {37, nullptr, "RegisterHidReportEvent"}, | 94 | {37, nullptr, "RegisterHidReportEvent"}, |
| 95 | {38, nullptr, "HidGetReportEventInfo"}, | 95 | {38, nullptr, "GetHidReportEventInfo"}, |
| 96 | {39, nullptr, "GetLatestPlr"}, | 96 | {39, nullptr, "GetLatestPlr"}, |
| 97 | {40, nullptr, "ExtGetPendingConnections"}, | 97 | {40, nullptr, "GetPendingConnections"}, |
| 98 | {41, nullptr, "GetChannelMap"}, | 98 | {41, nullptr, "GetChannelMap"}, |
| 99 | {42, nullptr, "EnableBluetoothBoostSetting"}, | 99 | {42, nullptr, "EnableTxPowerBoostSetting"}, |
| 100 | {43, nullptr, "IsBluetoothBoostSettingEnabled"}, | 100 | {43, nullptr, "IsTxPowerBoostSettingEnabled"}, |
| 101 | {44, nullptr, "EnableBluetoothAfhSetting"}, | 101 | {44, nullptr, "EnableAfhSetting"}, |
| 102 | {45, nullptr, "IsBluetoothAfhSettingEnabled"}, | 102 | {45, nullptr, "IsAfhSettingEnabled"}, |
| 103 | {46, nullptr, "InitializeBluetoothLe"}, | 103 | {46, nullptr, "InitializeBle"}, |
| 104 | {47, nullptr, "EnableBluetoothLe"}, | 104 | {47, nullptr, "EnableBle"}, |
| 105 | {48, nullptr, "DisableBluetoothLe"}, | 105 | {48, nullptr, "DisableBle"}, |
| 106 | {49, nullptr, "CleanupBluetoothLe"}, | 106 | {49, nullptr, "FinalizeBle"}, |
| 107 | {50, nullptr, "SetLeVisibility"}, | 107 | {50, nullptr, "SetBleVisibility"}, |
| 108 | {51, nullptr, "SetLeConnectionParameter"}, | 108 | {51, nullptr, "SetBleConnectionParameter"}, |
| 109 | {52, nullptr, "SetLeDefaultConnectionParameter"}, | 109 | {52, nullptr, "SetBleDefaultConnectionParameter"}, |
| 110 | {53, nullptr, "SetLeAdvertiseData"}, | 110 | {53, nullptr, "SetBleAdvertiseData"}, |
| 111 | {54, nullptr, "SetLeAdvertiseParameter"}, | 111 | {54, nullptr, "SetBleAdvertiseParameter"}, |
| 112 | {55, nullptr, "StartLeScan"}, | 112 | {55, nullptr, "StartBleScan"}, |
| 113 | {56, nullptr, "StopLeScan"}, | 113 | {56, nullptr, "StopBleScan"}, |
| 114 | {57, nullptr, "AddLeScanFilterCondition"}, | 114 | {57, nullptr, "AddBleScanFilterCondition"}, |
| 115 | {58, nullptr, "DeleteLeScanFilterCondition"}, | 115 | {58, nullptr, "DeleteBleScanFilterCondition"}, |
| 116 | {59, nullptr, "DeleteLeScanFilter"}, | 116 | {59, nullptr, "DeleteBleScanFilter"}, |
| 117 | {60, nullptr, "ClearLeScanFilters"}, | 117 | {60, nullptr, "ClearBleScanFilters"}, |
| 118 | {61, nullptr, "EnableLeScanFilter"}, | 118 | {61, nullptr, "EnableBleScanFilter"}, |
| 119 | {62, nullptr, "RegisterLeClient"}, | 119 | {62, nullptr, "RegisterGattClient"}, |
| 120 | {63, nullptr, "UnregisterLeClient"}, | 120 | {63, nullptr, "UnregisterGattClient"}, |
| 121 | {64, nullptr, "UnregisterLeClientAll"}, | 121 | {64, nullptr, "UnregisterAllGattClients"}, |
| 122 | {65, nullptr, "LeClientConnect"}, | 122 | {65, nullptr, "ConnectGattServer"}, |
| 123 | {66, nullptr, "LeClientCancelConnection"}, | 123 | {66, nullptr, "CancelConnectGattServer"}, |
| 124 | {67, nullptr, "LeClientDisconnect"}, | 124 | {67, nullptr, "DisconnectGattServer"}, |
| 125 | {68, nullptr, "LeClientGetAttributes"}, | 125 | {68, nullptr, "GetGattAttribute"}, |
| 126 | {69, nullptr, "LeClientDiscoverService"}, | 126 | {69, nullptr, "GetGattService"}, |
| 127 | {70, nullptr, "LeClientConfigureMtu"}, | 127 | {70, nullptr, "ConfigureAttMtu"}, |
| 128 | {71, nullptr, "RegisterLeServer"}, | 128 | {71, nullptr, "RegisterGattServer"}, |
| 129 | {72, nullptr, "UnregisterLeServer"}, | 129 | {72, nullptr, "UnregisterGattServer"}, |
| 130 | {73, nullptr, "LeServerConnect"}, | 130 | {73, nullptr, "ConnectGattClient"}, |
| 131 | {74, nullptr, "LeServerDisconnect"}, | 131 | {74, nullptr, "DisconnectGattClient"}, |
| 132 | {75, nullptr, "CreateLeService"}, | 132 | {75, nullptr, "AddGattService"}, |
| 133 | {76, nullptr, "StartLeService"}, | 133 | {76, nullptr, "EnableGattService"}, |
| 134 | {77, nullptr, "AddLeCharacteristic"}, | 134 | {77, nullptr, "AddGattCharacteristic"}, |
| 135 | {78, nullptr, "AddLeDescriptor"}, | 135 | {78, nullptr, "AddGattDescriptor"}, |
| 136 | {79, nullptr, "GetLeCoreEventInfo"}, | 136 | {79, nullptr, "GetBleManagedEventInfo"}, |
| 137 | {80, nullptr, "LeGetFirstCharacteristic"}, | 137 | {80, nullptr, "GetGattFirstCharacteristic"}, |
| 138 | {81, nullptr, "LeGetNextCharacteristic"}, | 138 | {81, nullptr, "GetGattNextCharacteristic"}, |
| 139 | {82, nullptr, "LeGetFirstDescriptor"}, | 139 | {82, nullptr, "GetGattFirstDescriptor"}, |
| 140 | {83, nullptr, "LeGetNextDescriptor"}, | 140 | {83, nullptr, "GetGattNextDescriptor"}, |
| 141 | {84, nullptr, "RegisterLeCoreDataPath"}, | 141 | {84, nullptr, "RegisterGattManagedDataPath"}, |
| 142 | {85, nullptr, "UnregisterLeCoreDataPath"}, | 142 | {85, nullptr, "UnregisterGattManagedDataPath"}, |
| 143 | {86, nullptr, "RegisterLeHidDataPath"}, | 143 | {86, nullptr, "RegisterGattHidDataPath"}, |
| 144 | {87, nullptr, "UnregisterLeHidDataPath"}, | 144 | {87, nullptr, "UnregisterGattHidDataPath"}, |
| 145 | {88, nullptr, "RegisterLeDataPath"}, | 145 | {88, nullptr, "RegisterGattDataPath"}, |
| 146 | {89, nullptr, "UnregisterLeDataPath"}, | 146 | {89, nullptr, "UnregisterGattDataPath"}, |
| 147 | {90, nullptr, "LeClientReadCharacteristic"}, | 147 | {90, nullptr, "ReadGattCharacteristic"}, |
| 148 | {91, nullptr, "LeClientReadDescriptor"}, | 148 | {91, nullptr, "ReadGattDescriptor"}, |
| 149 | {92, nullptr, "LeClientWriteCharacteristic"}, | 149 | {92, nullptr, "WriteGattCharacteristic"}, |
| 150 | {93, nullptr, "LeClientWriteDescriptor"}, | 150 | {93, nullptr, "WriteGattDescriptor"}, |
| 151 | {94, nullptr, "LeClientRegisterNotification"}, | 151 | {94, nullptr, "RegisterGattNotification"}, |
| 152 | {95, nullptr, "LeClientDeregisterNotification"}, | 152 | {95, nullptr, "UnregisterGattNotification"}, |
| 153 | {96, nullptr, "GetLeHidEventInfo"}, | 153 | {96, nullptr, "GetLeHidEventInfo"}, |
| 154 | {97, nullptr, "RegisterBleHidEvent"}, | 154 | {97, nullptr, "RegisterBleHidEvent"}, |
| 155 | {98, nullptr, "SetLeScanParameter"}, | 155 | {98, nullptr, "SetBleScanParameter"}, |
| 156 | {256, nullptr, "GetIsManufacturingMode"}, | 156 | {99, nullptr, "MoveToSecondaryPiconet"}, |
| 157 | {256, nullptr, "IsManufacturingMode"}, | ||
| 157 | {257, nullptr, "EmulateBluetoothCrash"}, | 158 | {257, nullptr, "EmulateBluetoothCrash"}, |
| 158 | {258, nullptr, "GetBleChannelMap"}, | 159 | {258, nullptr, "GetBleChannelMap"}, |
| 159 | }; | 160 | }; |
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index 251b3c9df..0d251c6d0 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp | |||
| @@ -132,66 +132,71 @@ public: | |||
| 132 | explicit BTM() : ServiceFramework{"btm"} { | 132 | explicit BTM() : ServiceFramework{"btm"} { |
| 133 | // clang-format off | 133 | // clang-format off |
| 134 | static const FunctionInfo functions[] = { | 134 | static const FunctionInfo functions[] = { |
| 135 | {0, nullptr, "Unknown1"}, | 135 | {0, nullptr, "GetState"}, |
| 136 | {1, nullptr, "Unknown2"}, | 136 | {1, nullptr, "GetHostDeviceProperty"}, |
| 137 | {2, nullptr, "RegisterSystemEventForConnectedDeviceCondition"}, | 137 | {2, nullptr, "AcquireDeviceConditionEvent"}, |
| 138 | {3, nullptr, "Unknown3"}, | 138 | {3, nullptr, "GetDeviceCondition"}, |
| 139 | {4, nullptr, "Unknown4"}, | 139 | {4, nullptr, "SetBurstMode"}, |
| 140 | {5, nullptr, "Unknown5"}, | 140 | {5, nullptr, "SetSlotMode"}, |
| 141 | {6, nullptr, "Unknown6"}, | 141 | {6, nullptr, "SetBluetoothMode"}, |
| 142 | {7, nullptr, "Unknown7"}, | 142 | {7, nullptr, "SetWlanMode"}, |
| 143 | {8, nullptr, "RegisterSystemEventForRegisteredDeviceInfo"}, | 143 | {8, nullptr, "AcquireDeviceInfoEvent"}, |
| 144 | {9, nullptr, "Unknown8"}, | 144 | {9, nullptr, "GetDeviceInfo"}, |
| 145 | {10, nullptr, "Unknown9"}, | 145 | {10, nullptr, "AddDeviceInfo"}, |
| 146 | {11, nullptr, "Unknown10"}, | 146 | {11, nullptr, "RemoveDeviceInfo"}, |
| 147 | {12, nullptr, "Unknown11"}, | 147 | {12, nullptr, "IncreaseDeviceInfoOrder"}, |
| 148 | {13, nullptr, "Unknown12"}, | 148 | {13, nullptr, "LlrNotify"}, |
| 149 | {14, nullptr, "EnableRadio"}, | 149 | {14, nullptr, "EnableRadio"}, |
| 150 | {15, nullptr, "DisableRadio"}, | 150 | {15, nullptr, "DisableRadio"}, |
| 151 | {16, nullptr, "Unknown13"}, | 151 | {16, nullptr, "HidDisconnect"}, |
| 152 | {17, nullptr, "Unknown14"}, | 152 | {17, nullptr, "HidSetRetransmissionMode"}, |
| 153 | {18, nullptr, "Unknown15"}, | 153 | {18, nullptr, "AcquireAwakeReqEvent"}, |
| 154 | {19, nullptr, "Unknown16"}, | 154 | {19, nullptr, "AcquireLlrStateEvent"}, |
| 155 | {20, nullptr, "Unknown17"}, | 155 | {20, nullptr, "IsLlrStarted"}, |
| 156 | {21, nullptr, "Unknown18"}, | 156 | {21, nullptr, "EnableSlotSaving"}, |
| 157 | {22, nullptr, "Unknown19"}, | 157 | {22, nullptr, "ProtectDeviceInfo"}, |
| 158 | {23, nullptr, "Unknown20"}, | 158 | {23, nullptr, "AcquireBleScanEvent"}, |
| 159 | {24, nullptr, "Unknown21"}, | 159 | {24, nullptr, "GetBleScanParameterGeneral"}, |
| 160 | {25, nullptr, "Unknown22"}, | 160 | {25, nullptr, "GetBleScanParameterSmartDevice"}, |
| 161 | {26, nullptr, "Unknown23"}, | 161 | {26, nullptr, "StartBleScanForGeneral"}, |
| 162 | {27, nullptr, "Unknown24"}, | 162 | {27, nullptr, "StopBleScanForGeneral"}, |
| 163 | {28, nullptr, "Unknown25"}, | 163 | {28, nullptr, "GetBleScanResultsForGeneral"}, |
| 164 | {29, nullptr, "Unknown26"}, | 164 | {29, nullptr, "StartBleScanForPairedDevice"}, |
| 165 | {30, nullptr, "Unknown27"}, | 165 | {30, nullptr, "StopBleScanForPairedDevice"}, |
| 166 | {31, nullptr, "Unknown28"}, | 166 | {31, nullptr, "StartBleScanForSmartDevice"}, |
| 167 | {32, nullptr, "Unknown29"}, | 167 | {32, nullptr, "StopBleScanForSmartDevice"}, |
| 168 | {33, nullptr, "Unknown30"}, | 168 | {33, nullptr, "GetBleScanResultsForSmartDevice"}, |
| 169 | {34, nullptr, "Unknown31"}, | 169 | {34, nullptr, "AcquireBleConnectionEvent"}, |
| 170 | {35, nullptr, "Unknown32"}, | 170 | {35, nullptr, "BleConnect"}, |
| 171 | {36, nullptr, "Unknown33"}, | 171 | {36, nullptr, "BleOverrideConnection"}, |
| 172 | {37, nullptr, "Unknown34"}, | 172 | {37, nullptr, "BleDisconnect"}, |
| 173 | {38, nullptr, "Unknown35"}, | 173 | {38, nullptr, "BleGetConnectionState"}, |
| 174 | {39, nullptr, "Unknown36"}, | 174 | {39, nullptr, "BleGetGattClientConditionList"}, |
| 175 | {40, nullptr, "Unknown37"}, | 175 | {40, nullptr, "AcquireBlePairingEvent"}, |
| 176 | {41, nullptr, "Unknown38"}, | 176 | {41, nullptr, "BlePairDevice"}, |
| 177 | {42, nullptr, "Unknown39"}, | 177 | {42, nullptr, "BleUnpairDeviceOnBoth"}, |
| 178 | {43, nullptr, "Unknown40"}, | 178 | {43, nullptr, "BleUnpairDevice"}, |
| 179 | {44, nullptr, "Unknown41"}, | 179 | {44, nullptr, "BleGetPairedAddresses"}, |
| 180 | {45, nullptr, "Unknown42"}, | 180 | {45, nullptr, "AcquireBleServiceDiscoveryEvent"}, |
| 181 | {46, nullptr, "Unknown43"}, | 181 | {46, nullptr, "GetGattServices"}, |
| 182 | {47, nullptr, "Unknown44"}, | 182 | {47, nullptr, "GetGattService"}, |
| 183 | {48, nullptr, "Unknown45"}, | 183 | {48, nullptr, "GetGattIncludedServices"}, |
| 184 | {49, nullptr, "Unknown46"}, | 184 | {49, nullptr, "GetBelongingService"}, |
| 185 | {50, nullptr, "Unknown47"}, | 185 | {50, nullptr, "GetGattCharacteristics"}, |
| 186 | {51, nullptr, "Unknown48"}, | 186 | {51, nullptr, "GetGattDescriptors"}, |
| 187 | {52, nullptr, "Unknown49"}, | 187 | {52, nullptr, "AcquireBleMtuConfigEvent"}, |
| 188 | {53, nullptr, "Unknown50"}, | 188 | {53, nullptr, "ConfigureBleMtu"}, |
| 189 | {54, nullptr, "Unknown51"}, | 189 | {54, nullptr, "GetBleMtu"}, |
| 190 | {55, nullptr, "Unknown52"}, | 190 | {55, nullptr, "RegisterBleGattDataPath"}, |
| 191 | {56, nullptr, "Unknown53"}, | 191 | {56, nullptr, "UnregisterBleGattDataPath"}, |
| 192 | {57, nullptr, "Unknown54"}, | 192 | {57, nullptr, "RegisterAppletResourceUserId"}, |
| 193 | {58, nullptr, "Unknown55"}, | 193 | {58, nullptr, "UnregisterAppletResourceUserId"}, |
| 194 | {59, nullptr, "Unknown56"}, | 194 | {59, nullptr, "SetAppletResourceUserId"}, |
| 195 | {60, nullptr, "Unknown60"}, | ||
| 196 | {61, nullptr, "Unknown61"}, | ||
| 197 | {62, nullptr, "Unknown62"}, | ||
| 198 | {63, nullptr, "Unknown63"}, | ||
| 199 | {64, nullptr, "Unknown64"}, | ||
| 195 | }; | 200 | }; |
| 196 | // clang-format on | 201 | // clang-format on |
| 197 | 202 | ||
| @@ -204,19 +209,19 @@ public: | |||
| 204 | explicit BTM_DBG() : ServiceFramework{"btm:dbg"} { | 209 | explicit BTM_DBG() : ServiceFramework{"btm:dbg"} { |
| 205 | // clang-format off | 210 | // clang-format off |
| 206 | static const FunctionInfo functions[] = { | 211 | static const FunctionInfo functions[] = { |
| 207 | {0, nullptr, "RegisterSystemEventForDiscovery"}, | 212 | {0, nullptr, "AcquireDiscoveryEvent"}, |
| 208 | {1, nullptr, "Unknown1"}, | 213 | {1, nullptr, "StartDiscovery"}, |
| 209 | {2, nullptr, "Unknown2"}, | 214 | {2, nullptr, "CancelDiscovery"}, |
| 210 | {3, nullptr, "Unknown3"}, | 215 | {3, nullptr, "GetDeviceProperty"}, |
| 211 | {4, nullptr, "Unknown4"}, | 216 | {4, nullptr, "CreateBond"}, |
| 212 | {5, nullptr, "Unknown5"}, | 217 | {5, nullptr, "CancelBond"}, |
| 213 | {6, nullptr, "Unknown6"}, | 218 | {6, nullptr, "SetTsiMode"}, |
| 214 | {7, nullptr, "Unknown7"}, | 219 | {7, nullptr, "GeneralTest"}, |
| 215 | {8, nullptr, "Unknown8"}, | 220 | {8, nullptr, "HidConnect"}, |
| 216 | {9, nullptr, "Unknown9"}, | 221 | {9, nullptr, "GeneralGet"}, |
| 217 | {10, nullptr, "Unknown10"}, | 222 | {10, nullptr, "GetGattClientDisconnectionReason"}, |
| 218 | {11, nullptr, "Unknown11"}, | 223 | {11, nullptr, "GetBleConnectionParameter"}, |
| 219 | {12, nullptr, "Unknown11"}, | 224 | {12, nullptr, "GetBleConnectionParameterRequest"}, |
| 220 | }; | 225 | }; |
| 221 | // clang-format on | 226 | // clang-format on |
| 222 | 227 | ||
diff --git a/src/core/hle/service/caps/caps.cpp b/src/core/hle/service/caps/caps.cpp index 26c8a7081..ba5749b84 100644 --- a/src/core/hle/service/caps/caps.cpp +++ b/src/core/hle/service/caps/caps.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | 1 | // Copyright 2018 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps.h b/src/core/hle/service/caps/caps.h index fc70a4c27..b8c67b6e2 100644 --- a/src/core/hle/service/caps/caps.h +++ b/src/core/hle/service/caps/caps.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2018 yuzu emulator team | 1 | // Copyright 2018 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| @@ -12,73 +12,79 @@ class ServiceManager; | |||
| 12 | 12 | ||
| 13 | namespace Service::Capture { | 13 | namespace Service::Capture { |
| 14 | 14 | ||
| 15 | enum AlbumImageOrientation { | 15 | enum class AlbumImageOrientation { |
| 16 | Orientation0 = 0, | 16 | Orientation0 = 0, |
| 17 | Orientation1 = 1, | 17 | Orientation1 = 1, |
| 18 | Orientation2 = 2, | 18 | Orientation2 = 2, |
| 19 | Orientation3 = 3, | 19 | Orientation3 = 3, |
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | enum AlbumReportOption { | 22 | enum class AlbumReportOption { |
| 23 | Disable = 0, | 23 | Disable = 0, |
| 24 | Enable = 1, | 24 | Enable = 1, |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | enum ContentType : u8 { | 27 | enum class ContentType : u8 { |
| 28 | Screenshot = 0, | 28 | Screenshot = 0, |
| 29 | Movie = 1, | 29 | Movie = 1, |
| 30 | ExtraMovie = 3, | 30 | ExtraMovie = 3, |
| 31 | }; | 31 | }; |
| 32 | 32 | ||
| 33 | enum AlbumStorage : u8 { | 33 | enum class AlbumStorage : u8 { |
| 34 | NAND = 0, | 34 | NAND = 0, |
| 35 | SD = 1, | 35 | SD = 1, |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | struct AlbumFileDateTime { | 38 | struct AlbumFileDateTime { |
| 39 | u16 year; | 39 | s16 year{}; |
| 40 | u8 month; | 40 | s8 month{}; |
| 41 | u8 day; | 41 | s8 day{}; |
| 42 | u8 hour; | 42 | s8 hour{}; |
| 43 | u8 minute; | 43 | s8 minute{}; |
| 44 | u8 second; | 44 | s8 second{}; |
| 45 | u8 uid; | 45 | s8 uid{}; |
| 46 | }; | 46 | }; |
| 47 | static_assert(sizeof(AlbumFileDateTime) == 0x8, "AlbumFileDateTime has incorrect size."); | ||
| 47 | 48 | ||
| 48 | struct AlbumEntry { | 49 | struct AlbumEntry { |
| 49 | u64 size; | 50 | u64 size{}; |
| 50 | u64 application_id; | 51 | u64 application_id{}; |
| 51 | AlbumFileDateTime datetime; | 52 | AlbumFileDateTime datetime{}; |
| 52 | AlbumStorage storage; | 53 | AlbumStorage storage{}; |
| 53 | ContentType content; | 54 | ContentType content{}; |
| 54 | u8 padding[6]; | 55 | INSERT_PADDING_BYTES(6); |
| 55 | }; | 56 | }; |
| 57 | static_assert(sizeof(AlbumEntry) == 0x20, "AlbumEntry has incorrect size."); | ||
| 56 | 58 | ||
| 57 | struct AlbumFileEntry { | 59 | struct AlbumFileEntry { |
| 58 | u64 size; | 60 | u64 size{}; // Size of the entry |
| 59 | u64 hash; | 61 | u64 hash{}; // AES256 with hardcoded key over AlbumEntry |
| 60 | AlbumFileDateTime datetime; | 62 | AlbumFileDateTime datetime{}; |
| 61 | AlbumStorage storage; | 63 | AlbumStorage storage{}; |
| 62 | ContentType content; | 64 | ContentType content{}; |
| 63 | u8 padding[5]; | 65 | INSERT_PADDING_BYTES(5); |
| 64 | u8 unknown; | 66 | u8 unknown{1}; // Set to 1 on official SW |
| 65 | }; | 67 | }; |
| 68 | static_assert(sizeof(AlbumFileEntry) == 0x20, "AlbumFileEntry has incorrect size."); | ||
| 66 | 69 | ||
| 67 | struct ApplicationAlbumEntry { | 70 | struct ApplicationAlbumEntry { |
| 68 | u64 size; | 71 | u64 size{}; // Size of the entry |
| 69 | u64 hash; | 72 | u64 hash{}; // AES256 with hardcoded key over AlbumEntry |
| 70 | AlbumFileDateTime datetime; | 73 | AlbumFileDateTime datetime{}; |
| 71 | AlbumStorage storage; | 74 | AlbumStorage storage{}; |
| 72 | ContentType content; | 75 | ContentType content{}; |
| 73 | u8 padding[5]; | 76 | INSERT_PADDING_BYTES(5); |
| 74 | u8 unknown; | 77 | u8 unknown{1}; // Set to 1 on official SW |
| 75 | }; | 78 | }; |
| 79 | static_assert(sizeof(ApplicationAlbumEntry) == 0x20, "ApplicationAlbumEntry has incorrect size."); | ||
| 76 | 80 | ||
| 77 | struct ApplicationAlbumFileEntry { | 81 | struct ApplicationAlbumFileEntry { |
| 78 | ApplicationAlbumEntry entry; | 82 | ApplicationAlbumEntry entry{}; |
| 79 | AlbumFileDateTime datetime; | 83 | AlbumFileDateTime datetime{}; |
| 80 | u64 unknown; | 84 | u64 unknown{}; |
| 81 | }; | 85 | }; |
| 86 | static_assert(sizeof(ApplicationAlbumFileEntry) == 0x30, | ||
| 87 | "ApplicationAlbumFileEntry has incorrect size."); | ||
| 82 | 88 | ||
| 83 | /// Registers all Capture services with the specified service manager. | 89 | /// Registers all Capture services with the specified service manager. |
| 84 | void InstallInterfaces(SM::ServiceManager& sm); | 90 | void InstallInterfaces(SM::ServiceManager& sm); |
diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp index 88a3fdc05..a0a3b2ae3 100644 --- a/src/core/hle/service/caps/caps_a.cpp +++ b/src/core/hle/service/caps/caps_a.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_a.h b/src/core/hle/service/caps/caps_a.h index 8de832491..cb93aad5b 100644 --- a/src/core/hle/service/caps/caps_a.h +++ b/src/core/hle/service/caps/caps_a.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp index ea6452ffa..ab17a187e 100644 --- a/src/core/hle/service/caps/caps_c.cpp +++ b/src/core/hle/service/caps/caps_c.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_c.h b/src/core/hle/service/caps/caps_c.h index d07cdb441..a9d028689 100644 --- a/src/core/hle/service/caps/caps_c.h +++ b/src/core/hle/service/caps/caps_c.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp index d01a8a58e..822ee96c8 100644 --- a/src/core/hle/service/caps/caps_sc.cpp +++ b/src/core/hle/service/caps/caps_sc.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_sc.h b/src/core/hle/service/caps/caps_sc.h index 9ba372f7a..ac3e929ca 100644 --- a/src/core/hle/service/caps/caps_sc.h +++ b/src/core/hle/service/caps/caps_sc.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp index eaa3a7494..24dc716e7 100644 --- a/src/core/hle/service/caps/caps_ss.cpp +++ b/src/core/hle/service/caps/caps_ss.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_ss.h b/src/core/hle/service/caps/caps_ss.h index e258a6925..450686e4f 100644 --- a/src/core/hle/service/caps/caps_ss.h +++ b/src/core/hle/service/caps/caps_ss.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index e8b0698e8..fffb2ecf9 100644 --- a/src/core/hle/service/caps/caps_su.cpp +++ b/src/core/hle/service/caps/caps_su.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_su.h b/src/core/hle/service/caps/caps_su.h index c494d7c84..62c9603a9 100644 --- a/src/core/hle/service/caps/caps_su.h +++ b/src/core/hle/service/caps/caps_su.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp index 78bab6ed8..f36d8de2d 100644 --- a/src/core/hle/service/caps/caps_u.cpp +++ b/src/core/hle/service/caps/caps_u.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| @@ -58,19 +58,25 @@ void CAPS_U::GetAlbumContentsFileListForApplication(Kernel::HLERequestContext& c | |||
| 58 | // u8 ContentType, two s64s, and an u64 AppletResourceUserId. Returns an output u64 for total | 58 | // u8 ContentType, two s64s, and an u64 AppletResourceUserId. Returns an output u64 for total |
| 59 | // output entries (which is copied to a s32 by official SW). | 59 | // output entries (which is copied to a s32 by official SW). |
| 60 | IPC::RequestParser rp{ctx}; | 60 | IPC::RequestParser rp{ctx}; |
| 61 | [[maybe_unused]] const auto application_album_file_entries = rp.PopRaw<std::array<u8, 0x30>>(); | 61 | const auto pid{rp.Pop<s32>()}; |
| 62 | const auto pid = rp.Pop<s32>(); | 62 | const auto content_type{rp.PopEnum<ContentType>()}; |
| 63 | const auto content_type = rp.PopRaw<ContentType>(); | 63 | const auto start_posix_time{rp.Pop<s64>()}; |
| 64 | [[maybe_unused]] const auto start_datetime = rp.PopRaw<AlbumFileDateTime>(); | 64 | const auto end_posix_time{rp.Pop<s64>()}; |
| 65 | [[maybe_unused]] const auto end_datetime = rp.PopRaw<AlbumFileDateTime>(); | 65 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 66 | const auto applet_resource_user_id = rp.Pop<u64>(); | 66 | |
| 67 | // TODO: Update this when we implement the album. | ||
| 68 | // Currently we do not have a method of accessing album entries, set this to 0 for now. | ||
| 69 | constexpr s32 total_entries{0}; | ||
| 70 | |||
| 67 | LOG_WARNING(Service_Capture, | 71 | LOG_WARNING(Service_Capture, |
| 68 | "(STUBBED) called. pid={}, content_type={}, applet_resource_user_id={}", pid, | 72 | "(STUBBED) called. pid={}, content_type={}, start_posix_time={}, " |
| 69 | content_type, applet_resource_user_id); | 73 | "end_posix_time={}, applet_resource_user_id={}, total_entries={}", |
| 74 | pid, content_type, start_posix_time, end_posix_time, applet_resource_user_id, | ||
| 75 | total_entries); | ||
| 70 | 76 | ||
| 71 | IPC::ResponseBuilder rb{ctx, 3}; | 77 | IPC::ResponseBuilder rb{ctx, 3}; |
| 72 | rb.Push(RESULT_SUCCESS); | 78 | rb.Push(RESULT_SUCCESS); |
| 73 | rb.Push<s32>(0); | 79 | rb.Push(total_entries); |
| 74 | } | 80 | } |
| 75 | 81 | ||
| 76 | } // namespace Service::Capture | 82 | } // namespace Service::Capture |
diff --git a/src/core/hle/service/caps/caps_u.h b/src/core/hle/service/caps/caps_u.h index e6e0716ff..689364de4 100644 --- a/src/core/hle/service/caps/caps_u.h +++ b/src/core/hle/service/caps/caps_u.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2020 yuzu emulator team | 1 | // Copyright 2020 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index f8e9df4b1..9365f27e1 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp | |||
| @@ -27,8 +27,8 @@ public: | |||
| 27 | {8, &ETicket::GetTitleKey, "GetTitleKey"}, | 27 | {8, &ETicket::GetTitleKey, "GetTitleKey"}, |
| 28 | {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, | 28 | {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, |
| 29 | {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, | 29 | {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, |
| 30 | {11, &ETicket::ListCommonTicket, "ListCommonTicket"}, | 30 | {11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"}, |
| 31 | {12, &ETicket::ListPersonalizedTicket, "ListPersonalizedTicket"}, | 31 | {12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"}, |
| 32 | {13, nullptr, "ListMissingPersonalizedTicket"}, | 32 | {13, nullptr, "ListMissingPersonalizedTicket"}, |
| 33 | {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, | 33 | {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, |
| 34 | {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, | 34 | {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, |
| @@ -55,7 +55,46 @@ public: | |||
| 55 | {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, | 55 | {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, |
| 56 | {37, nullptr, "OwnTicket2"}, | 56 | {37, nullptr, "OwnTicket2"}, |
| 57 | {38, nullptr, "OwnTicket3"}, | 57 | {38, nullptr, "OwnTicket3"}, |
| 58 | {501, nullptr, "Unknown501"}, | ||
| 59 | {502, nullptr, "Unknown502"}, | ||
| 58 | {503, nullptr, "GetTitleKey"}, | 60 | {503, nullptr, "GetTitleKey"}, |
| 61 | {504, nullptr, "Unknown504"}, | ||
| 62 | {508, nullptr, "Unknown508"}, | ||
| 63 | {509, nullptr, "Unknown509"}, | ||
| 64 | {510, nullptr, "Unknown510"}, | ||
| 65 | {511, nullptr, "Unknown511"}, | ||
| 66 | {1001, nullptr, "Unknown1001"}, | ||
| 67 | {1002, nullptr, "Unknown1001"}, | ||
| 68 | {1003, nullptr, "Unknown1003"}, | ||
| 69 | {1004, nullptr, "Unknown1004"}, | ||
| 70 | {1005, nullptr, "Unknown1005"}, | ||
| 71 | {1006, nullptr, "Unknown1006"}, | ||
| 72 | {1007, nullptr, "Unknown1007"}, | ||
| 73 | {1009, nullptr, "Unknown1009"}, | ||
| 74 | {1010, nullptr, "Unknown1010"}, | ||
| 75 | {1011, nullptr, "Unknown1011"}, | ||
| 76 | {1012, nullptr, "Unknown1012"}, | ||
| 77 | {1013, nullptr, "Unknown1013"}, | ||
| 78 | {1014, nullptr, "Unknown1014"}, | ||
| 79 | {1015, nullptr, "Unknown1015"}, | ||
| 80 | {1016, nullptr, "Unknown1016"}, | ||
| 81 | {1017, nullptr, "Unknown1017"}, | ||
| 82 | {1018, nullptr, "Unknown1018"}, | ||
| 83 | {1019, nullptr, "Unknown1019"}, | ||
| 84 | {1020, nullptr, "Unknown1020"}, | ||
| 85 | {1021, nullptr, "Unknown1021"}, | ||
| 86 | {1501, nullptr, "Unknown1501"}, | ||
| 87 | {1502, nullptr, "Unknown1502"}, | ||
| 88 | {1503, nullptr, "Unknown1503"}, | ||
| 89 | {1504, nullptr, "Unknown1504"}, | ||
| 90 | {1505, nullptr, "Unknown1505"}, | ||
| 91 | {2000, nullptr, "Unknown2000"}, | ||
| 92 | {2001, nullptr, "Unknown2001"}, | ||
| 93 | {2100, nullptr, "Unknown2100"}, | ||
| 94 | {2501, nullptr, "Unknown2501"}, | ||
| 95 | {2502, nullptr, "Unknown2502"}, | ||
| 96 | {3001, nullptr, "Unknown3001"}, | ||
| 97 | {3002, nullptr, "Unknown3002"}, | ||
| 59 | }; | 98 | }; |
| 60 | // clang-format on | 99 | // clang-format on |
| 61 | RegisterHandlers(functions); | 100 | RegisterHandlers(functions); |
| @@ -147,7 +186,7 @@ private: | |||
| 147 | rb.Push<u32>(count); | 186 | rb.Push<u32>(count); |
| 148 | } | 187 | } |
| 149 | 188 | ||
| 150 | void ListCommonTicket(Kernel::HLERequestContext& ctx) { | 189 | void ListCommonTicketRightsIds(Kernel::HLERequestContext& ctx) { |
| 151 | u32 out_entries; | 190 | u32 out_entries; |
| 152 | if (keys.GetCommonTickets().empty()) | 191 | if (keys.GetCommonTickets().empty()) |
| 153 | out_entries = 0; | 192 | out_entries = 0; |
| @@ -170,7 +209,7 @@ private: | |||
| 170 | rb.Push<u32>(out_entries); | 209 | rb.Push<u32>(out_entries); |
| 171 | } | 210 | } |
| 172 | 211 | ||
| 173 | void ListPersonalizedTicket(Kernel::HLERequestContext& ctx) { | 212 | void ListPersonalizedTicketRightsIds(Kernel::HLERequestContext& ctx) { |
| 174 | u32 out_entries; | 213 | u32 out_entries; |
| 175 | if (keys.GetPersonalizedTickets().empty()) | 214 | if (keys.GetPersonalizedTickets().empty()) |
| 176 | out_entries = 0; | 215 | out_entries = 0; |
diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp index 2df30acee..0d6d244f4 100644 --- a/src/core/hle/service/eupld/eupld.cpp +++ b/src/core/hle/service/eupld/eupld.cpp | |||
| @@ -19,6 +19,7 @@ public: | |||
| 19 | {1, nullptr, "ImportCrt"}, | 19 | {1, nullptr, "ImportCrt"}, |
| 20 | {2, nullptr, "ImportPki"}, | 20 | {2, nullptr, "ImportPki"}, |
| 21 | {3, nullptr, "SetAutoUpload"}, | 21 | {3, nullptr, "SetAutoUpload"}, |
| 22 | {4, nullptr, "GetAutoUpload"}, | ||
| 22 | }; | 23 | }; |
| 23 | // clang-format on | 24 | // clang-format on |
| 24 | 25 | ||
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index 68f259b70..b7adaffc7 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp | |||
| @@ -25,9 +25,13 @@ public: | |||
| 25 | {10101, &IFriendService::GetFriendList, "GetFriendList"}, | 25 | {10101, &IFriendService::GetFriendList, "GetFriendList"}, |
| 26 | {10102, nullptr, "UpdateFriendInfo"}, | 26 | {10102, nullptr, "UpdateFriendInfo"}, |
| 27 | {10110, nullptr, "GetFriendProfileImage"}, | 27 | {10110, nullptr, "GetFriendProfileImage"}, |
| 28 | {10120, nullptr, "Unknown10120"}, | ||
| 29 | {10121, nullptr, "Unknown10121"}, | ||
| 28 | {10200, nullptr, "SendFriendRequestForApplication"}, | 30 | {10200, nullptr, "SendFriendRequestForApplication"}, |
| 29 | {10211, nullptr, "AddFacedFriendRequestForApplication"}, | 31 | {10211, nullptr, "AddFacedFriendRequestForApplication"}, |
| 30 | {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, | 32 | {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, |
| 33 | {10420, nullptr, "Unknown10420"}, | ||
| 34 | {10421, nullptr, "Unknown10421"}, | ||
| 31 | {10500, nullptr, "GetProfileList"}, | 35 | {10500, nullptr, "GetProfileList"}, |
| 32 | {10600, nullptr, "DeclareOpenOnlinePlaySession"}, | 36 | {10600, nullptr, "DeclareOpenOnlinePlaySession"}, |
| 33 | {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, | 37 | {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, |
| @@ -97,6 +101,8 @@ public: | |||
| 97 | {30900, nullptr, "SendFriendInvitation"}, | 101 | {30900, nullptr, "SendFriendInvitation"}, |
| 98 | {30910, nullptr, "ReadFriendInvitation"}, | 102 | {30910, nullptr, "ReadFriendInvitation"}, |
| 99 | {30911, nullptr, "ReadAllFriendInvitations"}, | 103 | {30911, nullptr, "ReadAllFriendInvitations"}, |
| 104 | {40100, nullptr, "Unknown40100"}, | ||
| 105 | {40400, nullptr, "Unknown40400"}, | ||
| 100 | {49900, nullptr, "DeleteNetworkServiceAccountCache"}, | 106 | {49900, nullptr, "DeleteNetworkServiceAccountCache"}, |
| 101 | }; | 107 | }; |
| 102 | // clang-format on | 108 | // clang-format on |
diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index 24910ac6c..401e0b208 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp | |||
| @@ -17,6 +17,9 @@ public: | |||
| 17 | static const FunctionInfo functions[] = { | 17 | static const FunctionInfo functions[] = { |
| 18 | {1, nullptr, "OpenContinuousRecorder"}, | 18 | {1, nullptr, "OpenContinuousRecorder"}, |
| 19 | {2, nullptr, "OpenGameMovieTrimmer"}, | 19 | {2, nullptr, "OpenGameMovieTrimmer"}, |
| 20 | {3, nullptr, "OpenOffscreenRecorder"}, | ||
| 21 | {101, nullptr, "CreateMovieMaker"}, | ||
| 22 | {9903, nullptr, "SetOffscreenRecordingMarker"} | ||
| 20 | }; | 23 | }; |
| 21 | // clang-format on | 24 | // clang-format on |
| 22 | 25 | ||
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index c55d900e2..6fbee7efa 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -566,6 +566,14 @@ void Controller_NPad::DisconnectNPad(u32 npad_id) { | |||
| 566 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; | 566 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; |
| 567 | } | 567 | } |
| 568 | 568 | ||
| 569 | void Controller_NPad::SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode) { | ||
| 570 | gyroscope_zero_drift_mode = drift_mode; | ||
| 571 | } | ||
| 572 | |||
| 573 | Controller_NPad::GyroscopeZeroDriftMode Controller_NPad::GetGyroscopeZeroDriftMode() const { | ||
| 574 | return gyroscope_zero_drift_mode; | ||
| 575 | } | ||
| 576 | |||
| 569 | void Controller_NPad::StartLRAssignmentMode() { | 577 | void Controller_NPad::StartLRAssignmentMode() { |
| 570 | // Nothing internally is used for lr assignment mode. Since we have the ability to set the | 578 | // Nothing internally is used for lr assignment mode. Since we have the ability to set the |
| 571 | // controller types from boot, it doesn't really matter about showing a selection screen | 579 | // controller types from boot, it doesn't really matter about showing a selection screen |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 931f03430..5d4c58a43 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -58,6 +58,12 @@ public: | |||
| 58 | }; | 58 | }; |
| 59 | static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size"); | 59 | static_assert(sizeof(Vibration) == 0x10, "Vibration is an invalid size"); |
| 60 | 60 | ||
| 61 | enum class GyroscopeZeroDriftMode : u32 { | ||
| 62 | Loose = 0, | ||
| 63 | Standard = 1, | ||
| 64 | Tight = 2, | ||
| 65 | }; | ||
| 66 | |||
| 61 | enum class NpadHoldType : u64 { | 67 | enum class NpadHoldType : u64 { |
| 62 | Vertical = 0, | 68 | Vertical = 0, |
| 63 | Horizontal = 1, | 69 | Horizontal = 1, |
| @@ -117,6 +123,8 @@ public: | |||
| 117 | 123 | ||
| 118 | void ConnectNPad(u32 npad_id); | 124 | void ConnectNPad(u32 npad_id); |
| 119 | void DisconnectNPad(u32 npad_id); | 125 | void DisconnectNPad(u32 npad_id); |
| 126 | void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode); | ||
| 127 | GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const; | ||
| 120 | LedPattern GetLedPattern(u32 npad_id); | 128 | LedPattern GetLedPattern(u32 npad_id); |
| 121 | void SetVibrationEnabled(bool can_vibrate); | 129 | void SetVibrationEnabled(bool can_vibrate); |
| 122 | bool IsVibrationEnabled() const; | 130 | bool IsVibrationEnabled() const; |
| @@ -324,8 +332,8 @@ private: | |||
| 324 | std::array<Kernel::EventPair, 10> styleset_changed_events; | 332 | std::array<Kernel::EventPair, 10> styleset_changed_events; |
| 325 | Vibration last_processed_vibration{}; | 333 | Vibration last_processed_vibration{}; |
| 326 | std::array<ControllerHolder, 10> connected_controllers{}; | 334 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 335 | GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard}; | ||
| 327 | bool can_controllers_vibrate{true}; | 336 | bool can_controllers_vibrate{true}; |
| 328 | |||
| 329 | std::array<ControllerPad, 10> npad_pad_states{}; | 337 | std::array<ControllerPad, 10> npad_pad_states{}; |
| 330 | bool is_in_lr_assignment_mode{false}; | 338 | bool is_in_lr_assignment_mode{false}; |
| 331 | Core::System& system; | 339 | Core::System& system; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index c84cb1483..57d5edea7 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -161,7 +161,7 @@ Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) { | |||
| 161 | {40, nullptr, "AcquireXpadIdEventHandle"}, | 161 | {40, nullptr, "AcquireXpadIdEventHandle"}, |
| 162 | {41, nullptr, "ReleaseXpadIdEventHandle"}, | 162 | {41, nullptr, "ReleaseXpadIdEventHandle"}, |
| 163 | {51, &Hid::ActivateXpad, "ActivateXpad"}, | 163 | {51, &Hid::ActivateXpad, "ActivateXpad"}, |
| 164 | {55, nullptr, "GetXpadIds"}, | 164 | {55, &Hid::GetXpadIDs, "GetXpadIds"}, |
| 165 | {56, nullptr, "ActivateJoyXpad"}, | 165 | {56, nullptr, "ActivateJoyXpad"}, |
| 166 | {58, nullptr, "GetJoyXpadLifoHandle"}, | 166 | {58, nullptr, "GetJoyXpadLifoHandle"}, |
| 167 | {59, nullptr, "GetJoyXpadIds"}, | 167 | {59, nullptr, "GetJoyXpadIds"}, |
| @@ -185,8 +185,8 @@ Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) { | |||
| 185 | {77, nullptr, "GetAccelerometerPlayMode"}, | 185 | {77, nullptr, "GetAccelerometerPlayMode"}, |
| 186 | {78, nullptr, "ResetAccelerometerPlayMode"}, | 186 | {78, nullptr, "ResetAccelerometerPlayMode"}, |
| 187 | {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"}, | 187 | {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"}, |
| 188 | {80, nullptr, "GetGyroscopeZeroDriftMode"}, | 188 | {80, &Hid::GetGyroscopeZeroDriftMode, "GetGyroscopeZeroDriftMode"}, |
| 189 | {81, nullptr, "ResetGyroscopeZeroDriftMode"}, | 189 | {81, &Hid::ResetGyroscopeZeroDriftMode, "ResetGyroscopeZeroDriftMode"}, |
| 190 | {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"}, | 190 | {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"}, |
| 191 | {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"}, | 191 | {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"}, |
| 192 | {91, &Hid::ActivateGesture, "ActivateGesture"}, | 192 | {91, &Hid::ActivateGesture, "ActivateGesture"}, |
| @@ -230,15 +230,15 @@ Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) { | |||
| 230 | {211, nullptr, "IsVibrationDeviceMounted"}, | 230 | {211, nullptr, "IsVibrationDeviceMounted"}, |
| 231 | {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"}, | 231 | {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"}, |
| 232 | {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"}, | 232 | {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"}, |
| 233 | {302, nullptr, "StopConsoleSixAxisSensor"}, | 233 | {302, &Hid::StopConsoleSixAxisSensor, "StopConsoleSixAxisSensor"}, |
| 234 | {303, nullptr, "ActivateSevenSixAxisSensor"}, | 234 | {303, &Hid::ActivateSevenSixAxisSensor, "ActivateSevenSixAxisSensor"}, |
| 235 | {304, nullptr, "StartSevenSixAxisSensor"}, | 235 | {304, &Hid::StartSevenSixAxisSensor, "StartSevenSixAxisSensor"}, |
| 236 | {305, &Hid::StopSevenSixAxisSensor, "StopSevenSixAxisSensor"}, | 236 | {305, &Hid::StopSevenSixAxisSensor, "StopSevenSixAxisSensor"}, |
| 237 | {306, &Hid::InitializeSevenSixAxisSensor, "InitializeSevenSixAxisSensor"}, | 237 | {306, &Hid::InitializeSevenSixAxisSensor, "InitializeSevenSixAxisSensor"}, |
| 238 | {307, nullptr, "FinalizeSevenSixAxisSensor"}, | 238 | {307, &Hid::FinalizeSevenSixAxisSensor, "FinalizeSevenSixAxisSensor"}, |
| 239 | {308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, | 239 | {308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, |
| 240 | {309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, | 240 | {309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, |
| 241 | {310, nullptr, "ResetSevenSixAxisSensorTimestamp"}, | 241 | {310, &Hid::ResetSevenSixAxisSensorTimestamp, "ResetSevenSixAxisSensorTimestamp"}, |
| 242 | {400, nullptr, "IsUsbFullKeyControllerEnabled"}, | 242 | {400, nullptr, "IsUsbFullKeyControllerEnabled"}, |
| 243 | {401, nullptr, "EnableUsbFullKeyController"}, | 243 | {401, nullptr, "EnableUsbFullKeyController"}, |
| 244 | {402, nullptr, "IsUsbFullKeyControllerConnected"}, | 244 | {402, nullptr, "IsUsbFullKeyControllerConnected"}, |
| @@ -319,6 +319,17 @@ void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) { | |||
| 319 | rb.Push(RESULT_SUCCESS); | 319 | rb.Push(RESULT_SUCCESS); |
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | void Hid::GetXpadIDs(Kernel::HLERequestContext& ctx) { | ||
| 323 | IPC::RequestParser rp{ctx}; | ||
| 324 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 325 | |||
| 326 | LOG_DEBUG(Service_HID, "(STUBBED) called, applet_resource_user_id={}", applet_resource_user_id); | ||
| 327 | |||
| 328 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 329 | rb.Push(RESULT_SUCCESS); | ||
| 330 | rb.Push(0); | ||
| 331 | } | ||
| 332 | |||
| 322 | void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) { | 333 | void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) { |
| 323 | IPC::RequestParser rp{ctx}; | 334 | IPC::RequestParser rp{ctx}; |
| 324 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 335 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| @@ -363,6 +374,15 @@ void Hid::ActivateKeyboard(Kernel::HLERequestContext& ctx) { | |||
| 363 | rb.Push(RESULT_SUCCESS); | 374 | rb.Push(RESULT_SUCCESS); |
| 364 | } | 375 | } |
| 365 | 376 | ||
| 377 | void Hid::SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx) { | ||
| 378 | IPC::RequestParser rp{ctx}; | ||
| 379 | const auto flags{rp.Pop<u32>()}; | ||
| 380 | LOG_WARNING(Service_HID, "(STUBBED) called. flags={}", flags); | ||
| 381 | |||
| 382 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 383 | rb.Push(RESULT_SUCCESS); | ||
| 384 | } | ||
| 385 | |||
| 366 | void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) { | 386 | void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) { |
| 367 | IPC::RequestParser rp{ctx}; | 387 | IPC::RequestParser rp{ctx}; |
| 368 | const auto unknown{rp.Pop<u32>()}; | 388 | const auto unknown{rp.Pop<u32>()}; |
| @@ -402,15 +422,59 @@ void Hid::StartSixAxisSensor(Kernel::HLERequestContext& ctx) { | |||
| 402 | rb.Push(RESULT_SUCCESS); | 422 | rb.Push(RESULT_SUCCESS); |
| 403 | } | 423 | } |
| 404 | 424 | ||
| 425 | void Hid::StopSixAxisSensor(Kernel::HLERequestContext& ctx) { | ||
| 426 | IPC::RequestParser rp{ctx}; | ||
| 427 | const auto handle{rp.Pop<u32>()}; | ||
| 428 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 429 | |||
| 430 | LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, | ||
| 431 | applet_resource_user_id); | ||
| 432 | |||
| 433 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 434 | rb.Push(RESULT_SUCCESS); | ||
| 435 | } | ||
| 436 | |||
| 405 | void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | 437 | void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { |
| 406 | IPC::RequestParser rp{ctx}; | 438 | IPC::RequestParser rp{ctx}; |
| 407 | const auto handle{rp.Pop<u32>()}; | 439 | const auto handle{rp.Pop<u32>()}; |
| 408 | const auto drift_mode{rp.Pop<u32>()}; | 440 | const auto drift_mode{rp.Pop<u32>()}; |
| 409 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 441 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 410 | 442 | ||
| 411 | LOG_WARNING(Service_HID, | 443 | applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 412 | "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, | 444 | .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode{drift_mode}); |
| 413 | drift_mode, applet_resource_user_id); | 445 | |
| 446 | LOG_DEBUG(Service_HID, "called, handle={}, drift_mode={}, applet_resource_user_id={}", handle, | ||
| 447 | drift_mode, applet_resource_user_id); | ||
| 448 | |||
| 449 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 450 | rb.Push(RESULT_SUCCESS); | ||
| 451 | } | ||
| 452 | |||
| 453 | void Hid::GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | ||
| 454 | IPC::RequestParser rp{ctx}; | ||
| 455 | const auto handle{rp.Pop<u32>()}; | ||
| 456 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 457 | |||
| 458 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 459 | applet_resource_user_id); | ||
| 460 | |||
| 461 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 462 | rb.Push(RESULT_SUCCESS); | ||
| 463 | rb.Push<u32>( | ||
| 464 | static_cast<u32>(applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 465 | .GetGyroscopeZeroDriftMode())); | ||
| 466 | } | ||
| 467 | |||
| 468 | void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) { | ||
| 469 | IPC::RequestParser rp{ctx}; | ||
| 470 | const auto handle{rp.Pop<u32>()}; | ||
| 471 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 472 | |||
| 473 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 474 | .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode::Standard); | ||
| 475 | |||
| 476 | LOG_DEBUG(Service_HID, "called, handle={}, applet_resource_user_id={}", handle, | ||
| 477 | applet_resource_user_id); | ||
| 414 | 478 | ||
| 415 | IPC::ResponseBuilder rb{ctx, 2}; | 479 | IPC::ResponseBuilder rb{ctx, 2}; |
| 416 | rb.Push(RESULT_SUCCESS); | 480 | rb.Push(RESULT_SUCCESS); |
| @@ -821,33 +885,35 @@ void Hid::StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { | |||
| 821 | rb.Push(RESULT_SUCCESS); | 885 | rb.Push(RESULT_SUCCESS); |
| 822 | } | 886 | } |
| 823 | 887 | ||
| 824 | void Hid::StopSixAxisSensor(Kernel::HLERequestContext& ctx) { | 888 | void Hid::StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 825 | IPC::RequestParser rp{ctx}; | 889 | IPC::RequestParser rp{ctx}; |
| 826 | const auto handle{rp.Pop<u32>()}; | 890 | const auto handle{rp.Pop<u32>()}; |
| 891 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 827 | 892 | ||
| 828 | LOG_WARNING(Service_HID, "(STUBBED) called, handle={}", handle); | 893 | LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle, |
| 894 | applet_resource_user_id); | ||
| 829 | 895 | ||
| 830 | IPC::ResponseBuilder rb{ctx, 2}; | 896 | IPC::ResponseBuilder rb{ctx, 2}; |
| 831 | rb.Push(RESULT_SUCCESS); | 897 | rb.Push(RESULT_SUCCESS); |
| 832 | } | 898 | } |
| 833 | 899 | ||
| 834 | void Hid::SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) { | 900 | void Hid::ActivateSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 835 | IPC::RequestParser rp{ctx}; | 901 | IPC::RequestParser rp{ctx}; |
| 836 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 902 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 837 | const auto unknown{rp.Pop<u32>()}; | ||
| 838 | 903 | ||
| 839 | LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, unknown={}", | 904 | LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", |
| 840 | applet_resource_user_id, unknown); | 905 | applet_resource_user_id); |
| 841 | 906 | ||
| 842 | IPC::ResponseBuilder rb{ctx, 2}; | 907 | IPC::ResponseBuilder rb{ctx, 2}; |
| 843 | rb.Push(RESULT_SUCCESS); | 908 | rb.Push(RESULT_SUCCESS); |
| 844 | } | 909 | } |
| 845 | 910 | ||
| 846 | void Hid::SetPalmaBoostMode(Kernel::HLERequestContext& ctx) { | 911 | void Hid::StartSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 847 | IPC::RequestParser rp{ctx}; | 912 | IPC::RequestParser rp{ctx}; |
| 848 | const auto unknown{rp.Pop<u32>()}; | 913 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 849 | 914 | ||
| 850 | LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}", unknown); | 915 | LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", |
| 916 | applet_resource_user_id); | ||
| 851 | 917 | ||
| 852 | IPC::ResponseBuilder rb{ctx, 2}; | 918 | IPC::ResponseBuilder rb{ctx, 2}; |
| 853 | rb.Push(RESULT_SUCCESS); | 919 | rb.Push(RESULT_SUCCESS); |
| @@ -871,10 +937,46 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { | |||
| 871 | rb.Push(RESULT_SUCCESS); | 937 | rb.Push(RESULT_SUCCESS); |
| 872 | } | 938 | } |
| 873 | 939 | ||
| 874 | void Hid::SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx) { | 940 | void Hid::FinalizeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { |
| 875 | IPC::RequestParser rp{ctx}; | 941 | IPC::RequestParser rp{ctx}; |
| 876 | const auto flags{rp.Pop<u32>()}; | 942 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 877 | LOG_WARNING(Service_HID, "(STUBBED) called. flags={}", flags); | 943 | |
| 944 | LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", | ||
| 945 | applet_resource_user_id); | ||
| 946 | |||
| 947 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 948 | rb.Push(RESULT_SUCCESS); | ||
| 949 | } | ||
| 950 | |||
| 951 | void Hid::ResetSevenSixAxisSensorTimestamp(Kernel::HLERequestContext& ctx) { | ||
| 952 | IPC::RequestParser rp{ctx}; | ||
| 953 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 954 | |||
| 955 | LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", | ||
| 956 | applet_resource_user_id); | ||
| 957 | |||
| 958 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 959 | rb.Push(RESULT_SUCCESS); | ||
| 960 | } | ||
| 961 | |||
| 962 | void Hid::SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) { | ||
| 963 | IPC::RequestParser rp{ctx}; | ||
| 964 | const auto applet_resource_user_id{rp.Pop<u64>()}; | ||
| 965 | const auto is_palma_all_connectable{rp.Pop<bool>()}; | ||
| 966 | |||
| 967 | LOG_WARNING(Service_HID, | ||
| 968 | "(STUBBED) called, applet_resource_user_id={}, is_palma_all_connectable={}", | ||
| 969 | applet_resource_user_id, is_palma_all_connectable); | ||
| 970 | |||
| 971 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 972 | rb.Push(RESULT_SUCCESS); | ||
| 973 | } | ||
| 974 | |||
| 975 | void Hid::SetPalmaBoostMode(Kernel::HLERequestContext& ctx) { | ||
| 976 | IPC::RequestParser rp{ctx}; | ||
| 977 | const auto palma_boost_mode{rp.Pop<bool>()}; | ||
| 978 | |||
| 979 | LOG_WARNING(Service_HID, "(STUBBED) called, palma_boost_mode={}", palma_boost_mode); | ||
| 878 | 980 | ||
| 879 | IPC::ResponseBuilder rb{ctx, 2}; | 981 | IPC::ResponseBuilder rb{ctx, 2}; |
| 880 | rb.Push(RESULT_SUCCESS); | 982 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index c8ed4ad8b..6fb048360 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -86,14 +86,19 @@ public: | |||
| 86 | private: | 86 | private: |
| 87 | void CreateAppletResource(Kernel::HLERequestContext& ctx); | 87 | void CreateAppletResource(Kernel::HLERequestContext& ctx); |
| 88 | void ActivateXpad(Kernel::HLERequestContext& ctx); | 88 | void ActivateXpad(Kernel::HLERequestContext& ctx); |
| 89 | void GetXpadIDs(Kernel::HLERequestContext& ctx); | ||
| 89 | void ActivateDebugPad(Kernel::HLERequestContext& ctx); | 90 | void ActivateDebugPad(Kernel::HLERequestContext& ctx); |
| 90 | void ActivateTouchScreen(Kernel::HLERequestContext& ctx); | 91 | void ActivateTouchScreen(Kernel::HLERequestContext& ctx); |
| 91 | void ActivateMouse(Kernel::HLERequestContext& ctx); | 92 | void ActivateMouse(Kernel::HLERequestContext& ctx); |
| 92 | void ActivateKeyboard(Kernel::HLERequestContext& ctx); | 93 | void ActivateKeyboard(Kernel::HLERequestContext& ctx); |
| 94 | void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx); | ||
| 93 | void ActivateGesture(Kernel::HLERequestContext& ctx); | 95 | void ActivateGesture(Kernel::HLERequestContext& ctx); |
| 94 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); | 96 | void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); |
| 95 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); | 97 | void StartSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 98 | void StopSixAxisSensor(Kernel::HLERequestContext& ctx); | ||
| 96 | void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | 99 | void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); |
| 100 | void GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | ||
| 101 | void ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | ||
| 97 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); | 102 | void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); |
| 98 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 103 | void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |
| 99 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | 104 | void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); |
| @@ -125,12 +130,15 @@ private: | |||
| 125 | void IsVibrationPermitted(Kernel::HLERequestContext& ctx); | 130 | void IsVibrationPermitted(Kernel::HLERequestContext& ctx); |
| 126 | void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | 131 | void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 127 | void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | 132 | void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 128 | void StopSixAxisSensor(Kernel::HLERequestContext& ctx); | 133 | void StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 129 | void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx); | 134 | void ActivateSevenSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 130 | void SetPalmaBoostMode(Kernel::HLERequestContext& ctx); | 135 | void StartSevenSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 131 | void StopSevenSixAxisSensor(Kernel::HLERequestContext& ctx); | 136 | void StopSevenSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 132 | void InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx); | 137 | void InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 133 | void SendKeyboardLockKeyEvent(Kernel::HLERequestContext& ctx); | 138 | void FinalizeSevenSixAxisSensor(Kernel::HLERequestContext& ctx); |
| 139 | void ResetSevenSixAxisSensorTimestamp(Kernel::HLERequestContext& ctx); | ||
| 140 | void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx); | ||
| 141 | void SetPalmaBoostMode(Kernel::HLERequestContext& ctx); | ||
| 134 | 142 | ||
| 135 | std::shared_ptr<IAppletResource> applet_resource; | 143 | std::shared_ptr<IAppletResource> applet_resource; |
| 136 | Core::System& system; | 144 | Core::System& system; |
diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index e8f9f2d29..17350b403 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp | |||
| @@ -47,6 +47,7 @@ public: | |||
| 47 | {26, &LBL::EnableVrMode, "EnableVrMode"}, | 47 | {26, &LBL::EnableVrMode, "EnableVrMode"}, |
| 48 | {27, &LBL::DisableVrMode, "DisableVrMode"}, | 48 | {27, &LBL::DisableVrMode, "DisableVrMode"}, |
| 49 | {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, | 49 | {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, |
| 50 | {29, nullptr, "IsAutoBrightnessControlSupported"}, | ||
| 50 | }; | 51 | }; |
| 51 | // clang-format on | 52 | // clang-format on |
| 52 | 53 | ||
diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 92adde6d4..49972cd69 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp | |||
| @@ -69,6 +69,7 @@ public: | |||
| 69 | {101, nullptr, "GetNetworkInfoLatestUpdate"}, | 69 | {101, nullptr, "GetNetworkInfoLatestUpdate"}, |
| 70 | {102, nullptr, "Scan"}, | 70 | {102, nullptr, "Scan"}, |
| 71 | {103, nullptr, "ScanPrivate"}, | 71 | {103, nullptr, "ScanPrivate"}, |
| 72 | {104, nullptr, "SetWirelessControllerRestriction"}, | ||
| 72 | {200, nullptr, "OpenAccessPoint"}, | 73 | {200, nullptr, "OpenAccessPoint"}, |
| 73 | {201, nullptr, "CloseAccessPoint"}, | 74 | {201, nullptr, "CloseAccessPoint"}, |
| 74 | {202, nullptr, "CreateNetwork"}, | 75 | {202, nullptr, "CreateNetwork"}, |
diff --git a/src/core/hle/service/lm/manager.cpp b/src/core/hle/service/lm/manager.cpp index b67081b86..3ee2374e7 100644 --- a/src/core/hle/service/lm/manager.cpp +++ b/src/core/hle/service/lm/manager.cpp | |||
| @@ -86,7 +86,8 @@ std::string FormatField(Field type, const std::vector<u8>& data) { | |||
| 86 | return Common::StringFromFixedZeroTerminatedBuffer( | 86 | return Common::StringFromFixedZeroTerminatedBuffer( |
| 87 | reinterpret_cast<const char*>(data.data()), data.size()); | 87 | reinterpret_cast<const char*>(data.data()), data.size()); |
| 88 | default: | 88 | default: |
| 89 | UNIMPLEMENTED(); | 89 | UNIMPLEMENTED_MSG("Unimplemented field type={}", type); |
| 90 | return ""; | ||
| 90 | } | 91 | } |
| 91 | } | 92 | } |
| 92 | 93 | ||
diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp index d16367f2c..113a4665c 100644 --- a/src/core/hle/service/mig/mig.cpp +++ b/src/core/hle/service/mig/mig.cpp | |||
| @@ -20,6 +20,12 @@ public: | |||
| 20 | {101, nullptr, "ResumeServer"}, | 20 | {101, nullptr, "ResumeServer"}, |
| 21 | {200, nullptr, "CreateClient"}, | 21 | {200, nullptr, "CreateClient"}, |
| 22 | {201, nullptr, "ResumeClient"}, | 22 | {201, nullptr, "ResumeClient"}, |
| 23 | {1001, nullptr, "Unknown1001"}, | ||
| 24 | {1010, nullptr, "Unknown1010"}, | ||
| 25 | {1100, nullptr, "Unknown1100"}, | ||
| 26 | {1101, nullptr, "Unknown1101"}, | ||
| 27 | {1200, nullptr, "Unknown1200"}, | ||
| 28 | {1201, nullptr, "Unknown1201"} | ||
| 23 | }; | 29 | }; |
| 24 | // clang-format on | 30 | // clang-format on |
| 25 | 31 | ||
diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp index def63dc8a..25c24e537 100644 --- a/src/core/hle/service/mm/mm_u.cpp +++ b/src/core/hle/service/mm/mm_u.cpp | |||
| @@ -14,14 +14,14 @@ public: | |||
| 14 | explicit MM_U() : ServiceFramework{"mm:u"} { | 14 | explicit MM_U() : ServiceFramework{"mm:u"} { |
| 15 | // clang-format off | 15 | // clang-format off |
| 16 | static const FunctionInfo functions[] = { | 16 | static const FunctionInfo functions[] = { |
| 17 | {0, &MM_U::Initialize, "Initialize"}, | 17 | {0, &MM_U::InitializeOld, "InitializeOld"}, |
| 18 | {1, &MM_U::Finalize, "Finalize"}, | 18 | {1, &MM_U::FinalizeOld, "FinalizeOld"}, |
| 19 | {2, &MM_U::SetAndWait, "SetAndWait"}, | 19 | {2, &MM_U::SetAndWaitOld, "SetAndWaitOld"}, |
| 20 | {3, &MM_U::Get, "Get"}, | 20 | {3, &MM_U::GetOld, "GetOld"}, |
| 21 | {4, &MM_U::InitializeWithId, "InitializeWithId"}, | 21 | {4, &MM_U::Initialize, "Initialize"}, |
| 22 | {5, &MM_U::FinalizeWithId, "FinalizeWithId"}, | 22 | {5, &MM_U::Finalize, "Finalize"}, |
| 23 | {6, &MM_U::SetAndWaitWithId, "SetAndWaitWithId"}, | 23 | {6, &MM_U::SetAndWait, "SetAndWait"}, |
| 24 | {7, &MM_U::GetWithId, "GetWithId"}, | 24 | {7, &MM_U::Get, "Get"}, |
| 25 | }; | 25 | }; |
| 26 | // clang-format on | 26 | // clang-format on |
| 27 | 27 | ||
| @@ -29,21 +29,21 @@ public: | |||
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | private: | 31 | private: |
| 32 | void Initialize(Kernel::HLERequestContext& ctx) { | 32 | void InitializeOld(Kernel::HLERequestContext& ctx) { |
| 33 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 33 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 34 | 34 | ||
| 35 | IPC::ResponseBuilder rb{ctx, 2}; | 35 | IPC::ResponseBuilder rb{ctx, 2}; |
| 36 | rb.Push(RESULT_SUCCESS); | 36 | rb.Push(RESULT_SUCCESS); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | void Finalize(Kernel::HLERequestContext& ctx) { | 39 | void FinalizeOld(Kernel::HLERequestContext& ctx) { |
| 40 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 40 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 41 | 41 | ||
| 42 | IPC::ResponseBuilder rb{ctx, 2}; | 42 | IPC::ResponseBuilder rb{ctx, 2}; |
| 43 | rb.Push(RESULT_SUCCESS); | 43 | rb.Push(RESULT_SUCCESS); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | void SetAndWait(Kernel::HLERequestContext& ctx) { | 46 | void SetAndWaitOld(Kernel::HLERequestContext& ctx) { |
| 47 | IPC::RequestParser rp{ctx}; | 47 | IPC::RequestParser rp{ctx}; |
| 48 | min = rp.Pop<u32>(); | 48 | min = rp.Pop<u32>(); |
| 49 | max = rp.Pop<u32>(); | 49 | max = rp.Pop<u32>(); |
| @@ -54,7 +54,7 @@ private: | |||
| 54 | rb.Push(RESULT_SUCCESS); | 54 | rb.Push(RESULT_SUCCESS); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | void Get(Kernel::HLERequestContext& ctx) { | 57 | void GetOld(Kernel::HLERequestContext& ctx) { |
| 58 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 58 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 59 | 59 | ||
| 60 | IPC::ResponseBuilder rb{ctx, 3}; | 60 | IPC::ResponseBuilder rb{ctx, 3}; |
| @@ -62,7 +62,7 @@ private: | |||
| 62 | rb.Push(current); | 62 | rb.Push(current); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | void InitializeWithId(Kernel::HLERequestContext& ctx) { | 65 | void Initialize(Kernel::HLERequestContext& ctx) { |
| 66 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 66 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 67 | 67 | ||
| 68 | IPC::ResponseBuilder rb{ctx, 3}; | 68 | IPC::ResponseBuilder rb{ctx, 3}; |
| @@ -70,14 +70,14 @@ private: | |||
| 70 | rb.Push<u32>(id); // Any non zero value | 70 | rb.Push<u32>(id); // Any non zero value |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | void FinalizeWithId(Kernel::HLERequestContext& ctx) { | 73 | void Finalize(Kernel::HLERequestContext& ctx) { |
| 74 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 74 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 75 | 75 | ||
| 76 | IPC::ResponseBuilder rb{ctx, 2}; | 76 | IPC::ResponseBuilder rb{ctx, 2}; |
| 77 | rb.Push(RESULT_SUCCESS); | 77 | rb.Push(RESULT_SUCCESS); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | void SetAndWaitWithId(Kernel::HLERequestContext& ctx) { | 80 | void SetAndWait(Kernel::HLERequestContext& ctx) { |
| 81 | IPC::RequestParser rp{ctx}; | 81 | IPC::RequestParser rp{ctx}; |
| 82 | u32 input_id = rp.Pop<u32>(); | 82 | u32 input_id = rp.Pop<u32>(); |
| 83 | min = rp.Pop<u32>(); | 83 | min = rp.Pop<u32>(); |
| @@ -90,7 +90,7 @@ private: | |||
| 90 | rb.Push(RESULT_SUCCESS); | 90 | rb.Push(RESULT_SUCCESS); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | void GetWithId(Kernel::HLERequestContext& ctx) { | 93 | void Get(Kernel::HLERequestContext& ctx) { |
| 94 | LOG_WARNING(Service_MM, "(STUBBED) called"); | 94 | LOG_WARNING(Service_MM, "(STUBBED) called"); |
| 95 | 95 | ||
| 96 | IPC::ResponseBuilder rb{ctx, 3}; | 96 | IPC::ResponseBuilder rb{ctx, 3}; |
diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp index ec9aae04a..e38dea1f4 100644 --- a/src/core/hle/service/ncm/ncm.cpp +++ b/src/core/hle/service/ncm/ncm.cpp | |||
| @@ -28,16 +28,16 @@ public: | |||
| 28 | {7, nullptr, "ResolveApplicationLegalInformationPath"}, | 28 | {7, nullptr, "ResolveApplicationLegalInformationPath"}, |
| 29 | {8, nullptr, "RedirectApplicationLegalInformationPath"}, | 29 | {8, nullptr, "RedirectApplicationLegalInformationPath"}, |
| 30 | {9, nullptr, "Refresh"}, | 30 | {9, nullptr, "Refresh"}, |
| 31 | {10, nullptr, "RedirectProgramPath2"}, | 31 | {10, nullptr, "RedirectApplicationProgramPath"}, |
| 32 | {11, nullptr, "Refresh2"}, | 32 | {11, nullptr, "ClearApplicationRedirection"}, |
| 33 | {12, nullptr, "DeleteProgramPath"}, | 33 | {12, nullptr, "EraseProgramRedirection"}, |
| 34 | {13, nullptr, "DeleteApplicationControlPath"}, | 34 | {13, nullptr, "EraseApplicationControlRedirection"}, |
| 35 | {14, nullptr, "DeleteApplicationHtmlDocumentPath"}, | 35 | {14, nullptr, "EraseApplicationHtmlDocumentRedirection"}, |
| 36 | {15, nullptr, "DeleteApplicationLegalInformationPath"}, | 36 | {15, nullptr, "EraseApplicationLegalInformationRedirection"}, |
| 37 | {16, nullptr, ""}, | 37 | {16, nullptr, "ResolveProgramPathForDebug"}, |
| 38 | {17, nullptr, ""}, | 38 | {17, nullptr, "RedirectProgramPathForDebug"}, |
| 39 | {18, nullptr, ""}, | 39 | {18, nullptr, "RedirectApplicationProgramPathForDebug"}, |
| 40 | {19, nullptr, ""}, | 40 | {19, nullptr, "EraseProgramRedirectionForDebug"}, |
| 41 | }; | 41 | }; |
| 42 | // clang-format on | 42 | // clang-format on |
| 43 | 43 | ||
diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index b7b34ce7e..780ea30fe 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp | |||
| @@ -198,9 +198,9 @@ public: | |||
| 198 | static const FunctionInfo functions[] = { | 198 | static const FunctionInfo functions[] = { |
| 199 | {0, nullptr, "Initialize"}, | 199 | {0, nullptr, "Initialize"}, |
| 200 | {1, nullptr, "Finalize"}, | 200 | {1, nullptr, "Finalize"}, |
| 201 | {2, nullptr, "GetState"}, | 201 | {2, nullptr, "GetStateOld"}, |
| 202 | {3, nullptr, "IsNfcEnabled"}, | 202 | {3, nullptr, "IsNfcEnabledOld"}, |
| 203 | {100, nullptr, "SetNfcEnabled"}, | 203 | {100, nullptr, "SetNfcEnabledOld"}, |
| 204 | {400, nullptr, "InitializeSystem"}, | 204 | {400, nullptr, "InitializeSystem"}, |
| 205 | {401, nullptr, "FinalizeSystem"}, | 205 | {401, nullptr, "FinalizeSystem"}, |
| 206 | {402, nullptr, "GetState"}, | 206 | {402, nullptr, "GetState"}, |
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 cc2192e5c..0d913334e 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | |||
| @@ -25,7 +25,7 @@ u32 nvhost_ctrl_gpu::ioctl(Ioctl command, const std::vector<u8>& input, | |||
| 25 | case IoctlCommand::IocGetCharacteristicsCommand: | 25 | case IoctlCommand::IocGetCharacteristicsCommand: |
| 26 | return GetCharacteristics(input, output, output2, version); | 26 | return GetCharacteristics(input, output, output2, version); |
| 27 | case IoctlCommand::IocGetTPCMasksCommand: | 27 | case IoctlCommand::IocGetTPCMasksCommand: |
| 28 | return GetTPCMasks(input, output); | 28 | return GetTPCMasks(input, output, output2, version); |
| 29 | case IoctlCommand::IocGetActiveSlotMaskCommand: | 29 | case IoctlCommand::IocGetActiveSlotMaskCommand: |
| 30 | return GetActiveSlotMask(input, output); | 30 | return GetActiveSlotMask(input, output); |
| 31 | case IoctlCommand::IocZcullGetCtxSizeCommand: | 31 | case IoctlCommand::IocZcullGetCtxSizeCommand: |
| @@ -98,17 +98,22 @@ u32 nvhost_ctrl_gpu::GetCharacteristics(const std::vector<u8>& input, std::vecto | |||
| 98 | return 0; | 98 | return 0; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output) { | 101 | u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, |
| 102 | std::vector<u8>& output2, IoctlVersion version) { | ||
| 102 | IoctlGpuGetTpcMasksArgs params{}; | 103 | IoctlGpuGetTpcMasksArgs params{}; |
| 103 | std::memcpy(¶ms, input.data(), input.size()); | 104 | std::memcpy(¶ms, input.data(), input.size()); |
| 104 | LOG_INFO(Service_NVDRV, "called, mask=0x{:X}, mask_buf_addr=0x{:X}", params.mask_buf_size, | 105 | LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); |
| 105 | params.mask_buf_addr); | 106 | if (params.mask_buffer_size != 0) { |
| 106 | // TODO(ogniK): Confirm value on hardware | 107 | params.tcp_mask = 3; |
| 107 | if (params.mask_buf_size) | 108 | } |
| 108 | params.tpc_mask_size = 4 * 1; // 4 * num_gpc | 109 | |
| 109 | else | 110 | if (version == IoctlVersion::Version3) { |
| 110 | params.tpc_mask_size = 0; | 111 | std::memcpy(output.data(), input.data(), output.size()); |
| 111 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 112 | std::memcpy(output2.data(), ¶ms.tcp_mask, output2.size()); |
| 113 | } else { | ||
| 114 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 115 | } | ||
| 116 | |||
| 112 | return 0; | 117 | return 0; |
| 113 | } | 118 | } |
| 114 | 119 | ||
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h index 07b644ec5..ef60f72ce 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | |||
| @@ -92,16 +92,11 @@ private: | |||
| 92 | "IoctlCharacteristics is incorrect size"); | 92 | "IoctlCharacteristics is incorrect size"); |
| 93 | 93 | ||
| 94 | struct IoctlGpuGetTpcMasksArgs { | 94 | struct IoctlGpuGetTpcMasksArgs { |
| 95 | /// [in] TPC mask buffer size reserved by userspace. Should be at least | 95 | u32_le mask_buffer_size{}; |
| 96 | /// sizeof(__u32) * fls(gpc_mask) to receive TPC mask for each GPC. | 96 | INSERT_PADDING_WORDS(1); |
| 97 | /// [out] full kernel buffer size | 97 | u64_le mask_buffer_address{}; |
| 98 | u32_le mask_buf_size; | 98 | u32_le tcp_mask{}; |
| 99 | u32_le reserved; | 99 | INSERT_PADDING_WORDS(1); |
| 100 | |||
| 101 | /// [in] pointer to TPC mask buffer. It will receive one 32-bit TPC mask per GPC or 0 if | ||
| 102 | /// GPC is not enabled or not present. This parameter is ignored if mask_buf_size is 0. | ||
| 103 | u64_le mask_buf_addr; | ||
| 104 | u64_le tpc_mask_size; // Nintendo add this? | ||
| 105 | }; | 100 | }; |
| 106 | static_assert(sizeof(IoctlGpuGetTpcMasksArgs) == 24, | 101 | static_assert(sizeof(IoctlGpuGetTpcMasksArgs) == 24, |
| 107 | "IoctlGpuGetTpcMasksArgs is incorrect size"); | 102 | "IoctlGpuGetTpcMasksArgs is incorrect size"); |
| @@ -166,7 +161,8 @@ private: | |||
| 166 | 161 | ||
| 167 | u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, | 162 | u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output, |
| 168 | std::vector<u8>& output2, IoctlVersion version); | 163 | std::vector<u8>& output2, IoctlVersion version); |
| 169 | u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); | 164 | u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, std::vector<u8>& output2, |
| 165 | IoctlVersion version); | ||
| 170 | u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); | 166 | u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); |
| 171 | u32 ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output); | 167 | u32 ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output); |
| 172 | u32 ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); | 168 | u32 ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); |
diff --git a/src/core/host_timing.cpp b/src/core/host_timing.cpp new file mode 100644 index 000000000..2f40de1a1 --- /dev/null +++ b/src/core/host_timing.cpp | |||
| @@ -0,0 +1,206 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "core/host_timing.h" | ||
| 6 | |||
| 7 | #include <algorithm> | ||
| 8 | #include <mutex> | ||
| 9 | #include <string> | ||
| 10 | #include <tuple> | ||
| 11 | |||
| 12 | #include "common/assert.h" | ||
| 13 | #include "core/core_timing_util.h" | ||
| 14 | |||
| 15 | namespace Core::HostTiming { | ||
| 16 | |||
| 17 | std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) { | ||
| 18 | return std::make_shared<EventType>(std::move(callback), std::move(name)); | ||
| 19 | } | ||
| 20 | |||
| 21 | struct CoreTiming::Event { | ||
| 22 | u64 time; | ||
| 23 | u64 fifo_order; | ||
| 24 | u64 userdata; | ||
| 25 | std::weak_ptr<EventType> type; | ||
| 26 | |||
| 27 | // Sort by time, unless the times are the same, in which case sort by | ||
| 28 | // the order added to the queue | ||
| 29 | friend bool operator>(const Event& left, const Event& right) { | ||
| 30 | return std::tie(left.time, left.fifo_order) > std::tie(right.time, right.fifo_order); | ||
| 31 | } | ||
| 32 | |||
| 33 | friend bool operator<(const Event& left, const Event& right) { | ||
| 34 | return std::tie(left.time, left.fifo_order) < std::tie(right.time, right.fifo_order); | ||
| 35 | } | ||
| 36 | }; | ||
| 37 | |||
| 38 | CoreTiming::CoreTiming() { | ||
| 39 | clock = | ||
| 40 | Common::CreateBestMatchingClock(Core::Hardware::BASE_CLOCK_RATE, Core::Hardware::CNTFREQ); | ||
| 41 | } | ||
| 42 | |||
| 43 | CoreTiming::~CoreTiming() = default; | ||
| 44 | |||
| 45 | void CoreTiming::ThreadEntry(CoreTiming& instance) { | ||
| 46 | instance.ThreadLoop(); | ||
| 47 | } | ||
| 48 | |||
| 49 | void CoreTiming::Initialize() { | ||
| 50 | event_fifo_id = 0; | ||
| 51 | const auto empty_timed_callback = [](u64, s64) {}; | ||
| 52 | ev_lost = CreateEvent("_lost_event", empty_timed_callback); | ||
| 53 | timer_thread = std::make_unique<std::thread>(ThreadEntry, std::ref(*this)); | ||
| 54 | } | ||
| 55 | |||
| 56 | void CoreTiming::Shutdown() { | ||
| 57 | paused = true; | ||
| 58 | shutting_down = true; | ||
| 59 | event.Set(); | ||
| 60 | timer_thread->join(); | ||
| 61 | ClearPendingEvents(); | ||
| 62 | timer_thread.reset(); | ||
| 63 | has_started = false; | ||
| 64 | } | ||
| 65 | |||
| 66 | void CoreTiming::Pause(bool is_paused) { | ||
| 67 | paused = is_paused; | ||
| 68 | } | ||
| 69 | |||
| 70 | void CoreTiming::SyncPause(bool is_paused) { | ||
| 71 | if (is_paused == paused && paused_set == paused) { | ||
| 72 | return; | ||
| 73 | } | ||
| 74 | Pause(is_paused); | ||
| 75 | event.Set(); | ||
| 76 | while (paused_set != is_paused) | ||
| 77 | ; | ||
| 78 | } | ||
| 79 | |||
| 80 | bool CoreTiming::IsRunning() const { | ||
| 81 | return !paused_set; | ||
| 82 | } | ||
| 83 | |||
| 84 | bool CoreTiming::HasPendingEvents() const { | ||
| 85 | return !(wait_set && event_queue.empty()); | ||
| 86 | } | ||
| 87 | |||
| 88 | void CoreTiming::ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, | ||
| 89 | u64 userdata) { | ||
| 90 | basic_lock.lock(); | ||
| 91 | const u64 timeout = static_cast<u64>(GetGlobalTimeNs().count() + ns_into_future); | ||
| 92 | |||
| 93 | event_queue.emplace_back(Event{timeout, event_fifo_id++, userdata, event_type}); | ||
| 94 | |||
| 95 | std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); | ||
| 96 | basic_lock.unlock(); | ||
| 97 | event.Set(); | ||
| 98 | } | ||
| 99 | |||
| 100 | void CoreTiming::UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata) { | ||
| 101 | basic_lock.lock(); | ||
| 102 | const auto itr = std::remove_if(event_queue.begin(), event_queue.end(), [&](const Event& e) { | ||
| 103 | return e.type.lock().get() == event_type.get() && e.userdata == userdata; | ||
| 104 | }); | ||
| 105 | |||
| 106 | // Removing random items breaks the invariant so we have to re-establish it. | ||
| 107 | if (itr != event_queue.end()) { | ||
| 108 | event_queue.erase(itr, event_queue.end()); | ||
| 109 | std::make_heap(event_queue.begin(), event_queue.end(), std::greater<>()); | ||
| 110 | } | ||
| 111 | basic_lock.unlock(); | ||
| 112 | } | ||
| 113 | |||
| 114 | void CoreTiming::AddTicks(std::size_t core_index, u64 ticks) { | ||
| 115 | ticks_count[core_index] += ticks; | ||
| 116 | } | ||
| 117 | |||
| 118 | void CoreTiming::ResetTicks(std::size_t core_index) { | ||
| 119 | ticks_count[core_index] = 0; | ||
| 120 | } | ||
| 121 | |||
| 122 | u64 CoreTiming::GetCPUTicks() const { | ||
| 123 | return clock->GetCPUCycles(); | ||
| 124 | } | ||
| 125 | |||
| 126 | u64 CoreTiming::GetClockTicks() const { | ||
| 127 | return clock->GetClockCycles(); | ||
| 128 | } | ||
| 129 | |||
| 130 | void CoreTiming::ClearPendingEvents() { | ||
| 131 | event_queue.clear(); | ||
| 132 | } | ||
| 133 | |||
| 134 | void CoreTiming::RemoveEvent(const std::shared_ptr<EventType>& event_type) { | ||
| 135 | basic_lock.lock(); | ||
| 136 | |||
| 137 | const auto itr = std::remove_if(event_queue.begin(), event_queue.end(), [&](const Event& e) { | ||
| 138 | return e.type.lock().get() == event_type.get(); | ||
| 139 | }); | ||
| 140 | |||
| 141 | // Removing random items breaks the invariant so we have to re-establish it. | ||
| 142 | if (itr != event_queue.end()) { | ||
| 143 | event_queue.erase(itr, event_queue.end()); | ||
| 144 | std::make_heap(event_queue.begin(), event_queue.end(), std::greater<>()); | ||
| 145 | } | ||
| 146 | basic_lock.unlock(); | ||
| 147 | } | ||
| 148 | |||
| 149 | std::optional<u64> CoreTiming::Advance() { | ||
| 150 | advance_lock.lock(); | ||
| 151 | basic_lock.lock(); | ||
| 152 | global_timer = GetGlobalTimeNs().count(); | ||
| 153 | |||
| 154 | while (!event_queue.empty() && event_queue.front().time <= global_timer) { | ||
| 155 | Event evt = std::move(event_queue.front()); | ||
| 156 | std::pop_heap(event_queue.begin(), event_queue.end(), std::greater<>()); | ||
| 157 | event_queue.pop_back(); | ||
| 158 | basic_lock.unlock(); | ||
| 159 | |||
| 160 | if (auto event_type{evt.type.lock()}) { | ||
| 161 | event_type->callback(evt.userdata, global_timer - evt.time); | ||
| 162 | } | ||
| 163 | |||
| 164 | basic_lock.lock(); | ||
| 165 | } | ||
| 166 | |||
| 167 | if (!event_queue.empty()) { | ||
| 168 | const u64 next_time = event_queue.front().time - global_timer; | ||
| 169 | basic_lock.unlock(); | ||
| 170 | advance_lock.unlock(); | ||
| 171 | return next_time; | ||
| 172 | } else { | ||
| 173 | basic_lock.unlock(); | ||
| 174 | advance_lock.unlock(); | ||
| 175 | return std::nullopt; | ||
| 176 | } | ||
| 177 | } | ||
| 178 | |||
| 179 | void CoreTiming::ThreadLoop() { | ||
| 180 | has_started = true; | ||
| 181 | while (!shutting_down) { | ||
| 182 | while (!paused) { | ||
| 183 | paused_set = false; | ||
| 184 | const auto next_time = Advance(); | ||
| 185 | if (next_time) { | ||
| 186 | std::chrono::nanoseconds next_time_ns = std::chrono::nanoseconds(*next_time); | ||
| 187 | event.WaitFor(next_time_ns); | ||
| 188 | } else { | ||
| 189 | wait_set = true; | ||
| 190 | event.Wait(); | ||
| 191 | } | ||
| 192 | wait_set = false; | ||
| 193 | } | ||
| 194 | paused_set = true; | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { | ||
| 199 | return clock->GetTimeNS(); | ||
| 200 | } | ||
| 201 | |||
| 202 | std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { | ||
| 203 | return clock->GetTimeUS(); | ||
| 204 | } | ||
| 205 | |||
| 206 | } // namespace Core::HostTiming | ||
diff --git a/src/core/host_timing.h b/src/core/host_timing.h new file mode 100644 index 000000000..be6b68d7c --- /dev/null +++ b/src/core/host_timing.h | |||
| @@ -0,0 +1,160 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <atomic> | ||
| 8 | #include <chrono> | ||
| 9 | #include <functional> | ||
| 10 | #include <memory> | ||
| 11 | #include <mutex> | ||
| 12 | #include <optional> | ||
| 13 | #include <string> | ||
| 14 | #include <thread> | ||
| 15 | #include <vector> | ||
| 16 | |||
| 17 | #include "common/common_types.h" | ||
| 18 | #include "common/spin_lock.h" | ||
| 19 | #include "common/thread.h" | ||
| 20 | #include "common/threadsafe_queue.h" | ||
| 21 | #include "common/wall_clock.h" | ||
| 22 | #include "core/hardware_properties.h" | ||
| 23 | |||
| 24 | namespace Core::HostTiming { | ||
| 25 | |||
| 26 | /// A callback that may be scheduled for a particular core timing event. | ||
| 27 | using TimedCallback = std::function<void(u64 userdata, s64 cycles_late)>; | ||
| 28 | |||
| 29 | /// Contains the characteristics of a particular event. | ||
| 30 | struct EventType { | ||
| 31 | EventType(TimedCallback&& callback, std::string&& name) | ||
| 32 | : callback{std::move(callback)}, name{std::move(name)} {} | ||
| 33 | |||
| 34 | /// The event's callback function. | ||
| 35 | TimedCallback callback; | ||
| 36 | /// A pointer to the name of the event. | ||
| 37 | const std::string name; | ||
| 38 | }; | ||
| 39 | |||
| 40 | /** | ||
| 41 | * This is a system to schedule events into the emulated machine's future. Time is measured | ||
| 42 | * in main CPU clock cycles. | ||
| 43 | * | ||
| 44 | * To schedule an event, you first have to register its type. This is where you pass in the | ||
| 45 | * callback. You then schedule events using the type id you get back. | ||
| 46 | * | ||
| 47 | * The int cyclesLate that the callbacks get is how many cycles late it was. | ||
| 48 | * So to schedule a new event on a regular basis: | ||
| 49 | * inside callback: | ||
| 50 | * ScheduleEvent(periodInCycles - cyclesLate, callback, "whatever") | ||
| 51 | */ | ||
| 52 | class CoreTiming { | ||
| 53 | public: | ||
| 54 | CoreTiming(); | ||
| 55 | ~CoreTiming(); | ||
| 56 | |||
| 57 | CoreTiming(const CoreTiming&) = delete; | ||
| 58 | CoreTiming(CoreTiming&&) = delete; | ||
| 59 | |||
| 60 | CoreTiming& operator=(const CoreTiming&) = delete; | ||
| 61 | CoreTiming& operator=(CoreTiming&&) = delete; | ||
| 62 | |||
| 63 | /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is | ||
| 64 | /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. | ||
| 65 | void Initialize(); | ||
| 66 | |||
| 67 | /// Tears down all timing related functionality. | ||
| 68 | void Shutdown(); | ||
| 69 | |||
| 70 | /// Pauses/Unpauses the execution of the timer thread. | ||
| 71 | void Pause(bool is_paused); | ||
| 72 | |||
| 73 | /// Pauses/Unpauses the execution of the timer thread and waits until paused. | ||
| 74 | void SyncPause(bool is_paused); | ||
| 75 | |||
| 76 | /// Checks if core timing is running. | ||
| 77 | bool IsRunning() const; | ||
| 78 | |||
| 79 | /// Checks if the timer thread has started. | ||
| 80 | bool HasStarted() const { | ||
| 81 | return has_started; | ||
| 82 | } | ||
| 83 | |||
| 84 | /// Checks if there are any pending time events. | ||
| 85 | bool HasPendingEvents() const; | ||
| 86 | |||
| 87 | /// Schedules an event in core timing | ||
| 88 | void ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, | ||
| 89 | u64 userdata = 0); | ||
| 90 | |||
| 91 | void UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata); | ||
| 92 | |||
| 93 | /// We only permit one event of each type in the queue at a time. | ||
| 94 | void RemoveEvent(const std::shared_ptr<EventType>& event_type); | ||
| 95 | |||
| 96 | void AddTicks(std::size_t core_index, u64 ticks); | ||
| 97 | |||
| 98 | void ResetTicks(std::size_t core_index); | ||
| 99 | |||
| 100 | /// Returns current time in emulated CPU cycles | ||
| 101 | u64 GetCPUTicks() const; | ||
| 102 | |||
| 103 | /// Returns current time in emulated in Clock cycles | ||
| 104 | u64 GetClockTicks() const; | ||
| 105 | |||
| 106 | /// Returns current time in microseconds. | ||
| 107 | std::chrono::microseconds GetGlobalTimeUs() const; | ||
| 108 | |||
| 109 | /// Returns current time in nanoseconds. | ||
| 110 | std::chrono::nanoseconds GetGlobalTimeNs() const; | ||
| 111 | |||
| 112 | /// Checks for events manually and returns time in nanoseconds for next event, threadsafe. | ||
| 113 | std::optional<u64> Advance(); | ||
| 114 | |||
| 115 | private: | ||
| 116 | struct Event; | ||
| 117 | |||
| 118 | /// Clear all pending events. This should ONLY be done on exit. | ||
| 119 | void ClearPendingEvents(); | ||
| 120 | |||
| 121 | static void ThreadEntry(CoreTiming& instance); | ||
| 122 | void ThreadLoop(); | ||
| 123 | |||
| 124 | std::unique_ptr<Common::WallClock> clock; | ||
| 125 | |||
| 126 | u64 global_timer = 0; | ||
| 127 | |||
| 128 | std::chrono::nanoseconds start_point; | ||
| 129 | |||
| 130 | // The queue is a min-heap using std::make_heap/push_heap/pop_heap. | ||
| 131 | // We don't use std::priority_queue because we need to be able to serialize, unserialize and | ||
| 132 | // erase arbitrary events (RemoveEvent()) regardless of the queue order. These aren't | ||
| 133 | // accomodated by the standard adaptor class. | ||
| 134 | std::vector<Event> event_queue; | ||
| 135 | u64 event_fifo_id = 0; | ||
| 136 | |||
| 137 | std::shared_ptr<EventType> ev_lost; | ||
| 138 | Common::Event event{}; | ||
| 139 | Common::SpinLock basic_lock{}; | ||
| 140 | Common::SpinLock advance_lock{}; | ||
| 141 | std::unique_ptr<std::thread> timer_thread; | ||
| 142 | std::atomic<bool> paused{}; | ||
| 143 | std::atomic<bool> paused_set{}; | ||
| 144 | std::atomic<bool> wait_set{}; | ||
| 145 | std::atomic<bool> shutting_down{}; | ||
| 146 | std::atomic<bool> has_started{}; | ||
| 147 | |||
| 148 | std::array<std::atomic<u64>, Core::Hardware::NUM_CPU_CORES> ticks_count{}; | ||
| 149 | }; | ||
| 150 | |||
| 151 | /// Creates a core timing event with the given name and callback. | ||
| 152 | /// | ||
| 153 | /// @param name The name of the core timing event to create. | ||
| 154 | /// @param callback The callback to execute for the event. | ||
| 155 | /// | ||
| 156 | /// @returns An EventType instance representing the created event. | ||
| 157 | /// | ||
| 158 | std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback); | ||
| 159 | |||
| 160 | } // namespace Core::HostTiming | ||
diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 4edff9cd8..56df5e925 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp | |||
| @@ -127,6 +127,13 @@ void LogSettings() { | |||
| 127 | LogSetting("Services_BCATBoxcatLocal", Settings::values.bcat_boxcat_local); | 127 | LogSetting("Services_BCATBoxcatLocal", Settings::values.bcat_boxcat_local); |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | float Volume() { | ||
| 131 | if (values.audio_muted) { | ||
| 132 | return 0.0f; | ||
| 133 | } | ||
| 134 | return values.volume; | ||
| 135 | } | ||
| 136 | |||
| 130 | bool IsGPULevelExtreme() { | 137 | bool IsGPULevelExtreme() { |
| 131 | return values.gpu_accuracy == GPUAccuracy::Extreme; | 138 | return values.gpu_accuracy == GPUAccuracy::Extreme; |
| 132 | } | 139 | } |
diff --git a/src/core/settings.h b/src/core/settings.h index 78eb33737..a598ccbc1 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -437,7 +437,7 @@ struct Values { | |||
| 437 | bool renderer_debug; | 437 | bool renderer_debug; |
| 438 | int vulkan_device; | 438 | int vulkan_device; |
| 439 | 439 | ||
| 440 | float resolution_factor; | 440 | u16 resolution_factor{1}; |
| 441 | int aspect_ratio; | 441 | int aspect_ratio; |
| 442 | int max_anisotropy; | 442 | int max_anisotropy; |
| 443 | bool use_frame_limit; | 443 | bool use_frame_limit; |
| @@ -459,6 +459,7 @@ struct Values { | |||
| 459 | bool use_dev_keys; | 459 | bool use_dev_keys; |
| 460 | 460 | ||
| 461 | // Audio | 461 | // Audio |
| 462 | bool audio_muted; | ||
| 462 | std::string sink_id; | 463 | std::string sink_id; |
| 463 | bool enable_audio_stretching; | 464 | bool enable_audio_stretching; |
| 464 | std::string audio_device_id; | 465 | std::string audio_device_id; |
| @@ -474,6 +475,7 @@ struct Values { | |||
| 474 | bool reporting_services; | 475 | bool reporting_services; |
| 475 | bool quest_flag; | 476 | bool quest_flag; |
| 476 | bool disable_cpu_opt; | 477 | bool disable_cpu_opt; |
| 478 | bool disable_macro_jit; | ||
| 477 | 479 | ||
| 478 | // BCAT | 480 | // BCAT |
| 479 | std::string bcat_backend; | 481 | std::string bcat_backend; |
| @@ -489,6 +491,8 @@ struct Values { | |||
| 489 | std::map<u64, std::vector<std::string>> disabled_addons; | 491 | std::map<u64, std::vector<std::string>> disabled_addons; |
| 490 | } extern values; | 492 | } extern values; |
| 491 | 493 | ||
| 494 | float Volume(); | ||
| 495 | |||
| 492 | bool IsGPULevelExtreme(); | 496 | bool IsGPULevelExtreme(); |
| 493 | bool IsGPULevelHigh(); | 497 | bool IsGPULevelHigh(); |
| 494 | 498 | ||