| 
									
										
											  
											
												chore: make yuzu REUSE compliant
[REUSE] is a specification that aims at making file copyright
information consistent, so that it can be both human and machine
readable. It basically requires that all files have a header containing
copyright and licensing information. When this isn't possible, like
when dealing with binary assets, generated files or embedded third-party
dependencies, it is permitted to insert copyright information in the
`.reuse/dep5` file.
Oh, and it also requires that all the licenses used in the project are
present in the `LICENSES` folder, that's why the diff is so huge.
This can be done automatically with `reuse download --all`.
The `reuse` tool also contains a handy subcommand that analyzes the
project and tells whether or not the project is (still) compliant,
`reuse lint`.
Following REUSE has a few advantages over the current approach:
- Copyright information is easy to access for users / downstream
- Files like `dist/license.md` do not need to exist anymore, as
  `.reuse/dep5` is used instead
- `reuse lint` makes it easy to ensure that copyright information of
  files like binary assets / images is always accurate and up to date
To add copyright information of files that didn't have it I looked up
who committed what and when, for each file. As yuzu contributors do not
have to sign a CLA or similar I couldn't assume that copyright ownership
was of the "yuzu Emulator Project", so I used the name and/or email of
the commit author instead.
[REUSE]: https://reuse.software
Follow-up to b2eb10382941bef0914f4a0a4685b9033440aa9f
											
										 
											2022-05-15 02:06:02 +02:00
										 |  |  | // SPDX-FileCopyrightText: 2014 Citra Emulator Project
 | 
					
						
							|  |  |  | // SPDX-License-Identifier: GPL-2.0-or-later
 | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:12:49 +01:00
										 |  |  | #include <cstddef>
 | 
					
						
							| 
									
										
										
										
											2019-11-26 13:09:12 -05:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2016-06-27 20:42:42 +03:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  | #include "common/typed_address.h"
 | 
					
						
							| 
									
										
										
										
											2022-11-12 11:02:07 -05:00
										 |  |  | #include "core/hle/result.h"
 | 
					
						
							| 
									
										
										
										
											2019-11-26 13:09:12 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Common { | 
					
						
							|  |  |  | struct PageTable; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-03-02 15:20:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 12:33:20 -05:00
										 |  |  | namespace Core { | 
					
						
							|  |  |  | class System; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 17:27:44 -05:00
										 |  |  | namespace Kernel { | 
					
						
							| 
									
										
										
										
											2020-01-12 17:04:15 +01:00
										 |  |  | class PhysicalMemory; | 
					
						
							| 
									
										
										
										
											2021-04-23 22:04:28 -07:00
										 |  |  | class KProcess; | 
					
						
							| 
									
										
										
										
											2020-01-12 17:04:15 +01:00
										 |  |  | } // namespace Kernel
 | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-31 15:10:44 -04:00
										 |  |  | namespace Core::Memory { | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-08-18 16:28:55 -07:00
										 |  |  | constexpr std::size_t YUZU_PAGEBITS = 12; | 
					
						
							|  |  |  | constexpr u64 YUZU_PAGESIZE = 1ULL << YUZU_PAGEBITS; | 
					
						
							|  |  |  | constexpr u64 YUZU_PAGEMASK = YUZU_PAGESIZE - 1; | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /// Virtual user-space memory regions
 | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  | enum : u64 { | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2015-05-12 22:38:29 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 12:33:20 -05:00
										 |  |  | /// Central class that handles all memory operations and state.
 | 
					
						
							|  |  |  | class Memory { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     explicit Memory(Core::System& system); | 
					
						
							|  |  |  |     ~Memory(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Memory(const Memory&) = delete; | 
					
						
							|  |  |  |     Memory& operator=(const Memory&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Memory(Memory&&) = default; | 
					
						
							| 
									
										
										
										
											2021-08-05 20:11:14 +00:00
										 |  |  |     Memory& operator=(Memory&&) = delete; | 
					
						
							| 
									
										
										
										
											2019-11-26 12:33:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 17:06:21 -07:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Resets the state of the Memory system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void Reset(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 18:34:30 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Changes the currently active page table to that of the given process instance. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param process The process to use the page table of. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-23 22:04:28 -07:00
										 |  |  |     void SetCurrentPageTable(Kernel::KProcess& process, u32 core_id); | 
					
						
							| 
									
										
										
										
											2019-11-26 18:34:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 13:09:12 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Maps an allocated buffer onto a region of the emulated process address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param page_table The page table of the emulated process. | 
					
						
							|  |  |  |      * @param base       The address to start mapping at. Must be page-aligned. | 
					
						
							|  |  |  |      * @param size       The amount of bytes to map. Must be page-aligned. | 
					
						
							|  |  |  |      * @param target     Buffer with the memory backing the mapping. Must be of length at least | 
					
						
							|  |  |  |      *                   `size`. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void MapMemoryRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size, | 
					
						
							|  |  |  |                          Common::PhysicalAddress target); | 
					
						
							| 
									
										
										
										
											2019-11-26 13:09:12 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Unmaps a region of the emulated process address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param page_table The page table of the emulated process. | 
					
						
							|  |  |  |      * @param base       The address to begin unmapping at. | 
					
						
							|  |  |  |      * @param size       The amount of bytes to unmap. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void UnmapRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size); | 
					
						
							| 
									
										
										
										
											2019-11-26 13:09:12 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 13:46:41 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Checks whether or not the supplied address is a valid virtual | 
					
						
							|  |  |  |      * address for the current process. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr The virtual address to check the validity of. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns True if the given virtual address is valid, false otherwise. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     [[nodiscard]] bool IsValidVirtualAddress(Common::ProcessAddress vaddr) const; | 
					
						
							| 
									
										
										
										
											2019-11-26 13:46:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-30 19:35:01 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Checks whether or not the supplied range of addresses are all valid | 
					
						
							|  |  |  |      * virtual addresses for the current process. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param base The address to begin checking. | 
					
						
							|  |  |  |      * @param size The amount of bytes to check. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns True if all bytes in the given range are valid, false otherwise. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     [[nodiscard]] bool IsValidVirtualAddressRange(Common::ProcessAddress base, u64 size) const; | 
					
						
							| 
									
										
										
										
											2022-05-30 19:35:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 15:19:15 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Gets a pointer to the given address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr Virtual address to retrieve a pointer to. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns The pointer to the given address, if the address is valid. | 
					
						
							|  |  |  |      *          If the address is not valid, nullptr will be returned. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     u8* GetPointer(Common::ProcessAddress vaddr); | 
					
						
							|  |  |  |     u8* GetPointerSilent(Common::ProcessAddress vaddr); | 
					
						
							| 
									
										
										
										
											2019-11-26 15:19:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-08 18:01:40 -08:00
										 |  |  |     template <typename T> | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     T* GetPointer(Common::ProcessAddress vaddr) { | 
					
						
							| 
									
										
										
										
											2021-02-08 18:01:40 -08:00
										 |  |  |         return reinterpret_cast<T*>(GetPointer(vaddr)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 15:19:15 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Gets a pointer to the given address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr Virtual address to retrieve a pointer to. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns The pointer to the given address, if the address is valid. | 
					
						
							|  |  |  |      *          If the address is not valid, nullptr will be returned. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     [[nodiscard]] const u8* GetPointer(Common::ProcessAddress vaddr) const; | 
					
						
							| 
									
										
										
										
											2019-11-26 15:19:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-08 18:01:40 -08:00
										 |  |  |     template <typename T> | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     const T* GetPointer(Common::ProcessAddress vaddr) const { | 
					
						
							| 
									
										
										
										
											2021-02-08 18:01:40 -08:00
										 |  |  |         return reinterpret_cast<T*>(GetPointer(vaddr)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads an 8-bit unsigned value from the current process' address space | 
					
						
							|  |  |  |      * at the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to read the 8-bit value from. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns the read 8-bit unsigned value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     u8 Read8(Common::ProcessAddress addr); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a 16-bit unsigned value from the current process' address space | 
					
						
							|  |  |  |      * at the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to read the 16-bit value from. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns the read 16-bit unsigned value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     u16 Read16(Common::ProcessAddress addr); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a 32-bit unsigned value from the current process' address space | 
					
						
							|  |  |  |      * at the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to read the 32-bit value from. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns the read 32-bit unsigned value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     u32 Read32(Common::ProcessAddress addr); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a 64-bit unsigned value from the current process' address space | 
					
						
							|  |  |  |      * at the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to read the 64-bit value from. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns the read 64-bit value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     u64 Read64(Common::ProcessAddress addr); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes an 8-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 8-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 8-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory at the given virtual address contains the specified data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void Write8(Common::ProcessAddress addr, u8 data); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 16-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 16-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 16-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void Write16(Common::ProcessAddress addr, u16 data); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 32-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 32-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 32-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void Write32(Common::ProcessAddress addr, u32 data); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 64-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 64-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 64-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void Write64(Common::ProcessAddress addr, u64 data); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 8-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space if and only if the address contains | 
					
						
							|  |  |  |      * the expected value. This operation is atomic. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 8-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 8-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * @param expected The 8-bit unsigned integer to check against the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     bool WriteExclusive8(Common::ProcessAddress addr, u8 data, u8 expected); | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 16-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space if and only if the address contains | 
					
						
							|  |  |  |      * the expected value. This operation is atomic. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 16-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 16-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * @param expected The 16-bit unsigned integer to check against the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     bool WriteExclusive16(Common::ProcessAddress addr, u16 data, u16 expected); | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 32-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space if and only if the address contains | 
					
						
							|  |  |  |      * the expected value. This operation is atomic. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 32-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 32-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * @param expected The 32-bit unsigned integer to check against the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     bool WriteExclusive32(Common::ProcessAddress addr, u32 data, u32 expected); | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 64-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space if and only if the address contains | 
					
						
							|  |  |  |      * the expected value. This operation is atomic. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 64-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 64-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * @param expected The 64-bit unsigned integer to check against the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     bool WriteExclusive64(Common::ProcessAddress addr, u64 data, u64 expected); | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a 128-bit unsigned integer to the given virtual address in | 
					
						
							|  |  |  |      * the current process' address space if and only if the address contains | 
					
						
							|  |  |  |      * the expected value. This operation is atomic. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param addr The virtual address to write the 128-bit unsigned integer to. | 
					
						
							|  |  |  |      * @param data The 128-bit unsigned integer to write to the given virtual address. | 
					
						
							|  |  |  |      * @param expected The 128-bit unsigned integer to check against the given virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The memory range [addr, sizeof(data)) contains the given data value. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     bool WriteExclusive128(Common::ProcessAddress addr, u128 data, u128 expected); | 
					
						
							| 
									
										
										
										
											2020-03-07 18:59:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 15:48:19 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a null-terminated string from the given virtual address. | 
					
						
							|  |  |  |      * This function will continually read characters until either: | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * - A null character ('\0') is reached. | 
					
						
							|  |  |  |      * - max_length characters have been read. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @note The final null-terminating character (if found) is not included | 
					
						
							|  |  |  |      *       in the returned string. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr      The address to begin reading the string from. | 
					
						
							|  |  |  |      * @param max_length The maximum length of the string to read in characters. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @returns The read string. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     std::string ReadCString(Common::ProcessAddress vaddr, std::size_t max_length); | 
					
						
							| 
									
										
										
										
											2019-11-26 15:48:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a contiguous block of bytes from the current process' address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param src_addr    The virtual address to begin reading from. | 
					
						
							|  |  |  |      * @param dest_buffer The buffer to place the read bytes into. | 
					
						
							|  |  |  |      * @param size        The amount of data to read, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @note If a size of 0 is specified, then this function reads nothing and | 
					
						
							|  |  |  |      *       no attempts to access memory are made at all. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @pre dest_buffer must be at least size bytes in length, otherwise a | 
					
						
							|  |  |  |      *      buffer overrun will occur. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The range [dest_buffer, size) contains the read bytes from the | 
					
						
							|  |  |  |      *       current process' address space. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void ReadBlock(Common::ProcessAddress src_addr, void* dest_buffer, std::size_t size); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:29:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 13:34:59 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Reads a contiguous block of bytes from the current process' address space. | 
					
						
							|  |  |  |      * This unsafe version does not trigger GPU flushing. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param src_addr    The virtual address to begin reading from. | 
					
						
							|  |  |  |      * @param dest_buffer The buffer to place the read bytes into. | 
					
						
							|  |  |  |      * @param size        The amount of data to read, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @note If a size of 0 is specified, then this function reads nothing and | 
					
						
							|  |  |  |      *       no attempts to access memory are made at all. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @pre dest_buffer must be at least size bytes in length, otherwise a | 
					
						
							|  |  |  |      *      buffer overrun will occur. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The range [dest_buffer, size) contains the read bytes from the | 
					
						
							|  |  |  |      *       current process' address space. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void ReadBlockUnsafe(Common::ProcessAddress src_addr, void* dest_buffer, std::size_t size); | 
					
						
							| 
									
										
										
										
											2020-04-05 17:23:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a range of bytes into the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr  The destination virtual address to begin writing the data at. | 
					
						
							|  |  |  |      * @param src_buffer The data to write into the current process' address space. | 
					
						
							|  |  |  |      * @param size       The size of the data to write, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The address range [dest_addr, size) in the current process' address space | 
					
						
							|  |  |  |      *       contains the data that was within src_buffer. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post If an attempt is made to write into an unmapped region of memory, the writes | 
					
						
							|  |  |  |      *       will be ignored and an error will be logged. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post If a write is performed into a region of memory that is considered cached | 
					
						
							|  |  |  |      *       rasterizer memory, will cause the currently active rasterizer to be notified | 
					
						
							|  |  |  |      *       and will mark that region as invalidated to caches that the active | 
					
						
							|  |  |  |      *       graphics backend may be maintaining over the course of execution. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void WriteBlock(Common::ProcessAddress dest_addr, const void* src_buffer, std::size_t size); | 
					
						
							| 
									
										
										
										
											2019-11-26 17:39:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 13:34:59 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Writes a range of bytes into the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * This unsafe version does not invalidate GPU Memory. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr  The destination virtual address to begin writing the data at. | 
					
						
							|  |  |  |      * @param src_buffer The data to write into the current process' address space. | 
					
						
							|  |  |  |      * @param size       The size of the data to write, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The address range [dest_addr, size) in the current process' address space | 
					
						
							|  |  |  |      *       contains the data that was within src_buffer. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post If an attempt is made to write into an unmapped region of memory, the writes | 
					
						
							|  |  |  |      *       will be ignored and an error will be logged. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void WriteBlockUnsafe(Common::ProcessAddress dest_addr, const void* src_buffer, | 
					
						
							|  |  |  |                           std::size_t size); | 
					
						
							| 
									
										
										
										
											2020-04-05 17:23:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 16:06:49 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Copies data within a process' address space to another location within the | 
					
						
							|  |  |  |      * same address space. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr The destination virtual address to begin copying the data into. | 
					
						
							|  |  |  |      * @param src_addr  The source virtual address to begin copying the data from. | 
					
						
							|  |  |  |      * @param size      The size of the data to copy, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The range [dest_addr, size) within the process' address space contains the | 
					
						
							|  |  |  |      *       same data within the range [src_addr, size). | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-23 19:58:48 -04:00
										 |  |  |     void CopyBlock(Common::ProcessAddress dest_addr, Common::ProcessAddress src_addr, | 
					
						
							|  |  |  |                    std::size_t size); | 
					
						
							| 
									
										
										
										
											2019-11-26 16:06:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-16 23:48:45 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Zeros a range of bytes within the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr The destination virtual address to zero the data from. | 
					
						
							|  |  |  |      * @param size      The size of the range to zero out, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @post The range [dest_addr, size) within the process' address space contains the | 
					
						
							|  |  |  |      *       value 0. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-23 19:58:48 -04:00
										 |  |  |     void ZeroBlock(Common::ProcessAddress dest_addr, std::size_t size); | 
					
						
							| 
									
										
										
										
											2022-07-16 23:48:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-12 11:02:07 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Invalidates a range of bytes within the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr The destination virtual address to invalidate the data from. | 
					
						
							|  |  |  |      * @param size      The size of the range to invalidate, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-23 19:58:48 -04:00
										 |  |  |     Result InvalidateDataCache(Common::ProcessAddress dest_addr, std::size_t size); | 
					
						
							| 
									
										
										
										
											2022-11-12 11:02:07 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Stores a range of bytes within the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr The destination virtual address to store the data from. | 
					
						
							|  |  |  |      * @param size      The size of the range to store, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-23 19:58:48 -04:00
										 |  |  |     Result StoreDataCache(Common::ProcessAddress dest_addr, std::size_t size); | 
					
						
							| 
									
										
										
										
											2022-11-12 11:02:07 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Flushes a range of bytes within the current process' address space at the specified | 
					
						
							|  |  |  |      * virtual address. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param dest_addr The destination virtual address to flush the data from. | 
					
						
							|  |  |  |      * @param size      The size of the range to flush, in bytes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-23 19:58:48 -04:00
										 |  |  |     Result FlushDataCache(Common::ProcessAddress dest_addr, std::size_t size); | 
					
						
							| 
									
										
										
										
											2022-11-12 11:02:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 15:56:13 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Marks each page within the specified address range as cached or uncached. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr  The virtual address indicating the start of the address range. | 
					
						
							|  |  |  |      * @param size   The size of the address range in bytes. | 
					
						
							|  |  |  |      * @param cached Whether or not any pages within the address range should be | 
					
						
							|  |  |  |      *               marked as cached or uncached. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void RasterizerMarkRegionCached(Common::ProcessAddress vaddr, u64 size, bool cached); | 
					
						
							| 
									
										
										
										
											2019-11-26 15:56:13 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 12:56:01 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Marks each page within the specified address range as debug or non-debug. | 
					
						
							|  |  |  |      * Debug addresses are not accessible from fastmem pointers. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param vaddr The virtual address indicating the start of the address range. | 
					
						
							|  |  |  |      * @param size  The size of the address range in bytes. | 
					
						
							|  |  |  |      * @param debug Whether or not any pages within the address range should be | 
					
						
							|  |  |  |      *              marked as debug or non-debug. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-03-17 21:26:04 -04:00
										 |  |  |     void MarkRegionDebug(Common::ProcessAddress vaddr, u64 size, bool debug); | 
					
						
							| 
									
										
										
										
											2022-06-06 12:56:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 12:33:20 -05:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2021-04-02 17:06:21 -07:00
										 |  |  |     Core::System& system; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-26 12:33:20 -05:00
										 |  |  |     struct Impl; | 
					
						
							|  |  |  |     std::unique_ptr<Impl> impl; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-31 15:10:44 -04:00
										 |  |  | } // namespace Core::Memory
 |