XenevaOS
Loading...
Searching...
No Matches
sched.h
Go to the documentation of this file.
1
32#ifndef __AA64_SCHED_H__
33#define __AA64_SCHED_H__
34
35#include <stdint.h>
36#include <Hal/AA64/aa64cpu.h>
37/* Pointer only. The full <list.h> declares list_add(list_t*, void*), which
38 * cannot share a file with mainline list_add(list_head*, list_head*).
39 * DCL/linux_irq_shim.c includes this header and then <linux/kernel.h>. */
40typedef struct _list_ list_t;
41
42#ifdef ARCH_ARM64
43
44#define THREAD_STATE_READY 1
45#define THREAD_STATE_BLOCKED 3
46#define THREAD_STATE_SLEEP 4
47#define THREAD_STATE_KILLABLE 5
48#define THREAD_STATE_LEFT_IN_KERNEL 6
49#define THREAD_STATE_PENDING_SIGNAL 7
50#define THREAD_STATE_RUNNING 8
51
55
56#define THREAD_LEVEL_KERNEL (1 << 0)
57#define THREAD_LEVEL_USER (1 << 1)
58#define THREAD_LEVEL_SUBTHREAD (1 << 2)
59#define THREAD_LEVEL_MAIN_THREAD (1 << 3)
60
61//#pragma pack(push,1)
62/* AuUserEntry structure */
63typedef struct _uentry_ {
68 int num_args;
69 uint64_t argvaddr; /* user-space VA of argv[] page (for crt0 via stack) */
70 uint64_t argvkernel; /* kernel-space VA of argv[] page (for EL1 writes) */
71 char** argvs;
73 /* PROCESS_TYPE_LINUX aux vector. Zero on a PE process. */
74 uint64_t linux_phdr;
75 uint16_t linux_phent;
76 uint16_t linux_phnum;
78//#pragma pack(pop)
79
80#define MAX_SIGNAL_ENTRY 10
81
82typedef struct _gp_context_ {
83 uint64_t x[31];
84 uint64_t sp_el0;
85 uint64_t elr_el1;
86 uint64_t spsr_el1;
87} _gp_context_t;
88
89typedef struct _signal_frame_ {
90 AA64Registers regs;
91 uint64_t elr_el1;
92 uint64_t sigret_address;
93} _signal_frame_t;
94
95//#pragma pack(push,1)
96typedef struct _aa64_task_ {
97 uint64_t x19; //0
98 uint64_t x20; //8
99 uint64_t x21; //16
100 uint64_t x22; //24
101 uint64_t x23; //32
102 uint64_t x24; //40
103 uint64_t x25; //48
104 uint64_t x26; //56
105 uint64_t x27; //64
106 uint64_t x28; //72
107 uint64_t x29; //80
108 uint64_t x30; //88
109 uint64_t sp; //96
110 uint64_t elr_el1; //104
111 uint64_t spsr_el1; //112
112 uint64_t x0; //120
113 uint64_t x1; //128
114 uint64_t x2; //136
115 uint64_t x3; //144
116 uint64_t x4; //152
117 uint64_t x5; //160
118 uint64_t x6; //168
119 uint64_t x7; //176
120 uint64_t x8; //184
121 uint8_t state; //192
122 uint8_t threadType; //193
123 uint64_t pml; //186
124 char name[8]; //130
125 void* procSlot; //138
126 AuUserEntry* uentry; //146
127 bool first_run; //206
128 uint64_t thread_id; //207
129 uint64_t sleepQuanta; //215
130 uint64_t originalKSp; //223
131 bool returnFromSyscall;
132 bool justStored;
133 void* data;
134 AU_ALIGN(16) uint8_t fp_regs[512];
135 uint64_t fpcr;
136 uint64_t fpsr;
137 uint32_t syscallNum;
138 uint64_t sig_pending;
139 _signal_frame_t signal;
140 uint64_t start_time_us;
141 uint64_t* sigs[32];
142 struct _aa64_task_* next;
143 struct _aa64_task_* prev;
144 /* EDF real-time class (implicit-deadline periodic model). Zeroed by
145 * default: thread is best-effort round-robin. See Hal/sched_edf.c. */
146 uint8_t edf_enabled;
147 uint8_t edf_waiting;
148 uint64_t edf_period_us;
149 uint64_t edf_wcet_us;
150 uint64_t edf_deadline_us;
151 uint64_t edf_release_us;
152 uint64_t edf_misses;
154 list_t* waitlist;
155 uint16_t wait_ref_count;
156 /* Linux ELF pthread. Saved across switches because EL0 writes TPIDR_EL0. */
157 uint64_t linux_tls;
158 uint64_t clear_child_tid;
159 uint64_t futex_uaddr;
160 uint32_t futex_bitset;
161 uint8_t futex_waiting;
163 uint64_t sleep_until_us;
164 uint8_t blocked_on_poll;
165} AA64Thread;
166
167//#pragma pack(pop)
168extern void AuSchedulerInitialize();
170AU_EXTERN AU_EXPORT AA64Thread* AuCreateKthread(void (*entry)(uint64_t), uint64_t* pml, char* name);
179AU_EXTERN AU_EXPORT AA64Thread*
180AuCreateSubKthread(void (*entry)(uint64_t), uint64_t stack, uint64_t* pml, char* name);
181
182extern void AuScheduleThread(AA64Registers* regs);
183extern void AuScheduleNext();
184/* Park the caller for about ms and run another thread. Returns 0, or
185 * -1 when the scheduler is not running yet. */
186extern int AuSchedYieldMs(uint64_t ms);
187extern void AuSchedulerStart();
188extern AA64Thread* AuGetIdleThread();
189extern AA64Thread* AuGetCurrentThread();
190
195AU_EXTERN AU_EXPORT void AuBlockThread(AA64Thread* thread);
196
202AU_EXTERN AU_EXPORT void AuUnblockThread(AA64Thread* thread);
203
209AU_EXTERN AU_EXPORT void AuThreadWakePoller(AA64Thread* t);
215
221AU_EXTERN AU_EXPORT void AuSleepThread(AA64Thread* thread, uint64_t ms);
222
229
236
248AU_EXTERN AU_EXPORT void AuThreadMoveToTrash(AA64Thread* t);
249
254extern void AuThreadCleanTrash(AA64Thread* t);
255
261
266extern void AuHandleSleepThreads();
267
273extern void AuThreadMakeReady(AA64Thread* thread);
274
275/* Scheduler list lock (mask + spinlock, DAIF save/restore). Tick path
276 * runs masked already; thread context must use these (or the locking
277 * AuThread* wrappers) around list access. */
278extern uint64_t AuSchedLock(void);
279extern void AuSchedUnlock(uint64_t saved_daif);
280extern bool AuSchedValidateLists(void);
281
282/* EDF real-time class, see Hal/sched_edf.c. All no-ops / NULL-safe when
283 * the thread is not EDF-enabled; best-effort threads are unaffected. */
284extern bool AuEDFSetParams(AA64Thread* thread, uint64_t period_us, uint64_t wcet_us);
285extern void AuEDFRemove(AA64Thread* thread);
286extern void AuEDFWaitPeriod(AA64Thread* thread);
287extern void AuEDFHandleReleases(uint64_t now_us);
288extern AA64Thread* AuEDFPickNext(void);
289extern uint64_t AuEDFGetMisses(AA64Thread* thread);
290extern void AuEDFSelfTestStart(void);
291extern void AuSoakStart(void);
292
298extern int AuThreadWaitForTermination(int thread_id);
305extern void AuThreadAwakeWaiters(AA64Thread* thread);
306
307#endif
308
309#endif
#define AU_ALIGN(x)
Definition aurora.h:42
#define AU_EXTERN
Definition aurora.h:54
#define AU_EXPORT
Definition aurora.h:40
#define signal(signum, handler)
signal – register a signal handler to a specific signal number
Definition signal.h:42
XETime t
Definition main.cpp:53
unsigned int uint32_t
Definition acefiex.h:163
unsigned char uint8_t
Definition acefiex.h:161
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
unsigned short int uint16_t
Definition acefiex.h:162
struct drm_crtc struct drm_plane struct drm_plane const struct drm_crtc_funcs const char * name
Definition drm_crtc.h:1242
void * data
Definition kthread.h:30
int x
Definition layout.c:118
void(* entry)(void *)
Definition process.h:101
AA64Thread * AuGetIdleThread()
Definition sched.c:675
uint64_t thread_id
Definition sched.c:80
void AuSchedulerInitialize()
AuSchedulerInitialize – initialize the scheduler.
Definition sched.c:642
AA64Thread * AuThreadFindByIDSleepList(uint64_t id)
AuThreadFindByIDSleepList – finds a thread by its id from the sleep queue.
Definition sched.c:835
void AuThreadAwakeWaiters(AA64Thread *thread)
AuThreadAwakeWaiters – unblock all awaiting threads for the current thread @praram thread – current t...
Definition sched.c:1025
int AuThreadWaitForTermination(int thread_id)
AuThreadWaitForTermination – wait for desired thread termination.
Definition sched.c:982
void AuScheduleThread(AA64Registers *regs)
AuScheduleThread – the core of multi-tasking. It schedules threads next to be runned.
Definition sched.c:463
AA64Thread * AuCreateSubKthread(void(*entry)(uint64_t), uint64_t stack, uint64_t *pml, char *name)
AuCreateSubKthread – create sub kernel thread of parent kthread.
Definition sched.c:270
bool AuSchedValidateLists(void)
AuSchedValidateLists – consistency-check all scheduler lists.
Definition sched.c:927
void AuThreadMakeReady(AA64Thread *thread)
AuThreadMakeReady – make a thread forcefully ready for next.
Definition sched.c:781
uint64_t AuCreateKernelStack(uint64_t *pml)
AuCreateKernelStack – maps kernel stack and return the top of the stack, it only maps 4KiB of stack.
Definition sched.c:608
int AuSchedYieldMs(uint64_t ms)
Definition sched.c:569
void AuSchedUnlock(uint64_t d)
Definition sched.c:101
void AuScheduleNext()
AuScheduleNext – forcefully schedule to idle thread.
Definition sched.c:588
uint64_t AuSchedLock(void)
Definition sched.c:91
void AuThreadWakePoller(AA64Thread *t)
AuThreadWakePoller – wake up a thread that was left in sleep/block while polling.
Definition sched.c:732
void AuEDFRemove(AA64Thread *thread)
AuEDFRemove – drop a thread's EDF reservation.
Definition sched_edf.c:74
AA64Thread * AuEDFPickNext(void)
AuEDFPickNext – earliest absolute deadline among runnable EDF threads Accepts READY and LEFT_IN_KERNE...
Definition sched_edf.c:144
void AuEDFSelfTestStart(void)
Definition sched_edf.c:196
uint64_t AuEDFGetMisses(AA64Thread *thread)
Definition sched_edf.c:160
void AuEDFWaitPeriod(AA64Thread *thread)
AuEDFWaitPeriod – end current job, sleep until next release Must be called by the EDF thread itself (...
Definition sched_edf.c:90
void AuEDFHandleReleases(uint64_t now_us)
AuEDFHandleReleases – wake EDF threads whose release arrived Called once per timer tick from AuSchedu...
Definition sched_edf.c:122
bool AuEDFSetParams(AA64Thread *thread, uint64_t period_us, uint64_t wcet_us)
AuEDFSetParams – admit a thread to the EDF class.
Definition sched_edf.c:45
void AuSoakStart(void)
Definition sched_soak.c:167
Definition aa64cpu.h:50
Definition list.h:46
Definition x86_64_sched.h:98
uint64_t ss
Definition x86_64_sched.h:102
char ** argvs
Definition x86_64_sched.h:105
uint64_t stackBase
Definition x86_64_sched.h:106
uint64_t argvaddr
Definition x86_64_sched.h:104
uint64_t entrypoint
Definition x86_64_sched.h:99
uint64_t rsp
Definition x86_64_sched.h:100
int num_args
Definition x86_64_sched.h:103
uint64_t cs
Definition x86_64_sched.h:101
#define state(x)
void AuHandleSleepThreads()
Definition x86_64_sched.cpp:380
AU_EXTERN AU_EXPORT void AuForceScheduler()
AuForceScheduler – force the scheduler to switch next thread.
Definition x86_64_sched.cpp:621
AU_EXTERN AU_EXPORT void AuUnblockThread(AuThread *t)
Definition x86_64_sched.cpp:541
void AuSchedulerStart()
AuSchedulerStart – start the scheduler.
Definition x86_64_sched.cpp:485
AU_EXTERN AU_EXPORT AuThread * AuThreadFindByIDBlockList(uint16_t id)
Definition x86_64_sched.cpp:609
AU_EXTERN AU_EXPORT AuThread * AuGetCurrentThread()
Definition x86_64_sched.cpp:505
AU_EXTERN AU_EXPORT void AuSleepThread(AuThread *thread, uint64_t ms)
Definition x86_64_sched.cpp:523
AU_EXTERN AU_EXPORT AuThread * AuThreadFindByID(uint16_t id)
Definition x86_64_sched.cpp:596
struct _uentry_ AuUserEntry
AU_EXTERN AU_EXPORT void AuBlockThread(AuThread *thread)
Definition x86_64_sched.cpp:514
void AuThreadMoveToTrash(AuThread *t)
Definition x86_64_sched.cpp:560
void AuThreadCleanTrash(AuThread *t)
Definition x86_64_sched.cpp:587
AU_EXTERN AU_EXPORT uint64_t AuGetSystemTimerTick()
AuGetSystemTimerTick – return the current system timer tick.
Definition x86_64_sched.cpp:634
AU_EXTERN AU_EXPORT AuThread * AuCreateKthread(void(*entry)(uint64_t), uint64_t stack, uint64_t cr3, char *name)
Definition x86_64_sched.cpp:253