/* Copyright (c) 2016 Google Inc.
 * See LICENSE for details.
 *
 * Linux emulation for virtual machines. */

#include <sys/stat.h>
#include <sys/types.h>
#include <parlib/stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <vmm/vmm.h>
#include <errno.h>
#include <sys/syscall.h>
#include <vmm/linux_syscalls.h>
#include <sys/time.h>
#include <vmm/linuxemu.h>
#include <dlfcn.h>
#include <sys/mman.h>
#include <futex.h>
#include <sys/epoll.h>

// This is the maximum fd number we allow opened in dune
#define DUNE_NR_FILE_DESC 100

// Some defines used in linux syscalls
#define FALLOC_FL_KEEP_SIZE 1
#define FALLOC_FL_PUNCH_HOLE 2
#define GRND_NONBLOCK 0x0001
#define GRND_RANDOM 0x0002

static int lemu_debug;

static uth_mutex_t *lemu_logging_lock;
static uth_mutex_t *fd_table_lock;

static FILE *lemu_global_logfile;

//Records the open fds of files opened with linuxemu
// TODO: Make this a dynamic array in the future
char *openfd_filenames[DUNE_NR_FILE_DESC];

void init_lemu_logging(int log_level)
{
	const char *logfile_name = "lemu.log";
	FILE *x = fopen(logfile_name, "w");

	lemu_debug = log_level;
	lemu_logging_lock = uth_mutex_alloc();

	if (x != NULL)
		lemu_global_logfile = x;
	else
		lemu_global_logfile = stderr;
}

void destroy_lemu_logging(void)
{
	if (lemu_logging_lock != NULL)
		uth_mutex_free(lemu_logging_lock);

	if (lemu_global_logfile != stderr)
		fclose(lemu_global_logfile);
}

/////////////////////////////////////
// BEGIN SYSCALL HELPERS
/////////////////////////////////////

// Checks if path is an absolute path
// Symlinks are not resolved, we just check if we refer to the root directory
bool is_absolute_path(const char *path)
{
	if (!path || strlen(path) == 0)
		return false;
	return (strncmp(path, "/", 1) == 0);
}


// This resolves relative paths in syscalls like openat and unlinkat, based on
// our currently opened fds in dune
//
// This function will allocate memory for the string absolute_path, it is the
// caller's responsibility to free this memory when it is done
//
// If path is an absolute path already, we ignore fd and retrun a copy of path
// in absolute_path
bool get_absolute_path_from_fd(int fd, const char *path, char **absolute_path)
{
	if (!path) {
		fprintf(stderr, "get_absolute_path_from_fd: suffix is null.\n");
		return false;
	}

	if (fd >= DUNE_NR_FILE_DESC) {
		fprintf(stderr, "get_absolute_path_from_fd: fd too large.\n");
		return false;
	}

	int len1 = strlen(path);

	if (len1 == 0) {
		fprintf(stderr,
			"get_absolute_path_from_fd: suffix is empty.\n");
		return false;
	}

	if (is_absolute_path(path)) {
		*absolute_path = calloc(sizeof(char), len1 + 1);
		if (!(*absolute_path)) {
			fprintf(stderr,
			        "get_absolute_path_from_fd: couldn't allocate memory.\n");
			return false;
		}
		strcpy(*absolute_path, path);
		return true;
	}

	uth_mutex_lock(fd_table_lock);
	if (!openfd_filenames[fd]) {
		uth_mutex_unlock(fd_table_lock);
		fprintf(stderr,
			"get_absolute_path_from_fd: no file open at fd.\n");
		return false;
	}

	int len2 = strlen(openfd_filenames[fd]);

	if (len2 == 0) {
		uth_mutex_unlock(fd_table_lock);
		fprintf(stderr,
		        "get_absolute_path_from_fd: prefix has length 0, fd was probably not open.\n");
		return false;
	}

	// Add space for an extra slash and a null terminator
	int total_len = len1 + len2 + 2;

	*absolute_path = calloc(sizeof(char), total_len);

	if (!(*absolute_path)) {
		uth_mutex_unlock(fd_table_lock);
		fprintf(stderr,
		        "get_absolute_path_from_fd: couldn't allocate memory.\n");
		return false;
	}

	strcat(*absolute_path, openfd_filenames[fd]);
	uth_mutex_unlock(fd_table_lock);

	// Add a slash if we don't have one
	if ((*absolute_path)[len2 - 1] != '/')
		strcat(*absolute_path, "/");

	strcat(*absolute_path, path);

	fprintf(stderr, "Constructed full path \"%s\"\n", *absolute_path);
	return true;
}


//Akaros open flags are different than linux
//This function converts them
int convert_open_flags_ltoa(int flags)
{
	int lower3bits = flags & 0x7;
	int otherstuff = flags & ~(0x7);

	switch (lower3bits) {
	case 0:
		otherstuff |= O_RDONLY;
		break;
	case 1:
		otherstuff |= O_WRONLY;
		break;
	case 2:
		otherstuff |= O_RDWR;
		break;
	default:
		// TODO(ganshun): We panic here for now if they are trying
		// behavior we do not expect
		panic("linuxemu, convert_open_flags_ltoa: unknown open flags provided\n");
		break;
	}
	return otherstuff;
}

int convert_open_flags_atol(int flags)
{
	int lower3bits = flags & 0x7;
	int otherstuff = flags & ~(0x7);

	switch (lower3bits) {
	case O_RDONLY:
		otherstuff |= 0;
		break;
	case O_WRONLY:
		otherstuff |= 1;
		break;
	case O_RDWR:
		otherstuff |= 2;
		break;
	default:
		// TODO(ganshun): We panic here for now if they are trying
		// behavior we do not expect
		panic("linuxemu, convert_open_flags_atol: unknown open flags provided\n");
		break;
	}
	return otherstuff;
}

// Updates the fd mapping for a specific fd. Allows the fd mapping to
// be freed (in the case of a close). Calls to the function may leave
// values in the fd table as NULL
bool update_fd_map(int fd, const char *path)
{
	int len = 0;

	if (fd >= DUNE_NR_FILE_DESC)
		return false;

	if (path)
		len = strlen(path);

	uth_mutex_lock(fd_table_lock);

	// If there was a file here before, free the string
	// Potential optimization would be to only free when
	// we need to grow the size of the string.
	if (openfd_filenames[fd]) {
		free(openfd_filenames[fd]);
		openfd_filenames[fd] = NULL;
	}
	// If we have a new file to put here, allocate memory
	// and copy it in.
	if (len) {
		openfd_filenames[fd] = (char*) calloc(sizeof(char), len + 1);
		if (!openfd_filenames[fd]) {
			uth_mutex_unlock(fd_table_lock);
			panic("update_fd_map could not allocate memory\n");
			return false;
		}
		strcpy(openfd_filenames[fd], path);
	}

	uth_mutex_unlock(fd_table_lock);
	return true;
}

void convert_stat_akaros_to_linux(struct stat *si_akaros,
                                  struct linux_stat_amd64 *si)
{
	si->st_dev =  (uint64_t) si_akaros->st_dev;
	si->st_ino = (uint64_t) si_akaros->st_ino;
	si->st_mode = (uint32_t) si_akaros->st_mode;
	si->st_nlink = (uint64_t) si_akaros->st_nlink;
	si->st_uid = (uint32_t) si_akaros->st_uid;
	si->st_gid = (uint32_t) si_akaros->st_gid;
	si->st_rdev = (uint64_t) si_akaros->st_rdev;
	si->st_size = (int64_t) si_akaros->st_size;
	si->st_blksize = (int64_t) si_akaros->st_blksize;
	si->st_blocks = (int64_t) si_akaros->st_blocks;

	//For now the akaros timespec works out... this might change
	//akaros timespec must be 2x int64_t for this to be valid
	si->st_atim = si_akaros->st_atim;
	si->st_mtim = si_akaros->st_mtim;
	si->st_ctim = si_akaros->st_ctim;
}

/////////////////////////////////////
// BEGIN DUNE SYSCALL IMPLEMENTATIONS
/////////////////////////////////////

//////////////////////////////////////////////////////
// Ported Syscalls (we just call the akaros version)
//////////////////////////////////////////////////////

bool dune_sys_ftruncate(struct vm_trapframe *tf)
{
	int retval = ftruncate((int) tf->tf_rdi, (off_t) tf->tf_rsi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;

}

bool dune_sys_fcntl(struct vm_trapframe *tf)
{
	int retval = fcntl((int) tf->tf_rdi, (int) tf->tf_rsi, (int) tf->tf_rdx);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		// TODO(ganshun): fix fcntl SETFL, ak flags are different.
		if (tf->tf_rsi == 3)
			retval = convert_open_flags_atol(retval);
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_pread64(struct vm_trapframe *tf)
{
	int fd = (int) tf->tf_rdi;
	void *buf = (void*) tf->tf_rsi;
	size_t count = tf->tf_rdx;
	off_t offset = (off_t) tf->tf_r10;

	ssize_t retval = pread(fd, buf, count, offset);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %zd\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_read(struct vm_trapframe *tf)
{
	ssize_t retval = read(tf->tf_rdi, (void*) tf->tf_rsi,
			      (size_t) tf->tf_rdx);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %zd\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_pwrite64(struct vm_trapframe *tf)
{
	int fd = (int) tf->tf_rdi;
	const void *buf = (const void*) tf->tf_rsi;
	size_t length = (size_t) tf->tf_rdx;
	off_t offset = (off_t) tf->tf_r10;

	ssize_t retval = pwrite(fd, buf, length, offset);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %zd\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_write(struct vm_trapframe *tf)
{
	ssize_t retval = write((int) tf->tf_rdi, (const void *) tf->tf_rsi,
	                       (size_t) tf->tf_rdx);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %zd\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_getpid(struct vm_trapframe *tf)
{
	// Getpid always suceeds
	int retval = getpid();

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false, "SUCCESS %d\n",
		  retval);
	tf->tf_rax = retval;
	return true;
}

bool dune_sys_gettimeofday(struct vm_trapframe *tf)
{
	int retval = gettimeofday((struct timeval*) tf->tf_rdi,
	                          (struct timezone*) tf->tf_rsi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_dup(struct vm_trapframe *tf)
{
	int retval = dup((int) tf->tf_rdi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_dup2(struct vm_trapframe *tf)
{
	int retval = dup2((int) tf->tf_rdi, (int)tf->tf_rsi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_umask(struct vm_trapframe *tf)
{
	//Umask always succeeds
	int retval = umask((mode_t) tf->tf_rdi);

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false, "SUCCESS %d\n",
		  retval);
	tf->tf_rax = retval;
	return true;
}

bool dune_sys_clock_gettime(struct vm_trapframe *tf)
{
	int retval = clock_gettime(tf->tf_rdi, (struct timespec*) tf->tf_rsi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_munmap(struct vm_trapframe *tf)
{
	int retval = munmap((void *) tf->tf_rdi, tf->tf_rsi);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_futex(struct vm_trapframe *tf)
{
	int *uaddr = (int*) tf->tf_rdi;
	int op = (int) tf->tf_rsi;
	int val = (int) tf->tf_rdx;
	struct timespec *timeout = (struct timespec *) tf->tf_r10;
	int *uaddr2 = (int*) tf->tf_r8;
	int val3 = (int) tf->tf_r9;
	int retval = futex(uaddr, op, val, timeout, uaddr2, val3);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_gettid(struct vm_trapframe *tf)
{
	// Gettid always succeeds
	int retval = tf->tf_guest_pcoreid;

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false, "SUCCESS %d\n",
		  retval);
	tf->tf_rax = retval;
	return true;
}

/////////////////////////////////////////////////////////
// Modified Syscalls (Partially implemented in Akaros)
////////////////////////////////////////////////////////

bool dune_sys_open(struct vm_trapframe *tf)
{
	const char *file = (const char *) tf->tf_rdi;
	int flags = tf->tf_rsi;
	int mode = tf->tf_rdx;

	flags = convert_open_flags_ltoa(flags);
	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "Trying to open \"%s\"\n", file);

	int retval  = open(file, flags, mode);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
		return true;
	}

	if (!update_fd_map(retval, file))
		panic("[TID %d] %s: ERROR in updating fd_mapping\n",
		      tf->tf_guest_pcoreid, dune_syscall_table[tf->tf_rax].name);

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "SUCCESS %d\n", retval);
	tf->tf_rax = retval;
	return true;
}

bool dune_sys_openat(struct vm_trapframe *tf)
{

	int fd = (int) tf->tf_rdi;
	const char *s = (const char *) tf->tf_rsi;
	int flags = (int) tf->tf_rdx;
	char *s_absolute = NULL;
	int retval;
	int err;

	// TODO: we panic here on failure, but there are probably instances
	// where we'd want to recover and return EBADF or ENOTDIR
	if (!get_absolute_path_from_fd(fd, s, &s_absolute)) {
		panic("[TID %d] %s: ERROR in getting absolute path fd was %d, suffix was %s\n",
		      tf->tf_guest_pcoreid, dune_syscall_table[tf->tf_rax].name,
		      fd, s);
	}

	flags = convert_open_flags_ltoa(flags);
	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "trying to open absolute path %s with translated flags %p\n",
	          s, flags);
	retval = open(s_absolute, flags);
	err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
		free(s_absolute);
		return true;
	}

	if (!update_fd_map(retval, s_absolute)) {
		panic("[TID %d] %s: ERROR in updating fd_mapping\n",
		      tf->tf_guest_pcoreid,
		      dune_syscall_table[tf->tf_rax].name);
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "SUCCESS %d\n", retval);
	free(s_absolute);
	tf->tf_rax = retval;
	return true;
}

bool dune_sys_readlinkat(struct vm_trapframe *tf)
{
	int fd = (int) tf->tf_rdi;
	const char *s = (const char*) tf->tf_rsi;
	char *buf = (char *) tf->tf_rdx;
	size_t bufsize = (size_t) tf->tf_r10;
	ssize_t retval;
	int err;
	char *s_absolute = NULL;


	if (!get_absolute_path_from_fd(fd, s, &s_absolute)) {
		panic("[TID %d] %s: ERROR in getting absolute path fd was %d, suffix was %s\n",
		      tf->tf_guest_pcoreid, dune_syscall_table[tf->tf_rax].name,
		      fd, s);
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "trying to readlink %s\n", s_absolute);
	retval = readlink(s_absolute, buf, bufsize);
	err = errno;
	free(s_absolute);

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_unlinkat(struct vm_trapframe *tf)
{
	int fd = (int) tf->tf_rdi;
	const char *s = (const char*) tf->tf_rsi;
	int flags = (int) tf->tf_rdx;
	char *s_absolute = NULL;
	int retval, err;

	if (!get_absolute_path_from_fd(fd, s, &s_absolute)) {
		panic("[TID %d] %s: ERROR in getting absolute path fd was %d, suffix was %s\n",
		      tf->tf_guest_pcoreid, dune_syscall_table[tf->tf_rax].name,
		      fd, s);
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "trying to unlink %s\n", s_absolute);
	retval = unlink(s_absolute);
	err = errno;
	free(s_absolute);

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_close(struct vm_trapframe *tf)
{
	int fd = tf->tf_rdi;
	int retval, err;

	retval = close(fd);
	err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
		return true;
	}

	if (!update_fd_map(fd, NULL)) {
		panic("[TID %d] %s: ERROR in updating fd_mapping\n",
		      tf->tf_guest_pcoreid,
		      dune_syscall_table[tf->tf_rax].name);
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
	          "SUCCESS %d\n", retval);
	tf->tf_rax = retval;
	return true;
}

bool dune_sys_sched_yield(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	uthread_sched_yield();
	return true;
}


bool dune_sys_fstat(struct vm_trapframe *tf)
{
	struct stat si_akaros_val;
	int fd = tf->tf_rdi;
	struct linux_stat_amd64 *si = (struct linux_stat_amd64*) tf->tf_rsi;

	// TODO(ganshun): Check if mmaped
	if (!si) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", EFAULT);
		tf->tf_rax = -EFAULT;
		return true;
	}

	struct stat *si_akaros = &si_akaros_val;

	// Make sure we zero out the data on the stack
	memset((void*) si_akaros, 0, sizeof(struct stat));

	int retval = fstat(fd, si_akaros);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		convert_stat_akaros_to_linux(si_akaros, si);
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_stat(struct vm_trapframe *tf)
{
	struct stat si_akaros_val;
	const char *path = (const char*) tf->tf_rdi;
	struct linux_stat_amd64 *si = (struct linux_stat_amd64*) tf->tf_rsi;

	// TODO(ganshun): Check if mmaped
	if (!si) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", EFAULT);
		tf->tf_rax = -EFAULT;
		return true;
	}

	struct stat *si_akaros = &si_akaros_val;

	// Make sure we zero out the data on the stack
	memset((void*) si_akaros, 0, sizeof(struct stat));

	int retval = stat(path, si_akaros);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		convert_stat_akaros_to_linux(si_akaros, si);
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

///////////////////////////////////////////////////
// Newly Implemented Syscalls
///////////////////////////////////////////////////

// Dune implementation of fallocate, it just writes zeros for now
int dune_fallocate(int fd, int mode, off_t offset, off_t len)
{
	if (!(mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE)))
		return posix_fallocate(fd, offset, len);

	if (offset < 0 || len <= 0) {
		errno = EINVAL;
		return -1;
	}
	struct stat st;
	int ret = fstat(fd, &st);

	if (ret == -1) {
		errno == EBADF;
		return -1;
	}
	if (offset + len >= st.st_size) {
		// Panic here as we cannot support changing the size of the file
		// right now.
		panic("dune_fallocate: would write over the size of the file!");
	}
	if (S_ISFIFO(st.st_mode)) {
		errno = ESPIPE;
		return -1;
	}
	if (!(S_ISREG(st.st_mode) || S_ISDIR(st.st_mode))) {
		errno = ENODEV;
		return -1;
	}

	// TODO(ganshun): For punch hole, we just write zeros to the file for
	// now
	if ((mode & FALLOC_FL_PUNCH_HOLE) && (mode & FALLOC_FL_KEEP_SIZE)) {
		const size_t buffer_size = 0x100000;
		int pos;
		ssize_t amt = 0;
		size_t tot = 0;
		size_t size;
		char *buf = calloc(sizeof(char), buffer_size);

		if (!buf)
			panic("dune_fallocate: could not allocate a buffer\n");

		for (pos = offset; pos < offset + len; pos += amt) {
			size = len + offset - pos;
			if (size > buffer_size)
				size = buffer_size;
			amt = write(fd, buf, size);
			if (amt == -1) {
				free(buf);
				errno = EIO;
				return -1;
			}
			tot += amt;
			fprintf(stderr, "%d bytes written so far\n", tot);
		}
		free(buf);
		return tot;
	}

	// Unsupported otherwise
	errno = ENOSYS;
	return -1;
}

// Fallocate syscall
bool dune_sys_fallocate(struct vm_trapframe *tf)
{
	int fd = (int) tf->tf_rdi;
	int mode = (int) tf->tf_rsi;
	off_t offset = (off_t) tf->tf_rdx;
	off_t len = (off_t) tf->tf_r10;

	int retval = dune_fallocate(fd, mode, offset, len);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

// Currently unsupported
bool dune_sys_sched_getaffinity(struct vm_trapframe *tf)
{
	tf->tf_rax = -ENOSYS;
	return true;
}

// We do not implement pselect; however, some applications may try to
// use it as a portable way to sleep. If that is the case, then we
// allow it
bool dune_sys_pselect6(struct vm_trapframe *tf)
{
	int nfds = (int) tf->tf_rdi;
	fd_set *readfds = (fd_set *) tf->tf_rsi;
	fd_set *writefds = (fd_set *) tf->tf_rdx;
	fd_set *exceptfds = (fd_set *) tf->tf_r10;
	const struct timespec *timeout = (const struct timespec *) tf->tf_r8;
	const sigset_t *sigmask = (const sigset_t *) tf->tf_r9;

	// Check if process wants to sleep
	if (nfds == 0 && readfds == NULL && writefds == NULL &&
	    exceptfds == NULL && timeout != NULL) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "Sleeping for %ld seconds, %ld nanoseconds\n",
		          timeout->tv_sec, timeout->tv_nsec);
		nanosleep(timeout, NULL);
		tf->tf_rax = 0;
		return true;
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
	          "unimplemented, will now fail...\n");
	return false;
}

bool dune_sys_getrandom(struct vm_trapframe *tf)
{
	const char *random_source = "/dev/urandom";
	void *buf = (void*) tf->tf_rdi;
	size_t len = (size_t) tf->tf_rsi;
	unsigned int flags = (unsigned int) tf->tf_rdx;

	if (!buf) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "buffer inaccessable\n");
		tf->tf_rax = -EFAULT;
		return true;
	}
	if (flags & GRND_RANDOM || flags & GRND_NONBLOCK) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "unsupported flags specified\n");
		tf->tf_rax = -EINVAL;
		return true;
	}

	int fd = open(random_source, O_RDONLY);
	int err = errno;

	if (fd == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
			  "ERROR opening random source %s, errno=%d\n",
			  random_source, err);
		return false;
	}

	ssize_t retval = read(fd, buf, len);

	err = errno;
	close(fd);
	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR reading from random source %s, errno=%d\n",
		          random_source, err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %zd\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

/////////////////////////////////////////////////////////////////
/// We don't have a good implementation for these syscalls,
/// they will not work in all cases
/////////////////////////////////////////////////////////////////

bool dune_sys_getgroups(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}


bool dune_sys_geteuid(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}

bool dune_sys_getegid(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}


bool dune_sys_getuid(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}


bool dune_sys_getgid(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}

// TODO(ganshun): implement mincore
bool dune_sys_mincore(struct vm_trapframe *tf)
{
	tf->tf_rax = -ENOMEM;
	return true;
}

bool dune_sys_rt_sigprocmask(struct vm_trapframe *tf)
{
	int retval = sigprocmask(tf->tf_rdi, (const sigset_t*) tf->tf_rsi,
	                         (sigset_t*) tf->tf_rdx);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

// TODO(ganshun): sigaltstack needs to implemented for the guest
bool dune_sys_sigaltstack(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}


// TODO(ganshun): more signal code, we need to be careful with this one,
// we should not register guest signal handlers in akaros
bool dune_sys_rt_sigaction(struct vm_trapframe *tf)
{
	tf->tf_rax = 0;
	return true;
}

//TODO(ganshun): we do not support epoll currently except for create and wait
bool dune_sys_epoll_create1(struct vm_trapframe *tf)
{
	int flags = 0;
	// TODO(ganshun): epoll_create is not fully supported for all flags
	// so we ignore the flags variable in the trapframe since it is not used.
	int retval = epoll_create1(flags);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

bool dune_sys_epoll_wait(struct vm_trapframe *tf)
{
	int epfd = (int) tf->tf_rdi;
	struct epoll_event *events = (struct epoll_event*) tf->tf_rsi;
	int maxevents = (int) tf->tf_rdx;
	int timeout = (int) tf->tf_r10;
	int retval = epoll_wait(epfd, events, maxevents, timeout);
	int err = errno;

	if (retval == -1) {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, true,
		          "ERROR %d\n", err);
		tf->tf_rax = -err;
	} else {
		lemuprint(tf->tf_guest_pcoreid, tf->tf_rax, false,
		          "SUCCESS %d\n", retval);
		tf->tf_rax = retval;
	}
	return true;
}

// Unimplemented
bool dune_sys_epoll_ctl(struct vm_trapframe *tf)
{
	tf->tf_rax = -ENOSYS;
	return true;
}

// Unimplemented
bool dune_sys_fstatfs(struct vm_trapframe *tf)
{
	tf->tf_rax = -ENOSYS;
	return true;
}

// Main syscall table
struct dune_sys_table_entry dune_syscall_table[DUNE_MAX_NUM_SYSCALLS] = {
	[DUNE_SYS_READ] = {dune_sys_read, "DUNE_SYS_READ"},
	[DUNE_SYS_WRITE] = {dune_sys_write, "DUNE_SYS_WRITE"},
	[DUNE_SYS_OPEN] = {dune_sys_open, "DUNE_SYS_OPEN"},
	[DUNE_SYS_CLOSE] = {dune_sys_close, "DUNE_SYS_CLOSE"},
	[DUNE_SYS_STAT] = {dune_sys_stat, "DUNE_SYS_STAT"},
	[DUNE_SYS_FSTAT] = {dune_sys_fstat, "DUNE_SYS_FSTAT"},
	[DUNE_SYS_LSTAT] = {NULL, "DUNE_SYS_LSTAT"},
	[DUNE_SYS_POLL] = {NULL, "DUNE_SYS_POLL"},
	[DUNE_SYS_LSEEK] = {NULL, "DUNE_SYS_LSEEK"},
	[DUNE_SYS_MMAP] = {NULL, "DUNE_SYS_MMAP"},
	[DUNE_SYS_MPROTECT] = {NULL, "DUNE_SYS_MPROTECT"},
	[DUNE_SYS_MUNMAP] = {dune_sys_munmap, "DUNE_SYS_MUNMAP"},
	[DUNE_SYS_BRK] = {NULL, "DUNE_SYS_BRK"},
	[DUNE_SYS_RT_SIGACTION] = {dune_sys_rt_sigaction, "DUNE_SYS_RT_SIGACTION"},
	[DUNE_SYS_RT_SIGPROCMASK] = {dune_sys_rt_sigprocmask,
	                             "DUNE_SYS_RT_SIGPROCMASK"},
	[DUNE_SYS_RT_SIGRETURN] = {NULL, "DUNE_SYS_RT_SIGRETURN"},
	[DUNE_SYS_IOCTL] = {NULL, "DUNE_SYS_IOCTL"},
	[DUNE_SYS_PREAD64] = {dune_sys_pread64, "DUNE_SYS_PREAD64"},
	[DUNE_SYS_PWRITE64] = {dune_sys_pwrite64, "DUNE_SYS_PWRITE64"},
	[DUNE_SYS_READV] = {NULL, "DUNE_SYS_READV"},
	[DUNE_SYS_WRITEV] = {NULL, "DUNE_SYS_WRITEV"},
	[DUNE_SYS_ACCESS] = {NULL, "DUNE_SYS_ACCESS"},
	[DUNE_SYS_PIPE] = {NULL, "DUNE_SYS_PIPE"},
	[DUNE_SYS_SELECT] = {NULL, "DUNE_SYS_SELECT"},
	[DUNE_SYS_SCHED_YIELD] = {dune_sys_sched_yield, "DUNE_SYS_SCHED_YIELD"},
	[DUNE_SYS_MREMAP] = {NULL, "DUNE_SYS_MREMAP"},
	[DUNE_SYS_MSYNC] = {NULL, "DUNE_SYS_MSYNC"},
	[DUNE_SYS_MINCORE] = {dune_sys_mincore, "DUNE_SYS_MINCORE"},
	[DUNE_SYS_MADVISE] = {NULL, "DUNE_SYS_MADVISE"},
	[DUNE_SYS_SHMGET] = {NULL, "DUNE_SYS_SHMGET"},
	[DUNE_SYS_SHMAT] = {NULL, "DUNE_SYS_SHMAT"},
	[DUNE_SYS_SHMCTL] = {NULL, "DUNE_SYS_SHMCTL"},
	[DUNE_SYS_DUP] = {dune_sys_dup, "DUNE_SYS_DUP"},
	[DUNE_SYS_DUP2] = {dune_sys_dup2, "DUNE_SYS_DUP2"},
	[DUNE_SYS_PAUSE] = {NULL, "DUNE_SYS_PAUSE"},
	[DUNE_SYS_NANOSLEEP] = {NULL, "DUNE_SYS_NANOSLEEP"},
	[DUNE_SYS_GETITIMER] = {NULL, "DUNE_SYS_GETITIMER"},
	[DUNE_SYS_ALARM] = {NULL, "DUNE_SYS_ALARM"},
	[DUNE_SYS_SETITIMER] = {NULL, "DUNE_SYS_SETITIMER"},
	[DUNE_SYS_GETPID] = {dune_sys_getpid, "DUNE_SYS_GETPID"},
	[DUNE_SYS_SENDFILE] = {NULL, "DUNE_SYS_SENDFILE"},
	[DUNE_SYS_SOCKET] = {NULL, "DUNE_SYS_SOCKET"},
	[DUNE_SYS_CONNECT] = {NULL, "DUNE_SYS_CONNECT"},
	[DUNE_SYS_ACCEPT] = {NULL, "DUNE_SYS_ACCEPT"},
	[DUNE_SYS_SENDTO] = {NULL, "DUNE_SYS_SENDTO"},
	[DUNE_SYS_RECVFROM] = {NULL, "DUNE_SYS_RECVFROM"},
	[DUNE_SYS_SENDMSG] = {NULL, "DUNE_SYS_SENDMSG"},
	[DUNE_SYS_RECVMSG] = {NULL, "DUNE_SYS_RECVMSG"},
	[DUNE_SYS_SHUTDOWN] = {NULL, "DUNE_SYS_SHUTDOWN"},
	[DUNE_SYS_BIND] = {NULL, "DUNE_SYS_BIND"},
	[DUNE_SYS_LISTEN] = {NULL, "DUNE_SYS_LISTEN"},
	[DUNE_SYS_GETSOCKNAME] = {NULL, "DUNE_SYS_GETSOCKNAME"},
	[DUNE_SYS_GETPEERNAME] = {NULL, "DUNE_SYS_GETPEERNAME"},
	[DUNE_SYS_SOCKETPAIR] = {NULL, "DUNE_SYS_SOCKETPAIR"},
	[DUNE_SYS_SETSOCKOPT] = {NULL, "DUNE_SYS_SETSOCKOPT"},
	[DUNE_SYS_GETSOCKOPT] = {NULL, "DUNE_SYS_GETSOCKOPT"},
	[DUNE_SYS_CLONE] = {NULL, "DUNE_SYS_CLONE"},
	[DUNE_SYS_FORK] = {NULL, "DUNE_SYS_FORK"},
	[DUNE_SYS_VFORK] = {NULL, "DUNE_SYS_VFORK"},
	[DUNE_SYS_EXECVE] = {NULL, "DUNE_SYS_EXECVE"},
	[DUNE_SYS_EXIT] = {NULL, "DUNE_SYS_EXIT"},
	[DUNE_SYS_WAIT4] = {NULL, "DUNE_SYS_WAIT4"},
	[DUNE_SYS_KILL] = {NULL, "DUNE_SYS_KILL"},
	[DUNE_SYS_UNAME] = {NULL, "DUNE_SYS_UNAME"},
	[DUNE_SYS_SEMGET] = {NULL, "DUNE_SYS_SEMGET"},
	[DUNE_SYS_SEMOP] = {NULL, "DUNE_SYS_SEMOP"},
	[DUNE_SYS_SEMCTL] = {NULL, "DUNE_SYS_SEMCTL"},
	[DUNE_SYS_SHMDT] = {NULL, "DUNE_SYS_SHMDT"},
	[DUNE_SYS_MSGGET] = {NULL, "DUNE_SYS_MSGGET"},
	[DUNE_SYS_MSGSND] = {NULL, "DUNE_SYS_MSGSND"},
	[DUNE_SYS_MSGRCV] = {NULL, "DUNE_SYS_MSGRCV"},
	[DUNE_SYS_MSGCTL] = {NULL, "DUNE_SYS_MSGCTL"},
	[DUNE_SYS_FCNTL] = {dune_sys_fcntl, "DUNE_SYS_FCNTL"},
	[DUNE_SYS_FLOCK] = {NULL, "DUNE_SYS_FLOCK"},
	[DUNE_SYS_FSYNC] = {NULL, "DUNE_SYS_FSYNC"},
	[DUNE_SYS_FDATASYNC] = {NULL, "DUNE_SYS_FDATASYNC"},
	[DUNE_SYS_TRUNCATE] = {NULL, "DUNE_SYS_TRUNCATE"},
	[DUNE_SYS_FTRUNCATE] = {dune_sys_ftruncate, "DUNE_SYS_FTRUNCATE"},
	[DUNE_SYS_GETDENTS] = {NULL, "DUNE_SYS_GETDENTS"},
	[DUNE_SYS_GETCWD] = {NULL, "DUNE_SYS_GETCWD"},
	[DUNE_SYS_CHDIR] = {NULL, "DUNE_SYS_CHDIR"},
	[DUNE_SYS_FCHDIR] = {NULL, "DUNE_SYS_FCHDIR"},
	[DUNE_SYS_RENAME] = {NULL, "DUNE_SYS_RENAME"},
	[DUNE_SYS_MKDIR] = {NULL, "DUNE_SYS_MKDIR"},
	[DUNE_SYS_RMDIR] = {NULL, "DUNE_SYS_RMDIR"},
	[DUNE_SYS_CREAT] = {NULL, "DUNE_SYS_CREAT"},
	[DUNE_SYS_LINK] = {NULL, "DUNE_SYS_LINK"},
	[DUNE_SYS_UNLINK] = {NULL, "DUNE_SYS_UNLINK"},
	[DUNE_SYS_SYMLINK] = {NULL, "DUNE_SYS_SYMLINK"},
	[DUNE_SYS_READLINK] = {NULL, "DUNE_SYS_READLINK"},
	[DUNE_SYS_CHMOD] = {NULL, "DUNE_SYS_CHMOD"},
	[DUNE_SYS_FCHMOD] = {NULL, "DUNE_SYS_FCHMOD"},
	[DUNE_SYS_CHOWN] = {NULL, "DUNE_SYS_CHOWN"},
	[DUNE_SYS_FCHOWN] = {NULL, "DUNE_SYS_FCHOWN"},
	[DUNE_SYS_LCHOWN] = {NULL, "DUNE_SYS_LCHOWN"},
	[DUNE_SYS_UMASK] = {dune_sys_umask, "DUNE_SYS_UMASK"},
	[DUNE_SYS_GETTIMEOFDAY] = {dune_sys_gettimeofday, "DUNE_SYS_GETTIMEOFDAY"},
	[DUNE_SYS_GETRLIMIT] = {NULL, "DUNE_SYS_GETRLIMIT"},
	[DUNE_SYS_GETRUSAGE] = {NULL, "DUNE_SYS_GETRUSAGE"},
	[DUNE_SYS_SYSINFO] = {NULL, "DUNE_SYS_SYSINFO"},
	[DUNE_SYS_TIMES] = {NULL, "DUNE_SYS_TIMES"},
	[DUNE_SYS_PTRACE] = {NULL, "DUNE_SYS_PTRACE"},
	[DUNE_SYS_GETUID] = {dune_sys_getuid, "DUNE_SYS_GETUID"},
	[DUNE_SYS_SYSLOG] = {NULL, "DUNE_SYS_SYSLOG"},
	[DUNE_SYS_GETGID] = {dune_sys_getgid, "DUNE_SYS_GETGID"},
	[DUNE_SYS_SETUID] = {NULL, "DUNE_SYS_SETUID"},
	[DUNE_SYS_SETGID] = {NULL, "DUNE_SYS_SETGID"},
	[DUNE_SYS_GETEUID] = {dune_sys_geteuid, "DUNE_SYS_GETEUID"},
	[DUNE_SYS_GETEGID] = {dune_sys_getegid, "DUNE_SYS_GETEGID"},
	[DUNE_SYS_SETPGID] = {NULL, "DUNE_SYS_SETPGID"},
	[DUNE_SYS_GETPPID] = {NULL, "DUNE_SYS_GETPPID"},
	[DUNE_SYS_GETPGRP] = {NULL, "DUNE_SYS_GETPGRP"},
	[DUNE_SYS_SETSID] = {NULL, "DUNE_SYS_SETSID"},
	[DUNE_SYS_SETREUID] = {NULL, "DUNE_SYS_SETREUID"},
	[DUNE_SYS_SETREGID] = {NULL, "DUNE_SYS_SETREGID"},
	[DUNE_SYS_GETGROUPS] = {dune_sys_getgroups, "DUNE_SYS_GETGROUPS"},
	[DUNE_SYS_SETGROUPS] = {NULL, "DUNE_SYS_SETGROUPS"},
	[DUNE_SYS_SETRESUID] = {NULL, "DUNE_SYS_SETRESUID"},
	[DUNE_SYS_GETRESUID] = {NULL, "DUNE_SYS_GETRESUID"},
	[DUNE_SYS_SETRESGID] = {NULL, "DUNE_SYS_SETRESGID"},
	[DUNE_SYS_GETRESGID] = {NULL, "DUNE_SYS_GETRESGID"},
	[DUNE_SYS_GETPGID] = {NULL, "DUNE_SYS_GETPGID"},
	[DUNE_SYS_SETFSUID] = {NULL, "DUNE_SYS_SETFSUID"},
	[DUNE_SYS_SETFSGID] = {NULL, "DUNE_SYS_SETFSGID"},
	[DUNE_SYS_GETSID] = {NULL, "DUNE_SYS_GETSID"},
	[DUNE_SYS_CAPGET] = {NULL, "DUNE_SYS_CAPGET"},
	[DUNE_SYS_CAPSET] = {NULL, "DUNE_SYS_CAPSET"},
	[DUNE_SYS_RT_SIGPENDING] = {NULL, "DUNE_SYS_RT_SIGPENDING"},
	[DUNE_SYS_RT_SIGTIMEDWAIT] = {NULL, "DUNE_SYS_RT_SIGTIMEDWAIT"},
	[DUNE_SYS_RT_SIGQUEUEINFO] = {NULL, "DUNE_SYS_RT_SIGQUEUEINFO"},
	[DUNE_SYS_RT_SIGSUSPEND] = {NULL, "DUNE_SYS_RT_SIGSUSPEND"},
	[DUNE_SYS_SIGALTSTACK] = {dune_sys_sigaltstack, "DUNE_SYS_SIGALTSTACK"},
	[DUNE_SYS_UTIME] = {NULL, "DUNE_SYS_UTIME"},
	[DUNE_SYS_MKNOD] = {NULL, "DUNE_SYS_MKNOD"},
	[DUNE_SYS_USELIB] = {NULL, "DUNE_SYS_USELIB"},
	[DUNE_SYS_PERSONALITY] = {NULL, "DUNE_SYS_PERSONALITY"},
	[DUNE_SYS_USTAT] = {NULL, "DUNE_SYS_USTAT"},
	[DUNE_SYS_STATFS] = {NULL, "DUNE_SYS_STATFS"},
	[DUNE_SYS_FSTATFS] = {dune_sys_fstatfs, "DUNE_SYS_FSTATFS"},
	[DUNE_SYS_SYSFS] = {NULL, "DUNE_SYS_SYSFS"},
	[DUNE_SYS_GETPRIORITY] = {NULL, "DUNE_SYS_GETPRIORITY"},
	[DUNE_SYS_SETPRIORITY] = {NULL, "DUNE_SYS_SETPRIORITY"},
	[DUNE_SYS_SCHED_SETPARAM] = {NULL, "DUNE_SYS_SCHED_SETPARAM"},
	[DUNE_SYS_SCHED_GETPARAM] = {NULL, "DUNE_SYS_SCHED_GETPARAM"},
	[DUNE_SYS_SCHED_SETSCHEDULER] = {NULL, "DUNE_SYS_SCHED_SETSCHEDULER"},
	[DUNE_SYS_SCHED_GETSCHEDULER] = {NULL, "DUNE_SYS_SCHED_GETSCHEDULER"},
	[DUNE_SYS_SCHED_GET_PRIORITY_MAX] = {NULL,
	                                    "DUNE_SYS_SCHED_GET_PRIORITY_MAX"},
	[DUNE_SYS_SCHED_GET_PRIORITY_MIN] = {NULL,
	                                    "DUNE_SYS_SCHED_GET_PRIORITY_MIN"},
	[DUNE_SYS_SCHED_RR_GET_INTERVAL] = {NULL, "DUNE_SYS_SCHED_RR_GET_INTERVAL"},
	[DUNE_SYS_MLOCK] = {NULL, "DUNE_SYS_MLOCK"},
	[DUNE_SYS_MUNLOCK] = {NULL, "DUNE_SYS_MUNLOCK"},
	[DUNE_SYS_MLOCKALL] = {NULL, "DUNE_SYS_MLOCKALL"},
	[DUNE_SYS_MUNLOCKALL] = {NULL, "DUNE_SYS_MUNLOCKALL"},
	[DUNE_SYS_VHANGUP] = {NULL, "DUNE_SYS_VHANGUP"},
	[DUNE_SYS_MODIFY_LDT] = {NULL, "DUNE_SYS_MODIFY_LDT"},
	[DUNE_SYS_PIVOT_ROOT] = {NULL, "DUNE_SYS_PIVOT_ROOT"},
	[DUNE_SYS__SYSCTL] = {NULL, "DUNE_SYS__SYSCTL"},
	[DUNE_SYS_PRCTL] = {NULL, "DUNE_SYS_PRCTL"},
	[DUNE_SYS_ARCH_PRCTL] = {NULL, "DUNE_SYS_ARCH_PRCTL"},
	[DUNE_SYS_ADJTIMEX] = {NULL, "DUNE_SYS_ADJTIMEX"},
	[DUNE_SYS_SETRLIMIT] = {NULL, "DUNE_SYS_SETRLIMIT"},
	[DUNE_SYS_CHROOT] = {NULL, "DUNE_SYS_CHROOT"},
	[DUNE_SYS_SYNC] = {NULL, "DUNE_SYS_SYNC"},
	[DUNE_SYS_ACCT] = {NULL, "DUNE_SYS_ACCT"},
	[DUNE_SYS_SETTIMEOFDAY] = {NULL, "DUNE_SYS_SETTIMEOFDAY"},
	[DUNE_SYS_MOUNT] = {NULL, "DUNE_SYS_MOUNT"},
	[DUNE_SYS_UMOUNT2] = {NULL, "DUNE_SYS_UMOUNT2"},
	[DUNE_SYS_SWAPON] = {NULL, "DUNE_SYS_SWAPON"},
	[DUNE_SYS_SWAPOFF] = {NULL, "DUNE_SYS_SWAPOFF"},
	[DUNE_SYS_REBOOT] = {NULL, "DUNE_SYS_REBOOT"},
	[DUNE_SYS_SETHOSTNAME] = {NULL, "DUNE_SYS_SETHOSTNAME"},
	[DUNE_SYS_SETDOMAINNAME] = {NULL, "DUNE_SYS_SETDOMAINNAME"},
	[DUNE_SYS_IOPL] = {NULL, "DUNE_SYS_IOPL"},
	[DUNE_SYS_IOPERM] = {NULL, "DUNE_SYS_IOPERM"},
	[DUNE_SYS_CREATE_MODULE] = {NULL, "DUNE_SYS_CREATE_MODULE"},
	[DUNE_SYS_INIT_MODULE] = {NULL, "DUNE_SYS_INIT_MODULE"},
	[DUNE_SYS_DELETE_MODULE] = {NULL, "DUNE_SYS_DELETE_MODULE"},
	[DUNE_SYS_GET_KERNEL_SYMS] = {NULL, "DUNE_SYS_GET_KERNEL_SYMS"},
	[DUNE_SYS_QUERY_MODULE] = {NULL, "DUNE_SYS_QUERY_MODULE"},
	[DUNE_SYS_QUOTACTL] = {NULL, "DUNE_SYS_QUOTACTL"},
	[DUNE_SYS_NFSSERVCTL] = {NULL, "DUNE_SYS_NFSSERVCTL"},
	[DUNE_SYS_GETPMSG] = {NULL, "DUNE_SYS_GETPMSG"},
	[DUNE_SYS_PUTPMSG] = {NULL, "DUNE_SYS_PUTPMSG"},
	[DUNE_SYS_AFS_SYSCALL] = {NULL, "DUNE_SYS_AFS_SYSCALL"},
	[DUNE_SYS_TUXCALL] = {NULL, "DUNE_SYS_TUXCALL"},
	[DUNE_SYS_SECURITY] = {NULL, "DUNE_SYS_SECURITY"},
	[DUNE_SYS_GETTID] = {dune_sys_gettid, "DUNE_SYS_GETTID"},
	[DUNE_SYS_READAHEAD] = {NULL, "DUNE_SYS_READAHEAD"},
	[DUNE_SYS_SETXATTR] = {NULL, "DUNE_SYS_SETXATTR"},
	[DUNE_SYS_LSETXATTR] = {NULL, "DUNE_SYS_LSETXATTR"},
	[DUNE_SYS_FSETXATTR] = {NULL, "DUNE_SYS_FSETXATTR"},
	[DUNE_SYS_GETXATTR] = {NULL, "DUNE_SYS_GETXATTR"},
	[DUNE_SYS_LGETXATTR] = {NULL, "DUNE_SYS_LGETXATTR"},
	[DUNE_SYS_FGETXATTR] = {NULL, "DUNE_SYS_FGETXATTR"},
	[DUNE_SYS_LISTXATTR] = {NULL, "DUNE_SYS_LISTXATTR"},
	[DUNE_SYS_LLISTXATTR] = {NULL, "DUNE_SYS_LLISTXATTR"},
	[DUNE_SYS_FLISTXATTR] = {NULL, "DUNE_SYS_FLISTXATTR"},
	[DUNE_SYS_REMOVEXATTR] = {NULL, "DUNE_SYS_REMOVEXATTR"},
	[DUNE_SYS_LREMOVEXATTR] = {NULL, "DUNE_SYS_LREMOVEXATTR"},
	[DUNE_SYS_FREMOVEXATTR] = {NULL, "DUNE_SYS_FREMOVEXATTR"},
	[DUNE_SYS_TKILL] = {NULL, "DUNE_SYS_TKILL"},
	[DUNE_SYS_TIME] = {NULL, "DUNE_SYS_TIME"},
	[DUNE_SYS_FUTEX] = {dune_sys_futex, "DUNE_SYS_FUTEX"},
	[DUNE_SYS_SCHED_SETAFFINITY] = {NULL, "DUNE_SYS_SCHED_SETAFFINITY"},
	[DUNE_SYS_SCHED_GETAFFINITY] = {dune_sys_sched_getaffinity,
	                                "DUNE_SYS_SCHED_GETAFFINITY"},
	[DUNE_SYS_SET_THREAD_AREA] = {NULL, "DUNE_SYS_SET_THREAD_AREA"},
	[DUNE_SYS_IO_SETUP] = {NULL, "DUNE_SYS_IO_SETUP"},
	[DUNE_SYS_IO_DESTROY] = {NULL, "DUNE_SYS_IO_DESTROY"},
	[DUNE_SYS_IO_GETEVENTS] = {NULL, "DUNE_SYS_IO_GETEVENTS"},
	[DUNE_SYS_IO_SUBMIT] = {NULL, "DUNE_SYS_IO_SUBMIT"},
	[DUNE_SYS_IO_CANCEL] = {NULL, "DUNE_SYS_IO_CANCEL"},
	[DUNE_SYS_GET_THREAD_AREA] = {NULL, "DUNE_SYS_GET_THREAD_AREA"},
	[DUNE_SYS_LOOKUP_DCOOKIE] = {NULL, "DUNE_SYS_LOOKUP_DCOOKIE"},
	[DUNE_SYS_EPOLL_CREATE] = {NULL, "DUNE_SYS_EPOLL_CREATE"},
	[DUNE_SYS_EPOLL_CTL_OLD] = {NULL, "DUNE_SYS_EPOLL_CTL_OLD"},
	[DUNE_SYS_EPOLL_WAIT_OLD] = {NULL, "DUNE_SYS_EPOLL_WAIT_OLD"},
	[DUNE_SYS_REMAP_FILE_PAGES] = {NULL, "DUNE_SYS_REMAP_FILE_PAGES"},
	[DUNE_SYS_GETDENTS64] = {NULL, "DUNE_SYS_GETDENTS64"},
	[DUNE_SYS_SET_TID_ADDRESS] = {NULL, "DUNE_SYS_SET_TID_ADDRESS"},
	[DUNE_SYS_RESTART_SYSCALL] = {NULL, "DUNE_SYS_RESTART_SYSCALL"},
	[DUNE_SYS_SEMTIMEDOP] = {NULL, "DUNE_SYS_SEMTIMEDOP"},
	[DUNE_SYS_FADVISE64] = {NULL, "DUNE_SYS_FADVISE64"},
	[DUNE_SYS_TIMER_CREATE] = {NULL, "DUNE_SYS_TIMER_CREATE"},
	[DUNE_SYS_TIMER_SETTIME] = {NULL, "DUNE_SYS_TIMER_SETTIME"},
	[DUNE_SYS_TIMER_GETTIME] = {NULL, "DUNE_SYS_TIMER_GETTIME"},
	[DUNE_SYS_TIMER_GETOVERRUN] = {NULL, "DUNE_SYS_TIMER_GETOVERRUN"},
	[DUNE_SYS_TIMER_DELETE] = {NULL, "DUNE_SYS_TIMER_DELETE"},
	[DUNE_SYS_CLOCK_SETTIME] = {NULL, "DUNE_SYS_CLOCK_SETTIME"},
	[DUNE_SYS_CLOCK_GETTIME] = {dune_sys_clock_gettime,
	                            "DUNE_SYS_CLOCK_GETTIME"},
	[DUNE_SYS_CLOCK_GETRES] = {NULL, "DUNE_SYS_CLOCK_GETRES"},
	[DUNE_SYS_CLOCK_NANOSLEEP] = {NULL, "DUNE_SYS_CLOCK_NANOSLEEP"},
	[DUNE_SYS_EXIT_GROUP] = {NULL, "DUNE_SYS_EXIT_GROUP"},
	[DUNE_SYS_EPOLL_WAIT] = {dune_sys_epoll_wait, "DUNE_SYS_EPOLL_WAIT"},
	[DUNE_SYS_EPOLL_CTL] = {dune_sys_epoll_ctl, "DUNE_SYS_EPOLL_CTL"},
	[DUNE_SYS_TGKILL] = {NULL, "DUNE_SYS_TGKILL"},
	[DUNE_SYS_UTIMES] = {NULL, "DUNE_SYS_UTIMES"},
	[DUNE_SYS_VSERVER] = {NULL, "DUNE_SYS_VSERVER"},
	[DUNE_SYS_MBIND] = {NULL, "DUNE_SYS_MBIND"},
	[DUNE_SYS_SET_MEMPOLICY] = {NULL, "DUNE_SYS_SET_MEMPOLICY"},
	[DUNE_SYS_GET_MEMPOLICY] = {NULL, "DUNE_SYS_GET_MEMPOLICY"},
	[DUNE_SYS_MQ_OPEN] = {NULL, "DUNE_SYS_MQ_OPEN"},
	[DUNE_SYS_MQ_UNLINK] = {NULL, "DUNE_SYS_MQ_UNLINK"},
	[DUNE_SYS_MQ_TIMEDSEND] = {NULL, "DUNE_SYS_MQ_TIMEDSEND"},
	[DUNE_SYS_MQ_TIMEDRECEIVE] = {NULL, "DUNE_SYS_MQ_TIMEDRECEIVE"},
	[DUNE_SYS_MQ_NOTIFY] = {NULL, "DUNE_SYS_MQ_NOTIFY"},
	[DUNE_SYS_MQ_GETSETATTR] = {NULL, "DUNE_SYS_MQ_GETSETATTR"},
	[DUNE_SYS_KEXEC_LOAD] = {NULL, "DUNE_SYS_KEXEC_LOAD"},
	[DUNE_SYS_WAITID] = {NULL, "DUNE_SYS_WAITID"},
	[DUNE_SYS_ADD_KEY] = {NULL, "DUNE_SYS_ADD_KEY"},
	[DUNE_SYS_REQUEST_KEY] = {NULL, "DUNE_SYS_REQUEST_KEY"},
	[DUNE_SYS_KEYCTL] = {NULL, "DUNE_SYS_KEYCTL"},
	[DUNE_SYS_IOPRIO_SET] = {NULL, "DUNE_SYS_IOPRIO_SET"},
	[DUNE_SYS_IOPRIO_GET] = {NULL, "DUNE_SYS_IOPRIO_GET"},
	[DUNE_SYS_INOTIFY_INIT] = {NULL, "DUNE_SYS_INOTIFY_INIT"},
	[DUNE_SYS_INOTIFY_ADD_WATCH] = {NULL, "DUNE_SYS_INOTIFY_ADD_WATCH"},
	[DUNE_SYS_INOTIFY_RM_WATCH] = {NULL, "DUNE_SYS_INOTIFY_RM_WATCH"},
	[DUNE_SYS_MIGRATE_PAGES] = {NULL, "DUNE_SYS_MIGRATE_PAGES"},
	[DUNE_SYS_OPENAT] = {dune_sys_openat, "DUNE_SYS_OPENAT"},
	[DUNE_SYS_MKDIRAT] = {NULL, "DUNE_SYS_MKDIRAT"},
	[DUNE_SYS_MKNODAT] = {NULL, "DUNE_SYS_MKNODAT"},
	[DUNE_SYS_FCHOWNAT] = {NULL, "DUNE_SYS_FCHOWNAT"},
	[DUNE_SYS_FUTIMESAT] = {NULL, "DUNE_SYS_FUTIMESAT"},
	[DUNE_SYS_NEWFSTATAT] = {NULL, "DUNE_SYS_NEWFSTATAT"},
	[DUNE_SYS_UNLINKAT] = {dune_sys_unlinkat, "DUNE_SYS_UNLINKAT"},
	[DUNE_SYS_RENAMEAT] = {NULL, "DUNE_SYS_RENAMEAT"},
	[DUNE_SYS_LINKAT] = {NULL, "DUNE_SYS_LINKAT"},
	[DUNE_SYS_SYMLINKAT] = {NULL, "DUNE_SYS_SYMLINKAT"},
	[DUNE_SYS_READLINKAT] = {dune_sys_readlinkat, "DUNE_SYS_READLINKAT"},
	[DUNE_SYS_FCHMODAT] = {NULL, "DUNE_SYS_FCHMODAT"},
	[DUNE_SYS_FACCESSAT] = {NULL, "DUNE_SYS_FACCESSAT"},
	[DUNE_SYS_PSELECT6] = {dune_sys_pselect6, "DUNE_SYS_PSELECT6"},
	[DUNE_SYS_PPOLL] = {NULL, "DUNE_SYS_PPOLL"},
	[DUNE_SYS_UNSHARE] = {NULL, "DUNE_SYS_UNSHARE"},
	[DUNE_SYS_SET_ROBUST_LIST] = {NULL, "DUNE_SYS_SET_ROBUST_LIST"},
	[DUNE_SYS_GET_ROBUST_LIST] = {NULL, "DUNE_SYS_GET_ROBUST_LIST"},
	[DUNE_SYS_SPLICE] = {NULL, "DUNE_SYS_SPLICE"},
	[DUNE_SYS_TEE] = {NULL, "DUNE_SYS_TEE"},
	[DUNE_SYS_SYNC_FILE_RANGE] = {NULL, "DUNE_SYS_SYNC_FILE_RANGE"},
	[DUNE_SYS_VMSPLICE] = {NULL, "DUNE_SYS_VMSPLICE"},
	[DUNE_SYS_MOVE_PAGES] = {NULL, "DUNE_SYS_MOVE_PAGES"},
	[DUNE_SYS_UTIMENSAT] = {NULL, "DUNE_SYS_UTIMENSAT"},
	[DUNE_SYS_EPOLL_PWAIT] = {NULL, "DUNE_SYS_EPOLL_PWAIT"},
	[DUNE_SYS_SIGNALFD] = {NULL, "DUNE_SYS_SIGNALFD"},
	[DUNE_SYS_TIMERFD_CREATE] = {NULL, "DUNE_SYS_TIMERFD_CREATE"},
	[DUNE_SYS_EVENTFD] = {NULL, "DUNE_SYS_EVENTFD"},
	[DUNE_SYS_FALLOCATE] = {dune_sys_fallocate, "DUNE_SYS_FALLOCATE"},
	[DUNE_SYS_TIMERFD_SETTIME] = {NULL, "DUNE_SYS_TIMERFD_SETTIME"},
	[DUNE_SYS_TIMERFD_GETTIME] = {NULL, "DUNE_SYS_TIMERFD_GETTIME"},
	[DUNE_SYS_ACCEPT4] = {NULL, "DUNE_SYS_ACCEPT4"},
	[DUNE_SYS_SIGNALFD4] = {NULL, "DUNE_SYS_SIGNALFD4"},
	[DUNE_SYS_EVENTFD2] = {NULL, "DUNE_SYS_EVENTFD2"},
	[DUNE_SYS_EPOLL_CREATE1] = {dune_sys_epoll_create1,
	                            "DUNE_SYS_EPOLL_CREATE1"},
	[DUNE_SYS_DUP3] = {NULL, "DUNE_SYS_DUP3"},
	[DUNE_SYS_PIPE2] = {NULL, "DUNE_SYS_PIPE2"},
	[DUNE_SYS_INOTIFY_INIT1] = {NULL, "DUNE_SYS_INOTIFY_INIT1"},
	[DUNE_SYS_PREADV] = {NULL, "DUNE_SYS_PREADV"},
	[DUNE_SYS_PWRITEV] = {NULL, "DUNE_SYS_PWRITEV"},
	[DUNE_SYS_RT_TGSIGQUEUEINFO] = {NULL, "DUNE_SYS_RT_TGSIGQUEUEINFO"},
	[DUNE_SYS_PERF_EVENT_OPEN] = {NULL, "DUNE_SYS_PERF_EVENT_OPEN"},
	[DUNE_SYS_RECVMMSG] = {NULL, "DUNE_SYS_RECVMMSG"},
	[DUNE_SYS_FANOTIFY_INIT] = {NULL, "DUNE_SYS_FANOTIFY_INIT"},
	[DUNE_SYS_FANOTIFY_MARK] = {NULL, "DUNE_SYS_FANOTIFY_MARK"},
	[DUNE_SYS_PRLIMIT64] = {NULL, "DUNE_SYS_PRLIMIT64"},
	[DUNE_SYS_NAME_TO_HANDLE_AT] = {NULL, "DUNE_SYS_NAME_TO_HANDLE_AT"},
	[DUNE_SYS_OPEN_BY_HANDLE_AT] = {NULL, "DUNE_SYS_OPEN_BY_HANDLE_AT"},
	[DUNE_SYS_CLOCK_ADJTIME] = {NULL, "DUNE_SYS_CLOCK_ADJTIME"},
	[DUNE_SYS_SYNCFS] = {NULL, "DUNE_SYS_SYNCFS"},
	[DUNE_SYS_SENDMMSG] = {NULL, "DUNE_SYS_SENDMMSG"},
	[DUNE_SYS_SETNS] = {NULL, "DUNE_SYS_SETNS"},
	[DUNE_SYS_GETCPU] = {NULL, "DUNE_SYS_GETCPU"},
	[DUNE_SYS_PROCESS_VM_READV] = {NULL, "DUNE_SYS_PROCESS_VM_READV"},
	[DUNE_SYS_PROCESS_VM_WRITEV] = {NULL, "DUNE_SYS_PROCESS_VM_WRITEV"},
	[DUNE_SYS_KCMP] = {NULL, "DUNE_KCMP"},
	[DUNE_SYS_FINIT_MODULE] = {NULL, "DUNE_SYS_FINIT_MODULE"},
	[DUNE_SYS_SCHED_SETATTR] = {NULL, "DUNE_SYS_SCHED_SETATTR"},
	[DUNE_SYS_SCHED_GETATTR] = {NULL, "DUNE_SYS_SCHED_GETATTR"},
	[DUNE_SYS_RENAMEAT2] = {NULL, "DUNE_SYS_RENAMEAT2"},
	[DUNE_SYS_SECCOMP] = {NULL, "DUNE_SYS_SECCOMP"},
	[DUNE_SYS_GETRANDOM] = {dune_sys_getrandom, "DUNE_SYS_GETRANDOM"},
	[DUNE_SYS_MEMFD_CREATE] = {NULL, "DUNE_SYS_MEMFD_CREATE"},
	[DUNE_SYS_KEXEC_FILE_LOAD] = {NULL, "DUNE_SYS_KEXEC_FILE_LOAD"},
	[DUNE_SYS_BPF] = {NULL, "DUNE_SYS_BPF"},
	[DUNE_STUB_EXECVEAT] = {NULL, "DUNE_STUB_EXECVEAT"},
	[DUNE_USERFAULTFD] = {NULL, "DUNE_USERFAULTFD"},
	[DUNE_MEMBARRIER] = {NULL, "DUNE_MEMBARRIER"},
	[DUNE_MLOCK2] = {NULL, "DUNE_MLOCK2"},
	[DUNE_COPY_FILE_RANGE] = {NULL, "DUNE_COPY_FILE_RANGE"},
	[DUNE_PREADV2] = {NULL, "DUNE_PREADV2"},
	[DUNE_PWRITEV2] = {NULL, "DUNE_PWRITEV2"},

};

bool init_linuxemu(void)
{
	fd_table_lock = uth_mutex_alloc();
	int i;

	for (i = 0; i < DUNE_MAX_NUM_SYSCALLS ; ++i) {
		if (dune_syscall_table[i].name == NULL)
			dune_syscall_table[i].name = "nosyscall";
	}

	if (dlopen("liblinuxemu_extend.so", RTLD_NOW) == NULL) {
		fprintf(stderr,
			"Not using any syscall extensions\n Reason: %s\n",
		        dlerror());
		return false;
	}

	return true;
}

void lemuprint(const uint32_t tid, uint64_t syscall_number,
               const bool isError, const char *fmt, ...)
{
	va_list valist;
	const char *prefix = "[TID %d] %s: ";
	bool double_logging = false;

	// Do not use global variable as a check to acquire lock.
	// make sure it is not changed during our acquire/release.
	int debug = lemu_debug;

	// If we are not going to log anything anyway, just bail out.
	if (!(debug > 0 || isError))
		return;

	const char *syscall_name;

	if (syscall_number >= DUNE_MAX_NUM_SYSCALLS)
		panic("lemuprint: Illegal Syscall #%d!\n", syscall_number);
	else
		syscall_name = dune_syscall_table[syscall_number].name;

	va_start(valist, fmt);

	uth_mutex_lock(lemu_logging_lock);

	// Print to stderr if debug level is sufficient
	if (debug > 1) {
		fprintf(stderr, prefix, tid, syscall_name);
		vfprintf(stderr, fmt, valist);
		// Checks if we will double log to stderr
		if (lemu_global_logfile == stderr)
			double_logging = true;
	}

	// Log to the global logfile, if we defaulted the global logging to
	// stderr then we don't want to log 2 times to stderr.
	if (lemu_global_logfile != NULL && !double_logging) {
		fprintf(lemu_global_logfile, prefix, tid, syscall_name);
		vfprintf(lemu_global_logfile, fmt, valist);
	}

	uth_mutex_unlock(lemu_logging_lock);

	va_end(valist);
}


/* TODO: have an array which classifies syscall args
 * and "special" system calls (ones with weird return
 * values etc.). For some cases, we don't even do a system
 * call, and in many cases we have to rearrange arguments
 * since Linux and Akaros don't share signatures, so this
 * gets tricky. */
bool linuxemu(struct guest_thread *gth, struct vm_trapframe *tf)
{
	bool ret = false;

	if (tf->tf_rax >= DUNE_MAX_NUM_SYSCALLS) {
		fprintf(stderr, "System call %d is out of range\n", tf->tf_rax);
		return false;
	}


	if (dune_syscall_table[tf->tf_rax].call == NULL) {
		fprintf(stderr, "System call #%d (%s) is not implemented\n",
		        tf->tf_rax, dune_syscall_table[tf->tf_rax].name);
		return false;
	}

	lemuprint(tf->tf_guest_pcoreid, tf->tf_rax,
	          false, "vmcall(%d, %p, %p, %p, %p, %p, %p);\n", tf->tf_rax,
	          tf->tf_rdi, tf->tf_rsi, tf->tf_rdx, tf->tf_r10, tf->tf_r8,
	          tf->tf_r9);

	tf->tf_rip += 3;

	return (dune_syscall_table[tf->tf_rax].call)(tf);
}
