diff options
| author | 2014-07-05 10:28:14 -0400 | |
|---|---|---|
| committer | 2014-07-05 10:28:14 -0400 | |
| commit | 6084084a5d513544d8cb694554610b84270a5505 (patch) | |
| tree | fe2d322dc00edc55786956e5c94588205ae332b6 /src/core/mem_map_funcs.cpp | |
| parent | Merge pull request #26 from bunnei/romfs-archive (diff) | |
| parent | SharedMemory: Updated MapSharedMemory to use an enum for permissions. (diff) | |
| download | yuzu-6084084a5d513544d8cb694554610b84270a5505.tar.gz yuzu-6084084a5d513544d8cb694554610b84270a5505.tar.xz yuzu-6084084a5d513544d8cb694554610b84270a5505.zip | |
Merge pull request #28 from bunnei/shared-memory
Shared memory - adds preliminary support for shared memory kernel objects and correct block mapping.
Diffstat (limited to 'src/core/mem_map_funcs.cpp')
| -rw-r--r-- | src/core/mem_map_funcs.cpp | 42 |
1 files changed, 10 insertions, 32 deletions
diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index 37913119e..0342122df 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp | |||
| @@ -41,7 +41,7 @@ u32 _VirtualAddress(const u32 addr) { | |||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | template <typename T> | 43 | template <typename T> |
| 44 | inline void _Read(T &var, const u32 addr) { | 44 | inline void Read(T &var, const u32 addr) { |
| 45 | // TODO: Figure out the fastest order of tests for both read and write (they are probably different). | 45 | // TODO: Figure out the fastest order of tests for both read and write (they are probably different). |
| 46 | // TODO: Make sure this represents the mirrors in a correct way. | 46 | // TODO: Make sure this represents the mirrors in a correct way. |
| 47 | // Could just do a base-relative read, too.... TODO | 47 | // Could just do a base-relative read, too.... TODO |
| @@ -91,7 +91,7 @@ inline void _Read(T &var, const u32 addr) { | |||
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | template <typename T> | 93 | template <typename T> |
| 94 | inline void _Write(u32 addr, const T data) { | 94 | inline void Write(u32 addr, const T data) { |
| 95 | u32 vaddr = _VirtualAddress(addr); | 95 | u32 vaddr = _VirtualAddress(addr); |
| 96 | 96 | ||
| 97 | // Kernel memory command buffer | 97 | // Kernel memory command buffer |
| @@ -178,28 +178,6 @@ u8 *GetPointer(const u32 addr) { | |||
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | /** | 180 | /** |
| 181 | * Maps a block of memory in shared memory | ||
| 182 | * @param handle Handle to map memory block for | ||
| 183 | * @param addr Address to map memory block to | ||
| 184 | * @param permissions Memory map permissions | ||
| 185 | */ | ||
| 186 | u32 MapBlock_Shared(u32 handle, u32 addr,u32 permissions) { | ||
| 187 | MemoryBlock block; | ||
| 188 | |||
| 189 | block.handle = handle; | ||
| 190 | block.base_address = addr; | ||
| 191 | block.permissions = permissions; | ||
| 192 | |||
| 193 | if (g_shared_map.size() > 0) { | ||
| 194 | const MemoryBlock last_block = g_shared_map.rbegin()->second; | ||
| 195 | block.address = last_block.address + last_block.size; | ||
| 196 | } | ||
| 197 | g_shared_map[block.GetVirtualAddress()] = block; | ||
| 198 | |||
| 199 | return block.GetVirtualAddress(); | ||
| 200 | } | ||
| 201 | |||
| 202 | /** | ||
| 203 | * Maps a block of memory on the heap | 181 | * Maps a block of memory on the heap |
| 204 | * @param size Size of block in bytes | 182 | * @param size Size of block in bytes |
| 205 | * @param operation Memory map operation type | 183 | * @param operation Memory map operation type |
| @@ -247,25 +225,25 @@ u32 MapBlock_HeapGSP(u32 size, u32 operation, u32 permissions) { | |||
| 247 | 225 | ||
| 248 | u8 Read8(const u32 addr) { | 226 | u8 Read8(const u32 addr) { |
| 249 | u8 _var = 0; | 227 | u8 _var = 0; |
| 250 | _Read<u8>(_var, addr); | 228 | Read<u8>(_var, addr); |
| 251 | return (u8)_var; | 229 | return (u8)_var; |
| 252 | } | 230 | } |
| 253 | 231 | ||
| 254 | u16 Read16(const u32 addr) { | 232 | u16 Read16(const u32 addr) { |
| 255 | u16_le _var = 0; | 233 | u16_le _var = 0; |
| 256 | _Read<u16_le>(_var, addr); | 234 | Read<u16_le>(_var, addr); |
| 257 | return (u16)_var; | 235 | return (u16)_var; |
| 258 | } | 236 | } |
| 259 | 237 | ||
| 260 | u32 Read32(const u32 addr) { | 238 | u32 Read32(const u32 addr) { |
| 261 | u32_le _var = 0; | 239 | u32_le _var = 0; |
| 262 | _Read<u32_le>(_var, addr); | 240 | Read<u32_le>(_var, addr); |
| 263 | return _var; | 241 | return _var; |
| 264 | } | 242 | } |
| 265 | 243 | ||
| 266 | u64 Read64(const u32 addr) { | 244 | u64 Read64(const u32 addr) { |
| 267 | u64_le _var = 0; | 245 | u64_le _var = 0; |
| 268 | _Read<u64_le>(_var, addr); | 246 | Read<u64_le>(_var, addr); |
| 269 | return _var; | 247 | return _var; |
| 270 | } | 248 | } |
| 271 | 249 | ||
| @@ -278,19 +256,19 @@ u32 Read16_ZX(const u32 addr) { | |||
| 278 | } | 256 | } |
| 279 | 257 | ||
| 280 | void Write8(const u32 addr, const u8 data) { | 258 | void Write8(const u32 addr, const u8 data) { |
| 281 | _Write<u8>(addr, data); | 259 | Write<u8>(addr, data); |
| 282 | } | 260 | } |
| 283 | 261 | ||
| 284 | void Write16(const u32 addr, const u16 data) { | 262 | void Write16(const u32 addr, const u16 data) { |
| 285 | _Write<u16_le>(addr, data); | 263 | Write<u16_le>(addr, data); |
| 286 | } | 264 | } |
| 287 | 265 | ||
| 288 | void Write32(const u32 addr, const u32 data) { | 266 | void Write32(const u32 addr, const u32 data) { |
| 289 | _Write<u32_le>(addr, data); | 267 | Write<u32_le>(addr, data); |
| 290 | } | 268 | } |
| 291 | 269 | ||
| 292 | void Write64(const u32 addr, const u64 data) { | 270 | void Write64(const u32 addr, const u64 data) { |
| 293 | _Write<u64_le>(addr, data); | 271 | Write<u64_le>(addr, data); |
| 294 | } | 272 | } |
| 295 | 273 | ||
| 296 | void WriteBlock(const u32 addr, const u8* data, const int size) { | 274 | void WriteBlock(const u32 addr, const u8* data, const int size) { |