aa50ac58fdaca96dd91bd2e8da2e89dc55b8da7a
[akaros.git] / kern / src / smp.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  */
6
7 #ifdef __SHARC__
8 #pragma nosharc
9 #endif
10
11 #include <arch/arch.h>
12 #include <atomic.h>
13 #include <smp.h>
14 #include <ros/error.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <assert.h>
18 #include <pmap.h>
19 #include <process.h>
20 #include <trap.h>
21
22 struct per_cpu_info per_cpu_info[MAX_NUM_CPUS];
23
24 // tracks number of global waits on smp_calls, must be <= NUM_HANDLER_WRAPPERS
25 atomic_t outstanding_calls = 0;
26
27 /* All non-zero cores call this at the end of their boot process.  They halt,
28  * and wake up when interrupted, do any work on their work queue, then halt
29  * when there is nothing to do.  
30  * TODO: think about resetting the stack pointer at the beginning.
31  */
32 void smp_idle(void)
33 {
34         enable_irq();
35         while (1) {
36                 process_workqueue();
37                 // consider races with work added after we started leaving the last func
38                 cpu_halt();
39         }
40 }