Demo code to set up a VMMCP, including #c access
[akaros.git] / tests / vmmcp.c
1 #include <stdio.h> 
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <arch/arch.h>
6 #include <unistd.h>
7 #include <errno.h>
8 #include <dirent.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <ros/syscall.h>
12
13 unsigned long stack[1024];
14
15 static void fail(void)
16 {
17         __asm__ __volatile__("mov $0xdeadbeef, %rbx; mov 5, %rax\n");
18 }
19
20 unsigned long long *p512, *p1, *p2m;
21
22 int main(int argc, char **argv)
23 {
24         int fd = open("#c/sysctl", O_RDWR), ret;
25         static char cmd[512];
26         if (fd < 0) {
27                 perror("#c/sysctl");
28                 exit(1);
29         }
30         ret = syscall(33, 1);
31         if (ret < 0) {
32                 perror("vm setup");
33                 exit(1);
34         }
35         ret = posix_memalign((void **)&p512, 4096, 3*4096);
36         if (ret) {
37                 perror("ptp alloc");
38                 exit(1);
39         }
40         p1 = &p512[512];
41         p2m = &p512[1024];
42         p512[0] = (unsigned long long)p1 | 7;
43         p1[0] = /*0x87; */(unsigned long long)p2m | 7;
44         p2m[0] = 0x87;
45         p2m[1] = 0x200000 | 0x87;
46         p2m[2] = 0x400000 | 0x87;
47         p2m[3] = 0x600000 | 0x87;
48
49         printf("p512 %p p512[0] is 0x%lx p1 %p p1[0] is 0x%x\n", p512, p512[0], p1, p1[0]);
50         sprintf(cmd, "V 0x%x 0x%x 0x%x", (unsigned long long)fail, (unsigned long long) stack, (unsigned long long) p512);
51         printf("Writing command :%s:\n", cmd);
52         ret = write(fd, cmd, strlen(cmd));
53         if (ret != strlen(cmd)) {
54                 perror(cmd);
55         }
56         
57         return 0;
58 }