diff options
| -rw-r--r-- | src/core/hle/service/lm/lm.cpp | 65 | ||||
| -rw-r--r-- | src/core/hle/service/lm/lm.h | 5 |
2 files changed, 67 insertions, 3 deletions
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index d66ac55ca..72fa6db6b 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp | |||
| @@ -2,13 +2,61 @@ | |||
| 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 <string> | ||
| 5 | #include "common/logging/log.h" | 6 | #include "common/logging/log.h" |
| 6 | #include "core/hle/ipc_helpers.h" | 7 | #include "core/hle/ipc_helpers.h" |
| 8 | #include "core/hle/kernel/client_session.h" | ||
| 7 | #include "core/hle/service/lm/lm.h" | 9 | #include "core/hle/service/lm/lm.h" |
| 8 | 10 | ||
| 9 | namespace Service { | 11 | namespace Service { |
| 10 | namespace LM { | 12 | namespace LM { |
| 11 | 13 | ||
| 14 | class Logger final : public ServiceFramework<Logger> { | ||
| 15 | public: | ||
| 16 | Logger() : ServiceFramework("Logger") { | ||
| 17 | static const FunctionInfo functions[] = { | ||
| 18 | {0x00000000, &Logger::Log, "Log"}, | ||
| 19 | }; | ||
| 20 | RegisterHandlers(functions); | ||
| 21 | } | ||
| 22 | |||
| 23 | ~Logger() = default; | ||
| 24 | |||
| 25 | private: | ||
| 26 | struct MessageHeader { | ||
| 27 | u64_le pid; | ||
| 28 | u64_le threadContext; | ||
| 29 | union { | ||
| 30 | BitField<0, 16, u32_le> flags; | ||
| 31 | BitField<16, 8, u32_le> severity; | ||
| 32 | BitField<24, 8, u32_le> verbosity; | ||
| 33 | }; | ||
| 34 | u32_le payload_size; | ||
| 35 | INSERT_PADDING_WORDS(2); | ||
| 36 | }; | ||
| 37 | static_assert(sizeof(MessageHeader) == 0x20, "MessageHeader is incorrect size"); | ||
| 38 | |||
| 39 | /** | ||
| 40 | * LM::Initialize service function | ||
| 41 | * Inputs: | ||
| 42 | * 0: 0x00000000 | ||
| 43 | * Outputs: | ||
| 44 | * 0: ResultCode | ||
| 45 | */ | ||
| 46 | void Log(Kernel::HLERequestContext& ctx) { | ||
| 47 | MessageHeader header{}; | ||
| 48 | Memory::ReadBlock(ctx.BufferDescriptorX()[0].Address(), &header, sizeof(MessageHeader)); | ||
| 49 | |||
| 50 | std::vector<char> string(header.payload_size); | ||
| 51 | Memory::ReadBlock(ctx.BufferDescriptorX()[0].Address() + sizeof(MessageHeader), | ||
| 52 | string.data(), header.payload_size); | ||
| 53 | LOG_DEBUG(Debug_Emulated, "%.*s", header.payload_size, string.data()); | ||
| 54 | |||
| 55 | IPC::RequestBuilder rb{ctx, 1}; | ||
| 56 | rb.Push(RESULT_SUCCESS); | ||
| 57 | } | ||
| 58 | }; | ||
| 59 | |||
| 12 | void InstallInterfaces(SM::ServiceManager& service_manager) { | 60 | void InstallInterfaces(SM::ServiceManager& service_manager) { |
| 13 | std::make_shared<LM>()->InstallAsService(service_manager); | 61 | std::make_shared<LM>()->InstallAsService(service_manager); |
| 14 | } | 62 | } |
| @@ -21,9 +69,20 @@ void InstallInterfaces(SM::ServiceManager& service_manager) { | |||
| 21 | * 0: ResultCode | 69 | * 0: ResultCode |
| 22 | */ | 70 | */ |
| 23 | void LM::Initialize(Kernel::HLERequestContext& ctx) { | 71 | void LM::Initialize(Kernel::HLERequestContext& ctx) { |
| 24 | IPC::RequestBuilder rb{ctx, 1}; | 72 | auto client_port = std::make_shared<Logger>()->CreatePort(); |
| 25 | rb.Push(RESULT_SUCCESS); | 73 | auto session = client_port->Connect(); |
| 26 | LOG_WARNING(Service_SM, "(STUBBED) called"); | 74 | if (session.Succeeded()) { |
| 75 | LOG_DEBUG(Service_SM, "called, initialized logger -> session=%u", | ||
| 76 | (*session)->GetObjectId()); | ||
| 77 | IPC::RequestBuilder rb{ctx, 1, 0, 1}; | ||
| 78 | rb.Push(RESULT_SUCCESS); | ||
| 79 | rb.PushObjects(std::move(session).Unwrap()); | ||
| 80 | registered_loggers.emplace_back(std::move(client_port)); | ||
| 81 | } else { | ||
| 82 | UNIMPLEMENTED(); | ||
| 83 | } | ||
| 84 | |||
| 85 | LOG_INFO(Service_SM, "called"); | ||
| 27 | } | 86 | } |
| 28 | 87 | ||
| 29 | LM::LM() : ServiceFramework("lm") { | 88 | LM::LM() : ServiceFramework("lm") { |
diff --git a/src/core/hle/service/lm/lm.h b/src/core/hle/service/lm/lm.h index c497d82eb..05a92f712 100644 --- a/src/core/hle/service/lm/lm.h +++ b/src/core/hle/service/lm/lm.h | |||
| @@ -4,6 +4,9 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <vector> | ||
| 8 | #include "core/hle/kernel/client_port.h" | ||
| 9 | #include "core/hle/kernel/kernel.h" | ||
| 7 | #include "core/hle/service/service.h" | 10 | #include "core/hle/service/service.h" |
| 8 | 11 | ||
| 9 | namespace Service { | 12 | namespace Service { |
| @@ -16,6 +19,8 @@ public: | |||
| 16 | 19 | ||
| 17 | private: | 20 | private: |
| 18 | void Initialize(Kernel::HLERequestContext& ctx); | 21 | void Initialize(Kernel::HLERequestContext& ctx); |
| 22 | |||
| 23 | std::vector<Kernel::SharedPtr<Kernel::ClientPort>> registered_loggers; | ||
| 19 | }; | 24 | }; |
| 20 | 25 | ||
| 21 | /// Registers all LM services with the specified service manager. | 26 | /// Registers all LM services with the specified service manager. |