2005-05-13 10:57:08 +02:00
|
|
|
/* This table has one slot per process. It contains all the process management
|
2005-05-03 17:35:52 +02:00
|
|
|
* information for each process. Among other things, it defines the text, data
|
|
|
|
* and stack segments, uids and gids, and various flags. The kernel and file
|
|
|
|
* systems have tables that are also indexed by process, with the contents
|
|
|
|
* of corresponding slots referring to the same process in all three.
|
|
|
|
*/
|
2005-07-14 17:16:12 +02:00
|
|
|
#include <timers.h>
|
2005-05-03 17:35:52 +02:00
|
|
|
|
|
|
|
EXTERN struct mproc {
|
|
|
|
struct mem_map mp_seg[NR_LOCAL_SEGS]; /* points to text, data, stack */
|
|
|
|
char mp_exitstatus; /* storage for status when process exits */
|
|
|
|
char mp_sigstatus; /* storage for signal # for killed procs */
|
|
|
|
pid_t mp_pid; /* process id */
|
endpoint-aware conversion of servers.
'who', indicating caller number in pm and fs and some other servers, has
been removed in favour of 'who_e' (endpoint) and 'who_p' (proc nr.).
In both PM and FS, isokendpt() convert endpoints to process slot
numbers, returning OK if it was a valid and consistent endpoint number.
okendpt() does the same but panic()s if it doesn't succeed. (In PM,
this is pm_isok..)
pm and fs keep their own records of process endpoints in their proc tables,
which are needed to make kernel calls about those processes.
message field names have changed.
fs drivers are endpoints.
fs now doesn't try to get out of driver deadlock, as the protocol isn't
supposed to let that happen any more. (A warning is printed if ELOCKED
is detected though.)
fproc[].fp_task (indicating which driver the process is suspended on)
became an int.
PM and FS now get endpoint numbers of initial boot processes from the
kernel. These happen to be the same as the old proc numbers, to let
user processes reach them with the old numbers, but FS and PM don't know
that. All new processes after INIT, even after the generation number
wraps around, get endpoint numbers with generation 1 and higher, so
the first instances of the boot processes are the only processes ever
to have endpoint numbers in the old proc number range.
More return code checks of sys_* functions have been added.
IS has become endpoint-aware. Ditched the 'text' and 'data' fields
in the kernel dump (which show locations, not sizes, so aren't terribly
useful) in favour of the endpoint number. Proc number is still visible.
Some other dumps (e.g. dmap, rs) show endpoint numbers now too which got
the formatting changed.
PM reading segments using rw_seg() has changed - it uses other fields
in the message now instead of encoding the segment and process number and
fd in the fd field. For that it uses _read_pm() and _write_pm() which to
_taskcall()s directly in pm/misc.c.
PM now sys_exit()s itself on panic(), instead of sys_abort().
RS also talks in endpoints instead of process numbers.
2006-03-03 11:20:58 +01:00
|
|
|
int mp_endpoint; /* kernel endpoint id */
|
2005-05-03 17:35:52 +02:00
|
|
|
pid_t mp_procgrp; /* pid of process group (used for signals) */
|
|
|
|
pid_t mp_wpid; /* pid this process is waiting for */
|
|
|
|
int mp_parent; /* index of parent process */
|
|
|
|
|
2005-05-31 11:50:51 +02:00
|
|
|
/* Child user and system times. Accounting done on child exit. */
|
|
|
|
clock_t mp_child_utime; /* cumulative user time of children */
|
|
|
|
clock_t mp_child_stime; /* cumulative sys time of children */
|
|
|
|
|
2005-05-03 17:35:52 +02:00
|
|
|
/* Real and effective uids and gids. */
|
|
|
|
uid_t mp_realuid; /* process' real uid */
|
|
|
|
uid_t mp_effuid; /* process' effective uid */
|
|
|
|
gid_t mp_realgid; /* process' real gid */
|
|
|
|
gid_t mp_effgid; /* process' effective gid */
|
|
|
|
|
|
|
|
/* File identification for sharing. */
|
|
|
|
ino_t mp_ino; /* inode number of file */
|
|
|
|
dev_t mp_dev; /* device number of file system */
|
|
|
|
time_t mp_ctime; /* inode changed time */
|
|
|
|
|
|
|
|
/* Signal handling information. */
|
|
|
|
sigset_t mp_ignore; /* 1 means ignore the signal, 0 means don't */
|
|
|
|
sigset_t mp_catch; /* 1 means catch the signal, 0 means don't */
|
2005-07-19 14:11:11 +02:00
|
|
|
sigset_t mp_sig2mess; /* 1 means transform into notify message */
|
2005-05-03 17:35:52 +02:00
|
|
|
sigset_t mp_sigmask; /* signals to be blocked */
|
|
|
|
sigset_t mp_sigmask2; /* saved copy of mp_sigmask */
|
2005-05-13 10:57:08 +02:00
|
|
|
sigset_t mp_sigpending; /* pending signals to be handled */
|
2005-05-03 17:35:52 +02:00
|
|
|
struct sigaction mp_sigact[_NSIG + 1]; /* as in sigaction(2) */
|
|
|
|
vir_bytes mp_sigreturn; /* address of C library __sigreturn function */
|
2006-05-11 16:57:23 +02:00
|
|
|
struct sigmsg mp_sigmsg; /* Save the details of the signal until the
|
|
|
|
* PM_UNPAUSE request is delivered.
|
|
|
|
*/
|
2005-07-14 17:16:12 +02:00
|
|
|
struct timer mp_timer; /* watchdog timer for alarm(2) */
|
2005-05-03 17:35:52 +02:00
|
|
|
|
|
|
|
/* Backwards compatibility for signals. */
|
|
|
|
sighandler_t mp_func; /* all sigs vectored to a single user fcn */
|
|
|
|
|
|
|
|
unsigned mp_flags; /* flag bits */
|
|
|
|
vir_bytes mp_procargs; /* ptr to proc's initial stack arguments */
|
|
|
|
struct mproc *mp_swapq; /* queue of procs waiting to be swapped in */
|
|
|
|
message mp_reply; /* reply message to be sent to one */
|
|
|
|
|
2006-05-11 16:57:23 +02:00
|
|
|
/* Communication with FS */
|
2006-05-15 14:06:19 +02:00
|
|
|
int mp_fs_call; /* Record the call for normal system calls */
|
|
|
|
int mp_fs_call2; /* Record the call for signals */
|
2006-05-11 16:57:23 +02:00
|
|
|
char *mp_exec_path; /* Path of executable */
|
|
|
|
vir_bytes mp_exec_path_len; /* Length of path (including nul) */
|
|
|
|
char *mp_exec_frame; /* Arguments */
|
|
|
|
vir_bytes mp_exec_frame_len; /* Length of arguments */
|
|
|
|
|
2005-07-01 19:58:29 +02:00
|
|
|
/* Scheduling priority. */
|
|
|
|
signed int mp_nice; /* nice is PRIO_MIN..PRIO_MAX, standard 0. */
|
|
|
|
|
2005-05-03 17:35:52 +02:00
|
|
|
char mp_name[PROC_NAME_LEN]; /* process name */
|
|
|
|
} mproc[NR_PROCS];
|
|
|
|
|
|
|
|
/* Flag values */
|
|
|
|
#define IN_USE 0x001 /* set when 'mproc' slot in use */
|
|
|
|
#define WAITING 0x002 /* set by WAIT system call */
|
|
|
|
#define ZOMBIE 0x004 /* set by EXIT, cleared by WAIT */
|
|
|
|
#define PAUSED 0x008 /* set by PAUSE system call */
|
|
|
|
#define ALARM_ON 0x010 /* set when SIGALRM timer started */
|
|
|
|
#define SEPARATE 0x020 /* set if file is separate I & D space */
|
|
|
|
#define TRACED 0x040 /* set if process is to be traced */
|
|
|
|
#define STOPPED 0x080 /* set if process stopped for tracing */
|
|
|
|
#define SIGSUSPENDED 0x100 /* set by SIGSUSPEND system call */
|
|
|
|
#define REPLY 0x200 /* set if a reply message is pending */
|
|
|
|
#define ONSWAP 0x400 /* set if data segment is swapped out */
|
|
|
|
#define SWAPIN 0x800 /* set if on the "swap this in" queue */
|
2005-05-13 10:57:08 +02:00
|
|
|
#define DONT_SWAP 0x1000 /* never swap out this process */
|
2005-07-19 14:11:11 +02:00
|
|
|
#define PRIV_PROC 0x2000 /* system process, special privileges */
|
2006-05-11 16:57:23 +02:00
|
|
|
#define PM_SIG_PENDING 0x4000 /* process got a signal while waiting for FS */
|
|
|
|
#define PARTIAL_EXEC 0x8000 /* Process got a new map but no content */
|
2005-05-03 17:35:52 +02:00
|
|
|
|
|
|
|
#define NIL_MPROC ((struct mproc *) 0)
|
2005-05-31 11:50:51 +02:00
|
|
|
|