diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 115 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 44 |
2 files changed, 159 insertions, 0 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 014d647cf..db5796d15 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -18,15 +18,20 @@ | |||
| 18 | #include "core/core.h" | 18 | #include "core/core.h" |
| 19 | #include "core/core_timing.h" | 19 | #include "core/core_timing.h" |
| 20 | #include "core/core_timing_util.h" | 20 | #include "core/core_timing_util.h" |
| 21 | #include "core/device_memory.h" | ||
| 21 | #include "core/hardware_properties.h" | 22 | #include "core/hardware_properties.h" |
| 22 | #include "core/hle/kernel/client_port.h" | 23 | #include "core/hle/kernel/client_port.h" |
| 23 | #include "core/hle/kernel/errors.h" | 24 | #include "core/hle/kernel/errors.h" |
| 24 | #include "core/hle/kernel/handle_table.h" | 25 | #include "core/hle/kernel/handle_table.h" |
| 25 | #include "core/hle/kernel/kernel.h" | 26 | #include "core/hle/kernel/kernel.h" |
| 27 | #include "core/hle/kernel/memory/memory_layout.h" | ||
| 28 | #include "core/hle/kernel/memory/memory_manager.h" | ||
| 29 | #include "core/hle/kernel/memory/slab_heap.h" | ||
| 26 | #include "core/hle/kernel/physical_core.h" | 30 | #include "core/hle/kernel/physical_core.h" |
| 27 | #include "core/hle/kernel/process.h" | 31 | #include "core/hle/kernel/process.h" |
| 28 | #include "core/hle/kernel/resource_limit.h" | 32 | #include "core/hle/kernel/resource_limit.h" |
| 29 | #include "core/hle/kernel/scheduler.h" | 33 | #include "core/hle/kernel/scheduler.h" |
| 34 | #include "core/hle/kernel/shared_memory.h" | ||
| 30 | #include "core/hle/kernel/synchronization.h" | 35 | #include "core/hle/kernel/synchronization.h" |
| 31 | #include "core/hle/kernel/thread.h" | 36 | #include "core/hle/kernel/thread.h" |
| 32 | #include "core/hle/kernel/time_manager.h" | 37 | #include "core/hle/kernel/time_manager.h" |
| @@ -110,6 +115,7 @@ struct KernelCore::Impl { | |||
| 110 | 115 | ||
| 111 | InitializePhysicalCores(); | 116 | InitializePhysicalCores(); |
| 112 | InitializeSystemResourceLimit(kernel); | 117 | InitializeSystemResourceLimit(kernel); |
| 118 | InitializeMemoryLayout(); | ||
| 113 | InitializeThreads(); | 119 | InitializeThreads(); |
| 114 | InitializePreemption(); | 120 | InitializePreemption(); |
| 115 | } | 121 | } |
| @@ -237,6 +243,57 @@ struct KernelCore::Impl { | |||
| 237 | return result; | 243 | return result; |
| 238 | } | 244 | } |
| 239 | 245 | ||
| 246 | void InitializeMemoryLayout() { | ||
| 247 | // Initialize memory layout | ||
| 248 | constexpr Memory::MemoryLayout layout{Memory::MemoryLayout::GetDefaultLayout()}; | ||
| 249 | constexpr std::size_t hid_size{0x40000}; | ||
| 250 | constexpr std::size_t font_size{0x1100000}; | ||
| 251 | constexpr std::size_t irs_size{0x8000}; | ||
| 252 | constexpr std::size_t time_size{0x1000}; | ||
| 253 | constexpr PAddr hid_addr{layout.System().StartAddress()}; | ||
| 254 | constexpr PAddr font_pa{layout.System().StartAddress() + hid_size}; | ||
| 255 | constexpr PAddr irs_addr{layout.System().StartAddress() + hid_size + font_size}; | ||
| 256 | constexpr PAddr time_addr{layout.System().StartAddress() + hid_size + font_size + irs_size}; | ||
| 257 | |||
| 258 | // Initialize memory manager | ||
| 259 | memory_manager = std::make_unique<Memory::MemoryManager>(); | ||
| 260 | memory_manager->InitializeManager(Memory::MemoryManager::Pool::Application, | ||
| 261 | layout.Application().StartAddress(), | ||
| 262 | layout.Application().EndAddress()); | ||
| 263 | memory_manager->InitializeManager(Memory::MemoryManager::Pool::Applet, | ||
| 264 | layout.Applet().StartAddress(), | ||
| 265 | layout.Applet().EndAddress()); | ||
| 266 | memory_manager->InitializeManager(Memory::MemoryManager::Pool::System, | ||
| 267 | layout.System().StartAddress(), | ||
| 268 | layout.System().EndAddress()); | ||
| 269 | |||
| 270 | hid_shared_mem = Kernel::SharedMemory::Create( | ||
| 271 | system.Kernel(), system.DeviceMemory(), nullptr, | ||
| 272 | {hid_addr, hid_size / Memory::PageSize}, Memory::MemoryPermission::None, | ||
| 273 | Memory::MemoryPermission::Read, hid_addr, hid_size, "HID:SharedMemory"); | ||
| 274 | font_shared_mem = Kernel::SharedMemory::Create( | ||
| 275 | system.Kernel(), system.DeviceMemory(), nullptr, | ||
| 276 | {font_pa, font_size / Memory::PageSize}, Memory::MemoryPermission::None, | ||
| 277 | Memory::MemoryPermission::Read, font_pa, font_size, "Font:SharedMemory"); | ||
| 278 | irs_shared_mem = Kernel::SharedMemory::Create( | ||
| 279 | system.Kernel(), system.DeviceMemory(), nullptr, | ||
| 280 | {irs_addr, irs_size / Memory::PageSize}, Memory::MemoryPermission::None, | ||
| 281 | Memory::MemoryPermission::Read, irs_addr, irs_size, "IRS:SharedMemory"); | ||
| 282 | time_shared_mem = Kernel::SharedMemory::Create( | ||
| 283 | system.Kernel(), system.DeviceMemory(), nullptr, | ||
| 284 | {time_addr, time_size / Memory::PageSize}, Memory::MemoryPermission::None, | ||
| 285 | Memory::MemoryPermission::Read, time_addr, time_size, "Time:SharedMemory"); | ||
| 286 | |||
| 287 | // Allocate slab heaps | ||
| 288 | user_slab_heap_pages = std::make_unique<Memory::SlabHeap<Memory::Page>>(); | ||
| 289 | |||
| 290 | // Initialize slab heaps | ||
| 291 | constexpr u64 user_slab_heap_size{0x3de000}; | ||
| 292 | user_slab_heap_pages->Initialize( | ||
| 293 | system.DeviceMemory().GetPointer(Core::DramMemoryMap::SlabHeapBase), | ||
| 294 | user_slab_heap_size); | ||
| 295 | } | ||
| 296 | |||
| 240 | std::atomic<u32> next_object_id{0}; | 297 | std::atomic<u32> next_object_id{0}; |
| 241 | std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin}; | 298 | std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin}; |
| 242 | std::atomic<u64> next_user_process_id{Process::ProcessIDMin}; | 299 | std::atomic<u64> next_user_process_id{Process::ProcessIDMin}; |
| @@ -271,6 +328,16 @@ struct KernelCore::Impl { | |||
| 271 | std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads; | 328 | std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads; |
| 272 | std::mutex register_thread_mutex; | 329 | std::mutex register_thread_mutex; |
| 273 | 330 | ||
| 331 | // Kernel memory management | ||
| 332 | std::unique_ptr<Memory::MemoryManager> memory_manager; | ||
| 333 | std::unique_ptr<Memory::SlabHeap<Memory::Page>> user_slab_heap_pages; | ||
| 334 | |||
| 335 | // Shared memory for services | ||
| 336 | std::shared_ptr<Kernel::SharedMemory> hid_shared_mem; | ||
| 337 | std::shared_ptr<Kernel::SharedMemory> font_shared_mem; | ||
| 338 | std::shared_ptr<Kernel::SharedMemory> irs_shared_mem; | ||
| 339 | std::shared_ptr<Kernel::SharedMemory> time_shared_mem; | ||
| 340 | |||
| 274 | // System context | 341 | // System context |
| 275 | Core::System& system; | 342 | Core::System& system; |
| 276 | }; | 343 | }; |
| @@ -437,4 +504,52 @@ Core::EmuThreadHandle KernelCore::GetCurrentEmuThreadID() const { | |||
| 437 | return impl->GetCurrentEmuThreadID(); | 504 | return impl->GetCurrentEmuThreadID(); |
| 438 | } | 505 | } |
| 439 | 506 | ||
| 507 | Memory::MemoryManager& KernelCore::MemoryManager() { | ||
| 508 | return *impl->memory_manager; | ||
| 509 | } | ||
| 510 | |||
| 511 | const Memory::MemoryManager& KernelCore::MemoryManager() const { | ||
| 512 | return *impl->memory_manager; | ||
| 513 | } | ||
| 514 | |||
| 515 | Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() { | ||
| 516 | return *impl->user_slab_heap_pages; | ||
| 517 | } | ||
| 518 | |||
| 519 | const Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() const { | ||
| 520 | return *impl->user_slab_heap_pages; | ||
| 521 | } | ||
| 522 | |||
| 523 | Kernel::SharedMemory& KernelCore::GetHidSharedMem() { | ||
| 524 | return *impl->hid_shared_mem; | ||
| 525 | } | ||
| 526 | |||
| 527 | const Kernel::SharedMemory& KernelCore::GetHidSharedMem() const { | ||
| 528 | return *impl->hid_shared_mem; | ||
| 529 | } | ||
| 530 | |||
| 531 | Kernel::SharedMemory& KernelCore::GetFontSharedMem() { | ||
| 532 | return *impl->font_shared_mem; | ||
| 533 | } | ||
| 534 | |||
| 535 | const Kernel::SharedMemory& KernelCore::GetFontSharedMem() const { | ||
| 536 | return *impl->font_shared_mem; | ||
| 537 | } | ||
| 538 | |||
| 539 | Kernel::SharedMemory& KernelCore::GetIrsSharedMem() { | ||
| 540 | return *impl->irs_shared_mem; | ||
| 541 | } | ||
| 542 | |||
| 543 | const Kernel::SharedMemory& KernelCore::GetIrsSharedMem() const { | ||
| 544 | return *impl->irs_shared_mem; | ||
| 545 | } | ||
| 546 | |||
| 547 | Kernel::SharedMemory& KernelCore::GetTimeSharedMem() { | ||
| 548 | return *impl->time_shared_mem; | ||
| 549 | } | ||
| 550 | |||
| 551 | const Kernel::SharedMemory& KernelCore::GetTimeSharedMem() const { | ||
| 552 | return *impl->time_shared_mem; | ||
| 553 | } | ||
| 554 | |||
| 440 | } // namespace Kernel | 555 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index c4f78ab71..83de1f542 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <unordered_map> | 9 | #include <unordered_map> |
| 10 | #include <vector> | 10 | #include <vector> |
| 11 | #include "core/hle/kernel/memory/memory_types.h" | ||
| 11 | #include "core/hle/kernel/object.h" | 12 | #include "core/hle/kernel/object.h" |
| 12 | 13 | ||
| 13 | namespace Core { | 14 | namespace Core { |
| @@ -23,6 +24,12 @@ struct EventType; | |||
| 23 | 24 | ||
| 24 | namespace Kernel { | 25 | namespace Kernel { |
| 25 | 26 | ||
| 27 | namespace Memory { | ||
| 28 | class MemoryManager; | ||
| 29 | template <typename T> | ||
| 30 | class SlabHeap; | ||
| 31 | } // namespace Memory | ||
| 32 | |||
| 26 | class AddressArbiter; | 33 | class AddressArbiter; |
| 27 | class ClientPort; | 34 | class ClientPort; |
| 28 | class GlobalScheduler; | 35 | class GlobalScheduler; |
| @@ -31,6 +38,7 @@ class PhysicalCore; | |||
| 31 | class Process; | 38 | class Process; |
| 32 | class ResourceLimit; | 39 | class ResourceLimit; |
| 33 | class Scheduler; | 40 | class Scheduler; |
| 41 | class SharedMemory; | ||
| 34 | class Synchronization; | 42 | class Synchronization; |
| 35 | class Thread; | 43 | class Thread; |
| 36 | class TimeManager; | 44 | class TimeManager; |
| @@ -147,6 +155,42 @@ public: | |||
| 147 | /// Register the current thread as a non CPU core thread. | 155 | /// Register the current thread as a non CPU core thread. |
| 148 | void RegisterHostThread(); | 156 | void RegisterHostThread(); |
| 149 | 157 | ||
| 158 | /// Gets the virtual memory manager for the kernel. | ||
| 159 | Memory::MemoryManager& MemoryManager(); | ||
| 160 | |||
| 161 | /// Gets the virtual memory manager for the kernel. | ||
| 162 | const Memory::MemoryManager& MemoryManager() const; | ||
| 163 | |||
| 164 | /// Gets the slab heap allocated for user space pages. | ||
| 165 | Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages(); | ||
| 166 | |||
| 167 | /// Gets the slab heap allocated for user space pages. | ||
| 168 | const Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages() const; | ||
| 169 | |||
| 170 | /// Gets the shared memory object for HID services. | ||
| 171 | Kernel::SharedMemory& GetHidSharedMem(); | ||
| 172 | |||
| 173 | /// Gets the shared memory object for HID services. | ||
| 174 | const Kernel::SharedMemory& GetHidSharedMem() const; | ||
| 175 | |||
| 176 | /// Gets the shared memory object for font services. | ||
| 177 | Kernel::SharedMemory& GetFontSharedMem(); | ||
| 178 | |||
| 179 | /// Gets the shared memory object for font services. | ||
| 180 | const Kernel::SharedMemory& GetFontSharedMem() const; | ||
| 181 | |||
| 182 | /// Gets the shared memory object for IRS services. | ||
| 183 | Kernel::SharedMemory& GetIrsSharedMem(); | ||
| 184 | |||
| 185 | /// Gets the shared memory object for IRS services. | ||
| 186 | const Kernel::SharedMemory& GetIrsSharedMem() const; | ||
| 187 | |||
| 188 | /// Gets the shared memory object for Time services. | ||
| 189 | Kernel::SharedMemory& GetTimeSharedMem(); | ||
| 190 | |||
| 191 | /// Gets the shared memory object for Time services. | ||
| 192 | const Kernel::SharedMemory& GetTimeSharedMem() const; | ||
| 193 | |||
| 150 | private: | 194 | private: |
| 151 | friend class Object; | 195 | friend class Object; |
| 152 | friend class Process; | 196 | friend class Process; |