1 /* user.h 4.8 81/04/28 */ 2 3 #ifdef KERNEL 4 #include "../h/pcb.h" 5 #include "../h/dmap.h" 6 #include "../h/vtimes.h" 7 #include "assym.s" 8 #else 9 #include <sys/pcb.h> 10 #include <sys/dmap.h> 11 #include <sys/vtimes.h> 12 #endif 13 /* 14 * The user structure. 15 * One allocated per process. 16 * Contains all per process data 17 * that doesn't need to be referenced 18 * while the process is swapped. 19 * The user block is UPAGES*NBPG bytes 20 * long; resides at virtual user 21 * loc 0x80000000-UPAGES*NBPG; contains the system 22 * stack per user; is cross referenced 23 * with the proc structure for the 24 * same process. 25 */ 26 27 #define SHSIZE 32 28 29 struct user 30 { 31 struct pcb u_pcb; 32 int u_arg[5]; /* arguments to current system call */ 33 label_t u_qsav; /* for non-local gotos on interrupts */ 34 char u_segflg; /* 0:user D; 1:system; 2:user I */ 35 char u_error; /* return error code */ 36 short u_uid; /* effective user id */ 37 short u_gid; /* effective group id */ 38 short u_ruid; /* real user id */ 39 short u_rgid; /* real group id */ 40 struct proc *u_procp; /* pointer to proc structure */ 41 int *u_ap; /* pointer to arglist */ 42 union { /* syscall return values */ 43 struct { 44 int R_val1; 45 int R_val2; 46 } u_rv; 47 #define r_val1 u_rv.R_val1 48 #define r_val2 u_rv.R_val2 49 off_t r_off; 50 time_t r_time; 51 } u_r; 52 caddr_t u_base; /* base address for IO */ 53 unsigned int u_count; /* bytes remaining for IO */ 54 off_t u_offset; /* offset in file for IO */ 55 struct inode *u_cdir; /* pointer to inode of current directory */ 56 struct inode *u_rdir; /* root directory of current process */ 57 char u_dbuf[DIRSIZ]; /* current pathname component */ 58 caddr_t u_dirp; /* pathname pointer */ 59 struct direct u_dent; /* current directory entry */ 60 struct inode *u_pdir; /* inode of parent directory of dirp */ 61 struct file *u_ofile[NOFILE]; /* pointers to file structures of open files */ 62 char u_pofile[NOFILE]; /* per-process flags of open files */ 63 #define EXCLOSE 01 /* auto-close on exec */ 64 label_t u_ssav; /* label variable for swapping */ 65 int (*u_signal[NSIG])(); /* disposition of signals */ 66 int u_code; /* ``code'' to trap */ 67 /* on SIGILL code passes compatibility mode fault address */ 68 /* on SIGFPE code passes more specific kind of floating point fault */ 69 int *u_ar0; /* address of users saved R0 */ 70 struct uprof { /* profile arguments */ 71 short *pr_base; /* buffer base */ 72 unsigned pr_size; /* buffer size */ 73 unsigned pr_off; /* pc offset */ 74 unsigned pr_scale; /* pc scaling */ 75 } u_prof; 76 char u_eosys; /* special action on end of syscall */ 77 char u_sep; /* flag for I and D separation */ 78 struct tty *u_ttyp; /* controlling tty pointer */ 79 dev_t u_ttyd; /* controlling tty dev */ 80 union { 81 struct { /* header of executable file */ 82 int Ux_mag; /* magic number */ 83 unsigned Ux_tsize; /* text size */ 84 unsigned Ux_dsize; /* data size */ 85 unsigned Ux_bsize; /* bss size */ 86 unsigned Ux_ssize; /* symbol table size */ 87 unsigned Ux_entloc; /* entry location */ 88 unsigned Ux_unused; 89 unsigned Ux_relflg; 90 } Ux_A; 91 char ux_shell[SHSIZE]; /* #! and name of interpreter */ 92 } u_exdata; 93 #define ux_mag Ux_A.Ux_mag 94 #define ux_tsize Ux_A.Ux_tsize 95 #define ux_dsize Ux_A.Ux_dsize 96 #define ux_bsize Ux_A.Ux_bsize 97 #define ux_ssize Ux_A.Ux_ssize 98 #define ux_entloc Ux_A.Ux_entloc 99 #define ux_unused Ux_A.Ux_unused 100 #define ux_relflg Ux_A.Ux_relflg 101 102 char u_comm[DIRSIZ]; 103 time_t u_start; 104 char u_acflag; 105 short u_fpflag; /* unused now, will be later */ 106 short u_cmask; /* mask for file creation */ 107 size_t u_tsize; /* text size (clicks) */ 108 size_t u_dsize; /* data size (clicks) */ 109 size_t u_ssize; /* stack size (clicks) */ 110 struct vtimes u_vm; /* stats for this proc */ 111 struct vtimes u_cvm; /* sum of stats for reaped children */ 112 struct dmap u_dmap; /* disk map for data segment */ 113 struct dmap u_smap; /* disk map for stack segment */ 114 struct dmap u_cdmap, u_csmap; /* shadows of u_dmap, u_smap, for 115 use of parent during fork */ 116 time_t u_outime; /* user time at last sample */ 117 size_t u_odsize, u_ossize; /* for (clumsy) expansion swaps */ 118 size_t u_vrpages[NOFILE]; /* number vread pages hanging on fd */ 119 int u_limit[8]; /* see <sys/limit.h> */ 120 #ifdef notdef 121 unsigned u_vsave; /* saved previous fault page number */ 122 #endif 123 int u_stack[1]; 124 125 /* 126 * kernel stack per user 127 * extends from u + UPAGES*512 128 * backward not to reach here 129 */ 130 /* SHOULD INSTEAD GROW STACK BACKWARDS ABOVE u. TOWARDS A VIRTUAL HOLE */ 131 }; 132 133 /* u_eosys values */ 134 #define JUSTRETURN 0 135 #define RESTARTSYS 1 136 #define SIMULATERTI 2 137 138 /* u_error codes */ 139 #include <errno.h> 140 141 #ifdef KERNEL 142 extern struct user u; 143 extern struct user swaputl; 144 extern struct user forkutl; 145 extern struct user xswaputl; 146 extern struct user xswap2utl; 147 extern struct user pushutl; 148 extern struct user vfutl; 149 #endif 150