diff options
| author | 2018-12-20 22:54:05 -0500 | |
|---|---|---|
| committer | 2018-12-21 07:05:34 -0500 | |
| commit | 3dc59b74ec92f8ee6b856eb4a18c3efa9286730e (patch) | |
| tree | e3d3d41ee14f7a27c955a50b74d2b4c16582aafa /src | |
| parent | kernel/process_capability: Handle the priority mask and core mask flags (diff) | |
| download | yuzu-3dc59b74ec92f8ee6b856eb4a18c3efa9286730e.tar.gz yuzu-3dc59b74ec92f8ee6b856eb4a18c3efa9286730e.tar.xz yuzu-3dc59b74ec92f8ee6b856eb4a18c3efa9286730e.zip | |
kernel/process_capability: Handle syscall capability flags
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/process_capability.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/kernel/process_capability.h | 5 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp index 9f513b25b..615b354c6 100644 --- a/src/core/hle/kernel/process_capability.cpp +++ b/src/core/hle/kernel/process_capability.cpp | |||
| @@ -239,7 +239,30 @@ ResultCode ProcessCapabilities::HandlePriorityCoreNumFlags(u32 flags) { | |||
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | ResultCode ProcessCapabilities::HandleSyscallFlags(u32& set_svc_bits, u32 flags) { | 241 | ResultCode ProcessCapabilities::HandleSyscallFlags(u32& set_svc_bits, u32 flags) { |
| 242 | // TODO: Implement | 242 | const u32 index = flags >> 29; |
| 243 | const u32 svc_bit = 1U << index; | ||
| 244 | |||
| 245 | // If we've already set this svc before, bail. | ||
| 246 | if ((set_svc_bits & svc_bit) != 0) { | ||
| 247 | return ERR_INVALID_COMBINATION; | ||
| 248 | } | ||
| 249 | set_svc_bits |= svc_bit; | ||
| 250 | |||
| 251 | const u32 svc_mask = (flags >> 5) & 0xFFFFFF; | ||
| 252 | for (u32 i = 0; i < 24; ++i) { | ||
| 253 | const u32 svc_number = index * 24 + i; | ||
| 254 | |||
| 255 | if ((svc_mask & (1U << i)) == 0) { | ||
| 256 | continue; | ||
| 257 | } | ||
| 258 | |||
| 259 | if (svc_number >= svc_capabilities.size()) { | ||
| 260 | return ERR_OUT_OF_RANGE; | ||
| 261 | } | ||
| 262 | |||
| 263 | svc_capabilities[svc_number] = true; | ||
| 264 | } | ||
| 265 | |||
| 243 | return RESULT_SUCCESS; | 266 | return RESULT_SUCCESS; |
| 244 | } | 267 | } |
| 245 | 268 | ||
diff --git a/src/core/hle/kernel/process_capability.h b/src/core/hle/kernel/process_capability.h index 4b27ee8b9..4c151b3d5 100644 --- a/src/core/hle/kernel/process_capability.h +++ b/src/core/hle/kernel/process_capability.h | |||
| @@ -132,6 +132,11 @@ public: | |||
| 132 | return priority_mask; | 132 | return priority_mask; |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | /// Gets the SVC access permission bits | ||
| 136 | const SyscallCapabilities& GetServiceCapabilities() const { | ||
| 137 | return svc_capabilities; | ||
| 138 | } | ||
| 139 | |||
| 135 | private: | 140 | private: |
| 136 | /// Attempts to parse a given sequence of capability descriptors. | 141 | /// Attempts to parse a given sequence of capability descriptors. |
| 137 | /// | 142 | /// |