mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-06 15:01: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
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
|
Loading…
Add table
Add a link
Reference in a new issue