#ifndef _KERNEL_PROC_PROC_H #define _KERNEL_PROC_PROC_H #include #include #include #include #include #include #include #include #include #if defined(__x86_64__) #include /* KSTACK_SIZE */ #include /* USTACK_SIZE */ #endif /* Process is ready to run */ #define PROC_READY 0 /* Process marked garbage collection */ #define PROC_DEAD 1 /* Process is suspended */ #define PROC_SUSPENDED 2 #define PROC_RESOURCES_MAX 1024 struct cpu; struct proc_mapping { struct list_node_link proc_mappings_link; uintptr_t paddr; uintptr_t vaddr; size_t size; }; struct proc { int pid; struct rb_node_link proc_tree_link; struct rb_node_link cpu_run_q_link; struct rb_node_link suspension_link; struct list_node_link reap_link; struct list_node_link* mappings; /* pd.lock implicitly protects this field */ struct proc_platformdata pdata; struct pd pd; spin_lock_t lock; struct cpu* cpu; atomic_int state; struct rb_node_link* resource_tree; atomic_int rids; struct proc_suspension_q* suspension_q; }; void proc_suspend (struct proc* proc, struct proc_suspension_q* sq); void proc_resume (struct proc* proc); void proc_sched (void* regs); void proc_kill (struct proc* proc, void* regs); bool proc_map (struct proc* proc, uintptr_t start_paddr, uintptr_t start_vaddr, size_t pages, uint32_t flags); bool proc_unmap (struct proc* proc, uintptr_t start_vaddr, size_t pages); struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf); void proc_init (void); #endif // _KERNEL_PROC_PROC_H