Add a shared_ptr sanity check
[akaros.git] / tests / mcp_halt.c
1 #include <parlib/parlib.h>
2 #include <ros/mman.h>
3 #include <ros/resource.h>
4 #include <ros/procdata.h>
5 #include <ros/event.h>
6 #include <ros/bcq.h>
7 #include <parlib/arch/arch.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <parlib/vcore.h>
11 #include <parlib/mcs.h>
12 #include <parlib/timing.h>
13 #include <parlib/assert.h>
14 #include <parlib/event.h>
15 #include <parlib/uthread.h>
16
17 void ghetto_vcore_entry(void);
18
19 struct schedule_ops ghetto_sched_ops = {
20         .sched_entry = ghetto_vcore_entry,
21 };
22
23 /* All MCP syscalls will spin instead of blocking */
24 static void __ros_syscall_spinon(struct syscall *sysc)
25 {
26         while (!(atomic_read(&sysc->flags) & (SC_DONE | SC_PROGRESS)))
27                 cpu_relax();
28 }
29
30 int main(int argc, char** argv)
31 {
32         uint32_t vcoreid;
33         int nr_vcores;
34
35         if (argc < 2)
36                 nr_vcores = max_vcores();
37         else
38                 nr_vcores = atoi(argv[1]);
39
40         /* Inits a thread for us, though we won't use it.  Just a hack to get into
41          * _M mode.  Note this requests one vcore for us */
42         struct uthread dummy = {0};
43         uthread_2ls_init(&dummy, &ghetto_sched_ops, NULL, NULL);
44         uthread_mcp_init();
45
46         /* Reset the blockon to be the spinner...  This is really shitty.  Any
47          * blocking calls after we become an MCP and before this will fail.  This is
48          * just mhello showing its warts due to trying to work outside uthread.c */
49         ros_syscall_blockon = __ros_syscall_spinon;
50
51         vcore_request_total(nr_vcores);
52
53         while (1)
54                 sys_halt_core(0);
55
56         return 0;
57 }
58
59 void ghetto_vcore_entry(void)
60 {
61         if (vcore_id() == 0)
62                 run_current_uthread();
63
64         while (1)
65                 sys_halt_core(0);
66 }