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