summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_memory_block.h110
-rw-r--r--src/core/hle/kernel/svc_types.h4
2 files changed, 66 insertions, 48 deletions
diff --git a/src/core/hle/kernel/k_memory_block.h b/src/core/hle/kernel/k_memory_block.h
index 9444f6bd2..6f845d675 100644
--- a/src/core/hle/kernel/k_memory_block.h
+++ b/src/core/hle/kernel/k_memory_block.h
@@ -35,26 +35,32 @@ enum class KMemoryState : u32 {
35 FlagCanMapProcess = (1 << 23), 35 FlagCanMapProcess = (1 << 23),
36 FlagCanChangeAttribute = (1 << 24), 36 FlagCanChangeAttribute = (1 << 24),
37 FlagCanCodeMemory = (1 << 25), 37 FlagCanCodeMemory = (1 << 25),
38 FlagLinearMapped = (1 << 26),
38 39
39 FlagsData = FlagCanReprotect | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc | 40 FlagsData = FlagCanReprotect | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc |
40 FlagMapped | FlagCanAlias | FlagCanTransfer | FlagCanQueryPhysical | 41 FlagMapped | FlagCanAlias | FlagCanTransfer | FlagCanQueryPhysical |
41 FlagCanDeviceMap | FlagCanAlignedDeviceMap | FlagCanIpcUserBuffer | 42 FlagCanDeviceMap | FlagCanAlignedDeviceMap | FlagCanIpcUserBuffer |
42 FlagReferenceCounted | FlagCanChangeAttribute, 43 FlagReferenceCounted | FlagCanChangeAttribute | FlagLinearMapped,
43 44
44 FlagsCode = FlagCanDebug | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc | 45 FlagsCode = FlagCanDebug | FlagCanUseIpc | FlagCanUseNonDeviceIpc | FlagCanUseNonSecureIpc |
45 FlagMapped | FlagCode | FlagCanQueryPhysical | FlagCanDeviceMap | 46 FlagMapped | FlagCode | FlagCanQueryPhysical | FlagCanDeviceMap |
46 FlagCanAlignedDeviceMap | FlagReferenceCounted, 47 FlagCanAlignedDeviceMap | FlagReferenceCounted | FlagLinearMapped,
47 48
48 FlagsMisc = FlagMapped | FlagReferenceCounted | FlagCanQueryPhysical | FlagCanDeviceMap, 49 FlagsMisc = FlagMapped | FlagReferenceCounted | FlagCanQueryPhysical | FlagCanDeviceMap |
50 FlagLinearMapped,
49 51
50 Free = static_cast<u32>(Svc::MemoryState::Free), 52 Free = static_cast<u32>(Svc::MemoryState::Free),
51 Io = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped, 53 Io = static_cast<u32>(Svc::MemoryState::Io) | FlagMapped | FlagCanDeviceMap |
54 FlagCanAlignedDeviceMap,
52 Static = static_cast<u32>(Svc::MemoryState::Static) | FlagMapped | FlagCanQueryPhysical, 55 Static = static_cast<u32>(Svc::MemoryState::Static) | FlagMapped | FlagCanQueryPhysical,
53 Code = static_cast<u32>(Svc::MemoryState::Code) | FlagsCode | FlagCanMapProcess, 56 Code = static_cast<u32>(Svc::MemoryState::Code) | FlagsCode | FlagCanMapProcess,
54 CodeData = static_cast<u32>(Svc::MemoryState::CodeData) | FlagsData | FlagCanMapProcess | 57 CodeData = static_cast<u32>(Svc::MemoryState::CodeData) | FlagsData | FlagCanMapProcess |
55 FlagCanCodeMemory, 58 FlagCanCodeMemory,
56 Shared = static_cast<u32>(Svc::MemoryState::Shared) | FlagMapped | FlagReferenceCounted,
57 Normal = static_cast<u32>(Svc::MemoryState::Normal) | FlagsData | FlagCanCodeMemory, 59 Normal = static_cast<u32>(Svc::MemoryState::Normal) | FlagsData | FlagCanCodeMemory,
60 Shared = static_cast<u32>(Svc::MemoryState::Shared) | FlagMapped | FlagReferenceCounted |
61 FlagLinearMapped,
62
63 // Alias was removed after 1.0.0.
58 64
59 AliasCode = static_cast<u32>(Svc::MemoryState::AliasCode) | FlagsCode | FlagCanMapProcess | 65 AliasCode = static_cast<u32>(Svc::MemoryState::AliasCode) | FlagsCode | FlagCanMapProcess |
60 FlagCanCodeAlias, 66 FlagCanCodeAlias,
@@ -67,18 +73,18 @@ enum class KMemoryState : u32 {
67 Stack = static_cast<u32>(Svc::MemoryState::Stack) | FlagsMisc | FlagCanAlignedDeviceMap | 73 Stack = static_cast<u32>(Svc::MemoryState::Stack) | FlagsMisc | FlagCanAlignedDeviceMap |
68 FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, 74 FlagCanUseIpc | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc,
69 75
70 ThreadLocal = 76 ThreadLocal = static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagMapped | FlagLinearMapped,
71 static_cast<u32>(Svc::MemoryState::ThreadLocal) | FlagMapped | FlagReferenceCounted,
72 77
73 Transfered = static_cast<u32>(Svc::MemoryState::Transferred) | FlagsMisc | 78 Transfered = static_cast<u32>(Svc::MemoryState::Transfered) | FlagsMisc |
74 FlagCanAlignedDeviceMap | FlagCanChangeAttribute | FlagCanUseIpc | 79 FlagCanAlignedDeviceMap | FlagCanChangeAttribute | FlagCanUseIpc |
75 FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, 80 FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc,
76 81
77 SharedTransfered = static_cast<u32>(Svc::MemoryState::SharedTransferred) | FlagsMisc | 82 SharedTransfered = static_cast<u32>(Svc::MemoryState::SharedTransfered) | FlagsMisc |
78 FlagCanAlignedDeviceMap | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, 83 FlagCanAlignedDeviceMap | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc,
79 84
80 SharedCode = static_cast<u32>(Svc::MemoryState::SharedCode) | FlagMapped | 85 SharedCode = static_cast<u32>(Svc::MemoryState::SharedCode) | FlagMapped |
81 FlagReferenceCounted | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc, 86 FlagReferenceCounted | FlagLinearMapped | FlagCanUseNonSecureIpc |
87 FlagCanUseNonDeviceIpc,
82 88
83 Inaccessible = static_cast<u32>(Svc::MemoryState::Inaccessible), 89 Inaccessible = static_cast<u32>(Svc::MemoryState::Inaccessible),
84 90
@@ -91,69 +97,69 @@ enum class KMemoryState : u32 {
91 Kernel = static_cast<u32>(Svc::MemoryState::Kernel) | FlagMapped, 97 Kernel = static_cast<u32>(Svc::MemoryState::Kernel) | FlagMapped,
92 98
93 GeneratedCode = static_cast<u32>(Svc::MemoryState::GeneratedCode) | FlagMapped | 99 GeneratedCode = static_cast<u32>(Svc::MemoryState::GeneratedCode) | FlagMapped |
94 FlagReferenceCounted | FlagCanDebug, 100 FlagReferenceCounted | FlagCanDebug | FlagLinearMapped,
95 CodeOut = static_cast<u32>(Svc::MemoryState::CodeOut) | FlagMapped | FlagReferenceCounted, 101 CodeOut = static_cast<u32>(Svc::MemoryState::CodeOut) | FlagMapped | FlagReferenceCounted |
102 FlagLinearMapped,
96 103
97 Coverage = static_cast<u32>(Svc::MemoryState::Coverage) | FlagMapped, 104 Coverage = static_cast<u32>(Svc::MemoryState::Coverage) | FlagMapped,
105
106 Insecure = static_cast<u32>(Svc::MemoryState::Insecure) | FlagMapped | FlagReferenceCounted |
107 FlagLinearMapped | FlagCanChangeAttribute | FlagCanDeviceMap |
108 FlagCanAlignedDeviceMap | FlagCanUseNonSecureIpc | FlagCanUseNonDeviceIpc,
98}; 109};
99DECLARE_ENUM_FLAG_OPERATORS(KMemoryState); 110DECLARE_ENUM_FLAG_OPERATORS(KMemoryState);
100 111
101static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000); 112static_assert(static_cast<u32>(KMemoryState::Free) == 0x00000000);
102static_assert(static_cast<u32>(KMemoryState::Io) == 0x00002001); 113static_assert(static_cast<u32>(KMemoryState::Io) == 0x00182001);
103static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002); 114static_assert(static_cast<u32>(KMemoryState::Static) == 0x00042002);
104static_assert(static_cast<u32>(KMemoryState::Code) == 0x00DC7E03); 115static_assert(static_cast<u32>(KMemoryState::Code) == 0x04DC7E03);
105static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x03FEBD04); 116static_assert(static_cast<u32>(KMemoryState::CodeData) == 0x07FEBD04);
106static_assert(static_cast<u32>(KMemoryState::Normal) == 0x037EBD05); 117static_assert(static_cast<u32>(KMemoryState::Normal) == 0x077EBD05);
107static_assert(static_cast<u32>(KMemoryState::Shared) == 0x00402006); 118static_assert(static_cast<u32>(KMemoryState::Shared) == 0x04402006);
108static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x00DD7E08); 119
109static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x03FFBD09); 120static_assert(static_cast<u32>(KMemoryState::AliasCode) == 0x04DD7E08);
110static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x005C3C0A); 121static_assert(static_cast<u32>(KMemoryState::AliasCodeData) == 0x07FFBD09);
111static_assert(static_cast<u32>(KMemoryState::Stack) == 0x005C3C0B); 122static_assert(static_cast<u32>(KMemoryState::Ipc) == 0x045C3C0A);
112static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0040200C); 123static_assert(static_cast<u32>(KMemoryState::Stack) == 0x045C3C0B);
113static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x015C3C0D); 124static_assert(static_cast<u32>(KMemoryState::ThreadLocal) == 0x0400200C);
114static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x005C380E); 125static_assert(static_cast<u32>(KMemoryState::Transfered) == 0x055C3C0D);
115static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0040380F); 126static_assert(static_cast<u32>(KMemoryState::SharedTransfered) == 0x045C380E);
127static_assert(static_cast<u32>(KMemoryState::SharedCode) == 0x0440380F);
116static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010); 128static_assert(static_cast<u32>(KMemoryState::Inaccessible) == 0x00000010);
117static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x005C3811); 129static_assert(static_cast<u32>(KMemoryState::NonSecureIpc) == 0x045C3811);
118static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x004C2812); 130static_assert(static_cast<u32>(KMemoryState::NonDeviceIpc) == 0x044C2812);
119static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00002013); 131static_assert(static_cast<u32>(KMemoryState::Kernel) == 0x00002013);
120static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x00402214); 132static_assert(static_cast<u32>(KMemoryState::GeneratedCode) == 0x04402214);
121static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x00402015); 133static_assert(static_cast<u32>(KMemoryState::CodeOut) == 0x04402015);
122static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016); 134static_assert(static_cast<u32>(KMemoryState::Coverage) == 0x00002016);
135static_assert(static_cast<u32>(KMemoryState::Insecure) == 0x05583817);
123 136
124enum class KMemoryPermission : u8 { 137enum class KMemoryPermission : u8 {
125 None = 0, 138 None = 0,
126 All = static_cast<u8>(~None), 139 All = static_cast<u8>(~None),
127 140
128 Read = 1 << 0,
129 Write = 1 << 1,
130 Execute = 1 << 2,
131
132 ReadAndWrite = Read | Write,
133 ReadAndExecute = Read | Execute,
134
135 UserMask = static_cast<u8>(Svc::MemoryPermission::Read | Svc::MemoryPermission::Write |
136 Svc::MemoryPermission::Execute),
137
138 KernelShift = 3, 141 KernelShift = 3,
139 142
140 KernelRead = Read << KernelShift, 143 KernelRead = static_cast<u8>(Svc::MemoryPermission::Read) << KernelShift,
141 KernelWrite = Write << KernelShift, 144 KernelWrite = static_cast<u8>(Svc::MemoryPermission::Write) << KernelShift,
142 KernelExecute = Execute << KernelShift, 145 KernelExecute = static_cast<u8>(Svc::MemoryPermission::Execute) << KernelShift,
143 146
144 NotMapped = (1 << (2 * KernelShift)), 147 NotMapped = (1 << (2 * KernelShift)),
145 148
146 KernelReadWrite = KernelRead | KernelWrite, 149 KernelReadWrite = KernelRead | KernelWrite,
147 KernelReadExecute = KernelRead | KernelExecute, 150 KernelReadExecute = KernelRead | KernelExecute,
148 151
149 UserRead = Read | KernelRead, 152 UserRead = static_cast<u8>(Svc::MemoryPermission::Read) | KernelRead,
150 UserWrite = Write | KernelWrite, 153 UserWrite = static_cast<u8>(Svc::MemoryPermission::Write) | KernelWrite,
151 UserExecute = Execute, 154 UserExecute = static_cast<u8>(Svc::MemoryPermission::Execute),
152 155
153 UserReadWrite = UserRead | UserWrite, 156 UserReadWrite = UserRead | UserWrite,
154 UserReadExecute = UserRead | UserExecute, 157 UserReadExecute = UserRead | UserExecute,
155 158
156 IpcLockChangeMask = NotMapped | UserReadWrite 159 UserMask = static_cast<u8>(Svc::MemoryPermission::Read | Svc::MemoryPermission::Write |
160 Svc::MemoryPermission::Execute),
161
162 IpcLockChangeMask = NotMapped | UserReadWrite,
157}; 163};
158DECLARE_ENUM_FLAG_OPERATORS(KMemoryPermission); 164DECLARE_ENUM_FLAG_OPERATORS(KMemoryPermission);
159 165
@@ -468,6 +474,7 @@ public:
468 474
469 constexpr void UpdateDeviceDisableMergeStateForShareLeft( 475 constexpr void UpdateDeviceDisableMergeStateForShareLeft(
470 [[maybe_unused]] KMemoryPermission new_perm, bool left, [[maybe_unused]] bool right) { 476 [[maybe_unused]] KMemoryPermission new_perm, bool left, [[maybe_unused]] bool right) {
477 // New permission/right aren't used.
471 if (left) { 478 if (left) {
472 m_disable_merge_attribute = static_cast<KMemoryBlockDisableMergeAttribute>( 479 m_disable_merge_attribute = static_cast<KMemoryBlockDisableMergeAttribute>(
473 m_disable_merge_attribute | KMemoryBlockDisableMergeAttribute::DeviceLeft); 480 m_disable_merge_attribute | KMemoryBlockDisableMergeAttribute::DeviceLeft);
@@ -478,6 +485,7 @@ public:
478 485
479 constexpr void UpdateDeviceDisableMergeStateForShareRight( 486 constexpr void UpdateDeviceDisableMergeStateForShareRight(
480 [[maybe_unused]] KMemoryPermission new_perm, [[maybe_unused]] bool left, bool right) { 487 [[maybe_unused]] KMemoryPermission new_perm, [[maybe_unused]] bool left, bool right) {
488 // New permission/left aren't used.
481 if (right) { 489 if (right) {
482 m_disable_merge_attribute = static_cast<KMemoryBlockDisableMergeAttribute>( 490 m_disable_merge_attribute = static_cast<KMemoryBlockDisableMergeAttribute>(
483 m_disable_merge_attribute | KMemoryBlockDisableMergeAttribute::DeviceRight); 491 m_disable_merge_attribute | KMemoryBlockDisableMergeAttribute::DeviceRight);
@@ -494,6 +502,8 @@ public:
494 502
495 constexpr void ShareToDevice([[maybe_unused]] KMemoryPermission new_perm, bool left, 503 constexpr void ShareToDevice([[maybe_unused]] KMemoryPermission new_perm, bool left,
496 bool right) { 504 bool right) {
505 // New permission isn't used.
506
497 // We must either be shared or have a zero lock count. 507 // We must either be shared or have a zero lock count.
498 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared || 508 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared ||
499 m_device_use_count == 0); 509 m_device_use_count == 0);
@@ -509,6 +519,7 @@ public:
509 519
510 constexpr void UpdateDeviceDisableMergeStateForUnshareLeft( 520 constexpr void UpdateDeviceDisableMergeStateForUnshareLeft(
511 [[maybe_unused]] KMemoryPermission new_perm, bool left, [[maybe_unused]] bool right) { 521 [[maybe_unused]] KMemoryPermission new_perm, bool left, [[maybe_unused]] bool right) {
522 // New permission/right aren't used.
512 523
513 if (left) { 524 if (left) {
514 if (!m_device_disable_merge_left_count) { 525 if (!m_device_disable_merge_left_count) {
@@ -528,6 +539,8 @@ public:
528 539
529 constexpr void UpdateDeviceDisableMergeStateForUnshareRight( 540 constexpr void UpdateDeviceDisableMergeStateForUnshareRight(
530 [[maybe_unused]] KMemoryPermission new_perm, [[maybe_unused]] bool left, bool right) { 541 [[maybe_unused]] KMemoryPermission new_perm, [[maybe_unused]] bool left, bool right) {
542 // New permission/left aren't used.
543
531 if (right) { 544 if (right) {
532 const u16 old_device_disable_merge_right_count = m_device_disable_merge_right_count--; 545 const u16 old_device_disable_merge_right_count = m_device_disable_merge_right_count--;
533 ASSERT(old_device_disable_merge_right_count > 0); 546 ASSERT(old_device_disable_merge_right_count > 0);
@@ -546,6 +559,8 @@ public:
546 559
547 constexpr void UnshareToDevice([[maybe_unused]] KMemoryPermission new_perm, bool left, 560 constexpr void UnshareToDevice([[maybe_unused]] KMemoryPermission new_perm, bool left,
548 bool right) { 561 bool right) {
562 // New permission isn't used.
563
549 // We must be shared. 564 // We must be shared.
550 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared); 565 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared);
551 566
@@ -563,6 +578,7 @@ public:
563 578
564 constexpr void UnshareToDeviceRight([[maybe_unused]] KMemoryPermission new_perm, bool left, 579 constexpr void UnshareToDeviceRight([[maybe_unused]] KMemoryPermission new_perm, bool left,
565 bool right) { 580 bool right) {
581 // New permission isn't used.
566 582
567 // We must be shared. 583 // We must be shared.
568 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared); 584 ASSERT((m_attribute & KMemoryAttribute::DeviceShared) == KMemoryAttribute::DeviceShared);
@@ -613,6 +629,8 @@ public:
613 629
614 constexpr void UnlockForIpc([[maybe_unused]] KMemoryPermission new_perm, bool left, 630 constexpr void UnlockForIpc([[maybe_unused]] KMemoryPermission new_perm, bool left,
615 [[maybe_unused]] bool right) { 631 [[maybe_unused]] bool right) {
632 // New permission isn't used.
633
616 // We must be locked. 634 // We must be locked.
617 ASSERT((m_attribute & KMemoryAttribute::IpcLocked) == KMemoryAttribute::IpcLocked); 635 ASSERT((m_attribute & KMemoryAttribute::IpcLocked) == KMemoryAttribute::IpcLocked);
618 636
diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h
index 11bb0fe0f..9b0305552 100644
--- a/src/core/hle/kernel/svc_types.h
+++ b/src/core/hle/kernel/svc_types.h
@@ -22,8 +22,8 @@ enum class MemoryState : u32 {
22 Ipc = 0x0A, 22 Ipc = 0x0A,
23 Stack = 0x0B, 23 Stack = 0x0B,
24 ThreadLocal = 0x0C, 24 ThreadLocal = 0x0C,
25 Transferred = 0x0D, 25 Transfered = 0x0D,
26 SharedTransferred = 0x0E, 26 SharedTransfered = 0x0E,
27 SharedCode = 0x0F, 27 SharedCode = 0x0F,
28 Inaccessible = 0x10, 28 Inaccessible = 0x10,
29 NonSecureIpc = 0x11, 29 NonSecureIpc = 0x11,