Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - c/include/sysits.h
There are 9 other files named sysits.h in the archive. Click here to see a list.
/* <SYSITS.H> - ITS system definitions
**
**	Includes system call interface and system-dependent
**	constant definitions.
*/

/* To make a system call:
 *
 *	SYSCALL4("name",SC_IMC(0100),&arg1,&arg2,SC_VAL(&val))
 *
 * If x is of type int:
 *
 *	SC_CTL(&x) or SC_IMC(x) specify control bits.
 *	SC_ARG(&x) or &x or SC_IMM(x) specify arguments.
 *	SC_VAL(&x) gets a return value.
 *	SC_SIX("foo") spcifies a sixbit argument.
 *
 * It will -not- work to specify SC_ERR(&x)
 *
 * This returns an int: 0 or the ITS error code.
 *
 * The SYSCALLn_LOSE macros are the same, except they return void and
 * do a .LOSE if the call fails.
 * It seems better to use this in situations where the only possible
 * errors are in the logic of the program.  It should not be used if
 * there is the slightest possibility that someone could make use of an error
 * return.  Use your judgement.
 */

/* 4/1/88 Alan - Changed the name to SYSCALL (was SYSCAL) since I was
 * changing everything else incompatibly at the same time.  Its clear
 * that this currently won't inconvenience any working code, but it may
 * well be my last chance.
 */

#define SC_ARG(a) (a)			/* 0 - argument (for completeness) */
#define SC_SIX(name) ((int *) ((_KCCtype_char6 *) name)) /* sixbit arg */
#define SC_IMM(a) (((int)a)|(1<<27))	/* 1 - immediate argument */
#define SC_VAL(a) (((int)a)|(2<<27))	/* 2 - value */
#define SC_ERR(a) (((int)a)|(3<<27))	/* 3 - error return code */
#define SC_CTL(a) (((int)a)|(4<<27))	/* 4 - control */
#define SC_IMC(a) (((int)a)|(5<<27))	/* 5 - immediate control */
#define SC_LAST(a) (((int)a)|(1<<35))	/* Turns on SETZ bit */
#define SC_LERR(a) (SC_LAST(SC_ERR(a)))		/* Common combo */

#define SYSCALL0(name) _scall(3,SC_LERR(1),\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL1(name,a) _scall(4,SC_LERR(1),a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL2(name,a,b) _scall(5,SC_LERR(1),b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL3(name,a,b,c) _scall(6,SC_LERR(1),c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL4(name,a,b,c,d) _scall(7,SC_LERR(1),d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL5(name,a,b,c,d,e) _scall(8,SC_LERR(1),e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL6(name,a,b,c,d,e,f) _scall(9,SC_LERR(1),f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL7(name,a,b,c,d,e,f,g) _scall(10,SC_LERR(1),g,f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL8(name,a,b,c,d,e,f,g,h) _scall(11,SC_LERR(1),h,g,f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))

#define SYSCALL0_LOSE(name) _scalz(3,SC_LERR(1),\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL1_LOSE(name,a) _scalz(4,SC_LERR(1),a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL2_LOSE(name,a,b) _scalz(5,SC_LERR(1),b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL3_LOSE(name,a,b,c) _scalz(6,SC_LERR(1),c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL4_LOSE(name,a,b,c,d) _scalz(7,SC_LERR(1),d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL5_LOSE(name,a,b,c,d,e) _scalz(8,SC_LERR(1),e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL6_LOSE(name,a,b,c,d,e,f) _scalz(9,SC_LERR(1),f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL7_LOSE(name,a,b,c,d,e,f,g) _scalz(10,SC_LERR(1),g,f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
#define SYSCALL8_LOSE(name,a,b,c,d,e,f,g,h) _scalz(11,SC_LERR(1),\
			h,g,f,e,d,c,b,a,\
			*SC_SIX(name),SC_LAST(0))
/* Bytes.
 * I/O is a lot faster if the system is moving compatible size bytes.
 */

/* Creates a byte pointer of the given size that points to the first
 * byte in the word addressed by the given pointer.  This might not be
 * what you want, if you don't really know where the given pointer really
 * points.  But then, usually you really do...
 */
#define ALIGNED_BYTE_PTR(size, ptr)\
    (1 + ((char *) (((int) ((int *) (ptr))) | ((size) << 24) | 0440000000000)))

/* Creates a byte pointer of the given size that points to the bits
 * starting at the same place as those addressed by the given pointer.
 * Note that this only works for certain byte sizes because funny things
 * happen if you back up over the beginning of a word and then move forward
 * by a much smaller size.  It does work for converting between sizes 6, 7,
 * 8, 9, 18, and 36.
 */
#define BYTE_PTR_OF_SIZE(size, ptr)\
    (1 + ((char *) ((((int) ((ptr) - 1)) & 0770077777777) | ((size) << 24))))
/* Handy ITS constants.
 */

/* ITS_BIT(2,3) is bit 2.3 */
#define ITS_BIT(n,m) (1 << (((n) * 9) + (m) - 10))

#define FILENAME_SIZE 200		/* Enough for most purposes... */

/* Device types as determined by _dvtype() from .STATUS word: */
#define _DVDSK 0		/* non-blocking (default) */
#define _DVTTY 1		/* TTY */
#define _DVUSR 2		/* USR */

/* Open */

#define _DOOUT 1
#define _DOBLK 2
#define _DOIMG 4

#define _UAI 0
#define _UAO 1
#define _BAI 2
#define _BAO 3
#define _UII 4
#define _UIO 5
#define _BII 6
#define _BIO 7

/* Error codes */

#define _ENSDV	001	/* NO SUCH DEVICE */
#define _ENSIO	002	/* WRONG DIRECTION */
#define _ETMTR	003	/* TOO MANY TRANSLATIONS */
#define _ENSFL	004	/* FILE NOT FOUND */
#define _EFLDR	005	/* DIRECTORY FULL */
#define _EFLDV	006	/* DEVICE FULL */
#define _ENRDV	007	/* DEVICE NOT READY */
#define _ENADV	010	/* DEVICE NOT AVAILABLE */
#define _EBDFN	011	/* ILLEGAL FILE NAME */
#define _ENSMD	012	/* MODE NOT AVAILABLE */
#define _EEXFL	013	/* FILE ALREADY EXISTS */
#define _EBDCH	014	/* BAD CHANNEL NUMBER */
#define _ETMRG	015	/* TOO MANY ARGUMENTS */
#define _ENAPK	016	/* PACK NOT MOUNTED */
#define _ENADR	017	/* DIRECTORY NOT AVAIL */
#define _ENSDR	020	/* NON-EXISTENT DIRECTORY */
#define _ELCDV	021	/* LOCAL DEVICE ONLY */
#define _ESCO	022	/* SELF-CONTRADICTORY OPEN */
#define _ENAFL	023	/* FILE LOCKED */
#define _ETMDR	024	/* M.F.D. FULL */
#define _EMCHN	025	/* DEVICE NOT ASSIGNABLE TO THIS PROCESSOR */
#define _ERODV	026	/* DEVICE WRITE-LOCKED */
#define _ETMLK	027	/* LINK DEPTH EXCEEDED */
#define _ETFRG	030	/* TOO FEW ARGUMENTS */
#define _EROJB	031	/* CAN'T MODIFY JOB */
#define _EROPG	032	/* CAN'T GET THAT ACCESS TO PAGE */
#define _EBDRG	033	/* MEANINGLESS ARGS */
#define _EBDDV	034	/* WRONG TYPE DEVICE */
#define _ENSJB	035	/* NO SUCH JOB */
#define _EBOJ	036	/* VALID CLEAR OR STORED SET */
#define _ENACR	037	/* NO CORE AVAILABLE */
#define _ETOP	040	/* NOT TOP LEVEL */
#define _ENAPP	041	/* OTHER END OF PIPELINE GONE OR NOT OPEN */
#define _ENAJB	042	/* JOB GONE OR GOING AWAY */
#define _ENSCL	043	/* ILLEGAL SYSTEM CALL NAME */
#define _ENSCH	044	/* CHANNEL NOT OPEN */
#define _ENRBF	045	/* INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL */
#define _EBDFL	046	/* UNRECOGNIZABLE FILE */
#define _EBDLK	047	/* LINK TO NON-EXISTENT FILE */

/* CORBLK */

#define _CBWRT	0400000		/* TRY FOR WRITE ACCESS, OK IF CAN'T GET IT */
#define _CBRED	0200000		/* TRY FOR READ ACCESS, OK IF CAN'T GET IT */
#define _CBNDW	0100000		/* NEED WRITE ACCESS, FAIL IF CAN'T GET IT */
#define _CBPUB	0040000		/* MAKE PAGE PUBLIC, REQUIRES WRITE ACCESS */
#define _CBPRV	0020000		/* MAKE PAGE PRIVATE, REQUIRES WRITE ACCESS */
#define _CBNDR	0010000		/* NEED READ ACCESS, FAIL IF CAN'T GET IT */
#define _CBCPY	0004000		/* MAKE A COPY (DISK FILES ONLY) */
#define _CBLOK	0002000		/* LOCK PAGE IN CORE.  */
#define _CBULK	0001000		/* UNLOCK PAGE (ALLOW SWAP-OUT) */
#define _CBSLO	0000400		/* MAY ONLY RESIDE IN SLOWEST MEMORY */
#define _CBUSL	0000200		/* ALLOWS USE OF ANY MEMORY.  */

/* Job specs */

#define _JSELF	0777777		/* SELF (ALL <JOB> SPECS) */
#define _JSTVB	0777776		/* 11TV BUFFER (CORBLK) */
#define _JSNUL	0777775		/* NULL JOB (KLPERF) */
#define _JSALL	0777774		/* ALL JOBS (KLPERF) */
#define _JSNEW	0777773		/* FRESH PAGE (CORBLK) */
#define _JSABS	0777772		/* ABSOLUTE CORE (CORBLK) */
#define _JSNUM	0400000		/* THIS + JOB # => THAT JOB (ALL <JOB> */
				/* SPECS) */
#define _JSSIX	0400376		/* PDP6 IS USER NUMBER 376 */
#define _JSSUP	0400377		/* SUPERIOR (ALL <JOB> SPECS) */