diff options
| author | 2021-04-03 23:22:07 -0700 | |
|---|---|---|
| committer | 2021-05-05 16:40:50 -0700 | |
| commit | 086db71e942dc3468bccb741cabf62fdd221e790 (patch) | |
| tree | 46dda7ba6a9d2a1590b09ddddb450595879b2896 /src/core/hle/kernel | |
| 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/core/hle/kernel')
| -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 |
9 files changed, 116 insertions, 72 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 | } |