Просмотр исходного кода

Service/spl: add module and services

mailwl 8 лет назад
Родитель
Сommit
95e747cd06

+ 1 - 0
src/common/logging/backend.cpp

@@ -48,6 +48,7 @@ namespace Log {
     SUB(Service, PCTL)                                                                             \
     SUB(Service, SET)                                                                              \
     SUB(Service, SM)                                                                               \
+    SUB(Service, SPL)                                                                              \
     SUB(Service, Time)                                                                             \
     SUB(Service, VI)                                                                               \
     CLS(HW)                                                                                        \

+ 1 - 0
src/common/logging/log.h

@@ -65,6 +65,7 @@ enum class Class : ClassType {
     Service_PCTL,      ///< The PCTL (Parental control) service
     Service_SET,       ///< The SET (Settings) service
     Service_SM,        ///< The SM (Service manager) service
+    Service_SPL,       ///< The SPL service
     Service_Time,      ///< The time service
     Service_VI,        ///< The VI (Video interface) service
     HW,                ///< Low-level hardware emulation

+ 6 - 0
src/core/CMakeLists.txt

@@ -193,6 +193,12 @@ add_library(core STATIC
     hle/service/sockets/sfdnsres.h
     hle/service/sockets/sockets.cpp
     hle/service/sockets/sockets.h
+    hle/service/spl/csrng.cpp
+    hle/service/spl/csrng.h
+    hle/service/spl/module.cpp
+    hle/service/spl/module.h
+    hle/service/spl/spl.cpp
+    hle/service/spl/spl.h
     hle/service/time/time.cpp
     hle/service/time/time.h
     hle/service/time/time_s.cpp

+ 2 - 0
src/core/hle/service/service.cpp

@@ -34,6 +34,7 @@
 #include "core/hle/service/sm/controller.h"
 #include "core/hle/service/sm/sm.h"
 #include "core/hle/service/sockets/sockets.h"
+#include "core/hle/service/spl/module.h"
 #include "core/hle/service/time/time.h"
 #include "core/hle/service/vi/vi.h"
 
@@ -190,6 +191,7 @@ void Init() {
     Nvidia::InstallInterfaces(*SM::g_service_manager);
     PCTL::InstallInterfaces(*SM::g_service_manager);
     Sockets::InstallInterfaces(*SM::g_service_manager);
+    SPL::InstallInterfaces(*SM::g_service_manager);
     Time::InstallInterfaces(*SM::g_service_manager);
     VI::InstallInterfaces(*SM::g_service_manager, nv_flinger);
     Set::InstallInterfaces(*SM::g_service_manager);

+ 18 - 0
src/core/hle/service/spl/csrng.cpp

@@ -0,0 +1,18 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/spl/csrng.h"
+
+namespace Service {
+namespace SPL {
+
+CSRNG::CSRNG(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "csrng") {
+    static const FunctionInfo functions[] = {
+        {0, &CSRNG::GetRandomBytes, "GetRandomBytes"},
+    };
+    RegisterHandlers(functions);
+}
+
+} // namespace SPL
+} // namespace Service

+ 18 - 0
src/core/hle/service/spl/csrng.h

@@ -0,0 +1,18 @@
+// 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/spl/module.h"
+
+namespace Service {
+namespace SPL {
+
+class CSRNG final : public Module::Interface {
+public:
+    explicit CSRNG(std::shared_ptr<Module> module);
+};
+
+} // namespace SPL
+} // namespace Service

+ 42 - 0
src/core/hle/service/spl/module.cpp

@@ -0,0 +1,42 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <algorithm>
+#include <cstdlib>
+#include <vector>
+#include "common/logging/log.h"
+#include "core/hle/ipc_helpers.h"
+#include "core/hle/service/spl/csrng.h"
+#include "core/hle/service/spl/module.h"
+#include "core/hle/service/spl/spl.h"
+
+namespace Service {
+namespace SPL {
+
+Module::Interface::Interface(std::shared_ptr<Module> module, const char* name)
+    : ServiceFramework(name), module(std::move(module)) {}
+
+void Module::Interface::GetRandomBytes(Kernel::HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+
+    size_t size = ctx.GetWriteBufferSize();
+
+    std::vector<u8> data(size);
+    std::generate(data.begin(), data.end(), std::rand);
+
+    ctx.WriteBuffer(data);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(RESULT_SUCCESS);
+    LOG_DEBUG(Service_SPL, "called");
+}
+
+void InstallInterfaces(SM::ServiceManager& service_manager) {
+    auto module = std::make_shared<Module>();
+    std::make_shared<CSRNG>(module)->InstallAsService(service_manager);
+    std::make_shared<SPL>(module)->InstallAsService(service_manager);
+}
+
+} // namespace SPL
+} // namespace Service

+ 29 - 0
src/core/hle/service/spl/module.h

@@ -0,0 +1,29 @@
+// 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 {
+namespace SPL {
+
+class Module final {
+public:
+    class Interface : public ServiceFramework<Interface> {
+    public:
+        Interface(std::shared_ptr<Module> module, const char* name);
+
+        void GetRandomBytes(Kernel::HLERequestContext& ctx);
+
+    protected:
+        std::shared_ptr<Module> module;
+    };
+};
+
+/// Registers all SPL services with the specified service manager.
+void InstallInterfaces(SM::ServiceManager& service_manager);
+
+} // namespace SPL
+} // namespace Service

+ 41 - 0
src/core/hle/service/spl/spl.cpp

@@ -0,0 +1,41 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/spl/spl.h"
+
+namespace Service {
+namespace SPL {
+
+SPL::SPL(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "spl:") {
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "GetConfig"},
+        {1, nullptr, "UserExpMod"},
+        {2, nullptr, "GenerateAesKek"},
+        {3, nullptr, "LoadAesKey"},
+        {4, nullptr, "GenerateAesKey"},
+        {5, nullptr, "SetConfig"},
+        {7, &SPL::GetRandomBytes, "GetRandomBytes"},
+        {9, nullptr, "LoadSecureExpModKey"},
+        {10, nullptr, "SecureExpMod"},
+        {11, nullptr, "IsDevelopment"},
+        {12, nullptr, "GenerateSpecificAesKey"},
+        {13, nullptr, "DecryptPrivk"},
+        {14, nullptr, "DecryptAesKey"},
+        {15, nullptr, "DecryptAesCtr"},
+        {16, nullptr, "ComputeCmac"},
+        {17, nullptr, "LoadRsaOaepKey"},
+        {18, nullptr, "UnwrapRsaOaepWrappedTitleKey"},
+        {19, nullptr, "LoadTitleKey"},
+        {20, nullptr, "UnwrapAesWrappedTitleKey"},
+        {21, nullptr, "LockAesEngine"},
+        {22, nullptr, "UnlockAesEngine"},
+        {23, nullptr, "GetSplWaitEvent"},
+        {24, nullptr, "SetSharedData"},
+        {25, nullptr, "GetSharedData"},
+    };
+    RegisterHandlers(functions);
+}
+
+} // namespace SPL
+} // namespace Service

+ 18 - 0
src/core/hle/service/spl/spl.h

@@ -0,0 +1,18 @@
+// 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/spl/module.h"
+
+namespace Service {
+namespace SPL {
+
+class SPL final : public Module::Interface {
+public:
+    explicit SPL(std::shared_ptr<Module> module);
+};
+
+} // namespace SPL
+} // namespace Service