Ultrix-3.1/sys/sys/maus.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

/*
 * SCCSID: @(#)maus.c	3.1	3/4/87
 */

#include <sys/types.h>
#include <sys/param.h>
#include <signal.h>
#include <sys/systm.h>
#include <sys/dir.h>
#include <errno.h>
#include <sys/user.h>
#include <sys/inode.h>
#include <sys/maus.h>
#include <sys/conf.h>
#include <sys/seg.h>
#include <sys/reg.h>
#include <sys/map.h>
/* #include <sys/sysinfo.h> */
/* #include <sys/sysmacros.h> */

#define	READM	0
#define	WRITEM	1
#define	RDWRM	2
#define	FREEM	3
#define	SWITM	4

/*
 * maus system call
 */

maus()
{
	register i, j;
	register	struct	inode	*ip;
	int min;
	extern uchar();

/*	sysinfo.maus++; */
	switch(i=u.u_ar0[R0]) {
	case READM:
	case WRITEM:
	case RDWRM:
#ifdef	UCB_SYMLINKS
		if((ip = namei(uchar, LOOKUP, 1)) == NULL)
#else	UCB_SYMLINKS
		if((ip = namei(uchar, LOOKUP)) == NULL)
#endif	UCB_SYMLINKS
			return;
		if(i == READM || i == RDWRM)
			access(ip, IREAD);
		if(i == WRITEM || i == RDWRM)
			access(ip, IWRITE);
		min = (minor(ip->i_rdev) - 8) & 0377;
		if(major(ip->i_rdev) != MEMDEV || min >= nmausent)
			u.u_error = EINVAL;
		iput(ip);
		if(u.u_error)
			return;
		for(j=0; u.u_msav[j].ms_uisd;)
			if(++j >= NMSAV) {
				u.u_error = EMFILE;
				return;
			}
		if(i == READM)
			i = RO;
		else
			i = RW;
		u.u_msav[j].ms_uisd = i | ABS | (mausmap[min].bsize-1)<<8;
		u.u_msav[j].ms_uisa = mausmap[min].boffset + mauscore;
		u.u_rval1 = j;
		return;

	case FREEM:
		if((j=u.u_arg[0]) >= NMSAV || u.u_msav[j].ms_uisd == 0) {
			u.u_error = EBADF;
			return;
		}
		u.u_msav[j].ms_uisd = 0;
		u.u_msav[j].ms_uisa = 0;
		return;

	case SWITM:
		if((j = u.u_arg[0]) != -1) {
			j = ((j >> 13) & 07) + 8 ;
			if((u.u_mbitm & (1 << (j-8))) == 0 && u.u_uisd[j]) {
				u.u_error = EINVAL;	/* vaddr illegal */
				return;
			}
		} else for(j=14; u.u_uisd[j];)
			if(--j < 8) {
				u.u_error = ENOMEM;	/* no reg left */
				return;
			}
		if(u.u_ar0[R1] == -1) {		/* disable case */
			u.u_uisd[j] = 0;
			u.u_uisa[j] = 0;
			if(sepid) {
				UISD->r[j] = 0;
				UISA->r[j] = 0;
			}
			j -= 8;
			if(u.u_sep == 0) {
				UISD->r[j] = 0;
				UISA->r[j] = 0;
				u.u_uisd[j] = 0;
				u.u_uisa[j] = 0;
			}
			u.u_mbitm &= ~(1 << j);
			return;
		}
		if((i = u.u_ar0[R1]) >= NMSAV || u.u_msav[i].ms_uisd == 0) {
			u.u_error = EINVAL;	/* mdes illegal */
			return;
		}
		u.u_uisd[j] = u.u_msav[i].ms_uisd;
		u.u_uisa[j] = u.u_msav[i].ms_uisa;
		if(sepid) {
			UISD->r[j] = u.u_uisd[j];
			UISA->r[j] = u.u_uisa[j];
		}
		j -= 8;
		if(u.u_sep == 0) {
			UISD->r[j] = u.u_uisd[j] = u.u_uisd[j+8];
			UISA->r[j] = u.u_uisa[j] = u.u_uisa[j+8];
		}
		u.u_mbitm |= 1 << j;
		u.u_rval1 = j << 13;
		return;

	default:
		u.u_error = EINVAL;
		return;
	}
}

/*
 * allocate core for MAUS common regions
 */
mausinit()
{
	register unsigned i, bs, maussize;

	bs = 0;
	for(i=0; mausmap[i].boffset != -1; i++) {
		if((maussize=mausmap[i].boffset+mausmap[i].bsize)>bs)
			bs = maussize;
	}
	if (mauscore = malloc(coremap, bs)) {
		mausend = mauscore + bs;
		nmausent = i;
		return(bs);
	}
	return(0);
}

/*  mmoff pulled out from mem.c and put here since it is easier
 *  to make maus sysgenable this way.  George Mathew */

long
mmoff(dev)
register dev;
{
	register cn;	/* click number */

	cn = u.u_offset >> 6;
	if ((dev -= 8) < 0 || dev >= nmausent || cn < 0
		|| cn >= mausmap[dev].bsize) {
			u.u_error = ENXIO;
			return(-1L);
	}
	else
		return( ((long)(mauscore + mausmap[dev].boffset)<<6) + u.u_offset);
}