#ifndef __SYS_THREAD_H__ #define __SYS_THREAD_H__ #include #include #include struct Thread; typedef struct Thread Thread; #include #include #define SCHED_STATE_NULL 0 #define SCHED_STATE_RUNNABLE 1 #define SCHED_STATE_RUNNING 2 #define SCHED_STATE_WAITING 3 #define SCHED_STATE_ZOMBIE 4 typedef struct Thread { ThreadArch arch; AS *space; uintptr_t kstack; uintptr_t ustack; uint64_t tid; // Process struct Process *proc; // XXX: process list // Scheduler int schedState; TAILQ_ENTRY(Thread) schedQueue; TimerEvent *timerEvt; // Timer event for wakeups uintptr_t exitValue; // Statistics uint64_t ctxSwitches; uint64_t userTime; uint64_t kernTime; uint64_t waitTime; uint64_t waitStart; } Thread; #define PROCESS_HANDLE_SLOTS 128 typedef struct Process { uint64_t pid; AS *space; uintptr_t ustackNext; // Next user stack TAILQ_ENTRY(Process) processList; // Threads uint64_t threads; TAILQ_HEAD(ZombieQueueHead, Thread) zombieQueue; // Handles uint64_t nextFD; TAILQ_HEAD(HandleQHead, Handle) handles[PROCESS_HANDLE_SLOTS]; } Process; // Thread functions void Thread_Init(); Thread *Thread_Current(); Process *Thread_CreateProcess(); Thread *Thread_Create(Process *proc); Thread *Thread_KThreadCreate(void (*f)(void*), void *arg); Thread *Thread_UThreadCreate(Thread *oldThr, uint64_t rip, uint64_t arg); void Thread_SetRunnable(Thread *thr); void Thread_SetWaiting(Thread *thr); void Thread_SetZombie(Thread *thr); void Thread_Destroy(Thread *thr); uint64_t Thread_Wait(Thread *thr, uint64_t tid); void Thread_Switch(Thread *oldthr, Thread *newthr); void Thread_Scheduler(); void Thread_ProcDump(Process *proc); void Thread_Dump(Thread *thr); // Process functions Process *Process_Create(); void Process_Destroy(Process *proc); // Platform functions void Thread_InitArch(Thread *thr); void Thread_SetupKThread(Thread *thr, void (*f)(), uintptr_t arg1, uintptr_t arg2, uintptr_t arg3); void Thread_SetupUThread(Thread *thr, uint64_t rip, uint64_t arg); void Thread_SwitchArch(Thread *oldthr, Thread *newthr); // Handle Functions void Handle_Init(Process *proc); uint64_t Handle_Add(Process *proc, Handle *handle); void Handle_Remove(Process *proc, Handle *handle); Handle *Handle_Lookup(Process *proc, uint64_t fd); // CopyIn/CopyOut Functions int CopyIn(uintptr_t fromuser, void *tokernel, uintptr_t len); int CopyOut(void *fromkernel, uintptr_t touser, uintptr_t len); #endif /* __SYS_THREAD_H__ */