toaruos/kernel/include/process.h

141 lines
4.1 KiB
C
Raw Normal View History

2011-12-07 20:59:08 -06:00
/* vim: tabstop=4 shiftwidth=4 noexpandtab
*/
#ifndef PROCESS_H
#define PROCESS_H
2012-02-05 14:16:59 -06:00
//#include <system.h>
2011-12-07 20:59:08 -06:00
#include <tree.h>
#include <signal.h>
2012-02-05 14:16:59 -06:00
#include <task.h>
2011-12-07 20:59:08 -06:00
#define KERNEL_STACK_SIZE 0x8000
2011-12-07 20:59:08 -06:00
typedef signed int pid_t;
typedef unsigned int user_t;
typedef unsigned char status_t;
#define USER_ROOT_UID (user_t)0
2011-12-07 20:59:08 -06:00
/* Unix waitpid() options */
enum wait_option{
WCONTINUED,
WNOHANG,
WUNTRACED
};
/* x86 task */
typedef struct thread {
uintptr_t esp; /* Stack Pointer */
uintptr_t ebp; /* Base Pointer */
uintptr_t eip; /* Instruction Pointer */
2013-04-16 00:03:23 -07:00
uint8_t fpu_enabled;
2013-04-15 23:23:56 -07:00
uint8_t fp_regs[512];
2012-10-21 20:17:47 -07:00
2012-12-10 20:28:31 -08:00
uint8_t padding[32]; /* I don't know */
2011-12-07 20:59:08 -06:00
page_directory_t * page_directory; /* Page Directory */
} thread_t;
/* Portable image struct */
typedef struct image {
size_t size; /* Image size */
uintptr_t entry; /* Binary entry point */
uintptr_t heap; /* Heap pointer */
uintptr_t heap_actual; /* Actual heap location */
uintptr_t stack; /* Process kernel stack */
uintptr_t user_stack; /* User stack */
2012-02-08 02:40:44 -06:00
uintptr_t start;
uintptr_t shm_heap;
2011-12-07 20:59:08 -06:00
} image_t;
/* Resizable descriptor table */
typedef struct descriptor_table {
fs_node_t ** entries;
size_t length;
size_t capacity;
size_t refs;
2011-12-07 20:59:08 -06:00
} fd_table_t;
/* XXX */
#define SIG_COUNT 10
/* Signal Table */
typedef struct signal_table {
2012-02-12 18:47:01 -06:00
uintptr_t functions[NUMSIGNALS+1];
2011-12-07 20:59:08 -06:00
} sig_table_t;
/* Portable process struct */
typedef struct process {
2012-02-05 14:16:59 -06:00
pid_t id; /* Process ID (pid) */
char * name; /* Process Name */
char * description; /* Process description */
user_t user; /* Effective user */
int mask; /* Umask */
2013-03-18 21:52:45 -07:00
char ** cmdline;
pid_t group; /* Process thread group */
pid_t job; /* Process job group */
pid_t session; /* Session group */
2012-02-05 14:16:59 -06:00
thread_t thread; /* Associated task information */
tree_node_t * tree_entry; /* Process Tree Entry */
image_t image; /* Binary image information */
fs_node_t * wd_node; /* Working directory VFS node */
char * wd_name; /* Working directory path name */
2012-02-16 14:31:40 -06:00
fd_table_t * fds; /* File descriptor table */
2012-02-05 14:16:59 -06:00
status_t status; /* Process status */
sig_table_t signals; /* Signal table */
uint8_t finished; /* Status indicator */
uint8_t started;
uint8_t running;
2012-01-28 17:06:07 -06:00
struct regs * syscall_registers; /* Registers at interrupt */
list_t * wait_queue;
2012-02-05 14:16:59 -06:00
list_t * shm_mappings; /* Shared memory chunk mappings */
2012-02-08 02:40:44 -06:00
list_t * signal_queue; /* Queued signals */
thread_t signal_state;
char * signal_kstack;
node_t sched_node;
2012-11-30 18:26:47 -08:00
node_t sleep_node;
uint8_t is_tasklet;
2011-12-07 20:59:08 -06:00
} process_t;
2012-12-10 20:28:31 -08:00
typedef struct {
unsigned long end_tick;
unsigned long end_subtick;
process_t * process;
} sleeper_t;
2013-06-05 23:10:36 -07:00
void initialize_process_tree(void);
process_t * spawn_process(volatile process_t * parent);
2013-06-05 23:10:36 -07:00
void debug_print_process_tree(void);
process_t * spawn_init(void);
void set_process_environment(process_t * proc, page_directory_t * directory);
void make_process_ready(process_t * proc);
void make_process_reapable(process_t * proc);
2013-06-05 23:10:36 -07:00
uint8_t process_available(void);
process_t * next_ready_process(void);
uint8_t should_reap(void);
process_t * next_reapable_process(void);
uint32_t process_append_fd(process_t * proc, fs_node_t * node);
process_t * process_from_pid(pid_t pid);
2013-03-20 21:24:55 -07:00
process_t * process_get_first_child(process_t * process);
void delete_process(process_t * proc);
uint32_t process_move_fd(process_t * proc, int src, int dest);
2012-11-30 18:26:47 -08:00
int process_is_ready(process_t * proc);
2013-03-20 21:24:55 -07:00
void set_reaped(process_t * proc);
2012-12-10 20:28:31 -08:00
void wakeup_sleepers(unsigned long seconds, unsigned long subseconds);
void sleep_until(process_t * process, unsigned long seconds, unsigned long subseconds);
volatile process_t * current_process;
2011-12-07 20:59:08 -06:00
2013-03-18 21:52:45 -07:00
list_t * process_list;
typedef void (*tasklet_t) (void *, char *);
int create_kernel_tasklet(tasklet_t tasklet, char * name, void * argp);
2011-12-07 20:59:08 -06:00
#endif