Add all the files

This commit is contained in:
Exzap 2022-08-22 22:21:23 +02:00
parent e3db07a16a
commit d60742f52b
1445 changed files with 430238 additions and 0 deletions

View 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);
};

View 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

View 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