#ifndef _JOVE_HAL_PROCESS_H #define _JOVE_HAL_PROCESS_H 1 #include "hal/memory.h" #include "hal/obj.h" #include "lib/rbtree.h" #include "api/process.h" #include "proc/ipc.h" #ifdef DEBUG_IPC #include "lib/printf.h" #define ipc_klogf(fmt, ...) kprintf("%s: " fmt, __func__, __VA_ARGS__) #else #define ipc_klogf(fmt, ...) #endif struct pcb_header { struct rbtree_node tree_node; struct pcb_header *sched_prev, *sched_next; size_t size; pid_t pid; jove_obj_t *rootdir; enum pcb_state state; intmax_t state_code; size_t block_until; struct port mailbox; void *ksp; }; typedef struct process_control_block pcb_t; jove_owned_obj_t *process_current(void); int pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj); int _pcb_new_arch(pcb_t *pcb); pcb_t *pcb_frompid(pid_t pid); pid_t pcb_getpid(pcb_t *pcb); jove_obj_t *pcb_getrootdir(pcb_t *pcb); jove_owned_obj_t *pcb_getpagedir(jove_obj_t *rootdir_obj); jove_owned_obj_t *pcb_getself(jove_obj_t *rootdir_obj); struct port *pcb_getport(pcb_t *pcb); enum pcb_state pcb_getstate(pcb_t *pcb); intmax_t pcb_getstatecode(pcb_t *pcb); void *pcb_getksp(pcb_t *pcb); void **pcb_getksp_ref(pcb_t *pcb); pcb_t *pcb_frompid(pid_t pid); int pcb_send(pcb_t *pcb, pid_t target, jove_owned_obj_t *subject, size_t timeout); int pcb_recv(pcb_t *pcb, pid_t target, jove_owned_obj_t *dest_obj, size_t timeout); physaddr_t pcb_get_syscall_stack(pcb_t *pcb); physaddr_t pcb_get_interrupt_stack(pcb_t *pcb); physaddr_t pcb_set_syscall_stack(pcb_t *pcb, physaddr_t page); physaddr_t pcb_set_interrupt_stack(pcb_t *pcb, physaddr_t page); void pcb_map_syscall_stack(pcb_t *pcb); void pcb_map_interrupt_stack(pcb_t *pcb); extern struct rbtree_node *pcb_tree; #endif