mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	kernel: process_capability: Update to use Memory::PageTable.
This commit is contained in:
		
							parent
							
								
									84f1b6d530
								
							
						
					
					
						commit
						ffc3de762b
					
				@ -5,8 +5,8 @@
 | 
				
			|||||||
#include "common/bit_util.h"
 | 
					#include "common/bit_util.h"
 | 
				
			||||||
#include "core/hle/kernel/errors.h"
 | 
					#include "core/hle/kernel/errors.h"
 | 
				
			||||||
#include "core/hle/kernel/handle_table.h"
 | 
					#include "core/hle/kernel/handle_table.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/memory/page_table.h"
 | 
				
			||||||
#include "core/hle/kernel/process_capability.h"
 | 
					#include "core/hle/kernel/process_capability.h"
 | 
				
			||||||
#include "core/hle/kernel/vm_manager.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Kernel {
 | 
					namespace Kernel {
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
@ -66,7 +66,7 @@ u32 GetFlagBitOffset(CapabilityType type) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabilities,
 | 
					ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabilities,
 | 
				
			||||||
                                                           std::size_t num_capabilities,
 | 
					                                                           std::size_t num_capabilities,
 | 
				
			||||||
                                                           VMManager& vm_manager) {
 | 
					                                                           Memory::PageTable& page_table) {
 | 
				
			||||||
    Clear();
 | 
					    Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Allow all cores and priorities.
 | 
					    // Allow all cores and priorities.
 | 
				
			||||||
@ -74,15 +74,15 @@ ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabiliti
 | 
				
			|||||||
    priority_mask = 0xFFFFFFFFFFFFFFFF;
 | 
					    priority_mask = 0xFFFFFFFFFFFFFFFF;
 | 
				
			||||||
    kernel_version = PackedKernelVersion;
 | 
					    kernel_version = PackedKernelVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ParseCapabilities(capabilities, num_capabilities, vm_manager);
 | 
					    return ParseCapabilities(capabilities, num_capabilities, page_table);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::InitializeForUserProcess(const u32* capabilities,
 | 
					ResultCode ProcessCapabilities::InitializeForUserProcess(const u32* capabilities,
 | 
				
			||||||
                                                         std::size_t num_capabilities,
 | 
					                                                         std::size_t num_capabilities,
 | 
				
			||||||
                                                         VMManager& vm_manager) {
 | 
					                                                         Memory::PageTable& page_table) {
 | 
				
			||||||
    Clear();
 | 
					    Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ParseCapabilities(capabilities, num_capabilities, vm_manager);
 | 
					    return ParseCapabilities(capabilities, num_capabilities, page_table);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProcessCapabilities::InitializeForMetadatalessProcess() {
 | 
					void ProcessCapabilities::InitializeForMetadatalessProcess() {
 | 
				
			||||||
@ -105,7 +105,7 @@ void ProcessCapabilities::InitializeForMetadatalessProcess() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
 | 
					ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
 | 
				
			||||||
                                                  std::size_t num_capabilities,
 | 
					                                                  std::size_t num_capabilities,
 | 
				
			||||||
                                                  VMManager& vm_manager) {
 | 
					                                                  Memory::PageTable& page_table) {
 | 
				
			||||||
    u32 set_flags = 0;
 | 
					    u32 set_flags = 0;
 | 
				
			||||||
    u32 set_svc_bits = 0;
 | 
					    u32 set_svc_bits = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -127,13 +127,13 @@ ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
 | 
				
			|||||||
                return ERR_INVALID_COMBINATION;
 | 
					                return ERR_INVALID_COMBINATION;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const auto result = HandleMapPhysicalFlags(descriptor, size_flags, vm_manager);
 | 
					            const auto result = HandleMapPhysicalFlags(descriptor, size_flags, page_table);
 | 
				
			||||||
            if (result.IsError()) {
 | 
					            if (result.IsError()) {
 | 
				
			||||||
                return result;
 | 
					                return result;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            const auto result =
 | 
					            const auto result =
 | 
				
			||||||
                ParseSingleFlagCapability(set_flags, set_svc_bits, descriptor, vm_manager);
 | 
					                ParseSingleFlagCapability(set_flags, set_svc_bits, descriptor, page_table);
 | 
				
			||||||
            if (result.IsError()) {
 | 
					            if (result.IsError()) {
 | 
				
			||||||
                return result;
 | 
					                return result;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -144,7 +144,7 @@ ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits,
 | 
					ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits,
 | 
				
			||||||
                                                          u32 flag, VMManager& vm_manager) {
 | 
					                                                          u32 flag, Memory::PageTable& page_table) {
 | 
				
			||||||
    const auto type = GetCapabilityType(flag);
 | 
					    const auto type = GetCapabilityType(flag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type == CapabilityType::Unset) {
 | 
					    if (type == CapabilityType::Unset) {
 | 
				
			||||||
@ -172,7 +172,7 @@ ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& s
 | 
				
			|||||||
    case CapabilityType::Syscall:
 | 
					    case CapabilityType::Syscall:
 | 
				
			||||||
        return HandleSyscallFlags(set_svc_bits, flag);
 | 
					        return HandleSyscallFlags(set_svc_bits, flag);
 | 
				
			||||||
    case CapabilityType::MapIO:
 | 
					    case CapabilityType::MapIO:
 | 
				
			||||||
        return HandleMapIOFlags(flag, vm_manager);
 | 
					        return HandleMapIOFlags(flag, page_table);
 | 
				
			||||||
    case CapabilityType::Interrupt:
 | 
					    case CapabilityType::Interrupt:
 | 
				
			||||||
        return HandleInterruptFlags(flag);
 | 
					        return HandleInterruptFlags(flag);
 | 
				
			||||||
    case CapabilityType::ProgramType:
 | 
					    case CapabilityType::ProgramType:
 | 
				
			||||||
@ -269,12 +269,12 @@ ResultCode ProcessCapabilities::HandleSyscallFlags(u32& set_svc_bits, u32 flags)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::HandleMapPhysicalFlags(u32 flags, u32 size_flags,
 | 
					ResultCode ProcessCapabilities::HandleMapPhysicalFlags(u32 flags, u32 size_flags,
 | 
				
			||||||
                                                       VMManager& vm_manager) {
 | 
					                                                       Memory::PageTable& page_table) {
 | 
				
			||||||
    // TODO(Lioncache): Implement once the memory manager can handle this.
 | 
					    // TODO(Lioncache): Implement once the memory manager can handle this.
 | 
				
			||||||
    return RESULT_SUCCESS;
 | 
					    return RESULT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultCode ProcessCapabilities::HandleMapIOFlags(u32 flags, VMManager& vm_manager) {
 | 
					ResultCode ProcessCapabilities::HandleMapIOFlags(u32 flags, Memory::PageTable& page_table) {
 | 
				
			||||||
    // TODO(Lioncache): Implement once the memory manager can handle this.
 | 
					    // TODO(Lioncache): Implement once the memory manager can handle this.
 | 
				
			||||||
    return RESULT_SUCCESS;
 | 
					    return RESULT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,9 @@ union ResultCode;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Kernel {
 | 
					namespace Kernel {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VMManager;
 | 
					namespace Memory {
 | 
				
			||||||
 | 
					class PageTable;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The possible types of programs that may be indicated
 | 
					/// The possible types of programs that may be indicated
 | 
				
			||||||
/// by the program type capability descriptor.
 | 
					/// by the program type capability descriptor.
 | 
				
			||||||
@ -81,27 +83,27 @@ public:
 | 
				
			|||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @param capabilities     The capabilities to parse
 | 
					    /// @param capabilities     The capabilities to parse
 | 
				
			||||||
    /// @param num_capabilities The number of capabilities to parse.
 | 
					    /// @param num_capabilities The number of capabilities to parse.
 | 
				
			||||||
    /// @param vm_manager       The memory manager to use for handling any mapping-related
 | 
					    /// @param page_table       The memory manager to use for handling any mapping-related
 | 
				
			||||||
    ///                         operations (such as mapping IO memory, etc).
 | 
					    ///                         operations (such as mapping IO memory, etc).
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @returns RESULT_SUCCESS if this capabilities instance was able to be initialized,
 | 
					    /// @returns RESULT_SUCCESS if this capabilities instance was able to be initialized,
 | 
				
			||||||
    ///          otherwise, an error code upon failure.
 | 
					    ///          otherwise, an error code upon failure.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    ResultCode InitializeForKernelProcess(const u32* capabilities, std::size_t num_capabilities,
 | 
					    ResultCode InitializeForKernelProcess(const u32* capabilities, std::size_t num_capabilities,
 | 
				
			||||||
                                          VMManager& vm_manager);
 | 
					                                          Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Initializes this process capabilities instance for a userland process.
 | 
					    /// Initializes this process capabilities instance for a userland process.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @param capabilities     The capabilities to parse.
 | 
					    /// @param capabilities     The capabilities to parse.
 | 
				
			||||||
    /// @param num_capabilities The total number of capabilities to parse.
 | 
					    /// @param num_capabilities The total number of capabilities to parse.
 | 
				
			||||||
    /// @param vm_manager       The memory manager to use for handling any mapping-related
 | 
					    /// @param page_table       The memory manager to use for handling any mapping-related
 | 
				
			||||||
    ///                         operations (such as mapping IO memory, etc).
 | 
					    ///                         operations (such as mapping IO memory, etc).
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @returns RESULT_SUCCESS if this capabilities instance was able to be initialized,
 | 
					    /// @returns RESULT_SUCCESS if this capabilities instance was able to be initialized,
 | 
				
			||||||
    ///          otherwise, an error code upon failure.
 | 
					    ///          otherwise, an error code upon failure.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    ResultCode InitializeForUserProcess(const u32* capabilities, std::size_t num_capabilities,
 | 
					    ResultCode InitializeForUserProcess(const u32* capabilities, std::size_t num_capabilities,
 | 
				
			||||||
                                        VMManager& vm_manager);
 | 
					                                        Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Initializes this process capabilities instance for a process that does not
 | 
					    /// Initializes this process capabilities instance for a process that does not
 | 
				
			||||||
    /// have any metadata to parse.
 | 
					    /// have any metadata to parse.
 | 
				
			||||||
@ -181,13 +183,13 @@ private:
 | 
				
			|||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @param capabilities     The sequence of capability descriptors to parse.
 | 
					    /// @param capabilities     The sequence of capability descriptors to parse.
 | 
				
			||||||
    /// @param num_capabilities The number of descriptors within the given sequence.
 | 
					    /// @param num_capabilities The number of descriptors within the given sequence.
 | 
				
			||||||
    /// @param vm_manager       The memory manager that will perform any memory
 | 
					    /// @param page_table       The memory manager that will perform any memory
 | 
				
			||||||
    ///                         mapping if necessary.
 | 
					    ///                         mapping if necessary.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @return RESULT_SUCCESS if no errors occur, otherwise an error code.
 | 
					    /// @return RESULT_SUCCESS if no errors occur, otherwise an error code.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    ResultCode ParseCapabilities(const u32* capabilities, std::size_t num_capabilities,
 | 
					    ResultCode ParseCapabilities(const u32* capabilities, std::size_t num_capabilities,
 | 
				
			||||||
                                 VMManager& vm_manager);
 | 
					                                 Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Attempts to parse a capability descriptor that is only represented by a
 | 
					    /// Attempts to parse a capability descriptor that is only represented by a
 | 
				
			||||||
    /// single flag set.
 | 
					    /// single flag set.
 | 
				
			||||||
@ -196,13 +198,13 @@ private:
 | 
				
			|||||||
    ///                     flags being initialized more than once when they shouldn't be.
 | 
					    ///                     flags being initialized more than once when they shouldn't be.
 | 
				
			||||||
    /// @param set_svc_bits Running set of bits representing the allowed supervisor calls mask.
 | 
					    /// @param set_svc_bits Running set of bits representing the allowed supervisor calls mask.
 | 
				
			||||||
    /// @param flag         The flag to attempt to parse.
 | 
					    /// @param flag         The flag to attempt to parse.
 | 
				
			||||||
    /// @param vm_manager   The memory manager that will perform any memory
 | 
					    /// @param page_table   The memory manager that will perform any memory
 | 
				
			||||||
    ///                     mapping if necessary.
 | 
					    ///                     mapping if necessary.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// @return RESULT_SUCCESS if no errors occurred, otherwise an error code.
 | 
					    /// @return RESULT_SUCCESS if no errors occurred, otherwise an error code.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    ResultCode ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits, u32 flag,
 | 
					    ResultCode ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits, u32 flag,
 | 
				
			||||||
                                         VMManager& vm_manager);
 | 
					                                         Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Clears the internal state of this process capability instance. Necessary,
 | 
					    /// Clears the internal state of this process capability instance. Necessary,
 | 
				
			||||||
    /// to have a sane starting point due to us allowing running executables without
 | 
					    /// to have a sane starting point due to us allowing running executables without
 | 
				
			||||||
@ -226,10 +228,10 @@ private:
 | 
				
			|||||||
    ResultCode HandleSyscallFlags(u32& set_svc_bits, u32 flags);
 | 
					    ResultCode HandleSyscallFlags(u32& set_svc_bits, u32 flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Handles flags related to mapping physical memory pages.
 | 
					    /// Handles flags related to mapping physical memory pages.
 | 
				
			||||||
    ResultCode HandleMapPhysicalFlags(u32 flags, u32 size_flags, VMManager& vm_manager);
 | 
					    ResultCode HandleMapPhysicalFlags(u32 flags, u32 size_flags, Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Handles flags related to mapping IO pages.
 | 
					    /// Handles flags related to mapping IO pages.
 | 
				
			||||||
    ResultCode HandleMapIOFlags(u32 flags, VMManager& vm_manager);
 | 
					    ResultCode HandleMapIOFlags(u32 flags, Memory::PageTable& page_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Handles flags related to the interrupt capability flags.
 | 
					    /// Handles flags related to the interrupt capability flags.
 | 
				
			||||||
    ResultCode HandleInterruptFlags(u32 flags);
 | 
					    ResultCode HandleInterruptFlags(u32 flags);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user