| 
									
										
										
										
											2022-04-23 04:59:50 -04:00
										 |  |  | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
 | 
					
						
							|  |  |  | // SPDX-License-Identifier: GPL-2.0-or-later
 | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "core/hle/kernel/k_auto_object.h"
 | 
					
						
							|  |  |  | #include "core/hle/kernel/k_auto_object_container.h"
 | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  | #include "core/hle/kernel/kernel.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Kernel { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class Derived> | 
					
						
							|  |  |  | class KSlabAllocated { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     constexpr KSlabAllocated() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     size_t GetSlabIndex(KernelCore& kernel) const { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetIndex(static_cast<const Derived*>(this)); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) { | 
					
						
							|  |  |  |         kernel.SlabHeap<Derived>().Initialize(memory, memory_size); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static Derived* Allocate(KernelCore& kernel) { | 
					
						
							| 
									
										
										
										
											2022-10-14 21:24:25 -04:00
										 |  |  |         return kernel.SlabHeap<Derived>().Allocate(kernel); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static void Free(KernelCore& kernel, Derived* obj) { | 
					
						
							|  |  |  |         kernel.SlabHeap<Derived>().Free(obj); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static size_t GetObjectSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetObjectSize(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetSlabHeapSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapSize(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetPeakIndex(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetPeakIndex(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static uintptr_t GetSlabHeapAddress(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapAddress(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static size_t GetNumRemaining(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetNumRemaining(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-29 14:19:45 -07:00
										 |  |  | template <typename Derived, typename Base> | 
					
						
							|  |  |  | class KAutoObjectWithSlabHeap : public Base { | 
					
						
							|  |  |  |     static_assert(std::is_base_of<KAutoObject, Base>::value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     static Derived* Allocate(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().Allocate(kernel); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static void Free(KernelCore& kernel, Derived* obj) { | 
					
						
							|  |  |  |         kernel.SlabHeap<Derived>().Free(obj); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     explicit KAutoObjectWithSlabHeap(KernelCore& kernel_) : Base(kernel_), kernel(kernel_) {} | 
					
						
							|  |  |  |     virtual ~KAutoObjectWithSlabHeap() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void Destroy() override { | 
					
						
							|  |  |  |         const bool is_initialized = this->IsInitialized(); | 
					
						
							|  |  |  |         uintptr_t arg = 0; | 
					
						
							|  |  |  |         if (is_initialized) { | 
					
						
							|  |  |  |             arg = this->GetPostDestroyArgument(); | 
					
						
							|  |  |  |             this->Finalize(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         Free(kernel, static_cast<Derived*>(this)); | 
					
						
							|  |  |  |         if (is_initialized) { | 
					
						
							|  |  |  |             Derived::PostDestroy(arg); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual bool IsInitialized() const { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     virtual uintptr_t GetPostDestroyArgument() const { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     size_t GetSlabIndex() const { | 
					
						
							|  |  |  |         return SlabHeap<Derived>(kernel).GetObjectIndex(static_cast<const Derived*>(this)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) { | 
					
						
							|  |  |  |         kernel.SlabHeap<Derived>().Initialize(memory, memory_size); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static Derived* Create(KernelCore& kernel) { | 
					
						
							|  |  |  |         Derived* obj = Allocate(kernel); | 
					
						
							|  |  |  |         if (obj != nullptr) { | 
					
						
							|  |  |  |             KAutoObject::Create(obj); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return obj; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetObjectSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetObjectSize(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetSlabHeapSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapSize(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetPeakIndex(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetPeakIndex(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static uintptr_t GetSlabHeapAddress(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapAddress(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetNumRemaining(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetNumRemaining(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |     KernelCore& kernel; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  | template <typename Derived, typename Base> | 
					
						
							|  |  |  | class KAutoObjectWithSlabHeapAndContainer : public Base { | 
					
						
							|  |  |  |     static_assert(std::is_base_of<KAutoObjectWithList, Base>::value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static Derived* Allocate(KernelCore& kernel) { | 
					
						
							| 
									
										
										
										
											2022-03-11 16:29:53 -08:00
										 |  |  |         return kernel.SlabHeap<Derived>().Allocate(kernel); | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static void Free(KernelCore& kernel, Derived* obj) { | 
					
						
							| 
									
										
										
										
											2021-05-20 17:39:49 -07:00
										 |  |  |         kernel.SlabHeap<Derived>().Free(obj); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     KAutoObjectWithSlabHeapAndContainer(KernelCore& kernel_) : Base(kernel_), kernel(kernel_) {} | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     virtual ~KAutoObjectWithSlabHeapAndContainer() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void Destroy() override { | 
					
						
							|  |  |  |         const bool is_initialized = this->IsInitialized(); | 
					
						
							|  |  |  |         uintptr_t arg = 0; | 
					
						
							|  |  |  |         if (is_initialized) { | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |             kernel.ObjectListContainer().Unregister(this); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |             arg = this->GetPostDestroyArgument(); | 
					
						
							|  |  |  |             this->Finalize(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |         Free(kernel, static_cast<Derived*>(this)); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |         if (is_initialized) { | 
					
						
							|  |  |  |             Derived::PostDestroy(arg); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual bool IsInitialized() const { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     virtual uintptr_t GetPostDestroyArgument() const { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     size_t GetSlabIndex() const { | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |         return SlabHeap<Derived>(kernel).GetObjectIndex(static_cast<const Derived*>(this)); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  |     static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) { | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |         kernel.SlabHeap<Derived>().Initialize(memory, memory_size); | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  |         kernel.ObjectListContainer().Initialize(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:42:23 -07:00
										 |  |  |     static Derived* Create(KernelCore& kernel) { | 
					
						
							|  |  |  |         Derived* obj = Allocate(kernel); | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  |         if (obj != nullptr) { | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |             KAutoObject::Create(obj); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return obj; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-03 19:11:46 -07:00
										 |  |  |     static void Register(KernelCore& kernel, Derived* obj) { | 
					
						
							|  |  |  |         return kernel.ObjectListContainer().Register(obj); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static size_t GetObjectSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetObjectSize(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetSlabHeapSize(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapSize(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static size_t GetPeakIndex(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetPeakIndex(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static uintptr_t GetSlabHeapAddress(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetSlabHeapAddress(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  |     static size_t GetNumRemaining(KernelCore& kernel) { | 
					
						
							|  |  |  |         return kernel.SlabHeap<Derived>().GetNumRemaining(); | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-09 22:10:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |     KernelCore& kernel; | 
					
						
							| 
									
										
										
										
											2021-03-31 21:12:33 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Kernel
 |