112 lines
2.5 KiB
C
112 lines
2.5 KiB
C
#ifndef _KERNEL_TASKING_PROC_H
|
|
#define _KERNEL_TASKING_PROC_H
|
|
|
|
#include <algo/dynamic_array.h>
|
|
#include <fs/vfs.h>
|
|
#include <io/tty/vconsole.h>
|
|
#include <libkern/atomic.h>
|
|
#include <libkern/lock.h>
|
|
#include <libkern/types.h>
|
|
#include <mem/kmemzone.h>
|
|
#include <mem/memzone.h>
|
|
#include <mem/vm_address_space.h>
|
|
#include <mem/vmm.h>
|
|
|
|
#define MAX_PROCESS_COUNT 1024
|
|
#define MAX_OPENED_FILES 16
|
|
|
|
struct blocker;
|
|
|
|
enum PROC_STATUS {
|
|
PROC_INVALID = 0,
|
|
PROC_ALIVE,
|
|
PROC_DEAD,
|
|
PROC_DYING,
|
|
PROC_ZOMBIE,
|
|
};
|
|
|
|
struct thread;
|
|
struct proc {
|
|
vm_address_space_t* address_space;
|
|
|
|
pid_t pid;
|
|
pid_t ppid;
|
|
pid_t pgid;
|
|
uint32_t prio;
|
|
uint32_t status;
|
|
struct thread* main_thread;
|
|
|
|
spinlock_t lock;
|
|
|
|
uid_t uid;
|
|
gid_t gid;
|
|
uid_t euid;
|
|
gid_t egid;
|
|
uid_t suid;
|
|
gid_t sgid;
|
|
|
|
file_t* proc_file;
|
|
path_t cwd;
|
|
file_descriptor_t* fds;
|
|
|
|
int exit_code;
|
|
|
|
bool is_kthread;
|
|
|
|
// Trace data
|
|
bool is_tracee;
|
|
};
|
|
typedef struct proc proc_t;
|
|
|
|
/**
|
|
* PROC FUNCTIONS
|
|
*/
|
|
pid_t proc_alloc_pid();
|
|
struct thread* thread_by_pid(pid_t pid);
|
|
|
|
int proc_init_storage();
|
|
int proc_setup(proc_t* p);
|
|
int proc_setup_with_uid(proc_t* p, uid_t uid, gid_t gid);
|
|
int proc_setup_vconsole(proc_t* p, vconsole_entry_t* vconsole);
|
|
int proc_fill_up_stack(proc_t* p, int argc, char** argv, char** env);
|
|
int proc_free(proc_t* p);
|
|
int proc_free_locked(proc_t* p);
|
|
|
|
struct thread* proc_alloc_thread();
|
|
struct thread* proc_create_thread(proc_t* p);
|
|
void proc_kill_all_threads(proc_t* p);
|
|
void proc_kill_all_threads_except(proc_t* p, struct thread* gthread);
|
|
|
|
/**
|
|
* KTHREAD FUNCTIONS
|
|
*/
|
|
|
|
int kthread_setup(proc_t* p);
|
|
int kthread_setup_regs(proc_t* p, void* entry_point);
|
|
void kthread_setup_segment_regs(proc_t* p);
|
|
int kthread_fill_up_stack(struct thread* thread, void* data);
|
|
|
|
int proc_load(proc_t* p, struct thread* main_thread, const char* path);
|
|
int proc_fork_from(proc_t* new_proc, struct thread* from_thread);
|
|
|
|
int proc_die(proc_t* p, int exit_code);
|
|
int proc_block_all_threads(proc_t* p, const struct blocker* blocker);
|
|
|
|
/**
|
|
* PROC FD FUNCTIONS
|
|
*/
|
|
|
|
int proc_chdir(proc_t* p, const char* path);
|
|
file_descriptor_t* proc_get_free_fd(proc_t* p);
|
|
file_descriptor_t* proc_get_fd(proc_t* p, size_t index);
|
|
int proc_get_fd_id(proc_t* proc, file_descriptor_t* fd);
|
|
int proc_copy_fd(file_descriptor_t* oldfd, file_descriptor_t* newfd);
|
|
|
|
/**
|
|
* PROC HELPER FUNCTIONS
|
|
*/
|
|
|
|
static ALWAYS_INLINE bool proc_is_su(proc_t* p) { return p->euid == 0; }
|
|
static ALWAYS_INLINE int proc_is_alive(proc_t* p) { return p->status == PROC_ALIVE; }
|
|
|
|
#endif // _KERNEL_TASKING_PROC_H
|