#include #include #include #include #include #include #include #include #include #include #include #include "libemm64.h" #include "emm64_syscall.h" static int emm64_sysno = -1; /* get via sysctl. machdep.emm64_num */ static void emm_init(void) { size_t len; int val; int ret; len = sizeof(val); ret = sysctlbyname("machdep.emm64_num", &val, &len, NULL, 0); if (ret != -1 && val > 0) emm64_sysno = val; else emm64_sysno = -2; /* Work around a bug in vm_map_sync() - map very last page. */ if (emm64_sysno != -2) { mmap64(0x7ffffffff000ull, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); } } u_int64_t emm64_syscall(int func, void *arg) { quad_t ret; if (emm64_sysno == -1) emm_init(); if (emm64_sysno == -2) { errno = ENOSYS; return (u_int64_t)(int64_t)-1; } ret = __syscall(emm64_sysno, func, arg); return ret; }