V10/sys/io/pg.c

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

/*% cyntax -c -DKERNEL % && cc -c -DKERNEL %
 * I/O page driver.
 * Maps device registers into user address space on open.
 * Ioctl gets virtual address of registers.
 * Used for ITI framebuffer and miscellaneous hackage.
 */
#include "sys/param.h"
#include "sys/conf.h"
#include "sys/user.h"
#include "sys/ubaddr.h"
#include "sys/pte.h"
#include "sys/pgio.h"
extern struct ubaddr pgaddr[];	/* defined in conf */
extern int pgcnt;		/* defined in conf */
extern caddr_t pgcaddr[];	/* defined in conf.  0 when closed */
int pgopen(), pgclose(), pgioctl();
struct cdevsw pgcdev=cdinit(pgopen, pgclose, nodev, nodev, pgioctl);
static maptouser(vaddress)
caddr_t vaddress;
{
	Sysmap[((unsigned)vaddress-0x80000000)>>9].pg_prot=PG_UW>>27;
}
pgopen(dev, flag)
dev_t dev;
{
	register d=minor(dev);
	register caddr_t *p=&pgcaddr[d];
	if(d>=pgcnt
	|| *p
	|| (*p=ubaddr(&pgaddr[d]))==0
	|| ubbadaddr(pgaddr[d].ubno, *p, sizeof(short)))
		u.u_error=ENXIO;
	else
		maptouser(*p);
}
pgclose(dev)
dev_t dev;
{
	register caddr_t *p=&pgcaddr[minor(dev)];
	*p=0;
}
pgioctl(dev, cmd, arg, flag)
dev_t dev;
caddr_t arg;
{
	switch(cmd){
	case PGADDR:
		copyout((caddr_t)&pgcaddr[minor(dev)], arg, sizeof(caddr_t));
		break;
	default:
		return (ENOTTY);
	}
	return (0);
}