We never actually removed <ros/error.h>, now we do
[akaros.git] / lib / parlib / hart.h
1 #ifndef _HART_H
2 #define _HART_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 #include <ros/arch/hart.h>
9 #include <string.h>
10
11 #define HART_LOG2_MAX_MAX_HARTS 6
12 #define HART_MAX_MAX_HARTS (1 << HART_LOG2_MAX_MAX_HARTS)
13
14 typedef struct hart_lock_qnode
15 {
16         volatile struct hart_lock_qnode* volatile next;
17         volatile int locked;
18         char pad[HART_CL_SIZE-sizeof(void*)-sizeof(int)];
19 } hart_lock_qnode_t;
20
21 typedef struct
22 {
23         hart_lock_qnode_t* lock;
24         char pad[HART_CL_SIZE-sizeof(hart_lock_qnode_t*)];
25         hart_lock_qnode_t qnode[HART_MAX_MAX_HARTS] __attribute__((aligned(8)));
26 } hart_lock_t;
27
28 #define HART_LOCK_INIT {0}
29
30 typedef struct
31 {
32         volatile int myflags[2][HART_LOG2_MAX_MAX_HARTS];
33         volatile int* partnerflags[2][HART_LOG2_MAX_MAX_HARTS];
34         int parity;
35         int sense;
36         char pad[HART_CL_SIZE];
37 } hart_dissem_flags_t;
38
39 typedef struct
40 {
41         size_t nprocs;
42         hart_dissem_flags_t* allnodes;
43         size_t logp;
44 } hart_barrier_t;
45
46 extern void hart_entry();
47
48 int hart_barrier_init(hart_barrier_t* b, size_t nprocs);
49 void hart_barrier_wait(hart_barrier_t* b, size_t vcoreid);
50
51 void hart_lock_init(hart_lock_t* lock);
52 void hart_lock_unlock(hart_lock_t* lock);
53 void hart_lock_lock(hart_lock_t* l);
54
55 // "int" rather than size_t because of a newlib compiling issue
56 int hart_self();
57 void hart_relax();
58 int hart_swap(int* addr, int val);
59
60 int hart_request(size_t k);
61 void hart_yield();
62 size_t hart_max_harts();
63 size_t hart_current_harts();
64
65 #ifdef __cplusplus
66 }
67 #endif
68
69 #endif