summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/lm/lm.cpp65
-rw-r--r--src/core/hle/service/lm/lm.h5
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
9namespace Service { 11namespace Service {
10namespace LM { 12namespace LM {
11 13
14class Logger final : public ServiceFramework<Logger> {
15public:
16 Logger() : ServiceFramework("Logger") {
17 static const FunctionInfo functions[] = {
18 {0x00000000, &Logger::Log, "Log"},
19 };
20 RegisterHandlers(functions);
21 }
22
23 ~Logger() = default;
24
25private:
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
12void InstallInterfaces(SM::ServiceManager& service_manager) { 60void 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 */
23void LM::Initialize(Kernel::HLERequestContext& ctx) { 71void 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
29LM::LM() : ServiceFramework("lm") { 88LM::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
9namespace Service { 12namespace Service {
@@ -16,6 +19,8 @@ public:
16 19
17private: 20private:
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.