summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/handle_table.cpp20
-rw-r--r--src/core/hle/kernel/handle_table.h2
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp4
-rw-r--r--src/core/hle/kernel/init/init_slab_setup.cpp4
-rw-r--r--src/core/hle/kernel/k_shared_memory.cpp55
-rw-r--r--src/core/hle/kernel/k_shared_memory.h34
-rw-r--r--src/core/hle/kernel/k_thread.cpp3
-rw-r--r--src/core/hle/kernel/kernel.cpp45
-rw-r--r--src/core/hle/kernel/svc.cpp21
-rw-r--r--src/core/hle/service/hid/hid.cpp10
-rw-r--r--src/core/hle/service/hid/hid.h6
-rw-r--r--src/core/hle/service/hid/irs.cpp6
-rw-r--r--src/core/hle/service/hid/irs.h5
-rw-r--r--src/core/hle/service/ns/pl_u.cpp8
-rw-r--r--src/core/hle/service/time/time_sharedmemory.cpp15
-rw-r--r--src/core/hle/service/time/time_sharedmemory.h4
16 files changed, 128 insertions, 114 deletions
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp
index f746c4888..427c6fc1b 100644
--- a/src/core/hle/kernel/handle_table.cpp
+++ b/src/core/hle/kernel/handle_table.cpp
@@ -47,9 +47,21 @@ ResultCode HandleTable::SetSize(s32 handle_table_size) {
47 return RESULT_SUCCESS; 47 return RESULT_SUCCESS;
48} 48}
49 49
50ResultVal<Handle> HandleTable::Create(std::shared_ptr<Object> obj) { 50ResultVal<Handle> HandleTable::Create(Object* obj) {
51 DEBUG_ASSERT(obj != nullptr); 51 DEBUG_ASSERT(obj != nullptr);
52 52
53 switch (obj->GetHandleType()) {
54 case HandleType::SharedMemory:
55 case HandleType::Thread:
56 case HandleType::Process: {
57 Handle handle{};
58 Add(&handle, reinterpret_cast<KAutoObject*>(obj), {});
59 return MakeResult<Handle>(handle);
60 }
61 default:
62 break;
63 }
64
53 const u16 slot = next_free_slot; 65 const u16 slot = next_free_slot;
54 if (slot >= table_size) { 66 if (slot >= table_size) {
55 LOG_ERROR(Kernel, "Unable to allocate Handle, too many slots in use."); 67 LOG_ERROR(Kernel, "Unable to allocate Handle, too many slots in use.");
@@ -66,7 +78,7 @@ ResultVal<Handle> HandleTable::Create(std::shared_ptr<Object> obj) {
66 } 78 }
67 79
68 generations[slot] = generation; 80 generations[slot] = generation;
69 objects[slot] = std::move(obj); 81 objects[slot] = std::move(SharedFrom(obj));
70 82
71 Handle handle = generation | (slot << 15); 83 Handle handle = generation | (slot << 15);
72 return MakeResult<Handle>(handle); 84 return MakeResult<Handle>(handle);
@@ -100,12 +112,12 @@ ResultCode HandleTable::Add(Handle* out_handle, KAutoObject* obj, u16 type) {
100} 112}
101 113
102ResultVal<Handle> HandleTable::Duplicate(Handle handle) { 114ResultVal<Handle> HandleTable::Duplicate(Handle handle) {
103 std::shared_ptr<Object> object = SharedFrom(GetGeneric(handle)); 115 auto object = GetGeneric(handle);
104 if (object == nullptr) { 116 if (object == nullptr) {
105 LOG_ERROR(Kernel, "Tried to duplicate invalid handle: {:08X}", handle); 117 LOG_ERROR(Kernel, "Tried to duplicate invalid handle: {:08X}", handle);
106 return ResultInvalidHandle; 118 return ResultInvalidHandle;
107 } 119 }
108 return Create(std::move(object)); 120 return Create(object);
109} 121}
110 122
111bool HandleTable::Remove(Handle handle) { 123bool HandleTable::Remove(Handle handle) {
diff --git a/src/core/hle/kernel/handle_table.h b/src/core/hle/kernel/handle_table.h
index 24a26b81d..d57188844 100644
--- a/src/core/hle/kernel/handle_table.h
+++ b/src/core/hle/kernel/handle_table.h
@@ -74,7 +74,7 @@ public:
74 * @return The created Handle or one of the following errors: 74 * @return The created Handle or one of the following errors:
75 * - `ERR_HANDLE_TABLE_FULL`: the maximum number of handles has been exceeded. 75 * - `ERR_HANDLE_TABLE_FULL`: the maximum number of handles has been exceeded.
76 */ 76 */
77 ResultVal<Handle> Create(std::shared_ptr<Object> obj); 77 ResultVal<Handle> Create(Object* obj);
78 78
79 /** 79 /**
80 * Returns a new handle that points to the same object as the passed in handle. 80 * Returns a new handle that points to the same object as the passed in handle.
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index a9702539f..1e831aaca 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -225,12 +225,12 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(KThread& thread) {
225 // for specific values in each of these descriptors. 225 // for specific values in each of these descriptors.
226 for (auto& object : copy_objects) { 226 for (auto& object : copy_objects) {
227 ASSERT(object != nullptr); 227 ASSERT(object != nullptr);
228 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap(); 228 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap();
229 } 229 }
230 230
231 for (auto& object : move_objects) { 231 for (auto& object : move_objects) {
232 ASSERT(object != nullptr); 232 ASSERT(object != nullptr);
233 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap(); 233 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap();
234 } 234 }
235 } 235 }
236 236
diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp
index a6fed524b..eb9c8e2e4 100644
--- a/src/core/hle/kernel/init/init_slab_setup.cpp
+++ b/src/core/hle/kernel/init/init_slab_setup.cpp
@@ -11,6 +11,7 @@
11#include "core/hle/kernel/init/init_slab_setup.h" 11#include "core/hle/kernel/init/init_slab_setup.h"
12#include "core/hle/kernel/k_memory_layout.h" 12#include "core/hle/kernel/k_memory_layout.h"
13#include "core/hle/kernel/k_memory_manager.h" 13#include "core/hle/kernel/k_memory_manager.h"
14#include "core/hle/kernel/k_shared_memory.h"
14#include "core/hle/kernel/k_system_control.h" 15#include "core/hle/kernel/k_system_control.h"
15#include "core/hle/kernel/k_thread.h" 16#include "core/hle/kernel/k_thread.h"
16#include "core/hle/kernel/memory_types.h" 17#include "core/hle/kernel/memory_types.h"
@@ -23,7 +24,8 @@ namespace Kernel::Init {
23 24
24#define FOREACH_SLAB_TYPE(HANDLER, ...) \ 25#define FOREACH_SLAB_TYPE(HANDLER, ...) \
25 HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \ 26 HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \
26 HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) 27 HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) \
28 HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__)
27 29
28namespace { 30namespace {
29 31
diff --git a/src/core/hle/kernel/k_shared_memory.cpp b/src/core/hle/kernel/k_shared_memory.cpp
index 9b14f42b5..9e20c2350 100644
--- a/src/core/hle/kernel/k_shared_memory.cpp
+++ b/src/core/hle/kernel/k_shared_memory.cpp
@@ -11,36 +11,53 @@
11 11
12namespace Kernel { 12namespace Kernel {
13 13
14KSharedMemory::KSharedMemory(KernelCore& kernel, Core::DeviceMemory& device_memory) 14KSharedMemory::KSharedMemory(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {}
15 : Object{kernel}, device_memory{device_memory} {}
16 15
17KSharedMemory::~KSharedMemory() { 16KSharedMemory::~KSharedMemory() {
18 kernel.GetSystemResourceLimit()->Release(LimitableResource::PhysicalMemory, size); 17 kernel.GetSystemResourceLimit()->Release(LimitableResource::PhysicalMemory, size);
19} 18}
20 19
21std::shared_ptr<KSharedMemory> KSharedMemory::Create( 20ResultCode KSharedMemory::Initialize(KernelCore& kernel_, Core::DeviceMemory& device_memory_,
22 KernelCore& kernel, Core::DeviceMemory& device_memory, Process* owner_process, 21 Process* owner_process_, KPageLinkedList&& page_list_,
23 KPageLinkedList&& page_list, KMemoryPermission owner_permission, 22 KMemoryPermission owner_permission_,
24 KMemoryPermission user_permission, PAddr physical_address, std::size_t size, std::string name) { 23 KMemoryPermission user_permission_, PAddr physical_address_,
24 std::size_t size_, std::string name_) {
25 25
26 const auto resource_limit = kernel.GetSystemResourceLimit(); 26 resource_limit = kernel_.GetSystemResourceLimit();
27 KScopedResourceReservation memory_reservation(resource_limit, LimitableResource::PhysicalMemory, 27 KScopedResourceReservation memory_reservation(resource_limit, LimitableResource::PhysicalMemory,
28 size); 28 size_);
29 ASSERT(memory_reservation.Succeeded()); 29 ASSERT(memory_reservation.Succeeded());
30 30
31 std::shared_ptr<KSharedMemory> shared_memory{ 31 owner_process = owner_process_;
32 std::make_shared<KSharedMemory>(kernel, device_memory)}; 32 device_memory = &device_memory_;
33 33 page_list = std::move(page_list_);
34 shared_memory->owner_process = owner_process; 34 owner_permission = owner_permission_;
35 shared_memory->page_list = std::move(page_list); 35 user_permission = user_permission_;
36 shared_memory->owner_permission = owner_permission; 36 physical_address = physical_address_;
37 shared_memory->user_permission = user_permission; 37 size = size_;
38 shared_memory->physical_address = physical_address; 38 name = name_;
39 shared_memory->size = size; 39 is_initialized = true;
40 shared_memory->name = name;
41 40
42 memory_reservation.Commit(); 41 memory_reservation.Commit();
43 return shared_memory; 42
43 return RESULT_SUCCESS;
44}
45
46void KSharedMemory::Finalize() {
47 ///* Get the number of pages. */
48 // const size_t num_pages = m_page_group.GetNumPages();
49 // const size_t size = num_pages * PageSize;
50
51 ///* Close and finalize the page group. */
52 // m_page_group.Close();
53 // m_page_group.Finalize();
54
55 // Release the memory reservation.
56 resource_limit->Release(LimitableResource::PhysicalMemory, size);
57 resource_limit->Close();
58
59 // Perform inherited finalization.
60 KAutoObjectWithSlabHeapAndContainer<KSharedMemory, KAutoObjectWithList>::Finalize();
44} 61}
45 62
46ResultCode KSharedMemory::Map(Process& target_process, VAddr address, std::size_t size, 63ResultCode KSharedMemory::Map(Process& target_process, VAddr address, std::size_t size,
diff --git a/src/core/hle/kernel/k_shared_memory.h b/src/core/hle/kernel/k_shared_memory.h
index 016e34be5..aaa773bfc 100644
--- a/src/core/hle/kernel/k_shared_memory.h
+++ b/src/core/hle/kernel/k_shared_memory.h
@@ -11,24 +11,26 @@
11#include "core/device_memory.h" 11#include "core/device_memory.h"
12#include "core/hle/kernel/k_memory_block.h" 12#include "core/hle/kernel/k_memory_block.h"
13#include "core/hle/kernel/k_page_linked_list.h" 13#include "core/hle/kernel/k_page_linked_list.h"
14#include "core/hle/kernel/object.h"
15#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/slab_helpers.h"
16#include "core/hle/result.h" 16#include "core/hle/result.h"
17 17
18namespace Kernel { 18namespace Kernel {
19 19
20class KernelCore; 20class KernelCore;
21 21
22class KSharedMemory final : public Object { 22class KSharedMemory final
23 : public KAutoObjectWithSlabHeapAndContainer<KSharedMemory, KAutoObjectWithList> {
24 KERNEL_AUTOOBJECT_TRAITS(KSharedMemory, KAutoObject);
25
23public: 26public:
24 explicit KSharedMemory(KernelCore& kernel, Core::DeviceMemory& device_memory); 27 explicit KSharedMemory(KernelCore& kernel);
25 ~KSharedMemory() override; 28 ~KSharedMemory() override;
26 29
27 static std::shared_ptr<KSharedMemory> Create( 30 ResultCode Initialize(KernelCore& kernel_, Core::DeviceMemory& device_memory_,
28 KernelCore& kernel, Core::DeviceMemory& device_memory, Process* owner_process, 31 Process* owner_process_, KPageLinkedList&& page_list_,
29 KPageLinkedList&& page_list, KMemoryPermission owner_permission, 32 KMemoryPermission owner_permission_, KMemoryPermission user_permission_,
30 KMemoryPermission user_permission, PAddr physical_address, std::size_t size, 33 PAddr physical_address_, std::size_t size_, std::string name_);
31 std::string name);
32 34
33 std::string GetTypeName() const override { 35 std::string GetTypeName() const override {
34 return "SharedMemory"; 36 return "SharedMemory";
@@ -59,7 +61,7 @@ public:
59 * @return A pointer to the shared memory block from the specified offset 61 * @return A pointer to the shared memory block from the specified offset
60 */ 62 */
61 u8* GetPointer(std::size_t offset = 0) { 63 u8* GetPointer(std::size_t offset = 0) {
62 return device_memory.GetPointer(physical_address + offset); 64 return device_memory->GetPointer(physical_address + offset);
63 } 65 }
64 66
65 /** 67 /**
@@ -68,20 +70,26 @@ public:
68 * @return A pointer to the shared memory block from the specified offset 70 * @return A pointer to the shared memory block from the specified offset
69 */ 71 */
70 const u8* GetPointer(std::size_t offset = 0) const { 72 const u8* GetPointer(std::size_t offset = 0) const {
71 return device_memory.GetPointer(physical_address + offset); 73 return device_memory->GetPointer(physical_address + offset);
72 } 74 }
73 75
74 void Finalize() override {} 76 virtual void Finalize() override;
77
78 virtual bool IsInitialized() const override {
79 return is_initialized;
80 }
81 static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
75 82
76private: 83private:
77 Core::DeviceMemory& device_memory; 84 Core::DeviceMemory* device_memory;
78 Process* owner_process{}; 85 Process* owner_process{};
79 KPageLinkedList page_list; 86 KPageLinkedList page_list;
80 KMemoryPermission owner_permission{}; 87 KMemoryPermission owner_permission{};
81 KMemoryPermission user_permission{}; 88 KMemoryPermission user_permission{};
82 PAddr physical_address{}; 89 PAddr physical_address{};
83 std::size_t size{}; 90 std::size_t size{};
84 std::string name; 91 std::shared_ptr<KResourceLimit> resource_limit;
92 bool is_initialized{};
85}; 93};
86 94
87} // namespace Kernel 95} // namespace Kernel
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index 5d0b266c5..fbab5ecb7 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -291,6 +291,9 @@ void KThread::Finalize() {
291 parent->DecrementThreadCount(); 291 parent->DecrementThreadCount();
292 parent->GetResourceLimit()->Release(LimitableResource::Threads, 1); 292 parent->GetResourceLimit()->Release(LimitableResource::Threads, 1);
293 } 293 }
294
295 // Perform inherited finalization.
296 KAutoObjectWithSlabHeapAndContainer<KThread, KSynchronizationObject>::Finalize();
294} 297}
295 298
296bool KThread::IsSignaled() const { 299bool KThread::IsSignaled() const {
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 1b5b11564..cac76a6ec 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -575,22 +575,27 @@ struct KernelCore::Impl {
575 const PAddr irs_phys_addr{system_pool.GetAddress() + hid_size + font_size}; 575 const PAddr irs_phys_addr{system_pool.GetAddress() + hid_size + font_size};
576 const PAddr time_phys_addr{system_pool.GetAddress() + hid_size + font_size + irs_size}; 576 const PAddr time_phys_addr{system_pool.GetAddress() + hid_size + font_size + irs_size};
577 577
578 hid_shared_mem = Kernel::KSharedMemory::Create( 578 hid_shared_mem = std::make_unique<KSharedMemory>(system.Kernel());
579 system.Kernel(), system.DeviceMemory(), nullptr, {hid_phys_addr, hid_size / PageSize}, 579 font_shared_mem = std::make_unique<KSharedMemory>(system.Kernel());
580 KMemoryPermission::None, KMemoryPermission::Read, hid_phys_addr, hid_size, 580 irs_shared_mem = std::make_unique<KSharedMemory>(system.Kernel());
581 "HID:SharedMemory"); 581 time_shared_mem = std::make_unique<KSharedMemory>(system.Kernel());
582 font_shared_mem = Kernel::KSharedMemory::Create( 582
583 system.Kernel(), system.DeviceMemory(), nullptr, {font_phys_addr, font_size / PageSize}, 583 hid_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr,
584 KMemoryPermission::None, KMemoryPermission::Read, font_phys_addr, font_size, 584 {hid_phys_addr, hid_size / PageSize}, KMemoryPermission::None,
585 "Font:SharedMemory"); 585 KMemoryPermission::Read, hid_phys_addr, hid_size,
586 irs_shared_mem = Kernel::KSharedMemory::Create( 586 "HID:SharedMemory");
587 system.Kernel(), system.DeviceMemory(), nullptr, {irs_phys_addr, irs_size / PageSize}, 587 font_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr,
588 KMemoryPermission::None, KMemoryPermission::Read, irs_phys_addr, irs_size, 588 {font_phys_addr, font_size / PageSize}, KMemoryPermission::None,
589 "IRS:SharedMemory"); 589 KMemoryPermission::Read, font_phys_addr, font_size,
590 time_shared_mem = Kernel::KSharedMemory::Create( 590 "Font:SharedMemory");
591 system.Kernel(), system.DeviceMemory(), nullptr, {time_phys_addr, time_size / PageSize}, 591 irs_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr,
592 KMemoryPermission::None, KMemoryPermission::Read, time_phys_addr, time_size, 592 {irs_phys_addr, irs_size / PageSize}, KMemoryPermission::None,
593 "Time:SharedMemory"); 593 KMemoryPermission::Read, irs_phys_addr, irs_size,
594 "IRS:SharedMemory");
595 time_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr,
596 {time_phys_addr, time_size / PageSize}, KMemoryPermission::None,
597 KMemoryPermission::Read, time_phys_addr, time_size,
598 "Time:SharedMemory");
594 } 599 }
595 600
596 void InitializePageSlab() { 601 void InitializePageSlab() {
@@ -644,10 +649,10 @@ struct KernelCore::Impl {
644 std::unique_ptr<KSlabHeap<Page>> user_slab_heap_pages; 649 std::unique_ptr<KSlabHeap<Page>> user_slab_heap_pages;
645 650
646 // Shared memory for services 651 // Shared memory for services
647 std::shared_ptr<Kernel::KSharedMemory> hid_shared_mem; 652 std::unique_ptr<Kernel::KSharedMemory> hid_shared_mem;
648 std::shared_ptr<Kernel::KSharedMemory> font_shared_mem; 653 std::unique_ptr<Kernel::KSharedMemory> font_shared_mem;
649 std::shared_ptr<Kernel::KSharedMemory> irs_shared_mem; 654 std::unique_ptr<Kernel::KSharedMemory> irs_shared_mem;
650 std::shared_ptr<Kernel::KSharedMemory> time_shared_mem; 655 std::unique_ptr<Kernel::KSharedMemory> time_shared_mem;
651 656
652 // Threads used for services 657 // Threads used for services
653 std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; 658 std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads;
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 7d676e5f7..17d63658a 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -328,7 +328,7 @@ static ResultCode ConnectToNamedPort(Core::System& system, Handle* out_handle,
328 328
329 // Return the client session 329 // Return the client session
330 auto& handle_table = kernel.CurrentProcess()->GetHandleTable(); 330 auto& handle_table = kernel.CurrentProcess()->GetHandleTable();
331 CASCADE_RESULT(*out_handle, handle_table.Create(client_session)); 331 CASCADE_RESULT(*out_handle, handle_table.Create(client_session.get()));
332 return RESULT_SUCCESS; 332 return RESULT_SUCCESS;
333} 333}
334 334
@@ -836,7 +836,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha
836 return RESULT_SUCCESS; 836 return RESULT_SUCCESS;
837 } 837 }
838 838
839 const auto table_result = handle_table.Create(resource_limit); 839 const auto table_result = handle_table.Create(resource_limit.get());
840 if (table_result.Failed()) { 840 if (table_result.Failed()) {
841 return table_result.Code(); 841 return table_result.Code();
842 } 842 }
@@ -1168,12 +1168,9 @@ static ResultCode MapSharedMemory(Core::System& system, Handle shared_memory_han
1168 return ResultInvalidMemoryRange; 1168 return ResultInvalidMemoryRange;
1169 } 1169 }
1170 1170
1171 auto shared_memory{current_process->GetHandleTable().Get<KSharedMemory>(shared_memory_handle)}; 1171 auto shared_memory{
1172 if (!shared_memory) { 1172 current_process->GetHandleTable().GetObject<KSharedMemory>(shared_memory_handle)};
1173 LOG_ERROR(Kernel_SVC, "Shared memory does not exist, shared_memory_handle=0x{:08X}", 1173 R_UNLESS(shared_memory.IsNotNull(), ResultInvalidHandle);
1174 shared_memory_handle);
1175 return ResultInvalidHandle;
1176 }
1177 1174
1178 return shared_memory->Map(*current_process, addr, size, 1175 return shared_memory->Map(*current_process, addr, size,
1179 static_cast<KMemoryPermission>(permission_type)); 1176 static_cast<KMemoryPermission>(permission_type));
@@ -1817,7 +1814,7 @@ static ResultCode CreateTransferMemory(Core::System& system, Handle* handle, VAd
1817 } 1814 }
1818 1815
1819 auto& handle_table = kernel.CurrentProcess()->GetHandleTable(); 1816 auto& handle_table = kernel.CurrentProcess()->GetHandleTable();
1820 const auto result{handle_table.Create(std::move(transfer_mem_handle))}; 1817 const auto result{handle_table.Create(transfer_mem_handle.get())};
1821 if (result.Failed()) { 1818 if (result.Failed()) {
1822 return result.Code(); 1819 return result.Code();
1823 } 1820 }
@@ -1966,7 +1963,7 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1966 event->Initialize(); 1963 event->Initialize();
1967 1964
1968 // Add the writable event to the handle table. 1965 // Add the writable event to the handle table.
1969 const auto write_create_result = handle_table.Create(event->GetWritableEvent()); 1966 const auto write_create_result = handle_table.Create(event->GetWritableEvent().get());
1970 if (write_create_result.Failed()) { 1967 if (write_create_result.Failed()) {
1971 return write_create_result.Code(); 1968 return write_create_result.Code();
1972 } 1969 }
@@ -1976,7 +1973,7 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1976 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); }); 1973 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); });
1977 1974
1978 // Add the readable event to the handle table. 1975 // Add the readable event to the handle table.
1979 const auto read_create_result = handle_table.Create(SharedFrom(event->GetReadableEvent())); 1976 const auto read_create_result = handle_table.Create(event->GetReadableEvent());
1980 if (read_create_result.Failed()) { 1977 if (read_create_result.Failed()) {
1981 return read_create_result.Code(); 1978 return read_create_result.Code();
1982 } 1979 }
@@ -2027,7 +2024,7 @@ static ResultCode CreateResourceLimit(Core::System& system, Handle* out_handle)
2027 auto* const current_process = kernel.CurrentProcess(); 2024 auto* const current_process = kernel.CurrentProcess();
2028 ASSERT(current_process != nullptr); 2025 ASSERT(current_process != nullptr);
2029 2026
2030 const auto handle = current_process->GetHandleTable().Create(std::move(resource_limit)); 2027 const auto handle = current_process->GetHandleTable().Create(resource_limit.get());
2031 if (handle.Failed()) { 2028 if (handle.Failed()) {
2032 return handle.Code(); 2029 return handle.Code();
2033 } 2030 }
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index d2a6375f5..49c1db42a 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -53,9 +53,6 @@ IAppletResource::IAppletResource(Core::System& system_)
53 }; 53 };
54 RegisterHandlers(functions); 54 RegisterHandlers(functions);
55 55
56 auto& kernel = system.Kernel();
57 shared_mem = SharedFrom(&kernel.GetHidSharedMem());
58
59 MakeController<Controller_DebugPad>(HidController::DebugPad); 56 MakeController<Controller_DebugPad>(HidController::DebugPad);
60 MakeController<Controller_Touchscreen>(HidController::Touchscreen); 57 MakeController<Controller_Touchscreen>(HidController::Touchscreen);
61 MakeController<Controller_Mouse>(HidController::Mouse); 58 MakeController<Controller_Mouse>(HidController::Mouse);
@@ -118,7 +115,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
118 115
119 IPC::ResponseBuilder rb{ctx, 2, 1}; 116 IPC::ResponseBuilder rb{ctx, 2, 1};
120 rb.Push(RESULT_SUCCESS); 117 rb.Push(RESULT_SUCCESS);
121 rb.PushCopyObjects(shared_mem.get()); 118 rb.PushCopyObjects(&system.Kernel().GetHidSharedMem());
122} 119}
123 120
124void IAppletResource::UpdateControllers(std::uintptr_t user_data, 121void IAppletResource::UpdateControllers(std::uintptr_t user_data,
@@ -130,7 +127,8 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data,
130 if (should_reload) { 127 if (should_reload) {
131 controller->OnLoadInputDevices(); 128 controller->OnLoadInputDevices();
132 } 129 }
133 controller->OnUpdate(core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE); 130 controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(),
131 SHARED_MEMORY_SIZE);
134 } 132 }
135 133
136 // If ns_late is higher than the update rate ignore the delay 134 // If ns_late is higher than the update rate ignore the delay
@@ -145,7 +143,7 @@ void IAppletResource::UpdateMotion(std::uintptr_t user_data, std::chrono::nanose
145 auto& core_timing = system.CoreTiming(); 143 auto& core_timing = system.CoreTiming();
146 144
147 controllers[static_cast<size_t>(HidController::NPad)]->OnMotionUpdate( 145 controllers[static_cast<size_t>(HidController::NPad)]->OnMotionUpdate(
148 core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE); 146 core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE);
149 147
150 // If ns_late is higher than the update rate ignore the delay 148 // If ns_late is higher than the update rate ignore the delay
151 if (ns_late > motion_update_ns) { 149 if (ns_late > motion_update_ns) {
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index c2bdd39a3..aa3307955 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -13,10 +13,6 @@ namespace Core::Timing {
13struct EventType; 13struct EventType;
14} 14}
15 15
16namespace Kernel {
17class KSharedMemory;
18}
19
20namespace Service::SM { 16namespace Service::SM {
21class ServiceManager; 17class ServiceManager;
22} 18}
@@ -69,8 +65,6 @@ private:
69 void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); 65 void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
70 void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); 66 void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
71 67
72 std::shared_ptr<Kernel::KSharedMemory> shared_mem;
73
74 std::shared_ptr<Core::Timing::EventType> pad_update_event; 68 std::shared_ptr<Core::Timing::EventType> pad_update_event;
75 std::shared_ptr<Core::Timing::EventType> motion_update_event; 69 std::shared_ptr<Core::Timing::EventType> motion_update_event;
76 70
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index b50a51eb7..3c6085990 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -37,10 +37,6 @@ IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} {
37 // clang-format on 37 // clang-format on
38 38
39 RegisterHandlers(functions); 39 RegisterHandlers(functions);
40
41 auto& kernel = system.Kernel();
42
43 shared_mem = SharedFrom(&kernel.GetIrsSharedMem());
44} 40}
45 41
46void IRS::ActivateIrsensor(Kernel::HLERequestContext& ctx) { 42void IRS::ActivateIrsensor(Kernel::HLERequestContext& ctx) {
@@ -62,7 +58,7 @@ void IRS::GetIrsensorSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
62 58
63 IPC::ResponseBuilder rb{ctx, 2, 1}; 59 IPC::ResponseBuilder rb{ctx, 2, 1};
64 rb.Push(RESULT_SUCCESS); 60 rb.Push(RESULT_SUCCESS);
65 rb.PushCopyObjects(shared_mem.get()); 61 rb.PushCopyObjects(&system.Kernel().GetIrsSharedMem());
66} 62}
67 63
68void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) { 64void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h
index b0c8c7168..a1bcb5859 100644
--- a/src/core/hle/service/hid/irs.h
+++ b/src/core/hle/service/hid/irs.h
@@ -11,10 +11,6 @@ namespace Core {
11class System; 11class System;
12} 12}
13 13
14namespace Kernel {
15class KSharedMemory;
16}
17
18namespace Service::HID { 14namespace Service::HID {
19 15
20class IRS final : public ServiceFramework<IRS> { 16class IRS final : public ServiceFramework<IRS> {
@@ -42,7 +38,6 @@ private:
42 void StopImageProcessorAsync(Kernel::HLERequestContext& ctx); 38 void StopImageProcessorAsync(Kernel::HLERequestContext& ctx);
43 void ActivateIrsensorWithFunctionLevel(Kernel::HLERequestContext& ctx); 39 void ActivateIrsensorWithFunctionLevel(Kernel::HLERequestContext& ctx);
44 40
45 std::shared_ptr<Kernel::KSharedMemory> shared_mem;
46 const u32 device_handle{0xABCD}; 41 const u32 device_handle{0xABCD};
47}; 42};
48 43
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp
index e6616a3b9..82d847130 100644
--- a/src/core/hle/service/ns/pl_u.cpp
+++ b/src/core/hle/service/ns/pl_u.cpp
@@ -130,9 +130,6 @@ struct PL_U::Impl {
130 } 130 }
131 } 131 }
132 132
133 /// Handle to shared memory region designated for a shared font
134 std::shared_ptr<Kernel::KSharedMemory> shared_font_mem;
135
136 /// Backing memory for the shared font data 133 /// Backing memory for the shared font data
137 std::shared_ptr<Kernel::PhysicalMemory> shared_font; 134 std::shared_ptr<Kernel::PhysicalMemory> shared_font;
138 135
@@ -260,14 +257,13 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) {
260 257
261 // Create shared font memory object 258 // Create shared font memory object
262 auto& kernel = system.Kernel(); 259 auto& kernel = system.Kernel();
263 impl->shared_font_mem = SharedFrom(&kernel.GetFontSharedMem());
264 260
265 std::memcpy(impl->shared_font_mem->GetPointer(), impl->shared_font->data(), 261 std::memcpy(system.Kernel().GetFontSharedMem().GetPointer(), impl->shared_font->data(),
266 impl->shared_font->size()); 262 impl->shared_font->size());
267 263
268 IPC::ResponseBuilder rb{ctx, 2, 1}; 264 IPC::ResponseBuilder rb{ctx, 2, 1};
269 rb.Push(RESULT_SUCCESS); 265 rb.Push(RESULT_SUCCESS);
270 rb.PushCopyObjects(impl->shared_font_mem.get()); 266 rb.PushCopyObjects(&system.Kernel().GetFontSharedMem());
271} 267}
272 268
273void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) { 269void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/time/time_sharedmemory.cpp b/src/core/hle/service/time/time_sharedmemory.cpp
index 018ce94ed..eb57899f6 100644
--- a/src/core/hle/service/time/time_sharedmemory.cpp
+++ b/src/core/hle/service/time/time_sharedmemory.cpp
@@ -16,16 +16,11 @@ namespace Service::Time {
16static constexpr std::size_t SHARED_MEMORY_SIZE{0x1000}; 16static constexpr std::size_t SHARED_MEMORY_SIZE{0x1000};
17 17
18SharedMemory::SharedMemory(Core::System& system) : system(system) { 18SharedMemory::SharedMemory(Core::System& system) : system(system) {
19 shared_memory_holder = SharedFrom(&system.Kernel().GetTimeSharedMem()); 19 std::memset(system.Kernel().GetTimeSharedMem().GetPointer(), 0, SHARED_MEMORY_SIZE);
20 std::memset(shared_memory_holder->GetPointer(), 0, SHARED_MEMORY_SIZE);
21} 20}
22 21
23SharedMemory::~SharedMemory() = default; 22SharedMemory::~SharedMemory() = default;
24 23
25std::shared_ptr<Kernel::KSharedMemory> SharedMemory::GetSharedMemoryHolder() const {
26 return shared_memory_holder;
27}
28
29void SharedMemory::SetupStandardSteadyClock(const Common::UUID& clock_source_id, 24void SharedMemory::SetupStandardSteadyClock(const Common::UUID& clock_source_id,
30 Clock::TimeSpanType current_time_point) { 25 Clock::TimeSpanType current_time_point) {
31 const Clock::TimeSpanType ticks_time_span{Clock::TimeSpanType::FromTicks( 26 const Clock::TimeSpanType ticks_time_span{Clock::TimeSpanType::FromTicks(
@@ -34,22 +29,22 @@ void SharedMemory::SetupStandardSteadyClock(const Common::UUID& clock_source_id,
34 static_cast<u64>(current_time_point.nanoseconds - ticks_time_span.nanoseconds), 29 static_cast<u64>(current_time_point.nanoseconds - ticks_time_span.nanoseconds),
35 clock_source_id}; 30 clock_source_id};
36 shared_memory_format.standard_steady_clock_timepoint.StoreData( 31 shared_memory_format.standard_steady_clock_timepoint.StoreData(
37 shared_memory_holder->GetPointer(), context); 32 system.Kernel().GetTimeSharedMem().GetPointer(), context);
38} 33}
39 34
40void SharedMemory::UpdateLocalSystemClockContext(const Clock::SystemClockContext& context) { 35void SharedMemory::UpdateLocalSystemClockContext(const Clock::SystemClockContext& context) {
41 shared_memory_format.standard_local_system_clock_context.StoreData( 36 shared_memory_format.standard_local_system_clock_context.StoreData(
42 shared_memory_holder->GetPointer(), context); 37 system.Kernel().GetTimeSharedMem().GetPointer(), context);
43} 38}
44 39
45void SharedMemory::UpdateNetworkSystemClockContext(const Clock::SystemClockContext& context) { 40void SharedMemory::UpdateNetworkSystemClockContext(const Clock::SystemClockContext& context) {
46 shared_memory_format.standard_network_system_clock_context.StoreData( 41 shared_memory_format.standard_network_system_clock_context.StoreData(
47 shared_memory_holder->GetPointer(), context); 42 system.Kernel().GetTimeSharedMem().GetPointer(), context);
48} 43}
49 44
50void SharedMemory::SetAutomaticCorrectionEnabled(bool is_enabled) { 45void SharedMemory::SetAutomaticCorrectionEnabled(bool is_enabled) {
51 shared_memory_format.standard_user_system_clock_automatic_correction.StoreData( 46 shared_memory_format.standard_user_system_clock_automatic_correction.StoreData(
52 shared_memory_holder->GetPointer(), is_enabled); 47 system.Kernel().GetTimeSharedMem().GetPointer(), is_enabled);
53} 48}
54 49
55} // namespace Service::Time 50} // namespace Service::Time
diff --git a/src/core/hle/service/time/time_sharedmemory.h b/src/core/hle/service/time/time_sharedmemory.h
index 3bc749114..1ad9a286d 100644
--- a/src/core/hle/service/time/time_sharedmemory.h
+++ b/src/core/hle/service/time/time_sharedmemory.h
@@ -17,9 +17,6 @@ public:
17 explicit SharedMemory(Core::System& system); 17 explicit SharedMemory(Core::System& system);
18 ~SharedMemory(); 18 ~SharedMemory();
19 19
20 // Return the shared memory handle
21 std::shared_ptr<Kernel::KSharedMemory> GetSharedMemoryHolder() const;
22
23 // TODO(ogniK): We have to properly simulate memory barriers, how are we going to do this? 20 // TODO(ogniK): We have to properly simulate memory barriers, how are we going to do this?
24 template <typename T, std::size_t Offset> 21 template <typename T, std::size_t Offset>
25 struct MemoryBarrier { 22 struct MemoryBarrier {
@@ -63,7 +60,6 @@ public:
63 void SetAutomaticCorrectionEnabled(bool is_enabled); 60 void SetAutomaticCorrectionEnabled(bool is_enabled);
64 61
65private: 62private:
66 std::shared_ptr<Kernel::KSharedMemory> shared_memory_holder;
67 Core::System& system; 63 Core::System& system;
68 Format shared_memory_format{}; 64 Format shared_memory_format{};
69}; 65};