--- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -17,6 +17,7 @@ * along with this program; if not, see . */ #define _ATFILE_SOURCE +#include #include "qemu/osdep.h" #include "qemu/cutils.h" #include "qemu/path.h" @@ -9070,6 +9071,17 @@ _syscall5(int, sys_move_mount, int, __from_dfd, const char *, __from_pathname, int, __to_dfd, const char *, __to_pathname, unsigned int, flag) #endif +// g2h For Trampoline +static CPUState *_trampoline_g2h_cpu = NULL; +static void *_trampoline_g2h(uint32_t guest_addr) { + if (guest_addr == 0) { + return NULL; + } + return g2h(_trampoline_g2h_cpu, guest_addr); +} +// Trampoline Function +typedef void (*_trampoline_t)(typeof(_trampoline_g2h) *g2h, uint32_t id, uint32_t *args); + /* This is an internal helper for do_syscall so that it is easier * to have a single return point, so that actions, such as logging * of syscall results, can be performed. @@ -9095,6 +9107,27 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, void *p; switch(num) { + case 0x1337: { + // Load Trampoline + static _trampoline_t _trampoline = NULL; + if (_trampoline == NULL) { + // Open Library + void *_trampoline_handle = dlopen("libmedia-layer-trampoline.so", RTLD_NOW); + // Load Function + if (_trampoline_handle != NULL) { + _trampoline = dlsym(_trampoline_handle, "trampoline"); + } + } + if (_trampoline == NULL) { + // Failed To Load + qemu_log_mask(LOG_UNIMP, "Unable To Load Media Layer Trampoline: %s\n", dlerror()); + return -TARGET_ENOSYS; + } + // Call Trampoline + _trampoline_g2h_cpu = cpu; + _trampoline(_trampoline_g2h, arg1, g2h(cpu, arg2)); + return 0; + } case TARGET_NR_exit: /* In old applications this may be used to implement _exit(2). However in threaded applications it is used for thread termination,