diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 64 | ||||
| -rw-r--r-- | src/core/hle/service/am/applet_ae.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/am/applet_oe.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/am/idle.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/am/tcap.cpp | 23 | ||||
| -rw-r--r-- | src/core/hle/service/am/tcap.h | 17 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 191 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/service/lbl/lbl.cpp | 56 | ||||
| -rw-r--r-- | src/core/hle/service/npns/npns.cpp | 88 | ||||
| -rw-r--r-- | src/core/hle/service/npns/npns.h | 15 | ||||
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/psm.cpp | 71 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/psm.h | 15 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 8 | 
18 files changed, 535 insertions, 58 deletions
| diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 4755ec822..64fdf38cd 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -156,6 +156,8 @@ add_library(core STATIC      hle/service/am/omm.h      hle/service/am/spsm.cpp      hle/service/am/spsm.h +    hle/service/am/tcap.cpp +    hle/service/am/tcap.h      hle/service/aoc/aoc_u.cpp      hle/service/aoc/aoc_u.h      hle/service/apm/apm.cpp @@ -280,6 +282,8 @@ add_library(core STATIC      hle/service/nifm/nifm.h      hle/service/nim/nim.cpp      hle/service/nim/nim.h +    hle/service/npns/npns.cpp +    hle/service/npns/npns.h      hle/service/ns/ns.cpp      hle/service/ns/ns.h      hle/service/ns/pl_u.cpp @@ -327,6 +331,8 @@ add_library(core STATIC      hle/service/prepo/prepo.h      hle/service/psc/psc.cpp      hle/service/psc/psc.h +    hle/service/ptm/psm.cpp +    hle/service/ptm/psm.h      hle/service/service.cpp      hle/service/service.h      hle/service/set/set.cpp diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 3b8a2e230..690b84930 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -654,7 +654,7 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i      }      auto vma = process->VMManager().FindVMA(addr);      memory_info->attributes = 0; -    if (vma == Core::CurrentProcess()->VMManager().vma_map.end()) { +    if (vma == process->VMManager().vma_map.end()) {          memory_info->base_address = 0;          memory_info->permission = static_cast<u32>(VMAPermission::None);          memory_info->size = 0; diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 4d1f83170..ecf72ae24 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -15,6 +15,7 @@  #include "core/hle/service/am/idle.h"  #include "core/hle/service/am/omm.h"  #include "core/hle/service/am/spsm.h" +#include "core/hle/service/am/tcap.h"  #include "core/hle/service/apm/apm.h"  #include "core/hle/service/filesystem/filesystem.h"  #include "core/hle/service/nvflinger/nvflinger.h" @@ -26,13 +27,18 @@  namespace Service::AM {  IWindowController::IWindowController() : ServiceFramework("IWindowController") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "CreateWindow"},          {1, &IWindowController::GetAppletResourceUserId, "GetAppletResourceUserId"},          {10, &IWindowController::AcquireForegroundRights, "AcquireForegroundRights"},          {11, nullptr, "ReleaseForegroundRights"},          {12, nullptr, "RejectToChangeIntoBackground"}, +        {20, nullptr, "SetAppletWindowVisibility"}, +        {21, nullptr, "SetAppletGpuTimeSlice"},      }; +    // clang-format on +      RegisterHandlers(functions);  } @@ -87,6 +93,7 @@ void IAudioController::GetLibraryAppletExpectedMasterVolume(Kernel::HLERequestCo  }  IDisplayController::IDisplayController() : ServiceFramework("IDisplayController") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "GetLastForegroundCaptureImage"},          {1, nullptr, "UpdateLastForegroundCaptureImage"}, @@ -117,7 +124,11 @@ IDisplayController::IDisplayController() : ServiceFramework("IDisplayController"          {25, nullptr, "ReleaseLastForegroundCaptureSharedBuffer"},          {26, nullptr, "AcquireCallerAppletCaptureSharedBuffer"},          {27, nullptr, "ReleaseCallerAppletCaptureSharedBuffer"}, +        // 6.0.0+ +        {28, nullptr, "TakeScreenShotOfOwnLayerEx"},      }; +    // clang-format on +      RegisterHandlers(functions);  } @@ -128,6 +139,7 @@ IDebugFunctions::~IDebugFunctions() = default;  ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)      : ServiceFramework("ISelfController"), nvflinger(std::move(nvflinger)) { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "Exit"},          {1, &ISelfController::LockExit, "LockExit"}, @@ -136,10 +148,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger          {4, nullptr, "LeaveFatalSection"},          {9, &ISelfController::GetLibraryAppletLaunchableEvent, "GetLibraryAppletLaunchableEvent"},          {10, &ISelfController::SetScreenShotPermission, "SetScreenShotPermission"}, -        {11, &ISelfController::SetOperationModeChangedNotification, -         "SetOperationModeChangedNotification"}, -        {12, &ISelfController::SetPerformanceModeChangedNotification, -         "SetPerformanceModeChangedNotification"}, +        {11, &ISelfController::SetOperationModeChangedNotification, "SetOperationModeChangedNotification"}, +        {12, &ISelfController::SetPerformanceModeChangedNotification, "SetPerformanceModeChangedNotification"},          {13, &ISelfController::SetFocusHandlingMode, "SetFocusHandlingMode"},          {14, &ISelfController::SetRestartMessageEnabled, "SetRestartMessageEnabled"},          {15, nullptr, "SetScreenShotAppletIdentityInfo"}, @@ -165,7 +175,12 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger          {69, nullptr, "IsAutoSleepDisabled"},          {70, nullptr, "ReportMultimediaError"},          {80, nullptr, "SetWirelessPriorityMode"}, +        {90, nullptr, "GetAccumulatedSuspendedTickValue"}, +        {91, nullptr, "GetAccumulatedSuspendedTickChangedEvent"}, +        {1000, nullptr, "GetDebugStorageChannel"},      }; +    // clang-format on +      RegisterHandlers(functions);      auto& kernel = Core::System::GetInstance().Kernel(); @@ -312,6 +327,7 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c  }  ICommonStateGetter::ICommonStateGetter() : ServiceFramework("ICommonStateGetter") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, &ICommonStateGetter::GetEventHandle, "GetEventHandle"},          {1, &ICommonStateGetter::ReceiveMessage, "ReceiveMessage"}, @@ -336,11 +352,12 @@ ICommonStateGetter::ICommonStateGetter() : ServiceFramework("ICommonStateGetter"          {52, nullptr, "SwitchLcdBacklight"},          {55, nullptr, "IsInControllerFirmwareUpdateSection"},          {60, &ICommonStateGetter::GetDefaultDisplayResolution, "GetDefaultDisplayResolution"}, -        {61, &ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent, -         "GetDefaultDisplayResolutionChangeEvent"}, +        {61, &ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent, "GetDefaultDisplayResolutionChangeEvent"},          {62, nullptr, "GetHdcpAuthenticationState"},          {63, nullptr, "GetHdcpAuthenticationStateChangeEvent"},      }; +    // clang-format on +      RegisterHandlers(functions);      auto& kernel = Core::System::GetInstance().Kernel(); @@ -432,11 +449,14 @@ class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {  public:      explicit IStorageAccessor(std::vector<u8> buffer)          : ServiceFramework("IStorageAccessor"), buffer(std::move(buffer)) { +        // clang-format off          static const FunctionInfo functions[] = {              {0, &IStorageAccessor::GetSize, "GetSize"},              {10, &IStorageAccessor::Write, "Write"},              {11, &IStorageAccessor::Read, "Read"},          }; +        // clang-format on +          RegisterHandlers(functions);      } @@ -489,10 +509,13 @@ class IStorage final : public ServiceFramework<IStorage> {  public:      explicit IStorage(std::vector<u8> buffer)          : ServiceFramework("IStorage"), buffer(std::move(buffer)) { +        // clang-format off          static const FunctionInfo functions[] = {              {0, &IStorage::Open, "Open"},              {1, nullptr, "OpenTransferStorage"},          }; +        // clang-format on +          RegisterHandlers(functions);      } @@ -512,6 +535,7 @@ private:  class ILibraryAppletAccessor final : public ServiceFramework<ILibraryAppletAccessor> {  public:      explicit ILibraryAppletAccessor() : ServiceFramework("ILibraryAppletAccessor") { +        // clang-format off          static const FunctionInfo functions[] = {              {0, &ILibraryAppletAccessor::GetAppletStateChangedEvent, "GetAppletStateChangedEvent"},              {1, nullptr, "IsCompleted"}, @@ -532,6 +556,8 @@ public:              {150, nullptr, "RequestForAppletToGetForeground"},              {160, nullptr, "GetIndirectLayerConsumerHandle"},          }; +        // clang-format on +          RegisterHandlers(functions);          auto& kernel = Core::System::GetInstance().Kernel(); @@ -624,13 +650,13 @@ void ILibraryAppletCreator::CreateStorage(Kernel::HLERequestContext& ctx) {  }  IApplicationFunctions::IApplicationFunctions() : ServiceFramework("IApplicationFunctions") { +    // clang-format off      static const FunctionInfo functions[] = {          {1, &IApplicationFunctions::PopLaunchParameter, "PopLaunchParameter"},          {10, nullptr, "CreateApplicationAndPushAndRequestToStart"},          {11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"},          {12, nullptr, "CreateApplicationAndRequestToStart"}, -        {13, &IApplicationFunctions::CreateApplicationAndRequestToStartForQuest, -         "CreateApplicationAndRequestToStartForQuest"}, +        {13, &IApplicationFunctions::CreateApplicationAndRequestToStartForQuest, "CreateApplicationAndRequestToStartForQuest"},          {20, &IApplicationFunctions::EnsureSaveData, "EnsureSaveData"},          {21, &IApplicationFunctions::GetDesiredLanguage, "GetDesiredLanguage"},          {22, &IApplicationFunctions::SetTerminateResult, "SetTerminateResult"}, @@ -638,10 +664,8 @@ IApplicationFunctions::IApplicationFunctions() : ServiceFramework("IApplicationF          {24, nullptr, "GetLaunchStorageInfoForDebug"},          {25, nullptr, "ExtendSaveData"},          {26, nullptr, "GetSaveDataSize"}, -        {30, &IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed, -         "BeginBlockingHomeButtonShortAndLongPressed"}, -        {31, &IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed, -         "EndBlockingHomeButtonShortAndLongPressed"}, +        {30, &IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed, "BeginBlockingHomeButtonShortAndLongPressed"}, +        {31, &IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed, "EndBlockingHomeButtonShortAndLongPressed"},          {32, &IApplicationFunctions::BeginBlockingHomeButton, "BeginBlockingHomeButton"},          {33, &IApplicationFunctions::EndBlockingHomeButton, "EndBlockingHomeButton"},          {40, &IApplicationFunctions::NotifyRunning, "NotifyRunning"}, @@ -666,6 +690,8 @@ IApplicationFunctions::IApplicationFunctions() : ServiceFramework("IApplicationF          {1000, nullptr, "CreateMovieMaker"},          {1001, nullptr, "PrepareForJit"},      }; +    // clang-format on +      RegisterHandlers(functions);  } @@ -804,9 +830,11 @@ void InstallInterfaces(SM::ServiceManager& service_manager,      std::make_shared<IdleSys>()->InstallAsService(service_manager);      std::make_shared<OMM>()->InstallAsService(service_manager);      std::make_shared<SPSM>()->InstallAsService(service_manager); +    std::make_shared<TCAP>()->InstallAsService(service_manager);  }  IHomeMenuFunctions::IHomeMenuFunctions() : ServiceFramework("IHomeMenuFunctions") { +    // clang-format off      static const FunctionInfo functions[] = {          {10, &IHomeMenuFunctions::RequestToGetForeground, "RequestToGetForeground"},          {11, nullptr, "LockForeground"}, @@ -815,7 +843,10 @@ IHomeMenuFunctions::IHomeMenuFunctions() : ServiceFramework("IHomeMenuFunctions"          {21, nullptr, "GetPopFromGeneralChannelEvent"},          {30, nullptr, "GetHomeButtonWriterLockAccessor"},          {31, nullptr, "GetWriterLockAccessorEx"}, +        {100, nullptr, "PopRequestLaunchApplicationForDebug"},      }; +    // clang-format on +      RegisterHandlers(functions);  } @@ -828,6 +859,7 @@ void IHomeMenuFunctions::RequestToGetForeground(Kernel::HLERequestContext& ctx)  }  IGlobalStateController::IGlobalStateController() : ServiceFramework("IGlobalStateController") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "RequestToEnterSleep"},          {1, nullptr, "EnterSleep"}, @@ -841,18 +873,23 @@ IGlobalStateController::IGlobalStateController() : ServiceFramework("IGlobalStat          {14, nullptr, "ShouldSleepOnBoot"},          {15, nullptr, "GetHdcpAuthenticationFailedEvent"},      }; +    // clang-format on +      RegisterHandlers(functions);  }  IGlobalStateController::~IGlobalStateController() = default;  IApplicationCreator::IApplicationCreator() : ServiceFramework("IApplicationCreator") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "CreateApplication"},          {1, nullptr, "PopLaunchRequestedApplication"},          {10, nullptr, "CreateSystemApplication"},          {100, nullptr, "PopFloatingApplicationForDevelopment"},      }; +    // clang-format on +      RegisterHandlers(functions);  } @@ -860,6 +897,7 @@ IApplicationCreator::~IApplicationCreator() = default;  IProcessWindingController::IProcessWindingController()      : ServiceFramework("IProcessWindingController") { +    // clang-format off      static const FunctionInfo functions[] = {          {0, nullptr, "GetLaunchReason"},          {11, nullptr, "OpenCallingLibraryApplet"}, @@ -870,6 +908,8 @@ IProcessWindingController::IProcessWindingController()          {40, nullptr, "ReserveToStartAndWaitAndUnwindThis"},          {41, nullptr, "ReserveToStartAndWait"},      }; +    // clang-format on +      RegisterHandlers(functions);  } diff --git a/src/core/hle/service/am/applet_ae.cpp b/src/core/hle/service/am/applet_ae.cpp index 4296c255e..68ea778e8 100644 --- a/src/core/hle/service/am/applet_ae.cpp +++ b/src/core/hle/service/am/applet_ae.cpp @@ -211,6 +211,7 @@ void AppletAE::OpenLibraryAppletProxyOld(Kernel::HLERequestContext& ctx) {  AppletAE::AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)      : ServiceFramework("appletAE"), nvflinger(std::move(nvflinger)) { +    // clang-format off      static const FunctionInfo functions[] = {          {100, &AppletAE::OpenSystemAppletProxy, "OpenSystemAppletProxy"},          {200, &AppletAE::OpenLibraryAppletProxyOld, "OpenLibraryAppletProxyOld"}, @@ -218,7 +219,10 @@ AppletAE::AppletAE(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)          {300, nullptr, "OpenOverlayAppletProxy"},          {350, nullptr, "OpenSystemApplicationProxy"},          {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, +        {401, nullptr, "GetSystemAppletControllerForDebug"},      }; +    // clang-format on +      RegisterHandlers(functions);  } diff --git a/src/core/hle/service/am/applet_oe.cpp b/src/core/hle/service/am/applet_oe.cpp index e45cf6e20..60717afd9 100644 --- a/src/core/hle/service/am/applet_oe.cpp +++ b/src/core/hle/service/am/applet_oe.cpp @@ -14,6 +14,7 @@ class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {  public:      explicit IApplicationProxy(std::shared_ptr<NVFlinger::NVFlinger> nvflinger)          : ServiceFramework("IApplicationProxy"), nvflinger(std::move(nvflinger)) { +        // clang-format off          static const FunctionInfo functions[] = {              {0, &IApplicationProxy::GetCommonStateGetter, "GetCommonStateGetter"},              {1, &IApplicationProxy::GetSelfController, "GetSelfController"}, @@ -25,6 +26,8 @@ public:              {20, &IApplicationProxy::GetApplicationFunctions, "GetApplicationFunctions"},              {1000, &IApplicationProxy::GetDebugFunctions, "GetDebugFunctions"},          }; +        // clang-format on +          RegisterHandlers(functions);      } diff --git a/src/core/hle/service/am/idle.cpp b/src/core/hle/service/am/idle.cpp index 0e3088bc8..f814fe2c0 100644 --- a/src/core/hle/service/am/idle.cpp +++ b/src/core/hle/service/am/idle.cpp @@ -12,9 +12,9 @@ IdleSys::IdleSys() : ServiceFramework{"idle:sys"} {          {0, nullptr, "GetAutoPowerDownEvent"},          {1, nullptr, "Unknown1"},          {2, nullptr, "Unknown2"}, -        {3, nullptr, "Unknown3"}, -        {4, nullptr, "Unknown4"}, -        {5, nullptr, "Unknown5"}, +        {3, nullptr, "SetHandlingContext"}, +        {4, nullptr, "LoadAndApplySettings"}, +        {5, nullptr, "ReportUserIsActive"},      };      // clang-format on diff --git a/src/core/hle/service/am/tcap.cpp b/src/core/hle/service/am/tcap.cpp new file mode 100644 index 000000000..a75cbdda8 --- /dev/null +++ b/src/core/hle/service/am/tcap.cpp @@ -0,0 +1,23 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/am/tcap.h" + +namespace Service::AM { + +TCAP::TCAP() : ServiceFramework{"tcap"} { +    // clang-format off +    static const FunctionInfo functions[] = { +        {0, nullptr, "GetContinuousHighSkinTemperatureEvent"}, +        {1, nullptr, "SetOperationMode"}, +        {2, nullptr, "LoadAndApplySettings"}, +    }; +    // clang-format on + +    RegisterHandlers(functions); +} + +TCAP::~TCAP() = default; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/tcap.h b/src/core/hle/service/am/tcap.h new file mode 100644 index 000000000..2021b55d1 --- /dev/null +++ b/src/core/hle/service/am/tcap.h @@ -0,0 +1,17 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service::AM { + +class TCAP final : public ServiceFramework<TCAP> { +public: +    explicit TCAP(); +    ~TCAP() override; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index b26593b4f..b06e65a77 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -26,7 +26,11 @@ constexpr s32 HID_JOYSTICK_MAX = 0x7fff;  constexpr s32 HID_JOYSTICK_MIN = -0x7fff;  constexpr std::size_t NPAD_OFFSET = 0x9A00;  constexpr u32 BATTERY_FULL = 2; - +constexpr u32 NPAD_HANDHELD = 32; +constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this? +constexpr u32 MAX_NPAD_ID = 7; +constexpr Controller_NPad::NPadControllerType PREFERRED_CONTROLLER = +    Controller_NPad::NPadControllerType::JoyDual;  constexpr std::array<u32, 10> npad_id_list{      0, 1, 2, 3, 4, 5, 6, 7, 32, 16,  }; @@ -121,7 +125,7 @@ void Controller_NPad::OnInit() {          supported_npad_id_types.resize(npad_id_list.size());          std::memcpy(supported_npad_id_types.data(), npad_id_list.data(),                      npad_id_list.size() * sizeof(u32)); -        AddNewController(NPadControllerType::JoyDual); +        AddNewController(PREFERRED_CONTROLLER);      }  } @@ -218,6 +222,51 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {          rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX);          rstick_entry.y = static_cast<s32>(stick_r_y_f * HID_JOYSTICK_MAX); +        if (controller_type == NPadControllerType::JoyLeft || +            controller_type == NPadControllerType::JoyRight) { +            if (npad.properties.is_horizontal) { +                ControllerPadState state{}; +                AnalogPosition temp_lstick_entry{}; +                AnalogPosition temp_rstick_entry{}; +                if (controller_type == NPadControllerType::JoyLeft) { +                    state.d_down.Assign(pad_state.d_left.Value()); +                    state.d_left.Assign(pad_state.d_up.Value()); +                    state.d_right.Assign(pad_state.d_down.Value()); +                    state.d_up.Assign(pad_state.d_right.Value()); +                    state.l.Assign(pad_state.l.Value() | pad_state.sl.Value()); +                    state.r.Assign(pad_state.r.Value() | pad_state.sr.Value()); + +                    state.zl.Assign(pad_state.zl.Value()); +                    state.plus.Assign(pad_state.minus.Value()); + +                    temp_lstick_entry = lstick_entry; +                    temp_rstick_entry = rstick_entry; +                    std::swap(temp_lstick_entry.x, temp_lstick_entry.y); +                    std::swap(temp_rstick_entry.x, temp_rstick_entry.y); +                    temp_lstick_entry.y *= -1; +                } else if (controller_type == NPadControllerType::JoyRight) { +                    state.x.Assign(pad_state.a.Value()); +                    state.a.Assign(pad_state.b.Value()); +                    state.b.Assign(pad_state.y.Value()); +                    state.y.Assign(pad_state.b.Value()); + +                    state.l.Assign(pad_state.l.Value() | pad_state.sl.Value()); +                    state.r.Assign(pad_state.r.Value() | pad_state.sr.Value()); +                    state.zr.Assign(pad_state.zr.Value()); +                    state.plus.Assign(pad_state.plus.Value()); + +                    temp_lstick_entry = lstick_entry; +                    temp_rstick_entry = rstick_entry; +                    std::swap(temp_lstick_entry.x, temp_lstick_entry.y); +                    std::swap(temp_rstick_entry.x, temp_rstick_entry.y); +                    temp_rstick_entry.x *= -1; +                } +                pad_state.raw = state.raw; +                lstick_entry = temp_lstick_entry; +                rstick_entry = temp_rstick_entry; +            } +        } +          auto& main_controller =              npad.main_controller_states.npad[npad.main_controller_states.common.last_entry_index];          auto& handheld_entry = @@ -320,6 +369,16 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) {      supported_npad_id_types.clear();      supported_npad_id_types.resize(length / sizeof(u32));      std::memcpy(supported_npad_id_types.data(), data, length); +    for (std::size_t i = 0; i < connected_controllers.size(); i++) { +        auto& controller = connected_controllers[i]; +        if (!controller.is_connected) { +            continue; +        } +        if (!IsControllerSupported(PREFERRED_CONTROLLER)) { +            controller.type = DecideBestController(PREFERRED_CONTROLLER); +            InitNewlyAddedControler(i); +        } +    }  }  void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { @@ -351,11 +410,11 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids,      for (std::size_t i = 0; i < controller_ids.size(); i++) {          std::size_t controller_pos = i;          // Handheld controller conversion -        if (controller_pos == 32) { +        if (controller_pos == NPAD_HANDHELD) {              controller_pos = 8;          }          // Unknown controller conversion -        if (controller_pos == 16) { +        if (controller_pos == NPAD_UNKNOWN) {              controller_pos = 9;          }          if (connected_controllers[controller_pos].is_connected) { @@ -433,4 +492,128 @@ Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) {  void Controller_NPad::SetVibrationEnabled(bool can_vibrate) {      can_controllers_vibrate = can_vibrate;  } + +bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const { +    const bool support_handheld = +        std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), NPAD_HANDHELD) != +        supported_npad_id_types.end(); +    if (controller == NPadControllerType::Handheld) { +        // Handheld is not even a supported type, lets stop here +        if (!support_handheld) { +            return false; +        } +        // Handheld should not be supported in docked mode +        if (Settings::values.use_docked_mode) { +            return false; +        } + +        return true; +    } +    if (std::any_of(supported_npad_id_types.begin(), supported_npad_id_types.end(), +                    [](u32 npad_id) { return npad_id <= MAX_NPAD_ID; })) { +        switch (controller) { +        case NPadControllerType::ProController: +            return style.pro_controller; +        case NPadControllerType::JoyDual: +            return style.joycon_dual; +        case NPadControllerType::JoyLeft: +            return style.joycon_left; +        case NPadControllerType::JoyRight: +            return style.joycon_right; +        case NPadControllerType::Pokeball: +            return style.pokeball; +        default: +            return false; +        } +    } +    return false; +} + +Controller_NPad::NPadControllerType Controller_NPad::DecideBestController( +    NPadControllerType priority) const { +    if (IsControllerSupported(priority)) { +        return priority; +    } +    const auto is_docked = Settings::values.use_docked_mode; +    if (is_docked && priority == NPadControllerType::Handheld) { +        priority = NPadControllerType::JoyDual; +        if (IsControllerSupported(priority)) { +            return priority; +        } +    } +    std::vector<NPadControllerType> priority_list; +    switch (priority) { +    case NPadControllerType::ProController: +        priority_list.push_back(NPadControllerType::JoyDual); +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::Pokeball); +        break; +    case NPadControllerType::Handheld: +        priority_list.push_back(NPadControllerType::JoyDual); +        priority_list.push_back(NPadControllerType::ProController); +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::Pokeball); +        break; +    case NPadControllerType::JoyDual: +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::ProController); +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::Pokeball); +        break; +    case NPadControllerType::JoyLeft: +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::JoyDual); +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::ProController); +        priority_list.push_back(NPadControllerType::Pokeball); +        break; +    case NPadControllerType::JoyRight: +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyDual); +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::ProController); +        priority_list.push_back(NPadControllerType::Pokeball); +        break; +    case NPadControllerType::Pokeball: +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::JoyDual); +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::ProController); +        break; +    default: +        priority_list.push_back(NPadControllerType::JoyDual); +        if (!is_docked) { +            priority_list.push_back(NPadControllerType::Handheld); +        } +        priority_list.push_back(NPadControllerType::ProController); +        priority_list.push_back(NPadControllerType::JoyLeft); +        priority_list.push_back(NPadControllerType::JoyRight); +        priority_list.push_back(NPadControllerType::JoyDual); +    } + +    const auto iter = std::find_if(priority_list.begin(), priority_list.end(), +                                   [this](auto type) { return IsControllerSupported(type); }); +    if (iter == priority_list.end()) { +        UNIMPLEMENTED_MSG("Could not find supported controller!"); +        return priority; +    } + +    return *iter; +} +  } // namespace Service::HID diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 7c0f93acf..ac86985ff 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -283,5 +283,7 @@ private:      bool can_controllers_vibrate{true};      void InitNewlyAddedControler(std::size_t controller_idx); +    bool IsControllerSupported(NPadControllerType controller) const; +    NPadControllerType DecideBestController(NPadControllerType priority) const;  };  } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index beb89218a..a9aa9ec78 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -827,6 +827,7 @@ public:              {11, nullptr, "EnableJoyPollingReceiveMode"},              {12, nullptr, "DisableJoyPollingReceiveMode"},              {13, nullptr, "GetPollingData"}, +            {14, nullptr, "SetStatusManagerType"},          };          // clang-format on diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index 7321584e1..164c57e18 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -18,35 +18,35 @@ public:      explicit LBL() : ServiceFramework{"lbl"} {          // clang-format off          static const FunctionInfo functions[] = { -            {0, nullptr, "Unknown1"}, -            {1, nullptr, "Unknown2"}, -            {2, nullptr, "Unknown3"}, -            {3, nullptr, "GetCurrentBacklightLevel"}, -            {4, nullptr, "Unknown4"}, -            {5, nullptr, "GetAlsComputedBacklightLevel"}, -            {6, nullptr, "TurnOffBacklight"}, -            {7, nullptr, "TurnOnBacklight"}, -            {8, nullptr, "GetBacklightStatus"}, -            {9, nullptr, "Unknown5"}, -            {10, nullptr, "Unknown6"}, -            {11, nullptr, "Unknown7"}, -            {12, nullptr, "Unknown8"}, -            {13, nullptr, "Unknown9"}, -            {14, nullptr, "Unknown10"}, -            {15, nullptr, "GetAutoBrightnessSetting"}, -            {16, nullptr, "ReadRawLightSensor"}, -            {17, nullptr, "Unknown11"}, -            {18, nullptr, "Unknown12"}, -            {19, nullptr, "Unknown13"}, -            {20, nullptr, "Unknown14"}, -            {21, nullptr, "Unknown15"}, -            {22, nullptr, "Unknown16"}, -            {23, nullptr, "Unknown17"}, -            {24, nullptr, "Unknown18"}, -            {25, nullptr, "Unknown19"}, +            {0, nullptr, "SaveCurrentSetting"}, +            {1, nullptr, "LoadCurrentSetting"}, +            {2, nullptr, "SetCurrentBrightnessSetting"}, +            {3, nullptr, "GetCurrentBrightnessSetting"}, +            {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, +            {5, nullptr, "GetBrightnessSettingAppliedToBacklight"}, +            {6, nullptr, "SwitchBacklightOn"}, +            {7, nullptr, "SwitchBacklightOff"}, +            {8, nullptr, "GetBacklightSwitchStatus"}, +            {9, nullptr, "EnableDimming"}, +            {10, nullptr, "DisableDimming"}, +            {11, nullptr, "IsDimmingEnabled"}, +            {12, nullptr, "EnableAutoBrightnessControl"}, +            {13, nullptr, "DisableAutoBrightnessControl"}, +            {14, nullptr, "IsAutoBrightnessControlEnabled"}, +            {15, nullptr, "SetAmbientLightSensorValue"}, +            {16, nullptr, "GetAmbientLightSensorValue"}, +            {17, nullptr, "SetBrightnessReflectionDelayLevel"}, +            {18, nullptr, "GetBrightnessReflectionDelayLevel"}, +            {19, nullptr, "SetCurrentBrightnessMapping"}, +            {20, nullptr, "GetCurrentBrightnessMapping"}, +            {21, nullptr, "SetCurrentAmbientLightSensorMapping"}, +            {22, nullptr, "GetCurrentAmbientLightSensorMapping"}, +            {23, nullptr, "IsAmbientLightSensorAvailable"}, +            {24, nullptr, "SetCurrentBrightnessSettingForVrMode"}, +            {25, nullptr, "GetCurrentBrightnessSettingForVrMode"},              {26, &LBL::EnableVrMode, "EnableVrMode"},              {27, &LBL::DisableVrMode, "DisableVrMode"}, -            {28, &LBL::GetVrMode, "GetVrMode"}, +            {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},          };          // clang-format on @@ -72,7 +72,7 @@ private:          LOG_DEBUG(Service_LBL, "called");      } -    void GetVrMode(Kernel::HLERequestContext& ctx) { +    void IsVrModeEnabled(Kernel::HLERequestContext& ctx) {          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(RESULT_SUCCESS);          rb.Push(vr_mode_enabled); diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp new file mode 100644 index 000000000..ccb6f9da9 --- /dev/null +++ b/src/core/hle/service/npns/npns.cpp @@ -0,0 +1,88 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <memory> + +#include "core/hle/service/npns/npns.h" +#include "core/hle/service/service.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::NPNS { + +class NPNS_S final : public ServiceFramework<NPNS_S> { +public: +    explicit NPNS_S() : ServiceFramework{"npns:s"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {1, nullptr, "ListenAll"}, +            {2, nullptr, "ListenTo"}, +            {3, nullptr, "Receive"}, +            {4, nullptr, "ReceiveRaw"}, +            {5, nullptr, "GetReceiveEvent"}, +            {6, nullptr, "ListenUndelivered"}, +            {7, nullptr, "GetStateChangeEVent"}, +            {11, nullptr, "SubscribeTopic"}, +            {12, nullptr, "UnsubscribeTopic"}, +            {13, nullptr, "QueryIsTopicExist"}, +            {21, nullptr, "CreateToken"}, +            {22, nullptr, "CreateTokenWithApplicationId"}, +            {23, nullptr, "DestroyToken"}, +            {24, nullptr, "DestroyTokenWithApplicationId"}, +            {25, nullptr, "QueryIsTokenValid"}, +            {31, nullptr, "UploadTokenToBaaS"}, +            {32, nullptr, "DestroyTokenForBaaS"}, +            {33, nullptr, "CreateTokenForBaaS"}, +            {34, nullptr, "SetBaaSDeviceAccountIdList"}, +            {101, nullptr, "Suspend"}, +            {102, nullptr, "Resume"}, +            {103, nullptr, "GetState"}, +            {104, nullptr, "GetStatistics"}, +            {105, nullptr, "GetPlayReportRequestEvent"}, +            {111, nullptr, "GetJid"}, +            {112, nullptr, "CreateJid"}, +            {113, nullptr, "DestroyJid"}, +            {114, nullptr, "AttachJid"}, +            {115, nullptr, "DetachJid"}, +            {201, nullptr, "RequestChangeStateForceTimed"}, +            {102, nullptr, "RequestChangeStateForceAsync"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class NPNS_U final : public ServiceFramework<NPNS_U> { +public: +    explicit NPNS_U() : ServiceFramework{"npns:u"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {1, nullptr, "ListenAll"}, +            {2, nullptr, "ListenTo"}, +            {3, nullptr, "Receive"}, +            {4, nullptr, "ReceiveRaw"}, +            {5, nullptr, "GetReceiveEvent"}, +            {7, nullptr, "GetStateChangeEVent"}, +            {21, nullptr, "CreateToken"}, +            {23, nullptr, "DestroyToken"}, +            {25, nullptr, "QueryIsTokenValid"}, +            {26, nullptr, "ListenToMyApplicationId"}, +            {101, nullptr, "Suspend"}, +            {102, nullptr, "Resume"}, +            {103, nullptr, "GetState"}, +            {104, nullptr, "GetStatistics"}, +            {111, nullptr, "GetJid"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +void InstallInterfaces(SM::ServiceManager& sm) { +    std::make_shared<NPNS_S>()->InstallAsService(sm); +    std::make_shared<NPNS_U>()->InstallAsService(sm); +} + +} // namespace Service::NPNS diff --git a/src/core/hle/service/npns/npns.h b/src/core/hle/service/npns/npns.h new file mode 100644 index 000000000..861cd3e48 --- /dev/null +++ b/src/core/hle/service/npns/npns.h @@ -0,0 +1,15 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +namespace Service::SM { +class ServiceManager; +} + +namespace Service::NPNS { + +void InstallInterfaces(SM::ServiceManager& sm); + +} // namespace Service::NPNS diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index 6a9eccfb5..e4fcee9f8 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -14,20 +14,24 @@ public:      explicit PlayReport(const char* name) : ServiceFramework{name} {          // clang-format off          static const FunctionInfo functions[] = { -            {10100, nullptr, "SaveReport"}, -            {10101, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, +            {10100, nullptr, "SaveReportOld"}, +            {10101, &PlayReport::SaveReportWithUserOld, "SaveReportWithUserOld"}, +            {10102, nullptr, "SaveReport"}, +            {10103, nullptr, "SaveReportWithUser"},              {10200, nullptr, "RequestImmediateTransmission"},              {10300, nullptr, "GetTransmissionStatus"},              {20100, nullptr, "SaveSystemReport"}, -            {20200, nullptr, "SetOperationMode"},              {20101, nullptr, "SaveSystemReportWithUser"}, +            {20200, nullptr, "SetOperationMode"},              {30100, nullptr, "ClearStorage"}, +            {30200, nullptr, "ClearStatistics"}, +            {30300, nullptr, "GetStorageUsage"}, +            {30400, nullptr, "GetStatistics"}, +            {30401, nullptr, "GetThroughputHistory"}, +            {30500, nullptr, "GetLastUploadError"},              {40100, nullptr, "IsUserAgreementCheckEnabled"},              {40101, nullptr, "SetUserAgreementCheckEnabled"}, -            {90100, nullptr, "GetStorageUsage"}, -            {90200, nullptr, "GetStatistics"}, -            {90201, nullptr, "GetThroughputHistory"}, -            {90300, nullptr, "GetLastUploadError"}, +            {90100, nullptr, "ReadAllReportFiles"},          };          // clang-format on @@ -35,7 +39,7 @@ public:      }  private: -    void SaveReportWithUser(Kernel::HLERequestContext& ctx) { +    void SaveReportWithUserOld(Kernel::HLERequestContext& ctx) {          // TODO(ogniK): Do we want to add play report?          LOG_WARNING(Service_PREPO, "(STUBBED) called"); @@ -46,6 +50,7 @@ private:  void InstallInterfaces(SM::ServiceManager& service_manager) {      std::make_shared<PlayReport>("prepo:a")->InstallAsService(service_manager); +    std::make_shared<PlayReport>("prepo:a2")->InstallAsService(service_manager);      std::make_shared<PlayReport>("prepo:m")->InstallAsService(service_manager);      std::make_shared<PlayReport>("prepo:s")->InstallAsService(service_manager);      std::make_shared<PlayReport>("prepo:u")->InstallAsService(service_manager); diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp new file mode 100644 index 000000000..c2d5fda94 --- /dev/null +++ b/src/core/hle/service/ptm/psm.cpp @@ -0,0 +1,71 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <memory> + +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/service/ptm/psm.h" +#include "core/hle/service/service.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::PSM { + +constexpr u32 BATTERY_FULLY_CHARGED = 100;    // 100% Full +constexpr u32 BATTERY_CURRENTLY_CHARGING = 1; // Plugged into an official dock + +class PSM final : public ServiceFramework<PSM> { +public: +    explicit PSM() : ServiceFramework{"psm"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, +            {1, &PSM::GetChargerType, "GetChargerType"}, +            {2, nullptr, "EnableBatteryCharging"}, +            {3, nullptr, "DisableBatteryCharging"}, +            {4, nullptr, "IsBatteryChargingEnabled"}, +            {5, nullptr, "AcquireControllerPowerSupply"}, +            {6, nullptr, "ReleaseControllerPowerSupply"}, +            {7, nullptr, "OpenSession"}, +            {8, nullptr, "EnableEnoughPowerChargeEmulation"}, +            {9, nullptr, "DisableEnoughPowerChargeEmulation"}, +            {10, nullptr, "EnableFastBatteryCharging"}, +            {11, nullptr, "DisableFastBatteryCharging"}, +            {12, nullptr, "GetBatteryVoltageState"}, +            {13, nullptr, "GetRawBatteryChargePercentage"}, +            {14, nullptr, "IsEnoughPowerSupplied"}, +            {15, nullptr, "GetBatteryAgePercentage"}, +            {16, nullptr, "GetBatteryChargeInfoEvent"}, +            {17, nullptr, "GetBatteryChargeInfoFields"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } + +    ~PSM() override = default; + +private: +    void GetBatteryChargePercentage(Kernel::HLERequestContext& ctx) { +        LOG_WARNING(Service_PSM, "(STUBBED) called"); + +        IPC::ResponseBuilder rb{ctx, 3}; +        rb.Push(RESULT_SUCCESS); +        rb.Push<u32>(BATTERY_FULLY_CHARGED); +    } + +    void GetChargerType(Kernel::HLERequestContext& ctx) { +        LOG_WARNING(Service_PSM, "(STUBBED) called"); + +        IPC::ResponseBuilder rb{ctx, 3}; +        rb.Push(RESULT_SUCCESS); +        rb.Push<u32>(BATTERY_CURRENTLY_CHARGING); +    } +}; + +void InstallInterfaces(SM::ServiceManager& sm) { +    std::make_shared<PSM>()->InstallAsService(sm); +} + +} // namespace Service::PSM diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h new file mode 100644 index 000000000..a286793ae --- /dev/null +++ b/src/core/hle/service/ptm/psm.h @@ -0,0 +1,15 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +namespace Service::SM { +class ServiceManager; +} + +namespace Service::PSM { + +void InstallInterfaces(SM::ServiceManager& sm); + +} // namespace Service::PSM diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index a225cb4cb..a4cf45267 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -22,7 +22,7 @@  #include "core/hle/service/apm/apm.h"  #include "core/hle/service/arp/arp.h"  #include "core/hle/service/audio/audio.h" -#include "core/hle/service/bcat/bcat.h" +#include "core/hle/service/bcat/module.h"  #include "core/hle/service/bpc/bpc.h"  #include "core/hle/service/btdrv/btdrv.h"  #include "core/hle/service/btm/btm.h" @@ -48,15 +48,17 @@  #include "core/hle/service/nfp/nfp.h"  #include "core/hle/service/nifm/nifm.h"  #include "core/hle/service/nim/nim.h" +#include "core/hle/service/npns/npns.h"  #include "core/hle/service/ns/ns.h"  #include "core/hle/service/nvdrv/nvdrv.h"  #include "core/hle/service/nvflinger/nvflinger.h"  #include "core/hle/service/pcie/pcie.h" -#include "core/hle/service/pctl/pctl.h" +#include "core/hle/service/pctl/module.h"  #include "core/hle/service/pcv/pcv.h"  #include "core/hle/service/pm/pm.h"  #include "core/hle/service/prepo/prepo.h"  #include "core/hle/service/psc/psc.h" +#include "core/hle/service/ptm/psm.h"  #include "core/hle/service/service.h"  #include "core/hle/service/set/settings.h"  #include "core/hle/service/sm/sm.h" @@ -236,6 +238,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, FileSys::VfsFilesystem& vfs)      NFP::InstallInterfaces(*sm);      NIFM::InstallInterfaces(*sm);      NIM::InstallInterfaces(*sm); +    NPNS::InstallInterfaces(*sm);      NS::InstallInterfaces(*sm);      Nvidia::InstallInterfaces(*sm, *nv_flinger);      PCIe::InstallInterfaces(*sm); @@ -244,6 +247,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, FileSys::VfsFilesystem& vfs)      PlayReport::InstallInterfaces(*sm);      PM::InstallInterfaces(*sm);      PSC::InstallInterfaces(*sm); +    PSM::InstallInterfaces(*sm);      Set::InstallInterfaces(*sm);      Sockets::InstallInterfaces(*sm);      SPL::InstallInterfaces(*sm); | 
