ReXGlue SDK
Loading...
Searching...
No Matches
recompiled_code.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <csetjmp>
14#include <cstddef>
15#include <span>
16
17#include <rex/platform.h>
18#include <rex/types.h>
19
20#if REX_PLATFORM_WIN32
21#include <rex/platform/dynlib.h>
22#endif
23
24struct PPCContext;
25
26using PPCFunc = void(PPCContext& ctx, u8* base);
27
28namespace rex::ppc {
34REX_PPC_API PPCFunc* ResolveFunction(u32 guest_address);
35
37REX_PPC_API void Trap(PPCContext& ctx, u8* base, u16 trap_type);
38
45REX_PPC_API std::jmp_buf& GetJumpBuffer(u32 address);
46
53[[noreturn]] REX_PPC_API void LongJump(u32 address, int value);
54
56[[noreturn]] REX_PPC_API void UnimplementedInstruction(const char* opcode);
57} // namespace rex::ppc
58
68#define REX_FUNC(x) void x([[maybe_unused]] PPCContext& __restrict ctx, [[maybe_unused]] u8* base)
69
79#define REX_EXTERN(x) extern "C" REX_FUNC(x)
80
82 size_t address;
83 PPCFunc* host;
84};
85
87extern const PPCFuncMapping kPPCFuncMappings[];
88
90#if REX_PLATFORM_MAC
91#define REX_RECOMPILED_CODE_SECTION \
92 __attribute__((section("__TEXT,__rexguest,regular,pure_instructions")))
93#else
94#define REX_RECOMPILED_CODE_SECTION __attribute__((section("rexguest")))
95#endif
96
97#if REX_PLATFORM_WIN32
99extern "C" const char __ImageBase;
100#elif REX_PLATFORM_MAC
101extern "C" const ::rex::u8 rex_recompiled_code_begin __asm("section$start$__TEXT$__rexguest");
102extern "C" const ::rex::u8 rex_recompiled_code_end __asm("section$end$__TEXT$__rexguest");
103#else
105extern "C" __attribute__((weak, visibility("hidden"))) const ::rex::u8 __start_rexguest[];
107extern "C" __attribute__((weak, visibility("hidden"))) const ::rex::u8 __stop_rexguest[];
108#endif
109
117#if REX_PLATFORM_WIN32
118#define REX_RECOMPILED_CODE() ::rex::platform::FindImageSection(&__ImageBase, "rexguest")
119#elif REX_PLATFORM_MAC
120#define REX_RECOMPILED_CODE() \
121 ::std::span<const ::rex::u8>(&rex_recompiled_code_begin, &rex_recompiled_code_end)
122#else
123#define REX_RECOMPILED_CODE() ::std::span<const ::rex::u8>(__start_rexguest, __stop_rexguest)
124#endif
125
126namespace rex::ppc {
127
133REX_PPC_API bool AddRecompiledCode(std::span<const u8> code);
134
140REX_PPC_API void RemoveRecompiledCode(std::span<const u8> code);
141
148
149} // namespace rex::ppc
Definition title_runtime.h:33
REX_PPC_API void UnimplementedInstruction(const char *opcode)
REX_PPC_API std::jmp_buf & GetJumpBuffer(u32 address)
REX_PPC_API bool AddRecompiledCode(std::span< const u8 > code)
REX_PPC_API void Trap(PPCContext &ctx, u8 *base, u16 trap_type)
REX_PPC_API PPCFunc * ResolveFunction(u32 guest_address)
REX_PPC_API bool IsRecompiledCode(u64 address)
REX_PPC_API void RemoveRecompiledCode(std::span< const u8 > code)
REX_PPC_API void LongJump(u32 address, int value)
Definition app.h:36
Platform flags, packing macros and export markers.
#define REX_PPC_API
Definition platform.h:194
const ::rex::u8 __stop_rexguest[]
Definition recompiled_code.h:107
const ::rex::u8 __start_rexguest[]
Definition recompiled_code.h:105
const PPCFuncMapping kPPCFuncMappings[]
Definition context.h:387
Definition recompiled_code.h:81
Integer types, byte order wrappers and size literals.