43bd8d232ee9cfb1227ffdc0c2e9e63cc8f4af32
[akaros.git] / tests / ucq.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <parlib.h>
4 #include <sys/mman.h>
5 #include <ucq.h>
6
7 int main(int argc, char** argv)
8 {
9         /* this program should only be started from the kernel for tests */
10         printf("Attempting to read ucq messages from test_ucq().  "
11                "Don't call this manually.\n");
12         /* Map into a known, extremely ghetto location.  The kernel knows to look
13          * here. */
14         struct ucq *ucq = mmap((void*)USTACKTOP, PGSIZE, PROT_WRITE | PROT_READ,
15                                MAP_POPULATE, -1, 0);
16         assert((uintptr_t)ucq == USTACKTOP);
17         /* Now init it */
18         uintptr_t two_pages = (uintptr_t)mmap(0, PGSIZE * 2, PROT_WRITE | PROT_READ,
19                                               MAP_POPULATE, -1, 0);
20         assert(two_pages);
21         ucq_init(ucq, two_pages, two_pages + PGSIZE);
22         /* try to get a simple message */
23         struct event_msg msg;
24         /* 1: Spin til we can get a message (0 on success breaks) */
25         while (get_ucq_msg(ucq, &msg))
26                 cpu_relax();
27         printf("[user] Got simple message type %d(7) with A2 %08p(0xdeadbeef)\n",
28                msg.ev_type, msg.ev_arg2);
29         /* 2: get a bunch */
30         for (int i = 0; i < 5000; i++) {
31                 while (get_ucq_msg(ucq, &msg))
32                         cpu_relax();
33                 assert(msg.ev_type == i);
34         }
35         printf("Received a bunch!  Last one was %d(4999)\n", msg.ev_type);
36         return 0;
37 }