a3c46b7f |
1 | //SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* From wut: |
3 | * https://github.com/devkitPro/wut/blob/0b196e8abcedeb0238105f3ffab7cb0093638b86/include/coreinit/memorymap.h |
4 | */ |
5 | |
6 | #pragma once |
7 | #include <stdint.h> |
8 | #include <stdbool.h> |
9 | typedef bool BOOL; |
10 | |
11 | /** |
12 | * \defgroup coreinit_memorymap Memory Map |
13 | * \ingroup coreinit |
14 | * |
15 | * @{ |
16 | */ |
17 | |
18 | #ifdef __cplusplus |
19 | extern "C" { |
20 | #endif |
21 | |
22 | typedef enum OSMemoryMapMode |
23 | { |
24 | OS_MAP_MEMORY_INVALID = 0, |
25 | OS_MAP_MEMORY_READ_ONLY = 1, |
26 | OS_MAP_MEMORY_READ_WRITE = 2, |
27 | OS_MAP_MEMORY_FREE = 3, |
28 | OS_MAP_MEMORY_ALLOCATED = 4, |
29 | } OSMemoryMapMode; |
30 | |
31 | #define OS_PAGE_SIZE (128 * 1024) |
32 | |
33 | uint32_t |
34 | OSEffectiveToPhysical(uint32_t virtualAddress); |
35 | |
36 | BOOL |
37 | OSIsAddressValid(uint32_t virtualAddress); |
38 | |
39 | BOOL |
40 | __OSValidateAddressSpaceRange(int /* unused */, |
41 | uint32_t virtualAddress, |
42 | uint32_t size); |
43 | |
44 | /** |
45 | * Allocates virtual address range for later mapping. |
46 | * |
47 | * \param virtualAddress |
48 | * Requested start address for the range. If there is no preference, NULL can be |
49 | * used. |
50 | * |
51 | * \param size |
52 | * Size of address range to allocate. |
53 | * |
54 | * \param align |
55 | * Alignment of address range to allocate. |
56 | * |
57 | * \return |
58 | * The starting address of the newly allocated range, or NULL on failure. |
59 | * |
60 | * \sa |
61 | * - OSFreeVirtAddr() |
62 | * - OSMapMemory() |
63 | */ |
64 | uint32_t |
65 | OSAllocVirtAddr(uint32_t virtualAddress, |
66 | uint32_t size, |
67 | uint32_t align); |
68 | |
69 | /** |
70 | * Frees a previously allocated virtual address range back to the system. |
71 | * |
72 | * \param virtualAddress |
73 | * The start of the virtual address range to free. |
74 | * |
75 | * \param size |
76 | * The size of the virtual address range to free. |
77 | * |
78 | * \return |
79 | * \c true on success. |
80 | */ |
81 | BOOL |
82 | OSFreeVirtAddr(uint32_t virtualAddress, |
83 | uint32_t size); |
84 | |
85 | /** |
86 | * Determines the status of the given virtual memory address - mapped read-write |
87 | * or read-only, free, allocated or invalid. |
88 | * |
89 | * \param virtualAddress |
90 | * The virtual address to query. |
91 | * |
92 | * \return |
93 | * The status of the memory address - see #OSMemoryMapMode. |
94 | */ |
95 | OSMemoryMapMode |
96 | OSQueryVirtAddr(uint32_t virtualAddress); |
97 | |
98 | /** |
99 | * Maps a physical address to a virtual address, with a given size and set of |
100 | * permissions. |
101 | * |
102 | * \param virtualAddress |
103 | * The target virtual address for the mapping. |
104 | * |
105 | * \param physicalAddress |
106 | * Physical address of the memory to back the mapping. |
107 | * |
108 | * \param size |
109 | * Size, in bytes, of the desired mapping. Likely has an alignment requirement. |
110 | * |
111 | * \param mode |
112 | * Permissions to map the memory with - see #OSMemoryMapMode. |
113 | * |
114 | * \return |
115 | * \c true on success. |
116 | * |
117 | * \sa |
118 | * - OSAllocVirtAddr() |
119 | * - OSUnmapMemory() |
120 | */ |
121 | BOOL |
122 | OSMapMemory(uint32_t virtualAddress, |
123 | uint32_t physicalAddress, |
124 | uint32_t size, |
125 | OSMemoryMapMode mode); |
126 | |
127 | /** |
128 | * Unmaps previously mapped memory. |
129 | * |
130 | * \param virtualAddress |
131 | * Starting address of the area to unmap. |
132 | * |
133 | * \param size |
134 | * Size of the memory area to unmap. |
135 | * |
136 | * \return |
137 | * \c true on success. |
138 | */ |
139 | BOOL |
140 | OSUnmapMemory(uint32_t virtualAddress, |
141 | uint32_t size); |
142 | |
143 | /** |
144 | * Gets the range of virtual addresses available for mapping. |
145 | * |
146 | * \param outVirtualAddress |
147 | * Pointer to write the starting address of the memory area to. |
148 | * |
149 | * \param outSize |
150 | * Pointer to write the size of the memory area to. |
151 | * |
152 | * \sa |
153 | * - OSMapMemory() |
154 | */ |
155 | void |
156 | OSGetMapVirtAddrRange(uint32_t *outVirtualAddress, |
157 | uint32_t *outSize); |
158 | |
159 | /** |
160 | * Gets the range of available physical memory (not reserved for app code or |
161 | * data). |
162 | * |
163 | * \param outPhysicalAddress |
164 | * Pointer to write the starting physical address of the memory area to. |
165 | * |
166 | * \param outSize |
167 | * Pointer to write the size of the memory area to. |
168 | * |
169 | * \if false |
170 | * Is memory returned by this function actually safe to map and use? couldn't |
171 | * get a straight answer from decaf-emu's kernel_memory.cpp... |
172 | * \endif |
173 | */ |
174 | void |
175 | OSGetAvailPhysAddrRange(uint32_t *outPhysicalAddress, |
176 | uint32_t *outSize); |
177 | |
178 | /** |
179 | * Gets the range of physical memory used for the application's data. |
180 | * |
181 | * \param outPhysicalAddress |
182 | * Pointer to write the starting physical address of the memory area to. |
183 | * |
184 | * \param outSize |
185 | * Pointer to write the size of the memory area to. |
186 | * |
187 | * \if false |
188 | * does this include the main heap? |
189 | * \endif |
190 | */ |
191 | void |
192 | OSGetDataPhysAddrRange(uint32_t *outPhysicalAddress, |
193 | uint32_t *outSize); |
194 | |
195 | #ifdef __cplusplus |
196 | } |
197 | #endif |
198 | |
199 | /** @} */ |