XenevaOS
Loading...
Searching...
No Matches
process.h
Go to the documentation of this file.
1
30#ifndef __PROCESS_H__
31#define __PROCESS_H__
32
33#if defined(__GNUC__) || defined(__clang__)
34#ifndef __cplusplus
35#include <stdbool.h>
36#endif
37#endif
38#include <stdint.h>
39#include <Fs/vfs.h>
40#include <Cred/group.h>
41#include <Cred/user.h>
42#include <Cap/capability.h>
43#include <Sync/spinlock.h>
44
45#ifdef ARCH_ARM64
46#include <Hal/AA64/sched.h>
47#endif
48
49#ifdef ARCH_X64
50#include <Hal/x86_64_sched.h>
51#include <Sync/mutex.h>
52#endif
53#include <list.h>
54
55#define PROCESS_USER_STACK_SZ 512 * 1024
56
57#define MAX_THREADS_PER_PROCESS 60
58#define FILE_DESC_PER_PROCESS 60
59
60#define PROCESS_STATE_NOT_READY (1 << 0)
61#define PROCESS_STATE_READY (1 << 1)
62#define PROCESS_STATE_SUSPENDED (1 << 2)
63
64/* when a process exits, it's marked
65 * as died */
66#define PROCESS_STATE_DIED (1 << 3)
67
68/* when a process's parents dies, whitout
69 * terminating its childs, childs are
70 * marked as zombies
71 */
72#define PROCESS_STATE_ZOMBIE (1 << 4)
73#define PROCESS_STATE_ORPHAN (1 << 5)
74
75/* process state busy wait is set when
76 * any locks set its as waiting
77 */
78#define PROCESS_STATE_BUSY_WAIT (1 << 6)
79
80/* Exit codes for processes */
81#define PROCESS_EXIT_SUCCESS 0
82#define PROCESS_EXIT_FAILURE 1
83
84/* process types */
85#define PROCESS_TYPE_GENERAL (0 << 1)
86#define PROCESS_TYPE_SYSTEM (1 << 1)
87#define PROCESS_TYPE_BACKGROUND (1 << 2)
88#define PROCESS_TYPE_NON_KILLABLE (1 << 3)
89/* Static Linux ELF. svc #0 reads x8, not x16. */
90#define PROCESS_TYPE_LINUX (1 << 4)
91
92#define PROCESS_BREAK_ADDRESS 0x0000003000000000
93#ifdef ARCH_X64
94#define PROCESS_MMAP_ADDRESS 0x00000000C0000000
95#define PROCESS_SHM_ADDRESS 0x0000000080000000
96#elif ARCH_ARM64
97#define PROCESS_MMAP_ADDRESS 0x0000000C00000000
98#define PROCESS_SHM_ADDRESS 0x0000000800000000
99#endif
100
101typedef void (*entry)(void*);
102
110
124
125//#pragma pack(push,1)
126typedef struct _au_proc_ {
127 char name[16];
131
132 /* process image related stuff */
146#ifdef ARCH_X64
147 /* threading section */
148 AuThread* main_thread;
149#elif ARCH_ARM64
150 AA64Thread* main_thread;
151#endif // Maybe RISC-V?
152
155
156#ifdef ARCH_X64
158#elif ARCH_ARM64
159 AA64Thread* threads[MAX_THREADS_PER_PROCESS];
160#endif // Maybe RISC-V?
161
162 /* file descriptors */
164 /* capability table -- parallel to fds[]*/
166 /*loader related data*/
169
170 /* memory account */
174 size_t shm_break;
178 size_t mmap_next;
180
183
184 /* data structure */
188
189//#pragma pack(pop)
190/*
191* AuAddProcess -- adds process to kernel data structure
192* @param root -- pointer to the root process
193* @param proc -- process to add
194*/
195extern void AuAddProcess(AuProcess* parent, AuProcess* proc);
196
197/*
198* AuRemoveProcess -- removes a process from the process
199* data structure
200* @param parent -- pointer to the parent process
201* @param proc -- process to remove
202*/
203extern void AuRemoveProcess(AuProcess* parent, AuProcess* proc);
204
205/*
206* Allocate kernel stack
207* @param cr3 -- root page map level, it should be
208* converted to linear virtual address
209*/
211/*
212* KernelStackFree -- frees up an allocated stack
213* @param proc -- Pointer to process
214* @param ptr -- Starting address of the stack
215* @param cr3 -- page root level mapping
216*/
217extern void KernelStackFree(AuProcess* proc, void* ptr, uint64_t* cr3);
218
219/*
220* AuProcessFindPID -- finds a process by its pid
221* @param pid -- process id to find
222*/
223extern AuProcess* AuProcessFindPID(int pid);
224
225#ifdef ARCH_X64
226/*
227* AuProcessFindThread -- finds a process by its
228* main thread
229* @param thread -- pointer to main thread
230*/
231extern AuProcess* AuProcessFindThread(AuThread* thread);
232
233/*
234* AuProcessFindSubThread -- find a process from its
235* sub threads which contain a pointer to its process
236* slot
237* @param thread -- Pointer to sub thread
238*/
240#elif ARCH_ARM64
241/*
242* AuProcessFindThread -- finds a process by its
243* main thread
244* @param thread -- pointer to main thread
245*/
246extern AuProcess* AuProcessFindThread(AA64Thread* thread);
247
248/*
249* AuProcessFindSubThread -- find a process from its
250* sub threads which contain a pointer to its process
251* slot
252* @param thread -- Pointer to sub thread
253*/
254extern AuProcess* AuProcessFindSubThread(AA64Thread* thread);
255
256#endif
257
258/*
259* CreateUserStack -- creates new user stack
260* @param proc -- Pointer to process
261* @param cr3 -- pointer to the address space where to
262* map
263*/
265
266/*
267* AuStartRootProc -- starts the very first process
268* of aurora system
269*/
270extern void AuStartRootProc();
271
272/*
273* AuGetRootProcess -- returns the root process
274*/
276
277/*
278* AuCreateProcessSlot -- creates a blank process slot
279* @param parent -- pointer to the parent process
280*/
282
283/*
284* AuProcessFork -- fork a parent process
285* @param parent -- pointer to parent process
286*/
288
289/* AuProcessExit -- marks a process
290* as killable
291* @param proc -- process to exit
292*/
293extern void AuProcessExit(AuProcess* proc, bool schedulable);
294
295#ifdef ARCH_ARM64
296/* Reaping requires an inactive address space and stopped threads. */
297extern bool AuProcessCanReap(AuProcess* proc);
298extern AuProcess* AuGetKillableProcess(void);
299
300/* Wake borrowed waiter threads, then release the list and its entries. */
301extern void AuProcessWakeWaiters(AuProcess* proc);
302#endif
303
304/*
305* AuProcessGetFileDesc -- returns a empty file descriptor
306* from process slot
307* @param proc -- pointer to process slot
308*/
309extern int AuProcessGetFileDesc(AuProcess* proc);
310
311/*
312* AuProcessWaitForTermination -- waits for termination
313* of child processes
314* @param proc -- pointer to process who needs to
315* wait for termination
316* @param pid -- pid of the process, if -1 then any child
317* process
318*/
319extern int AuProcessWaitForTermination(AuProcess* proc, int pid);
320
321#ifdef ARCH_X64
322extern AuMutex* AuProcessGetMutex();
323#endif
324
325#ifdef ARCH_ARM64
333/*
334 * @brief CreateSubUserStack -- creates new user stack
335 * @param proc -- Pointer to process slot
336 * @param cr3 -- pointer to the address space where to
337 * map
338 */
340
347extern void AuProcessFreeKeResource(AA64Thread* thr);
348#endif
357extern int AuCreateUserthread(AuProcess* proc, void (*entry)(), char* name, uint64_t args);
358
363extern int AuProcGetNumProcessCount();
364
371extern int AuProcessFetch(AuProcessList* list, int num_proc_count);
372
378extern void AuProcessReapWaitcount(AuProcess* proc, int num_count);
379
380#endif
XEProcessList * list
Definition main.cpp:27
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
#define GID_NUM
Definition group.h:38
#define AURORA_MAX_GROUPS
Definition group.h:60
struct kobject * parent
Definition kobject.h:91
bool AuProcessCanReap(AuProcess *proc)
Definition process.c:477
uint64_t * CreateSubUserStack(AuProcess *proc, uint64_t *cr3)
CreateSubUserStack – creates new user stack.
Definition process.c:212
void AuProcessWakeWaiters(AuProcess *proc)
Definition process.c:409
void AuProcessFreeKeResource(AuThread *thr)
Definition process.cpp:472
AuProcess * AuGetKillableProcess()
Definition process.cpp:377
AuMutex * AuProcessGetMutex()
Definition process.cpp:581
AuProcess * AuProcessFindThread(AuThread *thread)
Definition process.cpp:152
AuProcess * AuProcessFindSubThread(AuThread *thread)
Definition process.cpp:168
uint64_t CreateKernelStack(AuProcess *proc, uint64_t *cr3)
Definition process.cpp:203
int AuProcGetNumProcessCount()
AuProcGetNumProcessCount – returns the total number of process created.
Definition process.c:533
void(* entry)(void *)
Definition process.h:101
void AuProcessReapWaitcount(AuProcess *proc, int num_count)
AuProcessReapWaitCount – decrease waiting thread counts.
Definition process.c:620
int AuProcessWaitForTermination(AuProcess *proc, int pid)
AuProcessWaitForTermination – waits for termination of child processes.
Definition process.cpp:396
AuProcess * AuGetRootProcess()
Definition process.cpp:369
void AuAddProcess(AuProcess *parent, AuProcess *proc)
AuAddProcess – adds process to kernel data structure.
Definition process.cpp:64
AuProcess * AuCreateProcessSlot(AuProcess *parent, char *name)
AuCreateProcessSlot – creates a blank process slot.
Definition process.cpp:296
struct _sys_proc_list_ AuProcessList
#define FILE_DESC_PER_PROCESS
Definition process.h:58
void AuRemoveProcess(AuProcess *parent, AuProcess *proc)
AuRemoveProcess – removes a process from the process data structure.
Definition process.cpp:86
void AuStartRootProc()
Definition process.cpp:351
#define MAX_THREADS_PER_PROCESS
Definition process.h:57
void KernelStackFree(AuProcess *proc, void *ptr, uint64_t *cr3)
Definition process.cpp:222
int AuProcessGetFileDesc(AuProcess *proc)
AuProcessGetFileDesc – returns a empty file descriptor from process slot, 0, 1 & 2 are reserved for t...
Definition process.cpp:433
AuProcess * AuProcessFindPID(int pid)
AuProcessFindPID – finds a process by its pid from the process tree.
Definition process.cpp:139
uint64_t * CreateUserStack(AuProcess *proc, uint64_t *cr3)
CreateUserStack – creates new user stack.
Definition process.cpp:179
struct _au_proc_cred_ AuProcCredentials
int AuProcessFetch(AuProcessList *list, int num_proc_count)
AuProcessFetch – fetch current process table status.
Definition process.c:587
int AuCreateUserthread(AuProcess *proc, void(*entry)(), char *name, uint64_t args)
Creates a user mode thread.
Definition process.c:319
AuProcess * AuProcessFork(AuProcess *parent)
struct _au_proc_ AuProcess
void AuProcessExit(AuProcess *proc, bool schedulable)
AuProcessExit – release resources and queue a process for reaping.
Definition process.cpp:493
uint64_t AuCreateSubKernelStack(AuProcess *proc, uint64_t *pml)
AuCreateSubKernelStack – maps sub kernel stack and return the top of the stack, it only maps 4KiB of ...
Definition sched.c:626
const char const char va_list args
Definition seq_buf.h:182
Definition vfs.h:129
Definition capability.h:49
Definition process.h:126
list_t * vmareas
Definition process.h:171
char name[16]
Definition process.h:127
list_t * shmmaps
Definition process.h:172
uint64_t _envp_block_
Definition process.h:139
uint32_t cpu_usage
Definition process.h:142
AuProcCredentials creds
Definition process.h:182
size_t shm_break
Definition process.h:174
uint64_t _image_base_
Definition process.h:135
uint16_t waiting_threads
Definition process.h:145
uint8_t type_flags
Definition process.h:130
AuCapability caps[FILE_DESC_PER_PROCESS]
Definition process.h:165
uint64_t total_runtime_us
Definition process.h:140
size_t _kstack_index_
Definition process.h:138
size_t mmap_next
Definition process.h:178
int proc_id
Definition process.h:128
size_t proc_mmap_len
Definition process.h:177
uint8_t num_thread
Definition process.h:153
uint64_t * cr3
Definition process.h:133
AuVFSNode * fsys
Definition process.h:168
size_t _user_stack_index_
Definition process.h:137
entry entry_point
Definition process.h:154
uint64_t window_runtime_us
Definition process.h:141
uint64_t prev_sample_runtime_us
Definition process.h:143
struct _au_proc_ * next
Definition process.h:185
Spinlock * mmap_lock
Definition process.h:179
struct _au_proc_ * prev
Definition process.h:186
size_t proc_mem_heap
Definition process.h:175
uint64_t _main_stack_
Definition process.h:136
list_t * waitlist
Definition process.h:173
AuVFSNode * fds[FILE_DESC_PER_PROCESS]
Definition process.h:163
AuVFSNode * file
Definition process.h:167
uint64_t prev_sample_time_us
Definition process.h:144
uint8_t state
Definition process.h:129
uint64_t _image_size_
Definition process.h:134
size_t proc_heapmem_len
Definition process.h:176
Definition process.h:103
uint16_t num_sgid
Definition process.h:108
UID_NUM uid
Definition process.h:105
uint8_t caps
Definition process.h:104
GID_NUM sgid[AURORA_MAX_GROUPS]
Definition process.h:107
GID_NUM gid
Definition process.h:106
Definition x86_64_sched.h:118
Definition list.h:46
Definition mutex.h:40
Definition spinlock.h:37
Definition process.h:115
uint64_t window_runtime_us
Definition process.h:119
int proc_id
Definition process.h:116
char name[16]
Definition process.h:117
uint32_t num_threads
Definition process.h:120
uint32_t cpu_usage
Definition process.h:122
uint64_t total_runtime_us
Definition process.h:118
uint32_t num_file_opened
Definition process.h:121
#define UID_NUM
Definition user.h:35