Parlib and other user libs are built with -fPIC
[akaros.git] / tests / mcp_halt.c
1 #include <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 <arch/arch.h>
8 #include <stdio.h>
9 #include <vcore.h>
10 #include <mcs.h>
11 #include <timing.h>
12 #include <rassert.h>
13 #include <event.h>
14 #include <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 struct schedule_ops *sched_ops = &ghetto_sched_ops;
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_lib_init(&dummy);
44
45         /* Reset the blockon to be the spinner...  This is really shitty.  Any
46          * blocking calls after we become an MCP and before this will fail.  This is
47          * just mhello showing its warts due to trying to work outside uthread.c */
48         ros_syscall_blockon = __ros_syscall_spinon;
49
50         vcore_request(nr_vcores - 1); /* since we already have 1 */
51
52         while (1)
53                 sys_halt_core(0);
54
55         return 0;
56 }
57
58 void ghetto_vcore_entry(void)
59 {
60         if (vcore_id() == 0)
61                 run_current_uthread();
62
63         while (1)
64                 sys_halt_core(0);
65 }