ReXGlue SDK
Toggle main menu visibility
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
24
struct
PPCContext
;
25
26
using
PPCFunc = void(
PPCContext
& ctx, u8* base);
27
28
namespace
rex::ppc
{
34
REX_PPC_API
PPCFunc*
ResolveFunction
(u32 guest_address);
35
37
REX_PPC_API
void
Trap
(
PPCContext
& ctx, u8* base, u16 trap_type);
38
45
REX_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
81
struct
PPCFuncMapping
{
82
size_t
address;
83
PPCFunc* host;
84
};
85
87
extern
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
99
extern
"C"
const
char
__ImageBase;
100
#elif REX_PLATFORM_MAC
101
extern
"C"
const ::rex::u8 rex_recompiled_code_begin __asm(
"section$start$__TEXT$__rexguest"
);
102
extern
"C"
const ::rex::u8 rex_recompiled_code_end __asm(
"section$end$__TEXT$__rexguest"
);
103
#else
105
extern
"C"
__attribute__((weak, visibility(
"hidden"
))) const ::
rex
::u8
__start_rexguest
[];
107
extern
"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
126
namespace
rex::ppc
{
127
133
REX_PPC_API
bool
AddRecompiledCode
(std::span<const u8> code);
134
140
REX_PPC_API
void
RemoveRecompiledCode
(std::span<const u8> code);
141
147
REX_PPC_API
bool
IsRecompiledCode
(u64 address);
148
149
}
// namespace rex::ppc
dynlib.h
rex::ppc
Definition
title_runtime.h:33
rex::ppc::UnimplementedInstruction
REX_PPC_API void UnimplementedInstruction(const char *opcode)
rex::ppc::GetJumpBuffer
REX_PPC_API std::jmp_buf & GetJumpBuffer(u32 address)
rex::ppc::AddRecompiledCode
REX_PPC_API bool AddRecompiledCode(std::span< const u8 > code)
rex::ppc::Trap
REX_PPC_API void Trap(PPCContext &ctx, u8 *base, u16 trap_type)
rex::ppc::ResolveFunction
REX_PPC_API PPCFunc * ResolveFunction(u32 guest_address)
rex::ppc::IsRecompiledCode
REX_PPC_API bool IsRecompiledCode(u64 address)
rex::ppc::RemoveRecompiledCode
REX_PPC_API void RemoveRecompiledCode(std::span< const u8 > code)
rex::ppc::LongJump
REX_PPC_API void LongJump(u32 address, int value)
rex
Definition
app.h:36
platform.h
Platform flags, packing macros and export markers.
REX_PPC_API
#define REX_PPC_API
Definition
platform.h:194
__stop_rexguest
const ::rex::u8 __stop_rexguest[]
Definition
recompiled_code.h:107
__start_rexguest
const ::rex::u8 __start_rexguest[]
Definition
recompiled_code.h:105
kPPCFuncMappings
const PPCFuncMapping kPPCFuncMappings[]
PPCContext
Definition
context.h:387
PPCFuncMapping
Definition
recompiled_code.h:81
types.h
Integer types, byte order wrappers and size literals.
rex
ppc
recompiled_code.h
Generated by
1.18.0