diff --git a/kernel/process.h b/kernel/process.h new file mode 100644 index 0000000..37b7737 --- /dev/null +++ b/kernel/process.h @@ -0,0 +1,86 @@ +/* +Copyright (C) 2015-2019 The University of Notre Dame +This software is distributed under the GNU General Public License. +See the file LICENSE for details. +*/ + +#ifndef PROCESS_H +#define PROCESS_H + +#include "kernel/types.h" +#include "kernel/stats.h" +#include "list.h" +#include "pagetable.h" +#include "kobject.h" +#include "x86.h" +#include "fs.h" + +#define PROCESS_STATE_CRADLE 0 +#define PROCESS_STATE_READY 1 +#define PROCESS_STATE_RUNNING 2 +#define PROCESS_STATE_BLOCKED 3 +#define PROCESS_STATE_GRAVE 4 + +#define PROCESS_MAX_OBJECTS 32 +#define PROCESS_MAX_PID 1024 + +#define PROCESS_EXIT_NORMAL 0 +#define PROCESS_EXIT_KILLED 1 + +struct process { + struct list_node node; + int state; + int exitcode; + int exitreason; + struct pagetable *pagetable; + char *kstack; + char *kstack_top; + char *kstack_ptr; + struct kobject *ktable[PROCESS_MAX_OBJECTS]; + struct process_stats stats; + uint32_t pid; + uint32_t ppid; + uint32_t vm_data_size; + uint32_t vm_stack_size; + uint32_t waiting_for_child_pid; +}; + +void process_init(); + +struct process *process_create(); +void process_delete(struct process *p); +void process_launch(struct process *p); +void process_pass_arguments(struct process *p, int argc, char **argv); +void process_inherit(struct process *parent, struct process *child); +void process_selective_inherit(struct process *parent, struct process *child, int * fds, int fd_len); + +void process_stack_reset(struct process *p, unsigned size); +void process_kstack_reset(struct process *p, unsigned entry_point); +void process_kstack_copy(struct process *parent, struct process *child); + +int process_data_size_set(struct process *p, unsigned size); +int process_stack_size_set(struct process *p, unsigned size); + +int process_available_fd(struct process *p); +int process_object_max(struct process *p); + +void process_yield(); +void process_preempt(); +void process_exit(int code); +void process_dump(struct process *p); + +void process_wait(struct list *q); +void process_wakeup(struct list *q); +void process_wakeup_parent(struct list *q); +void process_wakeup_all(struct list *q); +void process_reap_all(); + +int process_kill(uint32_t pid); +int process_wait_child(uint32_t pid, struct process_info *info, int timeout); +int process_reap(uint32_t pid); + +int process_stats(int pid, struct process_stats *stat); + +extern struct process *current; + +#endif