MPC TLB shootdowns
[akaros.git] / tests / fillmeup.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <ros/syscall.h>
4 #include <vcore.h>
5 #include <assert.h>
6 #include <parlib.h>
7
8 #define BUF_SIZE 1024
9 #define NUM_BUFS 1024
10 uint8_t bufs[BUF_SIZE * NUM_BUFS];
11 int16_t last_written;
12
13 void *mytls_desc = NULL;
14
15 void print_new_buf() 
16 {
17         printf("I just woke up on my vcore!\n");
18         printf("Value of last_written: %d\n", last_written);
19 //      printf("Contents of last written buffer:\n");
20 //      for(int i=0; i<BUF_SIZE; i++)
21 //              printf("0x%02x ", bufs[BUF_SIZE * last_written + i]);
22 }
23
24 void vcore_entry()
25 {
26         uint32_t vcoreid = vcore_id();
27
28         struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
29         struct vcore *vc = &__procinfo.vcoremap[vcoreid];
30
31         /* Should always have notifications disabled when coming in here. */
32         assert(vcpd->notif_enabled == FALSE);
33
34         /* Put this in the loop that deals with notifications.  It will return if
35          * there is no preempt pending. */ 
36         // TODO: prob make a handle_notif() function
37         if (vc->preempt_pending)
38                 sys_yield(TRUE);
39         vcpd->notif_pending = 0;
40
41         if(last_written >= 0)
42                 print_new_buf();
43                 
44         /* Pop the user trap frame */
45         set_tls_desc(mytls_desc, vcoreid);
46         pop_ros_tf(&vcpd->notif_tf, vcoreid);
47         assert(0);
48 }
49
50 int main(int argc, char** argv)
51 {
52 /* begin: stuff userspace needs to do before switching to multi-mode */
53         if (vcore_init())
54                 printf("vcore_init() failed, we're fucked!\n");
55
56         /* tell the kernel where and how we want to receive notifications */
57         struct notif_method *nm;
58         nm = &__procdata.notif_methods[NE_NONE];
59         nm->flags |= NOTIF_WANTED | NOTIF_IPI;
60         nm->vcoreid = 0;
61         nm = &__procdata.notif_methods[NE_ETC_ETC_ETC];
62         nm->flags |= NOTIF_WANTED | NOTIF_IPI;
63         nm->vcoreid = 0;
64
65         mytls_desc = get_tls_desc(0);
66
67         /* don't forget to enable notifs on vcore0 at some point */
68         struct preempt_data *vcpd;
69         vcpd = &__procdata.vcore_preempt_data[0];
70         vcpd->notif_enabled = TRUE;
71         
72 /* end: stuff userspace needs to do before switching to multi-mode */
73
74         printf("About to fill me up!!\n");
75         ros_syscall(SYS_fillmeup, bufs, NUM_BUFS, &last_written, 0, 0);
76         vcore_request(1);
77         while(1) {
78                 sys_halt_core(0);
79         }
80         return 0;
81 }
82
83