mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-28 22:49:02 -05:00 
			
		
		
		
	kernel: memory: Add system_control code, which will be used for ASLR support.
This commit is contained in:
		| @@ -159,6 +159,8 @@ add_library(core STATIC | |||||||
|     hle/kernel/memory/memory_block.h |     hle/kernel/memory/memory_block.h | ||||||
|     hle/kernel/memory/memory_types.h |     hle/kernel/memory/memory_types.h | ||||||
|     hle/kernel/memory/slab_heap.h |     hle/kernel/memory/slab_heap.h | ||||||
|  |     hle/kernel/memory/system_control.cpp | ||||||
|  |     hle/kernel/memory/system_control.h | ||||||
|     hle/kernel/mutex.cpp |     hle/kernel/mutex.cpp | ||||||
|     hle/kernel/mutex.h |     hle/kernel/mutex.h | ||||||
|     hle/kernel/object.cpp |     hle/kernel/object.cpp | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								src/core/hle/kernel/memory/system_control.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/core/hle/kernel/memory/system_control.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | // Copyright 2020 yuzu Emulator Project | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <random> | ||||||
|  |  | ||||||
|  | #include "core/hle/kernel/memory/system_control.h" | ||||||
|  |  | ||||||
|  | namespace Kernel::Memory::SystemControl { | ||||||
|  |  | ||||||
|  | u64 GenerateRandomU64ForInit() { | ||||||
|  |     std::random_device device; | ||||||
|  |     std::mt19937 gen(device()); | ||||||
|  |     std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max()); | ||||||
|  |     return distribution(gen); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename F> | ||||||
|  | u64 GenerateUniformRange(u64 min, u64 max, F f) { | ||||||
|  |     /* Handle the case where the difference is too large to represent. */ | ||||||
|  |     if (max == std::numeric_limits<u64>::max() && min == std::numeric_limits<u64>::min()) { | ||||||
|  |         return f(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Iterate until we get a value in range. */ | ||||||
|  |     const u64 range_size = ((max + 1) - min); | ||||||
|  |     const u64 effective_max = (std::numeric_limits<u64>::max() / range_size) * range_size; | ||||||
|  |     while (true) { | ||||||
|  |         if (const u64 rnd = f(); rnd < effective_max) { | ||||||
|  |             return min + (rnd % range_size); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | u64 GenerateRandomRange(u64 min, u64 max) { | ||||||
|  |     return GenerateUniformRange(min, max, GenerateRandomU64ForInit); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | } // namespace Kernel::Memory::SystemControl | ||||||
							
								
								
									
										18
									
								
								src/core/hle/kernel/memory/system_control.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/core/hle/kernel/memory/system_control.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | // Copyright 2020 yuzu Emulator Project | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "common/common_types.h" | ||||||
|  |  | ||||||
|  | namespace Kernel::Memory::SystemControl { | ||||||
|  |  | ||||||
|  | u64 GenerateRandomU64ForInit(); | ||||||
|  |  | ||||||
|  | template <typename F> | ||||||
|  | u64 GenerateUniformRange(u64 min, u64 max, F f); | ||||||
|  |  | ||||||
|  | u64 GenerateRandomRange(u64 min, u64 max); | ||||||
|  |  | ||||||
|  | } // namespace Kernel::Memory::SystemControl | ||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei