a.out.h
struct exec { /* a.out header */
int a_magic; /* magic number */
unsigned a_text; /* size of text segment */
unsigned a_data; /* size of initialized data */
unsigned a_bss; /* size of unitialized data */
unsigned a_syms; /* size of symbol table */
unsigned a_entry; /* entry point */
unsigned a_unused; /* not used */
unsigned a_flag; /* relocation info stripped */
};
#define A_MAGIC1 0407 /* normal */
#define A_MAGIC2 0410 /* read-only text */
#define A_MAGIC3 0411 /* separated I&D */
#define A_MAGIC4 0405 /* overlay */
struct nlist { /* symbol table entry */
char n_name[8]; /* symbol name */
int n_type; /* type flag */
unsigned n_value; /* value */
};
/* values for type flag */
#define N_UNDF 0 /* undefined */
#define N_ABS 01 /* absolute */
#define N_TEXT 02 /* text symbol */
#define N_DATA 03 /* data symbol */
#define N_BSS 04 /* bss symbol */
#define N_TYPE 037
#define N_REG 024 /* register name */
#define N_FN 037 /* file name symbol */
#define N_EXT 040 /* external bit, or'ed in */
#define FORMAT "%06o" /* to print a value */
ctype.h
#define _U 01
#define _L 02
#define _N 04
#define _S 010
#define _P 020
#define _C 040
#define _X 0100
extern char _ctype_[]; /* in /usr/src/libc/gen/ctype_.h */
#define isalpha(c) ((_ctype_+1)[c]&(_U|_L))
#define isupper(c) ((_ctype_+1)[c]&_U)
#define islower(c) ((_ctype_+1)[c]&_L)
#define isdigit(c) ((_ctype_+1)[c]&_N)
#define isxdigit(c) ((_ctype_+1)[c]&(_N|_X))
#define isspace(c) ((_ctype_+1)[c]&_S)
#define ispunct(c) ((_ctype_+1)[c]&_P)
#define isalnum(c) ((_ctype_+1)[c]&(_U|_L|_N))
#define isprint(c) ((_ctype_+1)[c]&(_P|_U|_L|_N))
#define iscntrl(c) ((_ctype_+1)[c]&_C)
#define isascii(c) ((unsigned)(c)<=0177)
#define toupper(c) ((c)-'a'+'A')
#define tolower(c) ((c)-'A'+'a')
#define toascii(c) ((c)&0177)
errno.h
/*
* Error codes
*/
#define EPERM 1
#define ENOENT 2
#define ESRCH 3
#define EINTR 4
#define EIO 5
#define ENXIO 6
#define E2BIG 7
#define ENOEXEC 8
#define EBADF 9
#define ECHILD 10
#define EAGAIN 11
#define ENOMEM 12
#define EACCES 13
#define EFAULT 14
#define ENOTBLK 15
#define EBUSY 16
#define EEXIST 17
#define EXDEV 18
#define ENODEV 19
#define ENOTDIR 20
#define EISDIR 21
#define EINVAL 22
#define ENFILE 23
#define EMFILE 24
#define ENOTTY 25
#define ETXTBSY 26
#define EFBIG 27
#define ENOSPC 28
#define ESPIPE 29
#define EROFS 30
#define EMLINK 31
#define EPIPE 32
/* math software */
#define EDOM 33
#define ERANGE 34
execargs.h
char **execargs = (char**)(-2);
pwd.h
struct passwd { /* see getpwent(3) */
char *pw_name;
char *pw_passwd;
int pw_uid;
int pw_gid;
int pw_quota;
char *pw_comment;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
saio.h
/*
* header file for standalone package
*/
/*
* io block: includes an
* inode, cells for the use of seek, etc,
* and a buffer.
*/
struct iob {
char i_flgs;
struct inode i_ino;
int i_unit;
daddr_t i_boff;
daddr_t i_cyloff;
off_t i_offset;
daddr_t i_bn;
char *i_ma;
int i_cc;
char i_buf[512];
};
#define F_READ 01
#define F_WRITE 02
#define F_ALLOC 04
#define F_FILE 010
/*
* dev switch
*/
struct devsw {
char *dv_name;
int (*dv_strategy)();
int (*dv_open)();
int (*dv_close)();
};
struct devsw devsw[];
/*
* request codes. Must be the same a F_XXX above
*/
#define READ 1
#define WRITE 2
#define NBUFS 4
char b[NBUFS][512];
daddr_t blknos[NBUFS];
#define NFILES 4
struct iob iob[NFILES];
/*
* Set to which 32Kw segment the code is physically running in.
* Must be set by the users main (or there abouts).
*/
int segflag;
signal.h
#define NSIG 17
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
#define SIGILL 4 /* illegal instruction (not reset when caught) */
#define SIGTRAP 5 /* trace trap (not reset when caught) */
#define SIGIOT 6 /* IOT instruction */
#define SIGEMT 7 /* EMT instruction */
#define SIGFPE 8 /* floating point exception */
#define SIGKILL 9 /* kill (cannot be caught or ignored) */
#define SIGBUS 10 /* bus error */
#define SIGSEGV 11 /* segmentation violation */
#define SIGSYS 12 /* bad argument to system call */
#define SIGPIPE 13 /* write on a pipe with no one to read it */
#define SIGALRM 14 /* alarm clock */
#define SIGTERM 15 /* software termination signal from kill */
int (*signal())();
#define SIG_DFL (int (*)())0
#define SIG_IGN (int (*)())1
sys/acct.h
/*
* Accounting structures
*/
typedef unsigned short comp_t; /* "floating pt": 3 bits base 8 exp, 13 bits fraction */
struct acct
{
char ac_comm[10]; /* Accounting command name */
comp_t ac_utime; /* Accounting user time */
comp_t ac_stime; /* Accounting system time */
comp_t ac_etime; /* Accounting elapsed time */
time_t ac_btime; /* Beginning time */
short ac_uid; /* Accounting user ID */
short ac_gid; /* Accounting group ID */
short ac_mem; /* average memory usage */
comp_t ac_io; /* number of disk IO blocks */
dev_t ac_tty; /* control typewriter */
char ac_flag; /* Accounting flag */
};
extern struct acct acctbuf;
extern struct inode *acctp; /* inode of accounting file */
#define AFORK 01 /* has executed fork, but no exec */
#define ASU 02 /* used super-user privileges */
sys/buf.h
/*
* Each buffer in the pool is usually doubly linked into 2 lists:
* the device with which it is currently associated (always)
* and also on a list of blocks available for allocation
* for other use (usually).
* The latter list is kept in last-used order, and the two
* lists are doubly linked to make it easy to remove
* a buffer from one list when it was found by
* looking through the other.
* A buffer is on the available list, and is liable
* to be reassigned to another disk block, if and only
* if it is not marked BUSY. When a buffer is busy, the
* available-list pointers can be used for other purposes.
* Most drivers use the forward ptr as a link in their I/O
* active queue.
* A buffer header contains all the information required
* to perform I/O.
* Most of the routines which manipulate these things
* are in bio.c.
*/
struct buf
{
int b_flags; /* see defines below */
struct buf *b_forw; /* headed by d_tab of conf.c */
struct buf *b_back; /* " */
struct buf *av_forw; /* position on free list, */
struct buf *av_back; /* if not BUSY*/
dev_t b_dev; /* major+minor device name */
unsigned b_bcount; /* transfer count */
union {
caddr_t b_addr; /* low order core address */
int *b_words; /* words for clearing */
struct filsys *b_filsys; /* superblocks */
struct dinode *b_dino; /* ilist */
daddr_t *b_daddr; /* indirect block */
} b_un;
daddr_t b_blkno; /* block # on device */
char b_xmem; /* high order core address */
char b_error; /* returned after I/O */
unsigned int b_resid; /* words not transferred after error */
};
extern struct buf buf[]; /* The buffer pool itself */
extern struct buf bfreelist; /* head of available list */
/*
* These flags are kept in b_flags.
*/
#define B_WRITE 0 /* non-read pseudo-flag */
#define B_READ 01 /* read when I/O occurs */
#define B_DONE 02 /* transaction finished */
#define B_ERROR 04 /* transaction aborted */
#define B_BUSY 010 /* not on av_forw/back list */
#define B_PHYS 020 /* Physical IO potentially using UNIBUS map */
#define B_MAP 040 /* This block has the UNIBUS map allocated */
#define B_WANTED 0100 /* issue wakeup when BUSY goes off */
#define B_AGE 0200 /* delayed write for correct aging */
#define B_ASYNC 0400 /* don't wait for I/O completion */
#define B_DELWRI 01000 /* don't write till block leaves available list */
#define B_TAPE 02000 /* this is a magtape (no bdwrite) */
#define B_PBUSY 04000
#define B_PACK 010000
/*
* special redeclarations for
* the head of the queue per
* device driver.
*/
#define b_actf av_forw
#define b_actl av_back
#define b_active b_bcount
#define b_errcnt b_resid
sys/callo.h
/*
* The callout structure is for
* a routine arranging
* to be called by the clock interrupt
* (clock.c) with a specified argument,
* in a specified amount of time.
* Used, for example, to time tab
* delays on typewriters.
*/
struct callo
{
int c_time; /* incremental time */
caddr_t c_arg; /* argument to routine */
int (*c_func)(); /* routine */
};
struct callo callout[NCALL];
sys/conf.h
/*
* Declaration of block device
* switch. Each entry (row) is
* the only link between the
* main unix code and the driver.
* The initialization of the
* device switches is in the
* file conf.c.
*/
extern struct bdevsw
{
int (*d_open)();
int (*d_close)();
int (*d_strategy)();
struct buf *d_tab;
} bdevsw[];
/*
* Character device switch.
*/
extern struct cdevsw
{
int (*d_open)();
int (*d_close)();
int (*d_read)();
char *(*d_write)();
int (*d_ioctl)();
int (*d_stop)();
struct tty *d_ttys;
} cdevsw[];
/*
* tty line control switch.
*/
extern struct linesw
{
int (*l_open)();
int (*l_close)();
int (*l_read)();
int (*l_write)();
int (*l_ioctl)();
int (*l_rint)();
int (*l_rend)();
int (*l_meta)();
int (*l_start)();
int (*l_modem)();
} linesw[];
sys/dir.h
#ifndef DIRSIZ
#define DIRSIZ 14
#endif
struct direct
{
ino_t d_ino;
char d_name[DIRSIZ];
};
sys/fblk.h
struct fblk
{
int df_nfree;
daddr_t df_free[NICFREE];
};
sys/file.h
/*
* One file structure is allocated
* for each open/creat/pipe call.
* Main use is to hold the read/write
* pointer associated with each open
* file.
*/
struct file
{
char f_flag;
char f_count; /* reference count */
struct inode *f_inode; /* pointer to inode structure */
union {
off_t f_offset; /* read/write character pointer */
struct chan *f_chan; /* mpx channel pointer */
} f_un;
};
extern struct file file[]; /* The file table itself */
/* flags */
#define FREAD 01
#define FWRITE 02
#define FPIPE 04
#define FMPX 010
#define FMPY 020
#define FMP 030
#define FKERNEL 040
sys/filsys.h
/*
* Structure of the super-block
*/
struct filsys {
unsigned short s_isize; /* size in blocks of i-list */
daddr_t s_fsize; /* size in blocks of entire volume */
short s_nfree; /* number of addresses in s_free */
daddr_t s_free[NICFREE];/* free block list */
short s_ninode; /* number of i-nodes in s_inode */
ino_t s_inode[NICINOD];/* free i-node list */
char s_flock; /* lock during free list manipulation */
char s_ilock; /* lock during i-list manipulation */
char s_fmod; /* super block modified flag */
char s_ronly; /* mounted read-only flag */
time_t s_time; /* last super block update */
/* remainder not maintained by this version of the system */
daddr_t s_tfree; /* total free blocks*/
ino_t s_tinode; /* total free inodes */
short s_m; /* interleave factor */
short s_n; /* " " */
char s_fname[6]; /* file system name */
char s_fpack[6]; /* file system pack name */
};
sys/ino.h
/*
* Inode structure as it appears on
* a disk block.
*/
struct dinode
{
unsigned short di_mode; /* mode and type of file */
short di_nlink; /* number of links to file */
short di_uid; /* owner's user id */
short di_gid; /* owner's group id */
off_t di_size; /* number of bytes in file */
char di_addr[40]; /* disk block addresses */
time_t di_atime; /* time last accessed */
time_t di_mtime; /* time last modified */
time_t di_ctime; /* time created */
};
#define INOPB 8 /* 8 inodes per block */
/*
* the 40 address bytes:
* 39 used; 13 addresses
* of 3 bytes each.
*/
sys/inode.h
/*
* The I node is the focus of all
* file activity in unix. There is a unique
* inode allocated for each active file,
* each current directory, each mounted-on
* file, text file, and the root. An inode is 'named'
* by its dev/inumber pair. (iget/iget.c)
* Data, from mode on, is read in
* from permanent inode on volume.
*/
#define NADDR 13
#define NINDEX 15
struct group {
short g_state;
char g_index;
char g_rot;
struct group *g_group;
struct inode *g_inode;
struct file *g_file;
short g_rotmask;
short g_datq;
struct chan *g_chans[NINDEX];
};
struct inode
{
char i_flag;
char i_count; /* reference count */
dev_t i_dev; /* device where inode resides */
ino_t i_number; /* i number, 1-to-1 with device address */
unsigned short i_mode;
short i_nlink; /* directory entries */
short i_uid; /* owner */
short i_gid; /* group of owner */
off_t i_size; /* size of file */
union {
struct {
daddr_t i_addr[NADDR]; /* if normal file/directory */
daddr_t i_lastr; /* last logical block read (for read-ahead) */
};
struct {
daddr_t i_rdev; /* i_addr[0] */
struct group i_group; /* multiplexor group file */
};
} i_un;
};
extern struct inode inode[]; /* The inode table itself */
struct inode *mpxip; /* mpx virtual inode */
/* flags */
#define ILOCK 01 /* inode is locked */
#define IUPD 02 /* file has been modified */
#define IACC 04 /* inode access time to be updated */
#define IMOUNT 010 /* inode is mounted on */
#define IWANT 020 /* some process waiting on lock */
#define ITEXT 040 /* inode is pure text prototype */
#define ICHG 0100 /* inode has been changed */
/* modes */
#define IFMT 0170000 /* type of file */
#define IFDIR 0040000 /* directory */
#define IFCHR 0020000 /* character special */
#define IFBLK 0060000 /* block special */
#define IFREG 0100000 /* regular */
#define IFMPC 0030000 /* multiplexed char special */
#define IFMPB 0070000 /* multiplexed block special */
#define ISUID 04000 /* set user id on execution */
#define ISGID 02000 /* set group id on execution */
#define ISVTX 01000 /* save swapped text even after use */
#define IREAD 0400 /* read, write, execute permissions */
#define IWRITE 0200
#define IEXEC 0100
sys/map.h
struct map
{
short m_size;
unsigned short m_addr;
};
struct map coremap[CMAPSIZ]; /* space for core allocation */
struct map swapmap[SMAPSIZ]; /* space for swap allocation */
sys/mount.h
/*
* Mount structure.
* One allocated on every mount.
* Used to find the super block.
*/
struct mount
{
dev_t m_dev; /* device mounted */
struct buf *m_bufp; /* pointer to superblock */
struct inode *m_inodp; /* pointer to mounted on inode */
} mount[NMOUNT];
sys/mpx.h
#define M 3
#define C 100
/*
* character Q structure
*/
struct clist
{
int c_cc;
int c_cf;
int c_cl;
};
struct chan
{
char cflag;
char m, c;
struct chan *dest;
struct clist ioq;
};
/* c flags */
#define BLOCK 01
struct line
{
char xbuf[24+2];
char rbuf[100+2];
char rseq;
char xseq;
char ackf;
char xflag;
char state;
char time;
int sum;
char *ip;
char *ep;
};
#define WWAIT 02
#define CRUN 04
#define RWAIT 010
#define ALLOC 020
#define DIS 040
#define DLY 0100
/*
* machine structure
*/
struct mach
{
char mflag;
char rchan;
char rcount;
char xchan;
char xcount;
struct clist ackq;
struct clist datq;
struct clist disq;
struct chan *chanp[128];
};
/* m flags */
#define RNEXT 01
#define MRUN 04
#define XNEXT 010
/*
* trace buffer
*/
#define TBSIZ 100
sys/mx.h
#define NGROUPS 10 /* number of mpx files permitted at one time */
#define NCHANS 20 /* number of channel structures */
#define NPORTS 30 /* number of channels to i/o ports */
#define CNTLSIZ 10
#define NLEVELS 4
#define NMSIZE 50 /* max size of mxlstn file name */
/*
* header returned on read of mpx
*/
struct rh {
short index;
short count;
short ccount;
};
/*
* head expected on write of mpx
*/
struct wh {
short index;
short count;
short ccount;
char *data;
};
struct mx_args {
char *m_name;
int m_cmd;
int m_arg[3];
};
#ifdef KERNEL
/*
* internal structure for channel
*/
struct chan {
short c_flags;
char c_index;
char c_line;
struct group *c_group;
struct file *c_fy;
struct tty *c_ttyp;
struct clist c_ctlx;
int c_pgrp;
struct tty *c_ottyp;
char c_oline;
union {
struct clist datq;
} cx;
union {
struct clist datq;
struct chan *c_chan;
} cy;
struct clist c_ctly;
};
struct schan {
short c_flags;
char c_index;
char c_line;
struct group *c_group;
struct file *c_fy;
struct tty *c_ttyp;
struct clist c_ctlx;
int c_pgrp;
};
/*
* flags
*/
#define INUSE 01
#define COPEN 02
#define XGRP 04
#define YGRP 010
#define WCLOSE 020
#define ISGRP 0100
#define BLOCK 0200
#define EOTMARK 0400
#define SIGBLK 01000
#define BLKMSG 01000
#define ENAMSG 02000
#define WFLUSH 04000
#define NMBUF 010000
#define PORT 020000
#define ALT 040000
#endif
/*
* mpxchan command codes
*/
#define MPX 5
#define MPXN 6
#define CHAN 1
#define JOIN 2
#define EXTR 3
#define ATTACH 4
#define CONNECT 7
#define DETACH 8
#define DISCON 9
#define DEBUG 10
#define NPGRP 11
#define CSIG 12
#define PACK 13
#define NDEBUGS 30
/*
* control channel message codes
*/
#define M_WATCH 1
#define M_CLOSE 2
#define M_EOT 3
#define M_OPEN 4
#define M_BLK 5
#define M_UBLK 6
#define DO_BLK 7
#define DO_UBLK 8
#define M_IOCTL 12
#define M_SIG 14
/*
* debug codes other than mpxchan cmds
*/
#define MCCLOSE 29
#define MCOPEN 28
#define ALL 27
#define SCON 26
#define MSREAD 25
#define SDATA 24
#define MCREAD 23
#define MCWRITE 22
sys/param.h
/*
* tunable variables
*/
#define NBUF 29 /* size of buffer cache */
#define NINODE 200 /* number of in core inodes */
#define NFILE 175 /* number of in core file structures */
#define NMOUNT 8 /* number of mountable file systems */
#define MAXMEM (64*32) /* max core per process - first # is Kw */
#define MAXUPRC 25 /* max processes per user */
#define SSIZE 20 /* initial stack size (*64 bytes) */
#define SINCR 20 /* increment of stack (*64 bytes) */
#define NOFILE 20 /* max open files per process */
#define CANBSIZ 256 /* max size of typewriter line */
#define CMAPSIZ 50 /* size of core allocation area */
#define SMAPSIZ 50 /* size of swap allocation area */
#define NCALL 20 /* max simultaneous time callouts */
#define NPROC 150 /* max number of processes */
#define NTEXT 40 /* max number of pure texts */
#define NCLIST 100 /* max total clist size */
#define HZ 60 /* Ticks/second of the clock */
#define TIMEZONE (5*60) /* Minutes westward from Greenwich */
#define DSTFLAG 1 /* Daylight Saving Time applies in this locality */
#define MSGBUFS 128 /* Characters saved from error messages */
#define NCARGS 5120 /* # characters in exec arglist */
/*
* priorities
* probably should not be
* altered too much
*/
#define PSWP 0
#define PINOD 10
#define PRIBIO 20
#define PZERO 25
#define NZERO 20
#define PPIPE 26
#define PWAIT 30
#define PSLEP 40
#define PUSER 50
/*
* signals
* dont change
*/
#define NSIG 17
/*
* No more than 16 signals (1-16) because they are
* stored in bits in a word.
*/
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt (rubout) */
#define SIGQUIT 3 /* quit (FS) */
#define SIGINS 4 /* illegal instruction */
#define SIGTRC 5 /* trace or breakpoint */
#define SIGIOT 6 /* iot */
#define SIGEMT 7 /* emt */
#define SIGFPT 8 /* floating exception */
#define SIGKIL 9 /* kill, uncatchable termination */
#define SIGBUS 10 /* bus error */
#define SIGSEG 11 /* segmentation violation */
#define SIGSYS 12 /* bad system call */
#define SIGPIPE 13 /* end of pipe */
#define SIGCLK 14 /* alarm clock */
#define SIGTRM 15 /* Catchable termination */
/*
* fundamental constants of the implementation--
* cannot be changed easily
*/
#define NBPW sizeof(int) /* number of bytes in an integer */
#define BSIZE 512 /* size of secondary block (bytes) */
/* BSLOP can be 0 unless you have a TIU/Spider */
#define BSLOP 2 /* In case some device needs bigger buffers */
#define NINDIR (BSIZE/sizeof(daddr_t))
#define BMASK 0777 /* BSIZE-1 */
#define BSHIFT 9 /* LOG2(BSIZE) */
#define NMASK 0177 /* NINDIR-1 */
#define NSHIFT 7 /* LOG2(NINDIR) */
#define USIZE 16 /* size of user block (*64) */
#define UBASE 0140000 /* abs. addr of user block */
#define NULL 0
#define CMASK 0 /* default mask for file creation */
#define NODEV (dev_t)(-1)
#define ROOTINO ((ino_t)2) /* i number of all roots */
#define SUPERB ((daddr_t)1) /* block number of the super block */
#define DIRSIZ 14 /* max characters per directory */
#define NICINOD 100 /* number of superblock inodes */
#define NICFREE 50 /* number of superblock free blocks */
#define INFSIZE 138 /* size of per-proc info for users */
#define CBSIZE 14 /* number of chars in a clist block */
#define CROUND 017 /* clist rounding: sizeof(int *) + CBSIZE - 1*/
/*
* Some macros for units conversion
*/
/* Core clicks (64 bytes) to segments and vice versa */
#define ctos(x) ((x+127)/128)
#define stoc(x) ((x)*128)
/* Core clicks (64 bytes) to disk blocks */
#define ctod(x) ((x+7)>>3)
/* inumber to disk address */
#define itod(x) (daddr_t)((((unsigned)x+15)>>3))
/* inumber to disk offset */
#define itoo(x) (int)((x+15)&07)
/* clicks to bytes */
#define ctob(x) (x<<6)
/* bytes to clicks */
#define btoc(x) ((((unsigned)x+63)>>6))
/* major part of a device */
#define major(x) (int)(((unsigned)x>>8))
/* minor part of a device */
#define minor(x) (int)(x&0377)
/* make a device number */
#define makedev(x,y) (dev_t)((x)<<8 | (y))
typedef struct { int r[1]; } * physadr;
typedef long daddr_t;
typedef char * caddr_t;
typedef unsigned int ino_t;
typedef long time_t;
typedef int label_t[6]; /* regs 2-7 */
typedef int dev_t;
typedef long off_t;
/*
* Machine-dependent bits and macros
*/
#define UMODE 0170000 /* usermode bits */
#define USERMODE(ps) ((ps & UMODE)==UMODE)
#define INTPRI 0340 /* Priority bits */
#define BASEPRI(ps) ((ps & INTPRI) != 0)
sys/pk.h
struct header {
char sync;
char ksize;
unsigned short sum;
char cntl;
char ccntl;
};
#define HDRSIZ 6
struct pack {
short p_state; /* line state */
short p_bits; /* mask for getepack */
short p_rsize; /* input packet size */
short p_xsize; /* output packet size */
struct header p_ihbuf; /* input header */
struct header p_ohbuf; /* output header */
char *p_rptr;
char p_mode;
char **p_ipool;
char p_xcount; /* # active output buffers */
char p_rcount;
char p_nout,p_tout;
char p_lpsize; /* log(psize/32) */
char p_timer;
char p_obusy;
char p_srxmit;
char p_rwindow; /* window size */
char p_swindow;
char p_msg; /* control msg */
char p_rmsg; /* repeated control msg */
char p_ps,p_pr; /* last packet sent, recv'd */
char p_rpr;
char p_nxtps; /* next output seq number */
char p_imap; /* bit map of input buffers */
char p_pscopy; /* newest output packet */
char *p_ob[8]; /* output buffers */
char *p_ib[8]; /* input buffers */
char p_os[8]; /* output buffer status */
char p_is[8]; /* input buffer status */
short p_osum[8]; /* output checksums */
short p_isum[8]; /* input checksums */
DSYSTEM;
};
#define CHECK 0125252
#define SYN 020
#define MOD8 7
#define ISCNTL(a) ((a & 0300)==0)
#define MIN(a,b) ((a<b)? a:b)
char next[8];
char mask[8];
int npbits;
int pkactive;
/*
* driver state
*/
#define DEAD 0
#define INITa 1
#define INITb 2
#define INITab 3
#define LIVE 010
#define RXMIT 020
#define RREJ 040
#define PDEBUG 0200
#define DRAINO 0400
#define WAITO 01000
#define DOWN 02000
#define RCLOSE 04000
#define BADFRAME 020000
/*
* io buffer states
*/
#define B_NULL 0
#define B_READY 1
#define B_SENT 2
#define B_RESID 010
#define B_COPY 020
#define B_MARK 040
#define B_SHORT 0100
/*
* control messages
*/
#define CLOSE 1
#define RJ 2
#define SRJ 3
#define RR 4
#define INITC 5
#define INITB 6
#define INITA 7
#define M_RJ 4
#define M_SRJ 010
#define M_RR 020
#define M_INITC 040
#define M_CLOSE 2
#define M_INITA 0200
#define M_INITB 0100
#define PKOPRI 31
#define PKIPRI 30
#define NPLINES 8
/*
* packet ioctl buf
*/
struct piocb {
unsigned t;
short psize;
short mode;
short state;
char window;
};
int pkdebug;
int pksizes[];
sys/pk.p
/*
* kernel level
*/
#ifdef KERNEL
#define PADDR ((struct pack *)tp->t_linep)
#define TURNOFF pkturnoff(tp)
#define UCOUNT u.u_count
#define S tp
#define P pk->p_ttyp
#define SDEF struct tty *tp
#define FS , tp
#define SIGNAL signal(pk->p_ttyp->t_pgrp, SIGPIPE)
#define TERROR pk->p_istate == R_ERROR
#define SETERROR u.u_error = EIO
#define OBUSY tp->t_state&BUSY
#define ODEAD ((tp->t_state&CARR_ON)==0)
char *getepack();
#define GETEPACK getepack(pk->p_bits)
#define FREEPACK(a,b) freepack(a, b)
#define q1 tp->t_rawq
#define q2 tp->t_canq
#define q3 tp->t_outq
#define LOCK s = spl6()
#define UNLOCK splx(s)
#define DSYSTEM struct tty *p_ttyp
#define ISYSTEM tp = pk->p_ttyp
#define SLEEP(a, b) sleep((caddr_t)a, b)
#define SLEEPNO (tp->t_chan!=NULL)
#define WAKEUP(a) wakeup((caddr_t)a)
#define IOMOVE(p, c, f) iomove(p, c, f)
#define PKGETPKT(p)
#define DTOM(a) dtom(a)
#include "../h/param.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/pk.h"
#include "../h/tty.h"
#include "../h/buf.h"
#include "../h/proc.h"
#endif
/*
* user level
*/
#ifdef USER
#define SLEEP(a, b)
#define SIGNAL
#define WAKEUP(a)
#define DSYSTEM int p_ifn, p_ofn
#define ISYSTEM
#define GETEPACK malloc(pk->p_xsize)
#define FREEPACK(a, b) free(a)
#define OBUSY 0
#define PKGETPKT(p) pkgetpack(p);
#define DTOM(a) 1;
#define S ipk, ibuf, icount
#define SDEF int icount; char *ibuf; struct pack *ipk
#define UCOUNT icount
#define IOMOVE(p, c, f) pkmove(p, ibuf, c, f) ; ibuf += c; UCOUNT -= c
#define PADDR ipk
#define TURNOFF
#define LOCK
#define UNLOCK
#define SETERROR
#define GENERROR(p, s)
#define PACKSIZE 64
#define WINDOWS 3
#define PKDEBUG(l, f, s) { extern Debug; if (Debug >= l) fprintf(stderr, f, s);}
#define PKASSERT(e, f, v) if (!(e)) {\
fprintf(stderr, "AERROR - (%s) ", "e");\
fprintf(stderr, f, v);\
pkfail();};
#endif
sys/prim.h
#define NOSLEEP 0400
#define FORCE 01000
#define NORM 02000
#define KEEP 04000
#define CLR 010000
int bwaiting,wcount;
char *getepack();
sys/proc.h
/*
* One structure allocated per active
* process. It contains all data needed
* about the process while the
* process may be swapped out.
* Other per process data (user.h)
* is swapped with the process.
*/
struct proc {
char p_stat;
char p_flag;
char p_pri; /* priority, negative is high */
char p_time; /* resident time for scheduling */
char p_cpu; /* cpu usage for scheduling */
char p_nice; /* nice for cpu usage */
short p_sig; /* signals pending to this process */
short p_uid; /* user id, used to direct tty signals */
short p_pgrp; /* name of process group leader */
short p_pid; /* unique process id */
short p_ppid; /* process id of parent */
short p_addr; /* address of swappable image */
short p_size; /* size of swappable image (clicks) */
caddr_t p_wchan; /* event process is awaiting */
struct text *p_textp; /* pointer to text structure */
struct proc *p_link; /* linked list of running processes */
int p_clktim; /* time to alarm clock signal */
};
extern struct proc proc[]; /* the proc table itself */
/* stat codes */
#define SSLEEP 1 /* awaiting an event */
#define SWAIT 2 /* (abandoned state) */
#define SRUN 3 /* running */
#define SIDL 4 /* intermediate state in process creation */
#define SZOMB 5 /* intermediate state in process termination */
#define SSTOP 6 /* process being traced */
/* flag codes */
#define SLOAD 01 /* in core */
#define SSYS 02 /* scheduling process */
#define SLOCK 04 /* process cannot be swapped */
#define SSWAP 010 /* process is being swapped out */
#define STRC 020 /* process is being traced */
#define SWTED 040 /* another tracing flag */
#define SULOCK 0100 /* user settable lock in core */
/*
* parallel proc structure
* to replace part with times
* to be passed to parent process
* in ZOMBIE state.
*/
struct xproc {
char xp_stat;
char xp_flag;
char xp_pri; /* priority, negative is high */
char xp_time; /* resident time for scheduling */
char xp_cpu; /* cpu usage for scheduling */
char xp_nice; /* nice for cpu usage */
short xp_sig; /* signals pending to this process */
short xp_uid; /* user id, used to direct tty signals */
short xp_pgrp; /* name of process group leader */
short xp_pid; /* unique process id */
short xp_ppid; /* process id of parent */
short xp_xstat; /* Exit status for wait */
time_t xp_utime; /* user time, this proc */
time_t xp_stime; /* system time, this proc */
};
sys/reg.h
/*
* Location of the users' stored
* registers relative to R0.
* Usage is u.u_ar0[XX].
*/
#define R0 (0)
#define R1 (-2)
#define R2 (-9)
#define R3 (-8)
#define R4 (-7)
#define R5 (-6)
#define R6 (-3)
#define R7 (1)
#define PC (1)
#define RPS (2)
#define TBIT 020 /* PS trace bit */
sys/seg.h
/*
* KT-11 addresses and bits.
*/
#define UISD ((physadr)0177600) /* first user I-space descriptor register */
#define UISA ((physadr)0177640) /* first user I-space address register */
#define UDSA ((physadr)0177660) /* first user D-space address register */
#define RO 02 /* access abilities */
#define RW 06
#define ED 010 /* extend direction */
#define TX 020 /* Software: text segment */
#define ABS 040 /* Software: absolute address */
/*
* structure used to address
* a sequence of integers.
*/
physadr ka6; /* 11/40 KISA6; 11/45 KDSA6 */
/*
* address to access 11/70 UNIBUS map
*/
#define UBMAP ((physadr)0170200)
sys/stat.h
struct stat
{
dev_t st_dev;
ino_t st_ino;
unsigned short st_mode;
short st_nlink;
short st_uid;
short st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
};
#define S_IFMT 0170000 /* type of file */
#define S_IFDIR 0040000 /* directory */
#define S_IFCHR 0020000 /* character special */
#define S_IFBLK 0060000 /* block special */
#define S_IFREG 0100000 /* regular */
#define S_IFMPC 0030000 /* multiplexed char special */
#define S_IFMPB 0070000 /* multiplexed block special */
#define S_ISUID 0004000 /* set user id on execution */
#define S_ISGID 0002000 /* set group id on execution */
#define S_ISVTX 0001000 /* save swapped text even after use */
#define S_IREAD 0000400 /* read permission, owner */
#define S_IWRITE 0000200 /* write permission, owner */
#define S_IEXEC 0000100 /* execute/search permission, owner */
sys/systm.h
/*
* Random set of variables
* used by more than one
* routine.
*/
char canonb[CANBSIZ]; /* buffer for erase and kill (#@) */
struct inode *rootdir; /* pointer to inode of root directory */
struct proc *runq; /* head of linked list of running processes */
int cputype; /* type of cpu =40, 45, or 70 */
int lbolt; /* time of day in 60th not in time */
time_t time; /* time in sec from 1970 */
/*
* Nblkdev is the number of entries
* (rows) in the block switch. It is
* set in binit/bio.c by making
* a pass over the switch.
* Used in bounds checking on major
* device numbers.
*/
int nblkdev;
/*
* Number of character switch entries.
* Set by cinit/tty.c
*/
int nchrdev;
int mpid; /* generic for unique process id's */
char runin; /* scheduling flag */
char runout; /* scheduling flag */
char runrun; /* scheduling flag */
char curpri; /* more scheduling */
int maxmem; /* actual max memory per process */
physadr lks; /* pointer to clock device */
daddr_t swplo; /* block number of swap space */
int nswap; /* size of swap space */
int updlock; /* lock for sync */
daddr_t rablock; /* block to be read ahead */
extern char regloc[]; /* locs. of saved user registers (trap.c) */
char msgbuf[MSGBUFS]; /* saved "printf" characters */
dev_t rootdev; /* device of the root */
dev_t swapdev; /* swapping device */
dev_t pipedev; /* pipe device */
extern int icode[]; /* user init code */
extern int szicode; /* its size */
dev_t getmdev();
daddr_t bmap();
struct inode *ialloc();
struct inode *iget();
struct inode *owner();
struct inode *maknode();
struct inode *namei();
struct buf *alloc();
struct buf *getblk();
struct buf *geteblk();
struct buf *bread();
struct buf *breada();
struct filsys *getfs();
struct file *getf();
struct file *falloc();
int uchar();
/*
* Instrumentation
*/
int dk_busy;
long dk_time[32];
long dk_numb[3];
long dk_wds[3];
long tk_nin;
long tk_nout;
/*
* Structure of the system-entry table
*/
extern struct sysent {
char sy_narg; /* total number of arguments */
char sy_nrarg; /* number of args in registers */
int (*sy_call)(); /* handler */
} sysent[];
sys/text.h
/*
* Text structure.
* One allocated per pure
* procedure on swap device.
* Manipulated by text.c
*/
struct text
{
short x_daddr; /* disk address of segment (relative to swplo) */
short x_caddr; /* core address, if loaded */
short x_size; /* size (clicks) */
struct inode *x_iptr; /* inode of prototype */
char x_count; /* reference count */
char x_ccount; /* number of loaded references */
char x_flag; /* traced, written flags */
};
extern struct text text[];
#define XTRC 01 /* Text may be written, exclusive use */
#define XWRIT 02 /* Text written into, must swap out */
#define XLOAD 04 /* Currently being read from file */
#define XLOCK 010 /* Being swapped in or out */
#define XWANT 020 /* Wanted for swapping */
sys/timeb.h
/*
* Structure returned by ftime system call
*/
struct timeb {
time_t time;
unsigned short millitm;
short timezone;
short dstflag;
};
sys/times.h
/*
* Structure returned by times()
*/
struct tms {
time_t tms_utime; /* user time */
time_t tms_stime; /* system time */
time_t tms_cutime; /* user time, children */
time_t tms_cstime; /* system time, children */
};
sys/tty.h
/*
* A clist structure is the head
* of a linked list queue of characters.
* The characters are stored in 4-word
* blocks containing a link and several characters.
* The routines getc and putc
* manipulate these structures.
*/
struct clist
{
int c_cc; /* character count */
char *c_cf; /* pointer to first char */
char *c_cl; /* pointer to last char */
};
/*
* A tty structure is needed for
* each UNIX character device that
* is used for normal terminal IO.
* The routines in tty.c handle the
* common code associated with
* these structures.
* The definition and device dependent
* code is in each driver. (kl.c dc.c dh.c)
*/
struct tc {
char t_intrc; /* interrupt */
char t_quitc; /* quit */
char t_startc; /* start output */
char t_stopc; /* stop output */
char t_eofc; /* end-of-file */
char t_brkc; /* input delimiter (like nl) */
};
struct tty
{
struct clist t_rawq; /* input chars right off device */
struct clist t_canq; /* input chars after erase and kill */
struct clist t_outq; /* output list to device */
int (* t_oproc)(); /* routine to start output */
int (* t_iproc)(); /* routine to start input */
struct chan *t_chan; /* destination channel */
caddr_t t_linep; /* aux line discipline pointer */
caddr_t t_addr; /* device address */
dev_t t_dev; /* device number */
short t_flags; /* mode, settable by ioctl call */
short t_state; /* internal state, not visible externally */
short t_pgrp; /* process group name */
char t_delct; /* number of delimiters in raw q */
char t_line; /* line discipline */
char t_col; /* printing column of device */
char t_erase; /* erase character */
char t_kill; /* kill character */
char t_char; /* character temporary */
char t_ispeed; /* input speed */
char t_ospeed; /* output speed */
union {
struct tc;
struct clist t_ctlq;
} t_un;
};
#define tun tp->t_un
/*
* structure of arg for ioctl
*/
struct ttiocb {
char ioc_ispeed;
char ioc_ospeed;
char ioc_erase;
char ioc_kill;
int ioc_flags;
};
#define TTIPRI 28
#define TTOPRI 29
#define CERASE '#' /* default special characters */
#define CEOT 004
#define CKILL '@'
#define CQUIT 034 /* FS, cntl shift L */
#define CINTR 0177 /* DEL */
#define CSTOP 023 /* Stop output: ctl-s */
#define CSTART 021 /* Start output: ctl-q */
#define CBRK 0377
/* limits */
#define TTHIWAT 100
#define TTLOWAT 50
#define TTYHOG 256
/* modes */
#define TANDEM 01
#define CBREAK 02
#define LCASE 04
#define ECHO 010
#define CRMOD 020
#define RAW 040
#define ODDP 0100
#define EVENP 0200
#define NLDELAY 001400
#define TBDELAY 006000
#define XTABS 006000
#define CRDELAY 030000
#define VTDELAY 040000
/* Hardware bits */
#define DONE 0200
#define IENABLE 0100
/* Internal state bits */
#define TIMEOUT 01 /* Delay timeout in progress */
#define WOPEN 02 /* Waiting for open to complete */
#define ISOPEN 04 /* Device is open */
#define FLUSH 010 /* outq has been flushed during DMA */
#define CARR_ON 020 /* Software copy of carrier-present */
#define BUSY 040 /* Output in progress */
#define ASLEEP 0100 /* Wakeup when output done */
#define XCLUDE 0200 /* exclusive-use flag against open */
#define TTSTOP 0400 /* Output stopped by ctl-s */
#define HUPCLS 01000 /* Hang up upon last close */
#define TBLOCK 02000 /* tandem queue blocked */
#define DKCMD 04000 /* datakit command channel */
#define DKMPX 010000 /* datakit user-multiplexed mode */
#define DKCALL 020000 /* datakit dial mode */
#define DKLINGR 040000 /* datakit lingering close mode */
#define CNTLQ 0100000 /* interpret t_un as clist */
/*
* tty ioctl commands
*/
#define TIOCGETD (('t'<<8)|0)
#define TIOCSETD (('t'<<8)|1)
#define TIOCHPCL (('t'<<8)|2)
#define TIOCMODG (('t'<<8)|3)
#define TIOCMODS (('t'<<8)|4)
#define TIOCGETP (('t'<<8)|8)
#define TIOCSETP (('t'<<8)|9)
#define TIOCSETN (('t'<<8)|10)
#define TIOCEXCL (('t'<<8)|13)
#define TIOCNXCL (('t'<<8)|14)
#define TIOCFLUSH (('t'<<8)|16)
#define TIOCSETC (('t'<<8)|17)
#define TIOCGETC (('t'<<8)|18)
#define DIOCLSTN (('d'<<8)|1)
#define DIOCNTRL (('d'<<8)|2)
#define DIOCMPX (('d'<<8)|3)
#define DIOCNMPX (('d'<<8)|4)
#define DIOCSCALL (('d'<<8)|5)
#define DIOCRCALL (('d'<<8)|6)
#define DIOCPGRP (('d'<<8)|7)
#define DIOCGETP (('d'<<8)|8)
#define DIOCSETP (('d'<<8)|9)
#define DIOCLOSE (('d'<<8)|10)
#define DIOCTIME (('d'<<8)|11)
#define DIOCRESET (('d'<<8)|12)
#define FIOCLEX (('f'<<8)|1)
#define FIONCLEX (('f'<<8)|2)
#define MXLSTN (('x'<<8)|1)
#define MXNBLK (('x'<<8)|2)
sys/types.h
typedef long daddr_t; /* disk address */
typedef char * caddr_t; /* core address */
typedef unsigned int ino_t; /* i-node number */
typedef long time_t; /* a time */
typedef int label_t[6]; /* program status */
typedef int dev_t; /* device code */
typedef long off_t; /* offset in file */
/* selectors and constructor for device code */
#define major(x) (int)(((unsigned)x>>8))
#define minor(x) (int)(x&0377)
#define makedev(x,y) (dev_t)((x)<<8|(y))
sys/user.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 USIZE*64 bytes
* long; resides at virtual kernel
* loc 140000; 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 */
int u_fper; /* FP error register */
int u_fpsaved; /* FP regs saved for this proc */
struct {
int 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 */
int *u_ap; /* pointer to arglist */
union { /* syscall return values */
struct {
int r_val1;
int r_val2;
};
off_t r_off;
time_t r_time;
} u_r;
caddr_t u_base; /* base address for IO */
unsigned int u_count; /* bytes remaining for IO */
off_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 */
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 */
int u_uisa[16]; /* prototype of segmentation addresses */
int u_uisd[16]; /* prototype of segmentation descriptors */
struct file *u_ofile[NOFILE]; /* pointers to file structures of open files */
char u_pofile[NOFILE]; /* per-process flags of open files */
int u_arg[5]; /* arguments to current system call */
unsigned u_tsize; /* text size (clicks) */
unsigned u_dsize; /* data size (clicks) */
unsigned u_ssize; /* stack size (clicks) */
label_t u_qsav; /* label variable for quits and interrupts */
label_t u_ssav; /* label variable for swapping */
int u_signal[NSIG]; /* disposition of signals */
time_t u_utime; /* this process user time */
time_t u_stime; /* this process system time */
time_t u_cutime; /* sum of childs' utimes */
time_t u_cstime; /* sum of childs' stimes */
int *u_ar0; /* address of users saved R0 */
struct { /* profile arguments */
short *pr_base; /* buffer base */
unsigned pr_size; /* buffer size */
unsigned pr_off; /* pc offset */
unsigned 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 */
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;
} u_exdata;
char u_comm[DIRSIZ];
time_t u_start;
char u_acflag;
short u_fpflag; /* unused now, will be later */
short u_cmask; /* mask for file creation */
int u_stack[1];
/* kernel stack per user
* extends from u + USIZE*64
* backward not to reach here
*/
};
extern struct user u;
/* u_error codes */
#define EPERM 1
#define ENOENT 2
#define ESRCH 3
#define EINTR 4
#define EIO 5
#define ENXIO 6
#define E2BIG 7
#define ENOEXEC 8
#define EBADF 9
#define ECHILD 10
#define EAGAIN 11
#define ENOMEM 12
#define EACCES 13
#define EFAULT 14
#define ENOTBLK 15
#define EBUSY 16
#define EEXIST 17
#define EXDEV 18
#define ENODEV 19
#define ENOTDIR 20
#define EISDIR 21
#define EINVAL 22
#define ENFILE 23
#define EMFILE 24
#define ENOTTY 25
#define ETXTBSY 26
#define EFBIG 27
#define ENOSPC 28
#define ESPIPE 29
#define EROFS 30
#define EMLINK 31
#define EPIPE 32
#define EDOM 33
#define ERANGE 34
sys.s
indir = 0.
exit = 1.
fork = 2.
read = 3.
write = 4.
open = 5.
close = 6.
wait = 7.
creat = 8.
link = 9.
unlink = 10.
exec = 11.
chdir = 12.
time = 13.
mknod = 14.
chmod = 15.
chown = 16.
break = 17.
stat = 18.
lseek = 19.
getpid = 20.
mount = 21.
umount = 22.
setuid = 23.
getuid = 24.
stime = 25.
ptrace = 26.
alarm = 27.
fstat = 28.
pause = 29.
utime = 30.
smdate = 30.
stty = 31.
gtty = 32.
access = 33.
nice = 34.
sleep = 35.
sync = 36.
kill = 37.
csw = 38.
setpgrp = 39.
dup = 41.
pipe = 42.
times = 43.
profil = 44.
setgid = 46.
getgid = 47.
signal = 48.
acct = 51.
phys = 52.
lock = 53.
ioctl = 54.
reboot = 55.
mpx = 56.
setinf = 59.
umask = 60.
getinf = 60.
tp_defs.h
char mt[] = "/dev/mt0";
char tc[] = "/dev/tapx";
int flags = flu;
char mheader[] = "/usr/mdec/mboot";
char theader[] = "/usr/mdec/tboot";