mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-07 15:31:18 +12:00
Add all the files
This commit is contained in:
parent
e3db07a16a
commit
d60742f52b
1445 changed files with 430238 additions and 0 deletions
24
src/util/MemMapper/MemMapper.h
Normal file
24
src/util/MemMapper/MemMapper.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
#pragma once
|
||||
|
||||
namespace MemMapper
|
||||
{
|
||||
enum class PAGE_PERMISSION : uint32
|
||||
{
|
||||
P_READ = (0x01),
|
||||
P_WRITE = (0x02),
|
||||
P_EXECUTE = (0x04),
|
||||
// combined
|
||||
P_NONE = 0,
|
||||
P_RW = (0x03),
|
||||
P_RWX = (0x07)
|
||||
};
|
||||
DEFINE_ENUM_FLAG_OPERATORS(PAGE_PERMISSION);
|
||||
|
||||
size_t GetPageSize();
|
||||
|
||||
void* ReserveMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags);
|
||||
void FreeReservation(void* baseAddr, size_t size);
|
||||
|
||||
void* AllocateMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags, bool fromReservation = false);
|
||||
void FreeMemory(void* baseAddr, size_t size, bool fromReservation = false);
|
||||
};
|
69
src/util/MemMapper/MemMapperUnix.cpp
Normal file
69
src/util/MemMapper/MemMapperUnix.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include "util/MemMapper/MemMapper.h"
|
||||
|
||||
#if BOOST_OS_LINUX > 0
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
namespace MemMapper
|
||||
{
|
||||
const size_t sPageSize{ []()
|
||||
{
|
||||
return (size_t)getpagesize();
|
||||
}()
|
||||
};
|
||||
|
||||
size_t GetPageSize()
|
||||
{
|
||||
return sPageSize;
|
||||
}
|
||||
|
||||
int GetProt(PAGE_PERMISSION permissionFlags)
|
||||
{
|
||||
int p = 0;
|
||||
if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PROT_READ | PROT_WRITE | PROT_EXEC;
|
||||
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PROT_READ | PROT_WRITE;
|
||||
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PROT_READ;
|
||||
else
|
||||
cemu_assert_unimplemented();
|
||||
return p;
|
||||
}
|
||||
|
||||
void* ReserveMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags)
|
||||
{
|
||||
return mmap(baseAddr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
}
|
||||
|
||||
void FreeReservation(void* baseAddr, size_t size)
|
||||
{
|
||||
munmap(baseAddr, size);
|
||||
}
|
||||
|
||||
void* AllocateMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags, bool fromReservation)
|
||||
{
|
||||
void* r;
|
||||
if(fromReservation)
|
||||
{
|
||||
if( mprotect(baseAddr, size, GetProt(permissionFlags)) == 0 )
|
||||
r = baseAddr;
|
||||
else
|
||||
r = nullptr;
|
||||
}
|
||||
else
|
||||
r = mmap(baseAddr, size, GetProt(permissionFlags), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
return r;
|
||||
}
|
||||
|
||||
void FreeMemory(void* baseAddr, size_t size, bool fromReservation)
|
||||
{
|
||||
if (fromReservation)
|
||||
mprotect(baseAddr, size, PROT_NONE);
|
||||
else
|
||||
munmap(baseAddr, size);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
67
src/util/MemMapper/MemMapperWin.cpp
Normal file
67
src/util/MemMapper/MemMapperWin.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include "util/MemMapper/MemMapper.h"
|
||||
|
||||
#if BOOST_OS_WINDOWS > 0
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
namespace MemMapper
|
||||
{
|
||||
const size_t sPageSize{ []()
|
||||
{
|
||||
SYSTEM_INFO si;
|
||||
GetSystemInfo(&si);
|
||||
return (size_t)si.dwPageSize;
|
||||
}()
|
||||
};
|
||||
|
||||
size_t GetPageSize()
|
||||
{
|
||||
return sPageSize;
|
||||
}
|
||||
|
||||
DWORD GetPageProtection(PAGE_PERMISSION permissionFlags)
|
||||
{
|
||||
DWORD p = 0;
|
||||
if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PAGE_EXECUTE_READWRITE;
|
||||
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PAGE_READWRITE;
|
||||
else if (HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_READ) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_WRITE) && !HAS_FLAG(permissionFlags, PAGE_PERMISSION::P_EXECUTE))
|
||||
p = PAGE_READONLY;
|
||||
else
|
||||
cemu_assert_unimplemented();
|
||||
return p;
|
||||
}
|
||||
|
||||
void* ReserveMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags)
|
||||
{
|
||||
void* r = VirtualAlloc(baseAddr, size, MEM_RESERVE, GetPageProtection(permissionFlags));
|
||||
return r;
|
||||
}
|
||||
|
||||
void FreeReservation(void* baseAddr, size_t size)
|
||||
{
|
||||
VirtualFree(baseAddr, size, MEM_RELEASE);
|
||||
}
|
||||
|
||||
void* AllocateMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags, bool fromReservation)
|
||||
{
|
||||
void* r;
|
||||
if(fromReservation)
|
||||
r = VirtualAlloc(baseAddr, size, MEM_COMMIT, GetPageProtection(permissionFlags));
|
||||
else
|
||||
r = VirtualAlloc(baseAddr, size, MEM_RESERVE | MEM_COMMIT, GetPageProtection(permissionFlags));
|
||||
return r;
|
||||
}
|
||||
|
||||
void FreeMemory(void* baseAddr, size_t size, bool fromReservation)
|
||||
{
|
||||
if(fromReservation)
|
||||
VirtualFree(baseAddr, size, MEM_DECOMMIT);
|
||||
else
|
||||
VirtualFree(baseAddr, size, MEM_RELEASE);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue