Move ros/vmx.h to an arch-specific location (XCC)
[akaros.git] / tests / vmm / vmresume.c
1 #include <stdio.h> 
2 #include <pthread.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <parlib/arch/arch.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <dirent.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <ros/syscall.h>
13 #include <sys/mman.h>
14
15 int *mmap_blob;
16 unsigned long long stack[1024];
17 volatile int shared = 0;
18 int mcp = 1;
19 #define V(x, t) (*((volatile t*)(x)))
20
21 static void *fail(void*arg)
22 {
23
24         *mmap_blob = 1337;
25         if (mcp)
26         while (V(&shared, int) < 31) {
27                 if (! (V(&shared, int) & 1))
28                         V(&shared, int) = V(&shared, int) + 1;
29 //      __asm__ __volatile__("vmcall\n");
30 //              cpu_relax();
31         }
32         V(&shared, int) = 55;
33
34         __asm__ __volatile__("vmcall\n");
35         __asm__ __volatile__("mov $0xdeadbeef, %rbx; mov 5, %rax\n");   
36 }
37
38 unsigned long long *p512, *p1, *p2m;
39
40 int main(int argc, char **argv)
41 {
42         int nr_gpcs = 1;
43         int fd = open("#cons/sysctl", O_RDWR), ret;
44         void * x;
45         static char cmd[512];
46         if (fd < 0) {
47                 perror("#cons/sysctl");
48                 exit(1);
49         }
50         if (ros_syscall(SYS_setup_vmm, nr_gpcs, 0, 0, 0, 0, 0) != nr_gpcs) {
51                 perror("Guest pcore setup failed");
52                 exit(1);
53         }
54         /* blob that is faulted in from the EPT first.  we need this to be in low
55          * memory (not above the normal mmap_break), so the EPT can look it up.
56          * Note that we won't get 4096.  The min is 1MB now, and ld is there. */
57         mmap_blob = mmap((int*)4096, PGSIZE, PROT_READ | PROT_WRITE,
58                          MAP_ANONYMOUS, -1, 0);
59         if (mmap_blob == MAP_FAILED) {
60                 perror("Unable to mmap");
61                 exit(1);
62         }
63
64         ret = syscall(33, 1);
65         if (ret < 0) {
66                 perror("vm setup");
67                 exit(1);
68         }
69         ret = posix_memalign((void **)&p512, 4096, 3*4096);
70         if (ret) {
71                 perror("ptp alloc");
72                 exit(1);
73         }
74         p1 = &p512[512];
75         p2m = &p512[1024];
76         p512[0] = (unsigned long long)p1 | 7;
77         p1[0] = /*0x87; */(unsigned long long)p2m | 7;
78         p2m[0] = 0x87;
79         p2m[1] = 0x200000 | 0x87;
80         p2m[2] = 0x400000 | 0x87;
81         p2m[3] = 0x600000 | 0x87;
82
83         printf("p512 %p p512[0] is 0x%lx p1 %p p1[0] is 0x%x\n", p512, p512[0], p1, p1[0]);
84         sprintf(cmd, "V 0x%x 0x%x 0x%x", (unsigned long long)fail, (unsigned long long) &stack[1024], (unsigned long long) p512);
85         printf("Writing command :%s:\n", cmd);
86         ret = write(fd, cmd, strlen(cmd));
87         if (ret != strlen(cmd)) {
88                 perror(cmd);
89         }
90         sprintf(cmd, "V 0 0 0");
91         while (V(&shared, int) < 31) {
92                 printf("RESUME?\n");
93                 if (V(&shared, int) & 1) {
94                         printf("shared %d\n", V(&shared, int) );
95                 }
96                 getchar();
97                 ret = write(fd, cmd, strlen(cmd));
98                 if (ret != strlen(cmd)) {
99                         perror(cmd);
100                 }
101                 if (V(&shared, int) & 1) {
102                         printf("shared %d\n", V(&shared, int) );
103                         V(&shared, int) = V(&shared, int) + 1;
104                 }
105         }
106         printf("shared is %d, blob is %d\n", shared, *mmap_blob);
107
108         return 0;
109 }