GCC/uthread callbacks on blocking syscalls (XCC)
[akaros.git] / user / parlib / include / uthread.h
1 #ifndef _UTHREAD_H
2 #define _UTHREAD_H
3
4 #include <vcore.h>
5
6 /* Bare necessities of a user thread.  2LSs should allocate a bigger struct and
7  * cast their threads to uthreads when talking with vcore code.  Vcore/default
8  * 2LS code won't touch udata or beyond. */
9 struct uthread {
10         struct user_trapframe utf;
11         struct ancillary_state as;
12         void *tls_desc;
13         /* whether or not the scheduler can migrate you from your vcore */
14         bool dont_migrate;
15 };
16 extern __thread struct uthread *current_uthread;
17
18 /* 2L-Scheduler operations.  Can be 0.  Examples in pthread.c. */
19 struct schedule_ops {
20         /* Functions supporting thread ops */
21         struct uthread *(*sched_init)(void);
22         void (*sched_entry)(void);
23         struct uthread *(*thread_create)(void (*func)(void), void *);
24         void (*thread_runnable)(struct uthread *);
25         void (*thread_yield)(struct uthread *);
26         void (*thread_exit)(struct uthread *);
27         void (*thread_blockon_sysc)(struct syscall *);
28         unsigned int (*vcores_wanted)(void);
29         /* Functions event handling wants */
30         void (*preempt_pending)(void);
31         void (*spawn_thread)(uintptr_t pc_start, void *data);   /* don't run yet */
32 };
33 extern struct schedule_ops *sched_ops;
34
35 /* Functions to make/manage uthreads.  Can be called by functions such as
36  * pthread_create(), which can wrap these with their own stuff (like attrs,
37  * retvals, etc). */
38
39 /* Creates a uthread.  Will pass udata to sched_ops's thread_create.  Func is
40  * what gets run, and if you want args, wrap it (like pthread) */
41 struct uthread *uthread_create(void (*func)(void), void *udata);
42 void uthread_runnable(struct uthread *uthread);
43 void uthread_yield(void);
44 void uthread_exit(void);
45 /* Block the calling uthread on sysc until it makes progress or is done */
46 void ros_syscall_blockon(struct syscall *sysc);
47
48 /* Utility function.  Event code also calls this. */
49 bool check_preempt_pending(uint32_t vcoreid);
50
51 /* Helpers, which sched_entry() can call */
52 void run_current_uthread(void);
53 void run_uthread(struct uthread *uthread);
54
55 #endif /* _UTHREAD_H */