diff options
| author | 2023-10-21 16:47:43 -0400 | |
|---|---|---|
| committer | 2023-10-21 20:03:41 -0400 | |
| commit | 8c59543ee32c8bff575bab7ec1e70f76f8eda437 (patch) | |
| tree | afeee77ba66daf7ec6bff18515c8fbf1bb8468e0 /src/core/hle/kernel/board | |
| parent | Merge pull request #11831 from liamwhite/hosversionbetween (diff) | |
| download | yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.tar.gz yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.tar.xz yuzu-8c59543ee32c8bff575bab7ec1e70f76f8eda437.zip | |
kernel: update KProcess
Diffstat (limited to 'src/core/hle/kernel/board')
| -rw-r--r-- | src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp | 59 | ||||
| -rw-r--r-- | src/core/hle/kernel/board/nintendo/nx/k_system_control.h | 13 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index 4cfdf4558..59364efa1 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp | |||
| @@ -8,7 +8,11 @@ | |||
| 8 | 8 | ||
| 9 | #include "core/hle/kernel/board/nintendo/nx/k_system_control.h" | 9 | #include "core/hle/kernel/board/nintendo/nx/k_system_control.h" |
| 10 | #include "core/hle/kernel/board/nintendo/nx/secure_monitor.h" | 10 | #include "core/hle/kernel/board/nintendo/nx/secure_monitor.h" |
| 11 | #include "core/hle/kernel/k_memory_manager.h" | ||
| 12 | #include "core/hle/kernel/k_page_table.h" | ||
| 11 | #include "core/hle/kernel/k_trace.h" | 13 | #include "core/hle/kernel/k_trace.h" |
| 14 | #include "core/hle/kernel/kernel.h" | ||
| 15 | #include "core/hle/kernel/svc_results.h" | ||
| 12 | 16 | ||
| 13 | namespace Kernel::Board::Nintendo::Nx { | 17 | namespace Kernel::Board::Nintendo::Nx { |
| 14 | 18 | ||
| @@ -30,6 +34,8 @@ constexpr const std::size_t RequiredNonSecureSystemMemorySize = | |||
| 30 | constexpr const std::size_t RequiredNonSecureSystemMemorySizeWithFatal = | 34 | constexpr const std::size_t RequiredNonSecureSystemMemorySizeWithFatal = |
| 31 | RequiredNonSecureSystemMemorySize + impl::RequiredNonSecureSystemMemorySizeViFatal; | 35 | RequiredNonSecureSystemMemorySize + impl::RequiredNonSecureSystemMemorySizeViFatal; |
| 32 | 36 | ||
| 37 | constexpr const std::size_t SecureAlignment = 128_KiB; | ||
| 38 | |||
| 33 | namespace { | 39 | namespace { |
| 34 | 40 | ||
| 35 | using namespace Common::Literals; | 41 | using namespace Common::Literals; |
| @@ -183,4 +189,57 @@ u64 KSystemControl::GenerateRandomRange(u64 min, u64 max) { | |||
| 183 | return GenerateUniformRange(min, max, GenerateRandomU64); | 189 | return GenerateUniformRange(min, max, GenerateRandomU64); |
| 184 | } | 190 | } |
| 185 | 191 | ||
| 192 | size_t KSystemControl::CalculateRequiredSecureMemorySize(size_t size, u32 pool) { | ||
| 193 | if (pool == static_cast<u32>(KMemoryManager::Pool::Applet)) { | ||
| 194 | return 0; | ||
| 195 | } else { | ||
| 196 | // return KSystemControlBase::CalculateRequiredSecureMemorySize(size, pool); | ||
| 197 | return size; | ||
| 198 | } | ||
| 199 | } | ||
| 200 | |||
| 201 | Result KSystemControl::AllocateSecureMemory(KernelCore& kernel, KVirtualAddress* out, size_t size, | ||
| 202 | u32 pool) { | ||
| 203 | // Applet secure memory is handled separately. | ||
| 204 | UNIMPLEMENTED_IF(pool == static_cast<u32>(KMemoryManager::Pool::Applet)); | ||
| 205 | |||
| 206 | // Ensure the size is aligned. | ||
| 207 | const size_t alignment = | ||
| 208 | (pool == static_cast<u32>(KMemoryManager::Pool::System) ? PageSize : SecureAlignment); | ||
| 209 | R_UNLESS(Common::IsAligned(size, alignment), ResultInvalidSize); | ||
| 210 | |||
| 211 | // Allocate the memory. | ||
| 212 | const size_t num_pages = size / PageSize; | ||
| 213 | const KPhysicalAddress paddr = kernel.MemoryManager().AllocateAndOpenContinuous( | ||
| 214 | num_pages, alignment / PageSize, | ||
| 215 | KMemoryManager::EncodeOption(static_cast<KMemoryManager::Pool>(pool), | ||
| 216 | KMemoryManager::Direction::FromFront)); | ||
| 217 | R_UNLESS(paddr != 0, ResultOutOfMemory); | ||
| 218 | |||
| 219 | // Ensure we don't leak references to the memory on error. | ||
| 220 | ON_RESULT_FAILURE { | ||
| 221 | kernel.MemoryManager().Close(paddr, num_pages); | ||
| 222 | }; | ||
| 223 | |||
| 224 | // We succeeded. | ||
| 225 | *out = KPageTable::GetHeapVirtualAddress(kernel.MemoryLayout(), paddr); | ||
| 226 | R_SUCCEED(); | ||
| 227 | } | ||
| 228 | |||
| 229 | void KSystemControl::FreeSecureMemory(KernelCore& kernel, KVirtualAddress address, size_t size, | ||
| 230 | u32 pool) { | ||
| 231 | // Applet secure memory is handled separately. | ||
| 232 | UNIMPLEMENTED_IF(pool == static_cast<u32>(KMemoryManager::Pool::Applet)); | ||
| 233 | |||
| 234 | // Ensure the size is aligned. | ||
| 235 | const size_t alignment = | ||
| 236 | (pool == static_cast<u32>(KMemoryManager::Pool::System) ? PageSize : SecureAlignment); | ||
| 237 | ASSERT(Common::IsAligned(GetInteger(address), alignment)); | ||
| 238 | ASSERT(Common::IsAligned(size, alignment)); | ||
| 239 | |||
| 240 | // Close the secure region's pages. | ||
| 241 | kernel.MemoryManager().Close(KPageTable::GetHeapPhysicalAddress(kernel.MemoryLayout(), address), | ||
| 242 | size / PageSize); | ||
| 243 | } | ||
| 244 | |||
| 186 | } // namespace Kernel::Board::Nintendo::Nx | 245 | } // namespace Kernel::Board::Nintendo::Nx |
diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.h b/src/core/hle/kernel/board/nintendo/nx/k_system_control.h index b477e8193..ff1feec70 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.h +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.h | |||
| @@ -4,6 +4,11 @@ | |||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include "core/hle/kernel/k_typed_address.h" | 6 | #include "core/hle/kernel/k_typed_address.h" |
| 7 | #include "core/hle/result.h" | ||
| 8 | |||
| 9 | namespace Kernel { | ||
| 10 | class KernelCore; | ||
| 11 | } | ||
| 7 | 12 | ||
| 8 | namespace Kernel::Board::Nintendo::Nx { | 13 | namespace Kernel::Board::Nintendo::Nx { |
| 9 | 14 | ||
| @@ -25,8 +30,16 @@ public: | |||
| 25 | static std::size_t GetMinimumNonSecureSystemPoolSize(); | 30 | static std::size_t GetMinimumNonSecureSystemPoolSize(); |
| 26 | }; | 31 | }; |
| 27 | 32 | ||
| 33 | // Randomness. | ||
| 28 | static u64 GenerateRandomRange(u64 min, u64 max); | 34 | static u64 GenerateRandomRange(u64 min, u64 max); |
| 29 | static u64 GenerateRandomU64(); | 35 | static u64 GenerateRandomU64(); |
| 36 | |||
| 37 | // Secure Memory. | ||
| 38 | static size_t CalculateRequiredSecureMemorySize(size_t size, u32 pool); | ||
| 39 | static Result AllocateSecureMemory(KernelCore& kernel, KVirtualAddress* out, size_t size, | ||
| 40 | u32 pool); | ||
| 41 | static void FreeSecureMemory(KernelCore& kernel, KVirtualAddress address, size_t size, | ||
| 42 | u32 pool); | ||
| 30 | }; | 43 | }; |
| 31 | 44 | ||
| 32 | } // namespace Kernel::Board::Nintendo::Nx | 45 | } // namespace Kernel::Board::Nintendo::Nx |