#include <sys/pcb.h> #include <sys/dmap.h> #include <sys/vtimes.h> /* * The user structure. * One allocated per process. * Contains all per process data * that doesn't need to be referenced * while the process is swapped. * The user block is UPAGES*NBPG bytes * long; resides at virtual user * loc 0x80000000-UPAGES*NBPG; contains the system * stack per user; is cross referenced * with the proc structure for the * same process. */ #define SHSIZE 32 struct user { struct pcb u_pcb; int u_arg[5]; /* arguments to current system call */ label_t u_qsav; /* for non-local gotos on interrupts */ char u_segflg; /* 0:user D; 1:system; 2:user I */ #define SEGUDATA 0 #define SEGSYS 1 #define SEGUINST 2 char u_error; /* return error code */ short u_uid; /* effective user id */ short u_gid; /* effective group id */ short u_ruid; /* real user id */ short u_rgid; /* real group id */ struct proc *u_procp; /* pointer to proc structure */ int *u_ap; /* pointer to arglist */ union { /* syscall return values */ struct { int R_val1; int R_val2; } u_rv; #define r_val1 u_rv.R_val1 #define r_val2 u_rv.R_val2 time_t r_time; } u_r; caddr_t u_base; /* base address for IO */ unsigned int u_count; /* bytes remaining for IO */ llong_t u_offset; /* offset in file for IO */ struct inode *u_cdir; /* pointer to inode of current directory */ struct inode *u_rdir; /* root directory of current process */ struct fildes *u_ofile[NOFILE]; /* (pointers to) file descriptors */ label_t u_ssav; /* label variable for swapping */ int (*u_signal[NSIG])(); /* disposition of signals */ int u_code; /* ``code'' to trap */ /* on SIGILL code passes compatibility mode fault address */ /* on SIGFPE code passes more specific kind of floating point fault */ int *u_ar0; /* address of users saved R0 */ struct uprof { /* profile arguments */ short *pr_base; /* buffer base */ unsigned pr_size; /* buffer size */ unsigned pr_off; /* pc offset */ unsigned pr_scale; /* pc scaling */ } u_prof; dev_t u_ttydev; /* dev,ino of controlling tty */ ino_t u_ttyino; union { struct { /* header of executable file */ int Ux_mag; /* magic number */ unsigned Ux_tsize; /* text size */ unsigned Ux_dsize; /* data size */ unsigned Ux_bsize; /* bss size */ unsigned Ux_ssize; /* symbol table size */ unsigned Ux_entloc; /* entry location */ unsigned Ux_unused; unsigned Ux_relflg; } Ux_A; char ux_shell[SHSIZE]; /* #! and name of interpreter */ } u_exdata; #define ux_mag Ux_A.Ux_mag #define ux_tsize Ux_A.Ux_tsize #define ux_dsize Ux_A.Ux_dsize #define ux_bsize Ux_A.Ux_bsize #define ux_ssize Ux_A.Ux_ssize #define ux_entloc Ux_A.Ux_entloc #define ux_unused Ux_A.Ux_unused #define ux_relflg Ux_A.Ux_relflg char u_comm[14]; /* needs to be >= acct.ac_comm */ time_t u_start; char u_acflag; /* accounting + initial trust */ short u_cmask; /* mask for file creation */ clicks_t u_tsize; /* text size (clicks) */ clicks_t u_dsize; /* data size (clicks) */ clicks_t u_ssize; /* stack size (clicks) */ struct vtimes u_vm; /* stats for this proc */ struct vtimes u_cvm; /* sum of stats for reaped children */ struct dmap u_dmap; /* disk map for data segment */ struct dmap u_smap; /* disk map for stack segment */ struct dmap u_cdmap, u_csmap; /* shadows of u_dmap, u_smap, for use of parent during fork */ time_t u_outime; /* user time at last sample */ clicks_t u_odsize, u_ossize; /* for (clumsy) expansion swaps */ short u_labcheck; /* security algo. for this syscall */ short u_checkfd; /* file descriptor being checked */ short *u_pofilep; /* where to find safe bit */ int u_limit[8]; /* see <sys/vlimit.h> */ int u_nbadio; /* # IO operations on hungup streams */ char u_logname[8]; /* login name */ int u_stack[1]; /* * kernel stack per user * extends from u + UPAGES*512 * backward not to reach here */ }; /* u_error codes */ #include <errno.h> #ifdef KERNEL extern struct user u; extern struct user *swaputl; extern struct user *forkutl; extern struct user *xswaputl; extern struct user *xswap2utl; extern struct user *pushutl; extern struct user *prusrutl; #endif