diff options
| author | 2021-04-03 23:22:07 -0700 | |
|---|---|---|
| committer | 2021-05-05 16:40:50 -0700 | |
| commit | 086db71e942dc3468bccb741cabf62fdd221e790 (patch) | |
| tree | 46dda7ba6a9d2a1590b09ddddb450595879b2896 /src | |
| parent | hle: kernel: Migrate KProcess to KAutoObject. (diff) | |
| download | yuzu-086db71e942dc3468bccb741cabf62fdd221e790.tar.gz yuzu-086db71e942dc3468bccb741cabf62fdd221e790.tar.xz yuzu-086db71e942dc3468bccb741cabf62fdd221e790.zip | |
hle: kernel: Migrate KSharedMemory to KAutoObject.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/handle_table.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/handle_table.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/init/init_slab_setup.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_shared_memory.cpp | 55 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_shared_memory.h | 34 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 45 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/irs.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/irs.h | 5 | ||||
| -rw-r--r-- | src/core/hle/service/ns/pl_u.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_sharedmemory.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_sharedmemory.h | 4 |
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 | ||
| 50 | ResultVal<Handle> HandleTable::Create(std::shared_ptr<Object> obj) { | 50 | ResultVal<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 | ||
| 102 | ResultVal<Handle> HandleTable::Duplicate(Handle handle) { | 114 | ResultVal<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 | ||
| 111 | bool HandleTable::Remove(Handle handle) { | 123 | bool 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 | ||
| 28 | namespace { | 30 | namespace { |
| 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 | ||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| 14 | KSharedMemory::KSharedMemory(KernelCore& kernel, Core::DeviceMemory& device_memory) | 14 | KSharedMemory::KSharedMemory(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {} |
| 15 | : Object{kernel}, device_memory{device_memory} {} | ||
| 16 | 15 | ||
| 17 | KSharedMemory::~KSharedMemory() { | 16 | KSharedMemory::~KSharedMemory() { |
| 18 | kernel.GetSystemResourceLimit()->Release(LimitableResource::PhysicalMemory, size); | 17 | kernel.GetSystemResourceLimit()->Release(LimitableResource::PhysicalMemory, size); |
| 19 | } | 18 | } |
| 20 | 19 | ||
| 21 | std::shared_ptr<KSharedMemory> KSharedMemory::Create( | 20 | ResultCode 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 | |||
| 46 | void 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 | ||
| 46 | ResultCode KSharedMemory::Map(Process& target_process, VAddr address, std::size_t size, | 63 | ResultCode 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 | ||
| 18 | namespace Kernel { | 18 | namespace Kernel { |
| 19 | 19 | ||
| 20 | class KernelCore; | 20 | class KernelCore; |
| 21 | 21 | ||
| 22 | class KSharedMemory final : public Object { | 22 | class KSharedMemory final |
| 23 | : public KAutoObjectWithSlabHeapAndContainer<KSharedMemory, KAutoObjectWithList> { | ||
| 24 | KERNEL_AUTOOBJECT_TRAITS(KSharedMemory, KAutoObject); | ||
| 25 | |||
| 23 | public: | 26 | public: |
| 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 | ||
| 76 | private: | 83 | private: |
| 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 | ||
| 296 | bool KThread::IsSignaled() const { | 299 | bool 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 | ||
| 124 | void IAppletResource::UpdateControllers(std::uintptr_t user_data, | 121 | void 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 { | |||
| 13 | struct EventType; | 13 | struct EventType; |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | namespace Kernel { | ||
| 17 | class KSharedMemory; | ||
| 18 | } | ||
| 19 | |||
| 20 | namespace Service::SM { | 16 | namespace Service::SM { |
| 21 | class ServiceManager; | 17 | class 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 | ||
| 46 | void IRS::ActivateIrsensor(Kernel::HLERequestContext& ctx) { | 42 | void 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 | ||
| 68 | void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) { | 64 | void 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 { | |||
| 11 | class System; | 11 | class System; |
| 12 | } | 12 | } |
| 13 | 13 | ||
| 14 | namespace Kernel { | ||
| 15 | class KSharedMemory; | ||
| 16 | } | ||
| 17 | |||
| 18 | namespace Service::HID { | 14 | namespace Service::HID { |
| 19 | 15 | ||
| 20 | class IRS final : public ServiceFramework<IRS> { | 16 | class 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 | ||
| 273 | void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) { | 269 | void 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 { | |||
| 16 | static constexpr std::size_t SHARED_MEMORY_SIZE{0x1000}; | 16 | static constexpr std::size_t SHARED_MEMORY_SIZE{0x1000}; |
| 17 | 17 | ||
| 18 | SharedMemory::SharedMemory(Core::System& system) : system(system) { | 18 | SharedMemory::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 | ||
| 23 | SharedMemory::~SharedMemory() = default; | 22 | SharedMemory::~SharedMemory() = default; |
| 24 | 23 | ||
| 25 | std::shared_ptr<Kernel::KSharedMemory> SharedMemory::GetSharedMemoryHolder() const { | ||
| 26 | return shared_memory_holder; | ||
| 27 | } | ||
| 28 | |||
| 29 | void SharedMemory::SetupStandardSteadyClock(const Common::UUID& clock_source_id, | 24 | void 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 | ||
| 40 | void SharedMemory::UpdateLocalSystemClockContext(const Clock::SystemClockContext& context) { | 35 | void 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 | ||
| 45 | void SharedMemory::UpdateNetworkSystemClockContext(const Clock::SystemClockContext& context) { | 40 | void 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 | ||
| 50 | void SharedMemory::SetAutomaticCorrectionEnabled(bool is_enabled) { | 45 | void 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 | ||
| 65 | private: | 62 | private: |
| 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 | }; |