/*
 * cube.h
 *
 * Defines iPSC specific structures and constants for programming
 * the cube.
 *
 * cube.h 6.3 89/06/02 09:13:19
 *
 * @(#)Version 3.0 SIM
 */

/*
 * First number in the Force type range
 */
#define FORCE_TYPE	0x40000000	/* 1073741824 decimal */

#define HOST		myhost()
#define NAMELEN		16
#define NUMTTYS	4

extern long	csendrecv();
extern long	cubeinfo();
extern long	ginv();
extern long	gray();
extern long	infocount();
extern long	infonode();
extern long	infopid();
extern long	infotype();
extern long	iprobe();
extern long	irecv();
extern long	isend();
extern long	isendrecv();
extern long	masktrap();
extern unsigned long mclock();
extern long	msgdone();
extern long	myhost();
extern long	mynode();
extern long	mypid();
extern long	nodedim();
extern long	numnodes();
extern long	iodone();
extern long	iomode();
extern long	iseof();
extern long	lseek();
extern long	lsize();
extern long	restrictvol();
extern long	_attachcube();
extern long	_cprobe();
extern long	_cread();
extern long	_crecv();
extern long	_csend();
extern long	_csendrecv();
extern long	_cwrite();
extern long	_cubeinfo();
extern long	_flick();
extern long	_flushmsg();
extern long	_gcol();
extern long	_gdhigh();
extern long	_gdlow();
extern long	_gdprod();
extern long	_gdsum();
extern long	_getcube();
extern long	_giand();
extern long	_gihigh();
extern long	_gilow();
extern long	_ginv();
extern long	_gior();
extern long	_giprod();
extern long	_gisum();
extern long	_gixor();
extern long	_gland();
extern long	_glor();
extern long	_glxor();
extern long	_gopf();
extern long	_gray();
extern long	_gsendx();
extern long	_gshigh();
extern long	_gslow();
extern long	_gsprod();
extern long	_gssum();
extern long	_gsync();
extern long	_handler();
extern long	_hrecv();
extern long	_hsend();
extern long	_hsendrecv();
extern long	_infocount();
extern long	_infonode();
extern long	_infopid();
extern long	_infotype();
extern long	_iodone();
extern long	_iomode();
extern long	_iowait();
extern long	_iprobe();
extern long	_iread();
extern long	_irecv();
extern long	_isend();
extern long	_isendrecv();
extern long	_iseof();
extern long	_iwrite();
extern long	_killcube();
extern long	_killproc();
extern long	_killsyslog();
extern long	_led();
extern long	_load();
extern long	_masktrap();
extern unsigned long _mclock();
extern long	_msgcancel();
extern long	_msgdone();
extern long	_msgwait();
extern long	_myhost();
extern long	_mynode();
extern long	_mypid();
extern long	_newserver();
extern long	_nodedim();
extern long	_numnodes();
extern long	_relcube();
extern long	_restrictvol();
extern long	_setiomode();
extern long	_setpid();
extern long	_setsyslog();
extern long	_waitall();
extern long	_waitone();
#define _HTOCC HTOCC
#define _HTOCS HTOCS
#define _HTOCL HTOCL
#define _HTOCF HTOCF
#define _HTOCD HTOCD
#define _CTOHC CTOHC
#define _CTOHS CTOHS
#define _CTOHL CTOHL
#define _CTOHF CTOHF
#define _CTOHD CTOHD
#define _createstruc createstruc
#define _relstruc relstruc


/*
 * Structure used with cubeinfo()
 */

struct cubetable {
	char	cubename[NAMELEN];	/* Name of cube. 		*/
	char	username[NAMELEN];	/* Name of user. 		*/
	char	srmname[NAMELEN];	/* Name of system resource man- */
					/* ager where cube is attached.	*/
	char	hostname[NAMELEN];	/* Name of host machine	where	*/
					/* getcube was invoked.  Name 	*/
					/* is either the remote system 	*/
					/* name or srmname.		*/
	char	tty[NAMELEN];		/* tty where getcube was invoked. */
	char	cubetype[NAMELEN];	/* Type of this subcube.	*/
	char	cindex[NAMELEN];	/* Char of index into 		*/
					/* cubetable.			*/
	char	ttys[NUMTTYS][NAMELEN];	/* Used for attached ttys.	*/
					/* A user logged into the same	*/
					/* host on different ttys may	*/
					/* be attached to the same cube */
					/* from each tty.  Up to 4 ttys */
					/* may be attached to the same	*/
					/* cube.  Strings for attached  */
					/* ttys are of the format '\0'	*/
					/* for no tty and "/dev/tty"	*/
					/* for valid ttys.		*/
};

/*
 * Structure used with get_param()
 */

struct i_param {
	char	*keyword;		/* The ASCII string to match in     */
					/* the cube configuration file.     */
	char	keytype;		/* Type of the keyword: s (string), */
					/* c (character), or i (integer).   */

	union{
		int	keyint;
		char	keychar;
		char	*keystr;
	} keyvalue;			/* Holds value associated with the  */
					/* keyword in the config file if    */
					/* found, otherwise it is undefined.*/
};

/*
 * Stack structure for a handler.
 *
 * To access the process stack within a handler, generate a pointer
 * to the first argument of the handler and use it with this structure.
 * 
 * Example:
 *
 * exception_handler(error_code)
 *	unsigned short error_code;
 * {
 *	struct handler_stack *hs;
 *
 *	hs = (struct handler_stack *)&error_code;
 *	printf("Exception at %x\n", hs->eip);
 *	exit(1);
 * }
 */

struct handler_stack {
	long		arg1;		/* First handler argument	*/
	long		arg2;		/* Second handler argument	*/
	long		arg3;		/* Third handler argument	*/
	long		arg4;		/* Fourth handler argument	*/
	long		edi;		/* EDI register			*/
	long		esi;		/* ESI register			*/
	long		ebp;		/* EBP register			*/
	long		reserved1;	/* points to reserved2		*/
	long		ebx;		/* EBX register			*/
	long		edx;		/* EDX register			*/
	long		ecx;		/* ECX register			*/
	long		eax;		/* EAX register			*/
	long		reserved2;	/* System scratch area,		*/
	long		reserved3;	/* contains copies of		*/
	long		reserved4;	/* the arguments		*/
	long		reserved5;	/* 				*/
	long		reserved6;	/* handler address		*/
	long		eip;		/* EIP register, return address	*/
	long		cs;		/* Code segment register	*/
	long		eflags;		/* Flags register		*/
	long		stack[1];	/* Process stack at interrupt	*/
};

	/*  iPSC/2 error codes */

#ifdef NO_ERRNO 
#define F_PSCERR 150
#define EQDRVERR	(F_PSCERR+0)	/* Internal driver error */
#define EQPBUF		(F_PSCERR+1)	/* Invalid buffer pointer */
#define EQBLEN		(F_PSCERR+2)	/* Buffer length exceeds allocation */
#define EQLEN		(F_PSCERR+3)	/* Invalid length */
#define EQTIME		(F_PSCERR+4)	/* Time limit exceeded */
#define EQMSGLONG	(F_PSCERR+5)	/* Received message too long for buffer */
#define EQPID		(F_PSCERR+6)	/* Invalid pid */
#define EQNODE		(F_PSCERR+7)	/* Invalid node */
#define EQTYPE		(F_PSCERR+8)	/* Invalid type */
#define EQMID		(F_PSCERR+9)	/* Invalid message id */
#define EQHND		(F_PSCERR+10)	/* Invalid handler type */
#define EQNOPROC	(F_PSCERR+11)	/* Out of process slots */
#define EQUSEPID	(F_PSCERR+12)	/* Pid already in use */
#define EQNOACT		(F_PSCERR+13)	/* No active process */
#define EQBADFIL	(F_PSCERR+14)	/* Invalid object file */
#define EQPARAM		(F_PSCERR+15)	/* Invalid parameter */
#define EQPFIL		(F_PSCERR+16)	/* Invalid file name pointer */
#define EQPCNODE	(F_PSCERR+17)	/* Invalid cnode pointer */
#define EQPCPID		(F_PSCERR+18)	/* Invalid cpid pointer */
#define EQPCCODE	(F_PSCERR+19)	/* Invalid ccode pointer */
#define EQPRIV		(F_PSCERR+20)	/* Privileged operation */
#define EQMEM		(F_PSCERR+21)	/* Not enough memory */
#define EQINVREC	(F_PSCERR+22)	/* Invalid loader record */
#define EQMSG		(F_PSCERR+23)	/* Invalid loader message */
#define EQNOMID		(F_PSCERR+24)	/* Too many requests */
#define EQSET		(F_PSCERR+25)	/* Pid already set */
#define EQNOSET		(F_PSCERR+26)	/* No pid defined */
#define EQCUBETABFULL	(F_PSCERR+27)	/* Internal cube usage limit */
#define EQCUBEEXISTS	(F_PSCERR+28)	/* Cubename already exists */
#define EQCUBENOTEXIST	(F_PSCERR+29)	/* Cubename does not exist */
#define EQCUBENOTATTCH	(F_PSCERR+30)	/* There is no attached cube */
#define EQUSOCK		(F_PSCERR+31)	/* Comm server out of unix sockets */
#define EQNETSOCK	(F_PSCERR+32)	/* Comm server out of net sockets */
#define EQTTY		(F_PSCERR+33)	/* Comm server out of ttys */
#define EQNOCUBES	(F_PSCERR+34)	/* There are no cubes allocated */
#define EQCUBENAMELEN	(F_PSCERR+35)	/* Cube name longer than 15 characters */
#define EQHOSTNAMELEN	(F_PSCERR+36)	/* Host name longer than 15 characters */
#define EQTYPENAMELEN	(F_PSCERR+37)	/* Cube type longer than 15 characters */
#define EQBADGLOBAL	(F_PSCERR+38)	/* Global value invalid */
#define EQRCSBUSY	(F_PSCERR+39)	/* Remote comm server busy, try again later */
#define EQINCMPREAD	(F_PSCERR+40)	/* Did not read header specified bytes */
#define EQNOCUBE	(F_PSCERR+41)	/* Cubetype not found */
#define EQLIFEBUSY	(F_PSCERR+42)	/* Internal cube usage limit */
#define EQNOCOMMSER	(F_PSCERR+43)	/* Commser not responding */
#define EQUSM		(F_PSCERR+44)	/* Invalid diagnostic channel usm id */
#define EQDIM		(F_PSCERR+45)	/* Invalid dimension */
#define EQMODE		(F_PSCERR+46)	/* Invalid diagnostic channel mode */
#define EQSTATUS	(F_PSCERR+47)	/* Invalid diagnostic channel status */
#define EQNOLL		(F_PSCERR+48)	/* Lifeline not responding */
#define EQBADNODE	(F_PSCERR+49)	/* Node not responding */
#define EQUSEVX		(F_PSCERR+50)	/* Vector extension in use by another process */
#define EQNOSRM		(F_PSCERR+51)	/* No SRM that matched your request was found */
#define EQMSGSHORT	(F_PSCERR+52)	/* Received message too short for buffer */
#define EQNOSYSLOG	(F_PSCERR+53)	/* No active syslog exists */
#define EQSYSLOG	(F_PSCERR+54)	/* Active syslog exists */
#define EQLOGFAIL	(F_PSCERR+55)	/* Cannot start syslog process */
#define EQBIGSYS	(F_PSCERR+56)	/* System too large for loading */
#define EQRRTTY		(F_PSCERR+57)	/* Cannot read from a remote terminal */
#define EQFSERVFAIL	(F_PSCERR+58)	/* Cannot start fserver process */
#define ECFPS		(F_PSCERR+59)	/* Seek to different file pointers */
#define ENFPS		(F_PSCERR+60)	/* Different file pointers */
#define EMIXIO		(F_PSCERR+61)	/* Mixed file operations */
#define EIMODE		(F_PSCERR+62)	/* Bad io mode number */
#define ESETIO		(F_PSCERR+63)	/* File is not synchronized */
#define ESRMIO		(F_PSCERR+64)	/* Not supported on the SRM */
#endif

