53 lines
2.0 KiB
Diff
53 lines
2.0 KiB
Diff
--- a/linux-user/syscall.c
|
|
+++ b/linux-user/syscall.c
|
|
@@ -17,6 +17,7 @@
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#define _ATFILE_SOURCE
|
|
+#include <dlfcn.h>
|
|
#include "qemu/osdep.h"
|
|
#include "qemu/cutils.h"
|
|
#include "qemu/path.h"
|
|
@@ -9070,6 +9071,14 @@ _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) {
|
|
+ return g2h(_trampoline_g2h_cpu, guest_addr);
|
|
+}
|
|
+// Trampoline Function
|
|
+typedef uint32_t (*_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 +9104,26 @@ 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_LAZY);
|
|
+ // 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;
|
|
+ return _trampoline(_trampoline_g2h, arg1, g2h(cpu, arg2));
|
|
+ }
|
|
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,
|