Allows application-specific event handling (XCC)
[akaros.git] / user / parlib / include / vcore.h
1 #ifndef _VCORE_H
2 #define _VCORE_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 #include <arch/vcore.h>
9 #include <string.h>
10
11 /*****************************************************************************/
12 /* TODO: This is a complete hack, but necessary for vcore stuff tow ork for now
13  * The issue is that exit sometimes calls sys_yield(), and we can't recover from
14  * that properly under our vcore model (we shouldn't though).  We really need to
15  * rethink what sys_yield 'should' do when in multicore mode, or else come up 
16  * with a different syscall entirely. */
17 #include <stdlib.h>
18 #include <unistd.h>
19 #undef exit
20 #define exit(status) ros_syscall(SYS_proc_destroy, getpid(), status, 0, 0, 0, 0)
21 /*****************************************************************************/
22
23 #define LOG2_MAX_VCORES 6
24 #define MAX_VCORES (1 << LOG2_MAX_VCORES)
25
26 #define TRANSITION_STACK_PAGES 2
27 #define TRANSITION_STACK_SIZE (TRANSITION_STACK_PAGES*PGSIZE)
28
29 /* 2L-Scheduler operations.  Can be 0. */
30 struct schedule_ops {
31         void (*preempt_pending)(void);
32         void (*spawn_thread)(uintptr_t pc_start, void *data);   /* don't run yet */
33 };
34 extern struct schedule_ops *sched_ops;
35
36 /* Defined by glibc; Must be implemented by a user level threading library */
37 extern void vcore_entry();
38
39 /* Utility Functions */
40 void *allocate_tls(void);
41
42 /* Vcore API functions */
43 int vcore_init(void);
44 int vcore_id(void);
45 int vcore_request(size_t k);
46 void vcore_yield(void);
47 size_t max_vcores(void);
48 size_t num_vcores(void);
49 bool check_preempt_pending(uint32_t vcoreid);
50 void clear_notif_pending(uint32_t vcoreid);
51
52 static inline void enable_notifs(uint32_t vcoreid)
53 {
54         __procdata.vcore_preempt_data[vcoreid].notif_enabled = TRUE;
55 }
56
57 static inline void disable_notifs(uint32_t vcoreid)
58 {
59         __procdata.vcore_preempt_data[vcoreid].notif_enabled = FALSE;
60 }
61
62 #ifdef __cplusplus
63 }
64 #endif
65
66 #endif