Added back harts support
[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 #define HART_CL_SIZE 128
14
15 typedef struct hart_lock_qnode
16 {
17         volatile struct hart_lock_qnode* volatile next;
18         volatile int locked;
19         char pad[HART_CL_SIZE-sizeof(void*)-sizeof(int)];
20 } hart_lock_qnode_t;
21
22 typedef struct
23 {
24         hart_lock_qnode_t* lock;
25         char pad[HART_CL_SIZE-sizeof(hart_lock_qnode_t*)];
26         hart_lock_qnode_t qnode[HART_MAX_MAX_HARTS] __attribute__((aligned(8)));
27 } hart_lock_t;
28
29 #define HART_LOCK_INIT {0}
30
31 typedef struct
32 {
33         volatile int myflags[2][HART_LOG2_MAX_MAX_HARTS];
34         volatile int* partnerflags[2][HART_LOG2_MAX_MAX_HARTS];
35         int parity;
36         int sense;
37         char pad[HART_CL_SIZE];
38 } hart_dissem_flags_t;
39
40 typedef struct
41 {
42         size_t nprocs;
43         hart_dissem_flags_t* allnodes;
44         size_t logp;
45 } hart_barrier_t;
46
47 extern void hart_entry();
48
49 int hart_barrier_init(hart_barrier_t* b, size_t nprocs);
50 void hart_barrier_wait(hart_barrier_t* b, size_t vcoreid);
51
52 void hart_lock_init(hart_lock_t* lock);
53 void hart_lock_unlock(hart_lock_t* lock);
54 void hart_lock_lock(hart_lock_t* l);
55
56 // "int" rather than size_t because of a newlib compiling issue
57 int hart_self();
58 void hart_relax();
59 int hart_swap(int* addr, int val);
60
61 int hart_request(size_t k);
62 void hart_yield();
63 size_t hart_max_harts();
64 size_t hart_current_harts();
65
66 #ifdef __cplusplus
67 }
68 #endif
69
70 #endif