dune: gettimeofday fix
[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 #include <sys/time.h>
17
18 /* TODO: have an array which classifies syscall args
19  * and "special" system calls (ones with weird return
20  * values etc.). For some cases, we don't even do a system
21  * call, and in many cases we have to rearrange arguments
22  * since Linux and Akaros don't share signatures, so this
23  * gets tricky. */
24 bool
25 linuxemu(struct guest_thread *gth, struct vm_trapframe *tf)
26 {
27         bool ret = false;
28
29         fprintf(stderr, "vmcall(%s(%d), %p, %p, %p, %p, %p, %p);\n",
30                 tf->tf_rax < 311 ? syscalls[tf->tf_rax] : "",
31                 tf->tf_rax, tf->tf_rdi, tf->tf_rsi, tf->tf_rdx,
32                 tf->tf_rcx, tf->tf_r8, tf->tf_r9);
33
34         tf->tf_rip += 3;
35         /* we don't do tic/tou checking here yet. */
36         switch (tf->tf_rax) {
37         default:
38                 /* TODO: just return the error to the guest once we are done
39                  * debugging this. */
40                 fprintf(stderr, "System call %d is not implemented\n", tf->tf_rax);
41                 //tf->tf_rax = -ENOSYS;
42                 break;
43         case DUNE_SYS_GETTIMEOFDAY:
44                 tf->tf_rax = gettimeofday((struct timeval*)tf->tf_rdi,
45                                           (struct timezone*)tf->tf_rsi);
46                 ret = true;
47                 break;
48         case DUNE_SYS_GETTID:
49                 tf->tf_rax = 1;
50                 ret = true;
51                 break;
52         case DUNE_SYS_WRITE:
53                 /* debug: write to stdout too for now. */
54                 write(2, (void *)tf->tf_rsi, (size_t)tf->tf_rdx);
55                 tf->tf_rax = write(tf->tf_rdi, (void *)tf->tf_rsi, (size_t)tf->tf_rdx);
56                 ret = true;
57                 break;
58         }
59         return ret;
60 }