فهرست منبع

kernel/process_capability: Handle kernel version capability flags

Lioncash 7 سال پیش
والد
کامیت
e0e84aede0
2فایلهای تغییر یافته به همراه18 افزوده شده و 1 حذف شده
  1. 13 1
      src/core/hle/kernel/process_capability.cpp
  2. 5 0
      src/core/hle/kernel/process_capability.h

+ 13 - 1
src/core/hle/kernel/process_capability.cpp

@@ -315,7 +315,19 @@ ResultCode ProcessCapabilities::HandleProgramTypeFlags(u32 flags) {
 }
 }
 
 
 ResultCode ProcessCapabilities::HandleKernelVersionFlags(u32 flags) {
 ResultCode ProcessCapabilities::HandleKernelVersionFlags(u32 flags) {
-    // TODO: Implement
+    // Yes, the internal member variable is checked in the actual kernel here.
+    // This might look odd for options that are only allowed to be initialized
+    // just once, however the kernel has a separate initialization function for
+    // kernel processes and userland processes. The kernel variant sets this
+    // member variable ahead of time.
+
+    const u32 major_version = kernel_version >> 19;
+
+    if (major_version != 0 || flags < 0x80000) {
+        return ERR_INVALID_CAPABILITY_DESCRIPTOR;
+    }
+
+    kernel_version = flags;
     return RESULT_SUCCESS;
     return RESULT_SUCCESS;
 }
 }
 
 

+ 5 - 0
src/core/hle/kernel/process_capability.h

@@ -155,6 +155,11 @@ public:
         return program_type;
         return program_type;
     }
     }
 
 
+    /// Gets the kernel version value.
+    u32 GetKernelVersion() const {
+        return kernel_version;
+    }
+
 private:
 private:
     /// Attempts to parse a given sequence of capability descriptors.
     /// Attempts to parse a given sequence of capability descriptors.
     ///
     ///