mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
76ed9310f2
Added RAII wrapper around the the JITPageWriteEnableExecuteDisable() and JITPageWriteDisableExecuteEnable() to make it so that it is harder to forget to pair the calls in all code branches as suggested by leoetlino.
40 lines
1.5 KiB
C++
40 lines
1.5 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <string>
|
|
|
|
namespace Common
|
|
{
|
|
void* AllocateExecutableMemory(size_t size);
|
|
|
|
// These two functions control the executable/writable state of the W^X memory
|
|
// allocations. More detailed documentation about them is in the .cpp file.
|
|
// In general where applicable the ScopedJITPageWriteAndNoExecute wrapper
|
|
// should be used to prevent bugs from not pairing up the calls properly.
|
|
|
|
// Allows a thread to write to executable memory, but not execute the data.
|
|
void JITPageWriteEnableExecuteDisable();
|
|
// Allows a thread to execute memory allocated for execution, but not write to it.
|
|
void JITPageWriteDisableExecuteEnable();
|
|
// RAII Wrapper around JITPageWrite*Execute*(). When this is in scope the thread can
|
|
// write to executable memory but not execute it.
|
|
struct ScopedJITPageWriteAndNoExecute
|
|
{
|
|
ScopedJITPageWriteAndNoExecute() { JITPageWriteEnableExecuteDisable(); }
|
|
~ScopedJITPageWriteAndNoExecute() { JITPageWriteDisableExecuteEnable(); }
|
|
};
|
|
void* AllocateMemoryPages(size_t size);
|
|
void FreeMemoryPages(void* ptr, size_t size);
|
|
void* AllocateAlignedMemory(size_t size, size_t alignment);
|
|
void FreeAlignedMemory(void* ptr);
|
|
void ReadProtectMemory(void* ptr, size_t size);
|
|
void WriteProtectMemory(void* ptr, size_t size, bool executable = false);
|
|
void UnWriteProtectMemory(void* ptr, size_t size, bool allowExecute = false);
|
|
size_t MemPhysical();
|
|
|
|
} // namespace Common
|