basekernel/kernel/process.h

87 lines
2.3 KiB
C

/*
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