vmmcp: cut over to virtual apic; fix include mess after upgrade
[akaros.git] / tests / vmm / virtiopiocons.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 tr, rr, done;
18 volatile int state;
19 int debug;
20
21 static void *fail(void*arg)
22 {
23
24         while (1) {
25                 state = 0;
26                 if (rr & 0x80) {
27                         state++;
28                         if ((rr & 0x7f) == 'x')
29                                 break;
30                         tr = rr;
31                         state++;
32                         rr = 0;
33                         state++;
34                 }
35                         
36         }
37         tr = 0x80;
38         done = 1;
39         while (1);
40 }
41
42 unsigned long long *p512, *p1, *p2m;
43
44 void *talk_thread(void *arg)
45 {
46         printf("talk thread ..\n");
47         int c;
48         
49         // This is a a bit odd but getchar() is not echoing characters.
50         // That's good for us but makes no sense.
51         while (!done && (c = getchar())) {
52                 int i;
53                 if (debug) printf("Set rr to 0x%x\n", c | 0x80);
54                 rr = c | 0x80;
55                 if (debug) printf("rr 0x%x tr 0x%x\n", rr, tr);
56                 while (! tr)
57                         ;
58                 if (debug) printf("tr 0x%x\n", tr);
59                 putchar(tr & 0x7f);
60                 tr = 0;
61         }
62         rr = 0; 
63         return NULL;
64 }
65
66 pthread_t *my_threads;
67 void **my_retvals;
68 int nr_threads = 2;
69
70 int main(int argc, char **argv)
71 {
72         int nr_gpcs = 1;
73         int fd = open("#cons/sysctl", O_RDWR), ret;
74         void * x;
75         static char cmd[512];
76         if (fd < 0) {
77                 perror("#cons/sysctl");
78                 exit(1);
79         }
80         if (ros_syscall(SYS_setup_vmm, nr_gpcs, 0, 0, 0, 0, 0) != nr_gpcs) {
81                 perror("Guest pcore setup failed");
82                 exit(1);
83         }
84         /* blob that is faulted in from the EPT first.  we need this to be in low
85          * memory (not above the normal mmap_break), so the EPT can look it up.
86          * Note that we won't get 4096.  The min is 1MB now, and ld is there. */
87         mmap_blob = mmap((int*)4096, PGSIZE, PROT_READ | PROT_WRITE,
88                          MAP_ANONYMOUS, -1, 0);
89         if (mmap_blob == MAP_FAILED) {
90                 perror("Unable to mmap");
91                 exit(1);
92         }
93
94                 my_threads = malloc(sizeof(pthread_t) * nr_threads);
95                 my_retvals = malloc(sizeof(void*) * nr_threads);
96                 if (!(my_retvals && my_threads))
97                         perror("Init threads/malloc");
98
99                 pthread_can_vcore_request(FALSE);       /* 2LS won't manage vcores */
100                 pthread_need_tls(FALSE);
101                 pthread_mcp_init();                                     /* gives us one vcore */
102                 vcore_request(nr_threads - 1);          /* ghetto incremental interface */
103                 for (int i = 0; i < nr_threads; i++) {
104                         x = __procinfo.vcoremap;
105                         printf("%p\n", __procinfo.vcoremap);
106                         printf("Vcore %d mapped to pcore %d\n", i,
107                                 __procinfo.vcoremap[i].pcoreid);
108                 }
109                 if (pthread_create(&my_threads[0], NULL, &talk_thread, NULL))
110                         perror("pth_create failed");
111 //              if (pthread_create(&my_threads[1], NULL, &fail, NULL))
112 //                      perror("pth_create failed");
113         printf("threads started\n");
114
115         if (0) for (int i = 0; i < nr_threads-1; i++) {
116                 int ret;
117                 if (pthread_join(my_threads[i], &my_retvals[i]))
118                         perror("pth_join failed");
119                 printf("%d %d\n", i, ret);
120         }
121         
122
123         ret = syscall(33, 1);
124         if (ret < 0) {
125                 perror("vm setup");
126                 exit(1);
127         }
128         ret = posix_memalign((void **)&p512, 4096, 3*4096);
129         if (ret) {
130                 perror("ptp alloc");
131                 exit(1);
132         }
133         p1 = &p512[512];
134         p2m = &p512[1024];
135         p512[0] = (unsigned long long)p1 | 7;
136         p1[0] = /*0x87; */(unsigned long long)p2m | 7;
137         p2m[0] = 0x87;
138         p2m[1] = 0x200000 | 0x87;
139         p2m[2] = 0x400000 | 0x87;
140         p2m[3] = 0x600000 | 0x87;
141
142         printf("p512 %p p512[0] is 0x%lx p1 %p p1[0] is 0x%x\n", p512, p512[0], p1, p1[0]);
143         sprintf(cmd, "V 0x%x 0x%x 0x%x", (unsigned long long)fail, (unsigned long long) &stack[1024], (unsigned long long) p512);
144         printf("Writing command :%s:\n", cmd);
145         ret = write(fd, cmd, strlen(cmd));
146         if (ret != strlen(cmd)) {
147                 perror(cmd);
148         }
149
150         sprintf(cmd, "V 0 0 0");
151         while (! done) {
152                 if (debug)
153                         fprintf(stderr, "RESUME\n");
154                 ret = write(fd, cmd, strlen(cmd));
155                 if (ret != strlen(cmd)) {
156                         perror(cmd);
157                 }
158         }
159         return 0;
160 }