made mhello work on sparc
[akaros.git] / tests / mhello.c
1 #include <parlib.h>
2 #include <ros/mman.h>
3 #include <ros/resource.h>
4 #include <stdio.h>
5 #include <hart.h>
6
7 // ghetto udelay, put in a lib somewhere and export the tsc freq
8 #include <arch/arch.h>
9 void udelay(uint64_t usec, uint64_t tsc_freq)
10 {
11         uint64_t start, end, now;
12
13         start = read_tsc();
14     end = start + (tsc_freq * usec) / 1000000;
15         if (end == 0) printf("This is terribly wrong \n");
16         do {
17         cpu_relax();
18         now = read_tsc();
19         } while (now < end || (now > start && end < start));
20         return;
21 }
22
23 hart_barrier_t b;
24
25 __thread int temp;
26
27 int main(int argc, char** argv)
28 {
29         uint32_t vcoreid;
30         int retval;
31
32         hart_barrier_init(&b,hart_max_harts()-1);
33
34         if ((vcoreid = hart_self())) {
35                 printf("Should never see me! (from vcore %d)\n", vcoreid);
36         } else { // core 0
37                 temp = 0xdeadbeef;
38                 printf("Hello from vcore %d with temp addr = %p and temp = %p\n",
39                        vcoreid, &temp, temp);
40                 printf("Multi-Goodbye, world, from PID: %d!\n", sys_getpid());
41                 //retval = sys_resource_req(RES_CORES, 2, 0);
42                 retval = hart_request(hart_max_harts()-2);
43                 //debug("retval = %d\n", retval);
44         }
45         printf("Vcore %d Done!\n", vcoreid);
46
47         hart_barrier_wait(&b,hart_self());
48
49         printf("All Cores Done!\n", vcoreid);
50         return 0;
51 }
52
53 void hart_entry(void)
54 {
55         uint32_t vcoreid = hart_self();
56         temp = 0xcafebabe;
57         printf("Hello from hart_entry in vcore %d with temp addr %p and temp %p\n",
58                vcoreid, &temp, temp);
59         hart_barrier_wait(&b,hart_self());
60         while(1);
61 }