dune: working test with emulated syscalls
[akaros.git] / user / vmm / linuxemu.c
1 /* Copyright (c) 2016 Google Inc.
2  * See LICENSE for details.
3  *
4  * Linux emulation for virtual machines. */
5
6 #include <sys/stat.h>
7 #include <sys/types.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <fcntl.h>
12 #include <vmm/vmm.h>
13 #include <errno.h>
14 #include <sys/syscall.h>
15 #include <vmm/linux_syscalls.h>
16
17 /* TODO: have an array which classifies syscall args
18  * and "special" system calls (ones with weird return
19  * values etc.). For some cases, we don't even do a system
20  * call, and in many cases we have to rearrange arguments
21  * since Linux and Akaros don't share signatures, so this
22  * gets tricky. */
23 bool
24 linuxemu(struct guest_thread *gth, struct vm_trapframe *tf)
25 {
26         bool ret = false;
27
28         fprintf(stderr, "vmcall(%s(%d), %p, %p, %p, %p, %p, %p);\n",
29                 tf->tf_rax < 311 ? syscalls[tf->tf_rax] : "",
30                 tf->tf_rax, tf->tf_rdi, tf->tf_rsi, tf->tf_rdx,
31                 tf->tf_rcx, tf->tf_r8, tf->tf_r9);
32
33         tf->tf_rip += 3;
34         /* we don't do tic/tou checking here yet. */
35         switch (tf->tf_rax) {
36         default:
37                 /* TODO: just return the error to the guest once we are done
38                  * debugging this. */
39                 fprintf(stderr, "System call %d is not implemented\n", tf->tf_rax);
40                 //tf->tf_rax = -ENOSYS;
41                 break;
42         case DUNE_SYS_GETTIMEOFDAY:
43                 tf->tf_rax = 0;
44                 ret = true;
45                 break;
46         case DUNE_SYS_GETTID:
47                 tf->tf_rax = 1;
48                 ret = true;
49                 break;
50         case DUNE_SYS_WRITE:
51                 /* debug: write to stdout too for now. */
52                 write(2, (void *)tf->tf_rsi, (size_t)tf->tf_rdx);
53                 tf->tf_rax = write(tf->tf_rdi, (void *)tf->tf_rsi, (size_t)tf->tf_rdx);
54                 ret = true;
55                 break;
56         }
57         return ret;
58 }