#ifndef _sys_user_h_
#       define  _sys_user_h_

#include        <errno.h>
#include        <sys/fperr.h>
#include        <sys/dir.h>   /* struct direct для тек. каталога */
#include        <a.out.h>     /* NXOVL */

/*
 * 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 USIZE*64 bytes
 * long; resides at virtual kernel
 * loc 0140000; contains the system
 * stack per user; is cross referenced
 * with the proc structure for the
 * same process.
 */

#define EXCLOSE 01

struct  user
{
        label_t u_rsav;                 /* save info when exchanging stacks */
        short   u_dummy;                /* historical dreg; u_fperr is below */
        short   u_fpsaved;              /* FP regs saved for this proc */
        struct {
                short   u_fpsr;         /* FP status register */
                double  u_fpregs[6];    /* FP registers */
        } u_fps;
        char    u_segflg;               /* IO flag: 0:user D; 1:system; 2:user I */
        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 */
        short   *u_ap;                  /* pointer to arglist */
        union {                         /* syscall return values */
                struct  {
                        short   r_val1;
                        short   r_val2;
                };
                off_t   r_off;
                time_t  r_time;
        } u_r;
        caddr_t u_base;                 /* base address for IO */
        u_short u_count;                /* bytes remaining for IO */
        off_t   u_offset;               /* offset in file for IO */
        struct  inode   *u_cdir;        /* inode of current directory */
        struct  inode   *u_rdir;        /* root directory of current process */
        char    u_dbuf[DIRSIZ];         /* current pathname component */
        caddr_t u_dirp;                 /* pathname pointer */
        struct  direct  u_dent;         /* current directory entry */
        struct  inode   *u_pdir;        /* inode of parent directory of dirp */
        short   u_uisa[16];             /* segmentation address prototypes */
        short   u_uisd[16];             /* segmentation descriptor prototypes */
        struct  file *u_ofile[NOFILE];  /* pointers to file structures of open files */
        char    u_pofile[NOFILE];       /* per-process flags of open files */
        short   u_arg[7];               /* arguments to current system call */
        size_t  u_tsize;                /* text size (clicks) */
        size_t  u_dsize;                /* data size (clicks) */
        size_t  u_ssize;                /* stack size (clicks) */
        label_t u_qsav;                 /* saved regs for interrupted syscall */
        label_t u_ssav;                 /* saved regs for newproc/expand */
        short   (*u_signal[NSIG])();    /* disposition of signals */
        time_t  u_utime;                /* this process's user time */
        time_t  u_stime;                /* this process's system time */
        time_t  u_cutime;               /* sum of children's utimes */
        time_t  u_cstime;               /* sum of children's stimes */
        short   *u_ar0;                 /* address of user's saved R0 */
        struct {                        /* profile arguments */
                short   *pr_base;       /* buffer base */
                u_short pr_size;        /* buffer size */
                u_short pr_off;         /* pc offset */
                u_short pr_scale;       /* pc scaling */
        } u_prof;
        char    u_intflg;               /* catch intr from sys */
        char    u_sep;                  /* flag for I and D separation */
        struct  tty     *u_ttyp;        /* controlling tty pointer */
        dev_t   u_ttyd;                 /* controlling tty dev */
        struct {                        /* header of executable file */
                short   ux_mag;         /* magic number */
                u_short ux_tsize;       /* text size */
                u_short ux_dsize;       /* data size */
                u_short ux_bsize;       /* bss size */
                u_short ux_ssize;       /* symbol table size */
                u_short ux_entloc;      /* entry location */
                u_short ux_unused;
                u_short ux_relflg;
        } u_exdata;

        char    u_comm[DIRSIZ];
        time_t  u_start;
        char    u_acflag;
        char    u_usize;                /* USIZE */
        short   u_fpflag;               /* unused now, will be later */
        short   u_cmask;                /* mask for file creation */
#ifdef  UCB_LOGIN
        short   u_login;                /* login flag: 0 or ttyslot */
        char    u_crn[4];
#endif
        struct  u_ovd   {               /* automatic overlay data */
                short   uo_curov;       /* current overlay */
                short   uo_ovbase;      /* base of overlay area, seg. */
                u_short uo_dbase;       /* start of data, clicks */
                u_short uo_ov_offst[1+NXOVL];    /* overlay offsets in text */
                short   uo_nseg;        /* number of overlay seg. regs. */
                short   uo_maxov;       /* max overlay number */
                short   uo_xaddr;       /* current address of text segment */
        }       u_ovdata;
        struct  fperr   u_fperr;        /* floating point error save */
        char    u_eosys;                /* action on syscall termination */
        struct  buf *u_sbuf;            /* Buffer cache of symbolic name */
        int     u_slength;              /* Length of symbolic name */
        int     u_soffset;              /* Pointer into buffer */
        short   u_stack[1];
                                        /* kernel stack per user
                                         * extends from u + USIZE*64
                                         * backward not to reach here
                                         */
};

#define u_fmode u_fpflag

#ifdef  KERNEL
extern  struct  user    u;
#endif

/* u_eosys values */
#define JUSTRETURN      0
#define RESTARTSYS      1
#define SIMULATERTI     2

#endif  _sys_user_h_