diff options
Diffstat (limited to 'src/core')
28 files changed, 344 insertions, 29 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index c11f017da..0abf7edc1 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -315,6 +315,8 @@ add_library(core STATIC      hle/service/time/interface.h      hle/service/time/time.cpp      hle/service/time/time.h +    hle/service/usb/usb.cpp +    hle/service/usb/usb.h      hle/service/vi/vi.cpp      hle/service/vi/vi.h      hle/service/vi/vi_m.cpp diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index 7933c105c..134e41ebc 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp @@ -14,8 +14,8 @@  namespace Kernel { -ClientPort::ClientPort() {} -ClientPort::~ClientPort() {} +ClientPort::ClientPort() = default; +ClientPort::~ClientPort() = default;  ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {      // Note: Threads do not wait for the server endpoint to call @@ -40,4 +40,12 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {      return MakeResult(std::get<SharedPtr<ClientSession>>(sessions));  } +void ClientPort::ConnectionClosed() { +    if (active_sessions == 0) { +        return; +    } + +    --active_sessions; +} +  } // namespace Kernel diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h index b42c94bde..b1269ea5c 100644 --- a/src/core/hle/kernel/client_port.h +++ b/src/core/hle/kernel/client_port.h @@ -37,14 +37,20 @@ public:       */      ResultVal<SharedPtr<ClientSession>> Connect(); -    SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port. -    u32 max_sessions;    ///< Maximum number of simultaneous sessions the port can have -    u32 active_sessions; ///< Number of currently open sessions to this port -    std::string name;    ///< Name of client port (optional) +    /** +     * Signifies that a previously active connection has been closed, +     * decreasing the total number of active connections to this port. +     */ +    void ConnectionClosed();  private:      ClientPort();      ~ClientPort() override; + +    SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port. +    u32 max_sessions = 0;    ///< Maximum number of simultaneous sessions the port can have +    u32 active_sessions = 0; ///< Number of currently open sessions to this port +    std::string name;        ///< Name of client port (optional)  };  } // namespace Kernel diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 60370e9ec..93560152f 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -27,7 +27,7 @@ ServerSession::~ServerSession() {      // Decrease the port's connection count.      if (parent->port) -        parent->port->active_sessions--; +        parent->port->ConnectionClosed();      // TODO(Subv): Wake up all the ClientSession's waiting threads and set      // the SendSyncRequest result to 0xC920181A. diff --git a/src/core/hle/service/apm/apm.cpp b/src/core/hle/service/apm/apm.cpp index 7a185c6c8..4109cb7f7 100644 --- a/src/core/hle/service/apm/apm.cpp +++ b/src/core/hle/service/apm/apm.cpp @@ -13,6 +13,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager) {      auto module_ = std::make_shared<Module>();      std::make_shared<APM>(module_, "apm")->InstallAsService(service_manager);      std::make_shared<APM>(module_, "apm:p")->InstallAsService(service_manager); +    std::make_shared<APM_Sys>()->InstallAsService(service_manager);  }  } // namespace Service::APM diff --git a/src/core/hle/service/apm/interface.cpp b/src/core/hle/service/apm/interface.cpp index ce943d829..4cd8132f5 100644 --- a/src/core/hle/service/apm/interface.cpp +++ b/src/core/hle/service/apm/interface.cpp @@ -74,6 +74,31 @@ void APM::OpenSession(Kernel::HLERequestContext& ctx) {      IPC::ResponseBuilder rb{ctx, 2, 0, 1};      rb.Push(RESULT_SUCCESS);      rb.PushIpcInterface<ISession>(); + +    LOG_DEBUG(Service_APM, "called"); +} + +APM_Sys::APM_Sys() : ServiceFramework{"apm:sys"} { +    // clang-format off +    static const FunctionInfo functions[] = { +        {0, nullptr, "RequestPerformanceMode"}, +        {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"}, +        {2, nullptr, "GetThrottlingState"}, +        {3, nullptr, "GetLastThrottlingState"}, +        {4, nullptr, "ClearLastThrottlingState"}, +        {5, nullptr, "LoadAndApplySettings"}, +    }; +    // clang-format on + +    RegisterHandlers(functions); +} + +void APM_Sys::GetPerformanceEvent(Kernel::HLERequestContext& ctx) { +    IPC::ResponseBuilder rb{ctx, 2, 0, 1}; +    rb.Push(RESULT_SUCCESS); +    rb.PushIpcInterface<ISession>(); + +    LOG_DEBUG(Service_APM, "called");  }  } // namespace Service::APM diff --git a/src/core/hle/service/apm/interface.h b/src/core/hle/service/apm/interface.h index fa68c7d93..d14264ad7 100644 --- a/src/core/hle/service/apm/interface.h +++ b/src/core/hle/service/apm/interface.h @@ -19,4 +19,12 @@ private:      std::shared_ptr<Module> apm;  }; +class APM_Sys final : public ServiceFramework<APM_Sys> { +public: +    explicit APM_Sys(); + +private: +    void GetPerformanceEvent(Kernel::HLERequestContext& ctx); +}; +  } // namespace Service::APM diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index ed53f96c5..8f0262e34 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -337,6 +337,7 @@ public:               "AcquireNpadStyleSetUpdateEventHandle"},              {107, nullptr, "DisconnectNpad"},              {108, &Hid::GetPlayerLedPattern, "GetPlayerLedPattern"}, +            {109, nullptr, "ActivateNpadWithRevision"},              {120, &Hid::SetNpadJoyHoldType, "SetNpadJoyHoldType"},              {121, &Hid::GetNpadJoyHoldType, "GetNpadJoyHoldType"},              {122, &Hid::SetNpadJoyAssignmentModeSingleByDefault, diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index 2b74e6a33..8bc49935a 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp @@ -7,8 +7,8 @@  #include "core/core.h"  #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h"  #include "core/hle/service/nvdrv/devices/nvmap.h" +#include "video_core/gpu.h"  #include "video_core/renderer_base.h" -#include "video_core/video_core.h"  namespace Service::Nvidia::Devices { diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 4b601781f..be2b79256 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -2,14 +2,15 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include <cinttypes> +#include <cstring>  #include "common/assert.h"  #include "common/logging/log.h"  #include "core/core.h"  #include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h"  #include "core/hle/service/nvdrv/devices/nvmap.h" +#include "video_core/memory_manager.h" +#include "video_core/rasterizer_interface.h"  #include "video_core/renderer_base.h" -#include "video_core/video_core.h"  namespace Service::Nvidia::Devices { diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 671b092e1..5685eb2be 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp @@ -2,6 +2,9 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <cstdlib> +#include <cstring> +  #include "common/assert.h"  #include "common/logging/log.h"  #include "core/hle/service/nvdrv/devices/nvhost_ctrl.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h index 090261a60..6b496e9fe 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h @@ -5,8 +5,6 @@  #pragma once  #include <array> -#include <cstdlib> -#include <cstring>  #include <vector>  #include "common/common_types.h"  #include "core/hle/service/nvdrv/devices/nvdevice.h" 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 010072a5b..ae421247d 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -2,7 +2,7 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include <cinttypes> +#include <cstring>  #include "common/assert.h"  #include "common/logging/log.h"  #include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 5a1123ad2..116dabedb 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -2,12 +2,14 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include <cinttypes> -#include <map> +#include <cstring>  #include "common/assert.h"  #include "common/logging/log.h"  #include "core/core.h"  #include "core/hle/service/nvdrv/devices/nvhost_gpu.h" +#include "core/memory.h" +#include "video_core/gpu.h" +#include "video_core/memory_manager.h"  namespace Service::Nvidia::Devices { diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index aa8df2e6e..650ed8fbc 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h @@ -6,6 +6,7 @@  #include <memory>  #include <vector> +#include "common/bit_field.h"  #include "common/common_types.h"  #include "common/swap.h"  #include "core/hle/service/nvdrv/devices/nvdevice.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index b51c73ee8..364619e67 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp @@ -2,6 +2,8 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <cstring> +  #include "common/assert.h"  #include "common/logging/log.h"  #include "core/hle/service/nvdrv/devices/nvhost_nvdec.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h index 0192aecdd..6ad74421b 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h @@ -4,11 +4,9 @@  #pragma once -#include <array> -#include <cstdlib> -#include <cstring>  #include <vector>  #include "common/common_types.h" +#include "common/swap.h"  #include "core/hle/service/nvdrv/devices/nvdevice.h"  namespace Service::Nvidia::Devices { diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index 724eeb139..e9305bfb3 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -3,7 +3,7 @@  // Refer to the license.txt file included.  #include <algorithm> -#include <cinttypes> +#include <cstring>  #include "common/assert.h"  #include "common/logging/log.h" diff --git a/src/core/hle/service/nvdrv/interface.h b/src/core/hle/service/nvdrv/interface.h index 959b5ba29..1c3529bb6 100644 --- a/src/core/hle/service/nvdrv/interface.h +++ b/src/core/hle/service/nvdrv/interface.h @@ -5,7 +5,6 @@  #pragma once  #include <memory> -#include <string>  #include "core/hle/kernel/event.h"  #include "core/hle/service/nvdrv/nvdrv.h"  #include "core/hle/service/service.h" diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 1555ea806..e8b30921a 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -54,7 +54,7 @@ u32 Module::Open(const std::string& device_name) {      return fd;  } -u32 Module::Ioctl(u32 fd, u32_le command, const std::vector<u8>& input, std::vector<u8>& output) { +u32 Module::Ioctl(u32 fd, u32 command, const std::vector<u8>& input, std::vector<u8>& output) {      auto itr = open_files.find(fd);      ASSERT_MSG(itr != open_files.end(), "Tried to talk to an invalid device"); diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp index 9ca6e5512..0e8e21bad 100644 --- a/src/core/hle/service/nvdrv/nvmemp.cpp +++ b/src/core/hle/service/nvdrv/nvmemp.cpp @@ -4,8 +4,6 @@  #include "common/assert.h"  #include "common/logging/log.h" -#include "core/hle/ipc_helpers.h" -#include "core/hle/service/nvdrv/nvdrv.h"  #include "core/hle/service/nvdrv/nvmemp.h"  namespace Service::Nvidia { diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 58da1fdfa..570aa8493 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp @@ -3,8 +3,11 @@  // Refer to the license.txt file included.  #include <algorithm> +#include <boost/optional.hpp>  #include "common/alignment.h" +#include "common/assert.h" +#include "common/logging/log.h"  #include "common/microprofile.h"  #include "common/scope_exit.h"  #include "core/core.h" @@ -43,7 +46,7 @@ NVFlinger::~NVFlinger() {      CoreTiming::UnscheduleEvent(composition_event, 0);  } -u64 NVFlinger::OpenDisplay(const std::string& name) { +u64 NVFlinger::OpenDisplay(std::string_view name) {      LOG_WARNING(Service, "Opening display {}", name);      // TODO(Subv): Currently we only support the Default display. diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index 2c908297b..5374df175 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h @@ -5,7 +5,11 @@  #pragma once  #include <memory> -#include <boost/optional.hpp> +#include <string> +#include <string_view> +#include <vector> + +#include "common/common_types.h"  #include "core/hle/kernel/event.h"  namespace CoreTiming { @@ -41,7 +45,7 @@ public:      ~NVFlinger();      /// Opens the specified display and returns the id. -    u64 OpenDisplay(const std::string& name); +    u64 OpenDisplay(std::string_view name);      /// Creates a layer on the specified display and returns the layer id.      u64 CreateLayer(u64 display_id); diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 31ea79773..889cdd41a 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -63,6 +63,7 @@  #include "core/hle/service/spl/module.h"  #include "core/hle/service/ssl/ssl.h"  #include "core/hle/service/time/time.h" +#include "core/hle/service/usb/usb.h"  #include "core/hle/service/vi/vi.h"  #include "core/hle/service/wlan/wlan.h" @@ -249,6 +250,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) {      SPL::InstallInterfaces(*sm);      SSL::InstallInterfaces(*sm);      Time::InstallInterfaces(*sm); +    USB::InstallInterfaces(*sm);      VI::InstallInterfaces(*sm, nv_flinger);      WLAN::InstallInterfaces(*sm); diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index 37b58bb77..2172c681b 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp @@ -80,8 +80,8 @@ public:              {5, nullptr, "GetTimeZoneRuleVersion"},              {100, &ITimeZoneService::ToCalendarTime, "ToCalendarTime"},              {101, &ITimeZoneService::ToCalendarTimeWithMyRule, "ToCalendarTimeWithMyRule"}, -            {200, nullptr, "ToPosixTime"}, -            {201, nullptr, "ToPosixTimeWithMyRule"}, +            {201, nullptr, "ToPosixTime"}, +            {202, nullptr, "ToPosixTimeWithMyRule"},          };          RegisterHandlers(functions);      } diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp new file mode 100644 index 000000000..e7fb5a419 --- /dev/null +++ b/src/core/hle/service/usb/usb.cpp @@ -0,0 +1,238 @@ +// 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/kernel/hle_ipc.h" +#include "core/hle/service/service.h" +#include "core/hle/service/sm/sm.h" +#include "core/hle/service/usb/usb.h" + +namespace Service::USB { + +class IDsInterface final : public ServiceFramework<IDsInterface> { +public: +    explicit IDsInterface() : ServiceFramework{"IDsInterface"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "GetDsEndpoint"}, +            {1, nullptr, "GetSetupEvent"}, +            {2, nullptr, "Unknown"}, +            {3, nullptr, "EnableInterface"}, +            {4, nullptr, "DisableInterface"}, +            {5, nullptr, "CtrlInPostBufferAsync"}, +            {6, nullptr, "CtrlOutPostBufferAsync"}, +            {7, nullptr, "GetCtrlInCompletionEvent"}, +            {8, nullptr, "GetCtrlInReportData"}, +            {9, nullptr, "GetCtrlOutCompletionEvent"}, +            {10, nullptr, "GetCtrlOutReportData"}, +            {11, nullptr, "StallCtrl"}, +            {12, nullptr, "AppendConfigurationData"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class USB_DS final : public ServiceFramework<USB_DS> { +public: +    explicit USB_DS() : ServiceFramework{"usb:ds"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "BindDevice"}, +            {1, nullptr, "BindClientProcess"}, +            {2, nullptr, "GetDsInterface"}, +            {3, nullptr, "GetStateChangeEvent"}, +            {4, nullptr, "GetState"}, +            {5, nullptr, "ClearDeviceData"}, +            {6, nullptr, "AddUsbStringDescriptor"}, +            {7, nullptr, "DeleteUsbStringDescriptor"}, +            {8, nullptr, "SetUsbDeviceDescriptor"}, +            {9, nullptr, "SetBinaryObjectStore"}, +            {10, nullptr, "Enable"}, +            {11, nullptr, "Disable"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IClientEpSession final : public ServiceFramework<IClientEpSession> { +public: +    explicit IClientEpSession() : ServiceFramework{"IClientEpSession"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "Unknown1"}, +            {1, nullptr, "Unknown2"}, +            {2, nullptr, "Unknown3"}, +            {3, nullptr, "Unknown4"}, +            {4, nullptr, "PostBufferAsync"}, +            {5, nullptr, "Unknown5"}, +            {6, nullptr, "Unknown6"}, +            {7, nullptr, "Unknown7"}, +            {8, nullptr, "Unknown8"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IClientIfSession final : public ServiceFramework<IClientIfSession> { +public: +    explicit IClientIfSession() : ServiceFramework{"IClientIfSession"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "Unknown1"}, +            {1, nullptr, "Unknown2"}, +            {2, nullptr, "Unknown3"}, +            {3, nullptr, "Unknown4"}, +            {4, nullptr, "Unknown5"}, +            {5, nullptr, "CtrlXferAsync"}, +            {6, nullptr, "Unknown6"}, +            {7, nullptr, "GetCtrlXferReport"}, +            {8, nullptr, "Unknown7"}, +            {9, nullptr, "GetClientEpSession"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class USB_HS final : public ServiceFramework<USB_HS> { +public: +    explicit USB_HS() : ServiceFramework{"usb:hs"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "BindClientProcess"}, +            {1, nullptr, "Unknown1"}, +            {2, nullptr, "Unknown2"}, +            {3, nullptr, "Unknown3"}, +            {4, nullptr, "Unknown4"}, +            {5, nullptr, "Unknown5"}, +            {6, nullptr, "GetInterfaceStateChangeEvent"}, +            {7, nullptr, "GetClientIfSession"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class IPdSession final : public ServiceFramework<IPdSession> { +public: +    explicit IPdSession() : ServiceFramework{"IPdSession"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "BindNoticeEvent"}, +            {1, nullptr, "Unknown1"}, +            {2, nullptr, "GetStatus"}, +            {3, nullptr, "GetNotice"}, +            {4, nullptr, "Unknown2"}, +            {5, nullptr, "Unknown3"}, +            {6, nullptr, "ReplyPowerRequest"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class USB_PD final : public ServiceFramework<USB_PD> { +public: +    explicit USB_PD() : ServiceFramework{"usb:pd"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, &USB_PD::GetPdSession, "GetPdSession"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } + +private: +    void GetPdSession(Kernel::HLERequestContext& ctx) { +        IPC::ResponseBuilder rb{ctx, 2, 0, 1}; +        rb.Push(RESULT_SUCCESS); +        rb.PushIpcInterface<IPdSession>(); + +        LOG_DEBUG(Service_USB, "called"); +    } +}; + +class IPdCradleSession final : public ServiceFramework<IPdCradleSession> { +public: +    explicit IPdCradleSession() : ServiceFramework{"IPdCradleSession"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "VdmUserWrite"}, +            {1, nullptr, "VdmUserRead"}, +            {2, nullptr, "Vdm20Init"}, +            {3, nullptr, "GetFwType"}, +            {4, nullptr, "GetFwRevision"}, +            {5, nullptr, "GetManufacturerId"}, +            {6, nullptr, "GetDeviceId"}, +            {7, nullptr, "Unknown1"}, +            {8, nullptr, "Unknown2"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +class USB_PD_C final : public ServiceFramework<USB_PD_C> { +public: +    explicit USB_PD_C() : ServiceFramework{"usb:pd:c"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, &USB_PD_C::GetPdCradleSession, "GetPdCradleSession"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } + +private: +    void GetPdCradleSession(Kernel::HLERequestContext& ctx) { +        IPC::ResponseBuilder rb{ctx, 2, 0, 1}; +        rb.Push(RESULT_SUCCESS); +        rb.PushIpcInterface<IPdCradleSession>(); + +        LOG_DEBUG(Service_USB, "called"); +    } +}; + +class USB_PM final : public ServiceFramework<USB_PM> { +public: +    explicit USB_PM() : ServiceFramework{"usb:pm"} { +        // clang-format off +        static const FunctionInfo functions[] = { +            {0, nullptr, "Unknown1"}, +            {1, nullptr, "Unknown2"}, +            {2, nullptr, "Unknown3"}, +            {3, nullptr, "Unknown4"}, +            {4, nullptr, "Unknown5"}, +            {5, nullptr, "Unknown6"}, +        }; +        // clang-format on + +        RegisterHandlers(functions); +    } +}; + +void InstallInterfaces(SM::ServiceManager& sm) { +    std::make_shared<USB_DS>()->InstallAsService(sm); +    std::make_shared<USB_HS>()->InstallAsService(sm); +    std::make_shared<USB_PD>()->InstallAsService(sm); +    std::make_shared<USB_PD_C>()->InstallAsService(sm); +    std::make_shared<USB_PM>()->InstallAsService(sm); +} + +} // namespace Service::USB diff --git a/src/core/hle/service/usb/usb.h b/src/core/hle/service/usb/usb.h new file mode 100644 index 000000000..970a11fe8 --- /dev/null +++ b/src/core/hle/service/usb/usb.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::USB { + +void InstallInterfaces(SM::ServiceManager& sm); + +} // namespace Service::USB diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 076927dff..9a8cdd0ff 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -41,7 +41,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(      if (dir == nullptr) {          if (file == nullptr)              return ResultStatus::ErrorInvalidFormat; -        const FileSys::VirtualDir dir = file->GetContainingDirectory(); +        dir = file->GetContainingDirectory();      }      const FileSys::VirtualFile npdm = dir->GetFile("main.npdm");  | 
