summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2018-12-20 03:14:47 +0100
committerLioncash <mathew1800@gmail.com>2018-12-21 13:05:34 +0100
commit010bc677f36304964e753057740a8ca32a7dcb83 (patch)
treeaddf6c2eb4b90236e61ae038b7717d2f774f85c3
parentkernel/process_capability: Handle interrupt capability flags (diff)
downloadyuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar.gz
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar.bz2
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar.lz
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar.xz
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.tar.zst
yuzu-010bc677f36304964e753057740a8ca32a7dcb83.zip
-rw-r--r--src/core/hle/kernel/errors.h1
-rw-r--r--src/core/hle/kernel/process_capability.cpp9
-rw-r--r--src/core/hle/kernel/process_capability.h21
3 files changed, 29 insertions, 2 deletions
diff --git a/src/core/hle/kernel/errors.h b/src/core/hle/kernel/errors.h
index a3d725866..ec574c097 100644
--- a/src/core/hle/kernel/errors.h
+++ b/src/core/hle/kernel/errors.h
@@ -31,6 +31,7 @@ constexpr ResultCode ERR_NOT_FOUND{ErrorModule::Kernel, 121};
constexpr ResultCode ERR_ALREADY_REGISTERED{ErrorModule::Kernel, 122};
constexpr ResultCode ERR_SESSION_CLOSED_BY_REMOTE{ErrorModule::Kernel, 123};
constexpr ResultCode ERR_INVALID_STATE{ErrorModule::Kernel, 125};
+constexpr ResultCode ERR_RESERVED_VALUE{ErrorModule::Kernel, 126};
constexpr ResultCode ERR_RESOURCE_LIMIT_EXCEEDED{ErrorModule::Kernel, 132};
} // namespace Kernel
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp
index e98157f9c..ef506b9f3 100644
--- a/src/core/hle/kernel/process_capability.cpp
+++ b/src/core/hle/kernel/process_capability.cpp
@@ -200,6 +200,8 @@ void ProcessCapabilities::Clear() {
handle_table_size = 0;
kernel_version = 0;
+ program_type = ProgramType::SysModule;
+
is_debuggable = false;
can_force_debug = false;
}
@@ -303,7 +305,12 @@ ResultCode ProcessCapabilities::HandleInterruptFlags(u32 flags) {
}
ResultCode ProcessCapabilities::HandleProgramTypeFlags(u32 flags) {
- // TODO: Implement
+ const u32 reserved = flags >> 17;
+ if (reserved != 0) {
+ return ERR_RESERVED_VALUE;
+ }
+
+ program_type = static_cast<ProgramType>((flags >> 14) & 0b111);
return RESULT_SUCCESS;
}
diff --git a/src/core/hle/kernel/process_capability.h b/src/core/hle/kernel/process_capability.h
index 4c151b3d5..140d60267 100644
--- a/src/core/hle/kernel/process_capability.h
+++ b/src/core/hle/kernel/process_capability.h
@@ -14,6 +14,14 @@ namespace Kernel {
class VMManager;
+/// The possible types of programs that may be indicated
+/// by the program type capability descriptor.
+enum class ProgramType {
+ SysModule,
+ Application,
+ Applet,
+};
+
/// Handles kernel capability descriptors that are provided by
/// application metadata. These descriptors provide information
/// that alters certain parameters for kernel process instance
@@ -137,6 +145,16 @@ public:
return svc_capabilities;
}
+ /// Gets the valid interrupt bits.
+ const InterruptCapabilities& GetInterruptCapabilities() const {
+ return interrupt_capabilities;
+ }
+
+ /// Gets the program type for this process.
+ ProgramType GetProgramType() const {
+ return program_type;
+ }
+
private:
/// Attempts to parse a given sequence of capability descriptors.
///
@@ -215,7 +233,8 @@ private:
u32 handle_table_size = 0;
u32 kernel_version = 0;
- u32 program_type = 0;
+
+ ProgramType program_type = ProgramType::SysModule;
bool is_debuggable = false;
bool can_force_debug = false;