summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar bunnei2021-03-20 00:23:06 -0700
committerGravatar bunnei2021-03-21 14:45:03 -0700
commitedbc505e52c8dacce91c7f89c798ae1b6da801e7 (patch)
tree9ee4410d8231a90e0547a529d24023a65013f4a6 /src/core/hle/kernel
parenthle: kernel: board: Add secure_monitor module. (diff)
downloadyuzu-edbc505e52c8dacce91c7f89c798ae1b6da801e7.tar.gz
yuzu-edbc505e52c8dacce91c7f89c798ae1b6da801e7.tar.xz
yuzu-edbc505e52c8dacce91c7f89c798ae1b6da801e7.zip
hle: kernel: board: k_system_control: Extend to include memory region sizes.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp120
-rw-r--r--src/core/hle/kernel/board/nintendo/nx/k_system_control.h6
2 files changed, 125 insertions, 1 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 0f41c4110..a48d0c11e 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
@@ -4,14 +4,132 @@
4 4
5#include <random> 5#include <random>
6 6
7#include "core/hle/kernel/k_system_control.h" 7#include "common/common_sizes.h"
8#include "core/hle/kernel/board/nintendo/nx/k_system_control.h"
9#include "core/hle/kernel/board/nintendo/nx/secure_monitor.h"
10#include "core/hle/kernel/k_trace.h"
8 11
9namespace Kernel::Board::Nintendo::Nx { 12namespace Kernel::Board::Nintendo::Nx {
10 13
14namespace impl {
15
16constexpr inline const std::size_t RequiredNonSecureSystemMemorySizeVi = 0x2238 * 4 * 1024;
17constexpr inline const std::size_t RequiredNonSecureSystemMemorySizeNvservices = 0x710 * 4 * 1024;
18constexpr inline const std::size_t RequiredNonSecureSystemMemorySizeMisc = 0x80 * 4 * 1024;
19
20} // namespace impl
21
22constexpr inline const std::size_t RequiredNonSecureSystemMemorySize =
23 impl::RequiredNonSecureSystemMemorySizeVi + impl::RequiredNonSecureSystemMemorySizeNvservices +
24 impl::RequiredNonSecureSystemMemorySizeMisc;
25
26namespace {
27
28u32 GetMemoryModeForInit() {
29 return 0x01;
30}
31
32u32 GetMemorySizeForInit() {
33 return 0;
34}
35
36Smc::MemoryArrangement GetMemoryArrangeForInit() {
37 switch (GetMemoryModeForInit() & 0x3F) {
38 case 0x01:
39 default:
40 return Smc::MemoryArrangement_4GB;
41 case 0x02:
42 return Smc::MemoryArrangement_4GBForAppletDev;
43 case 0x03:
44 return Smc::MemoryArrangement_4GBForSystemDev;
45 case 0x11:
46 return Smc::MemoryArrangement_6GB;
47 case 0x12:
48 return Smc::MemoryArrangement_6GBForAppletDev;
49 case 0x21:
50 return Smc::MemoryArrangement_8GB;
51 }
52}
53} // namespace
54
55// Initialization.
56size_t KSystemControl::Init::GetIntendedMemorySize() {
57 switch (GetMemorySizeForInit()) {
58 case Smc::MemorySize_4GB:
59 default: // All invalid modes should go to 4GB.
60 return Size_4_GB;
61 case Smc::MemorySize_6GB:
62 return Size_6_GB;
63 case Smc::MemorySize_8GB:
64 return Size_8_GB;
65 }
66}
67
68PAddr KSystemControl::Init::GetKernelPhysicalBaseAddress(u64 base_address) {
69 return base_address;
70}
71
11bool KSystemControl::Init::ShouldIncreaseThreadResourceLimit() { 72bool KSystemControl::Init::ShouldIncreaseThreadResourceLimit() {
12 return true; 73 return true;
13} 74}
14 75
76std::size_t KSystemControl::Init::GetApplicationPoolSize() {
77 // Get the base pool size.
78 const size_t base_pool_size = []() -> size_t {
79 switch (GetMemoryArrangeForInit()) {
80 case Smc::MemoryArrangement_4GB:
81 default:
82 return Size_3285_MB;
83 case Smc::MemoryArrangement_4GBForAppletDev:
84 return Size_2048_MB;
85 case Smc::MemoryArrangement_4GBForSystemDev:
86 return Size_3285_MB;
87 case Smc::MemoryArrangement_6GB:
88 return Size_4916_MB;
89 case Smc::MemoryArrangement_6GBForAppletDev:
90 return Size_3285_MB;
91 case Smc::MemoryArrangement_8GB:
92 return Size_4916_MB;
93 }
94 }();
95
96 // Return (possibly) adjusted size.
97 return base_pool_size;
98}
99
100size_t KSystemControl::Init::GetAppletPoolSize() {
101 // Get the base pool size.
102 const size_t base_pool_size = []() -> size_t {
103 switch (GetMemoryArrangeForInit()) {
104 case Smc::MemoryArrangement_4GB:
105 default:
106 return Size_507_MB;
107 case Smc::MemoryArrangement_4GBForAppletDev:
108 return Size_1554_MB;
109 case Smc::MemoryArrangement_4GBForSystemDev:
110 return Size_448_MB;
111 case Smc::MemoryArrangement_6GB:
112 return Size_562_MB;
113 case Smc::MemoryArrangement_6GBForAppletDev:
114 return Size_2193_MB;
115 case Smc::MemoryArrangement_8GB:
116 return Size_2193_MB;
117 }
118 }();
119
120 // Return (possibly) adjusted size.
121 constexpr size_t ExtraSystemMemoryForAtmosphere = Size_33_MB;
122 return base_pool_size - ExtraSystemMemoryForAtmosphere - KTraceBufferSize;
123}
124
125size_t KSystemControl::Init::GetMinimumNonSecureSystemPoolSize() {
126 // Verify that our minimum is at least as large as Nintendo's.
127 constexpr size_t MinimumSize = RequiredNonSecureSystemMemorySize;
128 static_assert(MinimumSize >= 0x29C8000);
129
130 return MinimumSize;
131}
132
15namespace { 133namespace {
16template <typename F> 134template <typename F>
17u64 GenerateUniformRange(u64 min, u64 max, F f) { 135u64 GenerateUniformRange(u64 min, u64 max, F f) {
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 3fde61971..52f230ced 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
@@ -12,7 +12,13 @@ class KSystemControl {
12public: 12public:
13 class Init { 13 class Init {
14 public: 14 public:
15 // Initialization.
16 static std::size_t GetIntendedMemorySize();
17 static PAddr GetKernelPhysicalBaseAddress(u64 base_address);
15 static bool ShouldIncreaseThreadResourceLimit(); 18 static bool ShouldIncreaseThreadResourceLimit();
19 static std::size_t GetApplicationPoolSize();
20 static std::size_t GetAppletPoolSize();
21 static std::size_t GetMinimumNonSecureSystemPoolSize();
16 }; 22 };
17 23
18 static u64 GenerateRandomRange(u64 min, u64 max); 24 static u64 GenerateRandomRange(u64 min, u64 max);