| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | // Copyright 2014 Citra Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:12:49 +01:00
										 |  |  | #include <cstddef>
 | 
					
						
							| 
									
										
										
										
											2016-06-27 20:42:42 +03:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-02 15:20:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Common { | 
					
						
							|  |  |  | struct PageTable; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 17:27:44 -05:00
										 |  |  | namespace Kernel { | 
					
						
							|  |  |  | class Process; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Memory { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 23:38:56 -03:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Page size used by the ARM architecture. This is the smallest granularity with which memory can | 
					
						
							|  |  |  |  * be mapped. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  | constexpr std::size_t PAGE_BITS = 12; | 
					
						
							| 
									
										
										
										
											2018-09-24 10:29:56 -04:00
										 |  |  | constexpr u64 PAGE_SIZE = 1ULL << PAGE_BITS; | 
					
						
							| 
									
										
										
										
											2018-02-12 21:53:32 +00:00
										 |  |  | constexpr u64 PAGE_MASK = PAGE_SIZE - 1; | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /// Virtual user-space memory regions
 | 
					
						
							|  |  |  | enum : VAddr { | 
					
						
							| 
									
										
										
										
											2018-09-24 20:01:45 -04:00
										 |  |  |     /// TLS (Thread-Local Storage) related.
 | 
					
						
							| 
									
										
										
										
											2018-03-14 22:06:57 -04:00
										 |  |  |     TLS_ENTRY_SIZE = 0x200, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Application stack
 | 
					
						
							| 
									
										
										
										
											2018-03-31 15:03:28 -04:00
										 |  |  |     DEFAULT_STACK_SIZE = 0x100000, | 
					
						
							| 
									
										
										
										
											2018-03-14 22:06:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-22 00:47:59 -06:00
										 |  |  |     /// Kernel Virtual Address Range
 | 
					
						
							|  |  |  |     KERNEL_REGION_VADDR = 0xFFFFFF8000000000, | 
					
						
							|  |  |  |     KERNEL_REGION_SIZE = 0x7FFFE00000, | 
					
						
							|  |  |  |     KERNEL_REGION_END = KERNEL_REGION_VADDR + KERNEL_REGION_SIZE, | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 02:47:33 -04:00
										 |  |  | /// Changes the currently active page table.
 | 
					
						
							| 
									
										
										
										
											2019-03-02 15:20:28 -05:00
										 |  |  | void SetCurrentPageTable(Common::PageTable* page_table); | 
					
						
							| 
									
										
										
										
											2017-07-21 21:17:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 17:27:44 -05:00
										 |  |  | /// Determines if the given VAddr is valid for the specified process.
 | 
					
						
							| 
									
										
										
										
											2018-08-05 21:31:56 -04:00
										 |  |  | bool IsValidVirtualAddress(const Kernel::Process& process, VAddr vaddr); | 
					
						
							| 
									
										
										
										
											2018-08-05 21:36:44 -04:00
										 |  |  | bool IsValidVirtualAddress(VAddr vaddr); | 
					
						
							| 
									
										
										
										
											2018-06-22 00:47:59 -06:00
										 |  |  | /// Determines if the given VAddr is a kernel address
 | 
					
						
							| 
									
										
										
										
											2018-08-05 21:36:44 -04:00
										 |  |  | bool IsKernelVirtualAddress(VAddr vaddr); | 
					
						
							| 
									
										
										
										
											2017-09-26 17:27:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | u8 Read8(VAddr addr); | 
					
						
							|  |  |  | u16 Read16(VAddr addr); | 
					
						
							|  |  |  | u32 Read32(VAddr addr); | 
					
						
							|  |  |  | u64 Read64(VAddr addr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Write8(VAddr addr, u8 data); | 
					
						
							|  |  |  | void Write16(VAddr addr, u16 data); | 
					
						
							|  |  |  | void Write32(VAddr addr, u32 data); | 
					
						
							|  |  |  | void Write64(VAddr addr, u64 data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  | void ReadBlock(const Kernel::Process& process, VAddr src_addr, void* dest_buffer, std::size_t size); | 
					
						
							|  |  |  | void ReadBlock(VAddr src_addr, void* dest_buffer, std::size_t size); | 
					
						
							| 
									
										
										
										
											2018-08-05 21:31:56 -04:00
										 |  |  | void WriteBlock(const Kernel::Process& process, VAddr dest_addr, const void* src_buffer, | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |                 std::size_t size); | 
					
						
							|  |  |  | void WriteBlock(VAddr dest_addr, const void* src_buffer, std::size_t size); | 
					
						
							|  |  |  | void ZeroBlock(const Kernel::Process& process, VAddr dest_addr, std::size_t size); | 
					
						
							|  |  |  | void CopyBlock(VAddr dest_addr, VAddr src_addr, std::size_t size); | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-05 21:36:44 -04:00
										 |  |  | u8* GetPointer(VAddr vaddr); | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-05 21:36:44 -04:00
										 |  |  | std::string ReadCString(VAddr vaddr, std::size_t max_length); | 
					
						
							| 
									
										
										
										
											2016-06-27 20:42:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 22:56:41 -04:00
										 |  |  | enum class FlushMode { | 
					
						
							|  |  |  |     /// Write back modified surfaces to RAM
 | 
					
						
							|  |  |  |     Flush, | 
					
						
							|  |  |  |     /// Remove region from the cache
 | 
					
						
							|  |  |  |     Invalidate, | 
					
						
							|  |  |  |     /// Write back modified surfaces to RAM, and also remove them from the cache
 | 
					
						
							|  |  |  |     FlushAndInvalidate, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-24 22:21:14 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Mark each page touching the region as cached. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-08-27 21:35:15 -04:00
										 |  |  | void RasterizerMarkRegionCached(VAddr vaddr, u64 size, bool cached); | 
					
						
							| 
									
										
										
										
											2018-03-24 22:21:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 21:17:57 -05:00
										 |  |  | } // namespace Memory
 |