43 lines
1.8 KiB
C
43 lines
1.8 KiB
C
![]() |
#include "types.h"
|
||
|
|
||
|
namespace virtmem
|
||
|
{
|
||
|
|
||
|
struct Mapping {
|
||
|
u64 start_address, end_address;
|
||
|
u64 memoffset, memsize;
|
||
|
bool allow_writes;
|
||
|
};
|
||
|
|
||
|
// Platform specific vmemory API
|
||
|
// To initialize (maybe) the vmem subsystem
|
||
|
bool init(void **vmem_base_addr, void **sh4rcb_addr, size_t ramSize);
|
||
|
// To reset the on-demand allocated pages.
|
||
|
void reset_mem(void *ptr, unsigned size_bytes);
|
||
|
// To handle a fault&allocate an ondemand page.
|
||
|
void ondemand_page(void *address, unsigned size_bytes);
|
||
|
// To create the mappings in the address space.
|
||
|
void create_mappings(const Mapping *vmem_maps, unsigned nummaps);
|
||
|
// Just tries to wipe as much as possible in the relevant area.
|
||
|
void destroy();
|
||
|
// Given a block of data in the .text section, prepares it for JIT action.
|
||
|
// both code_area and size are page aligned. Returns success.
|
||
|
bool prepare_jit_block(void *code_area, size_t size, void **code_area_rwx);
|
||
|
// Same as above but uses two address spaces one with RX and RW protections.
|
||
|
// Note: this function doesnt have to be implemented, it's a fallback for the above one.
|
||
|
bool prepare_jit_block(void *code_area, size_t size, void **code_area_rw, ptrdiff_t *rx_offset);
|
||
|
// This might not need an implementation (ie x86/64 cpus).
|
||
|
void flush_cache(void *icache_start, void *icache_end, void *dcache_start, void *dcache_end);
|
||
|
// Change a code buffer permissions from r-x to/from rw-
|
||
|
void jit_set_exec(void* code, size_t size, bool enable);
|
||
|
// Release a jit block previously allocated by prepare_jit_block
|
||
|
void release_jit_block(void *code_area, size_t size);
|
||
|
// Release a jit block previously allocated by prepare_jit_block (with dual RW and RX areas)
|
||
|
void release_jit_block(void *code_area1, void *code_area2, size_t size);
|
||
|
|
||
|
bool region_lock(void *start, std::size_t len);
|
||
|
bool region_unlock(void *start, std::size_t len);
|
||
|
bool region_set_exec(void *start, std::size_t len);
|
||
|
|
||
|
} // namespace vmem
|