V8/usr/sys/dev/iti.c
/* %W% */
#include "iti.h"
#include "../h/pte.h"
#include "../h/param.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/systm.h"
#include "../h/ioctl.h"
#include "../h/ubareg.h"
#include "../h/buf.h"
#include "../h/ubavar.h"
#include "../h/itireg.h"
int itiprobe(), itiattach();
struct uba_device *itidinfo[NITI];
u_short itistd[]={ 0160100, 0 };
struct uba_driver itidriver={
itiprobe, 0, itiattach, 0, itistd, "iti", itidinfo, 0, 0
};
struct iti{
char open;
}iti[NITI];
itiprobe(reg)
caddr_t reg;
{
register int br=0x15, cvec=0710; /* value-result */
return(1);
}
/*ARGSUSED*/
itiattach(ui)
struct uba_device *ui;
{
}
itiopen(dev)
dev_t dev;
{
register struct iti *p=&iti[minor(dev)];
register struct uba_device *ui=itidinfo[minor(dev)];
if(minor(dev)>=NITI || p->open || !ui->ui_alive)
u.u_error=ENXIO;
else{
p->open=1;
maptouser(ui->ui_addr);
}
}
iticlose(dev)
dev_t dev;
{
iti[minor(dev)].open=0;
unmaptouser(itidinfo[minor(dev)]->ui_addr);
}
/*ARGSUSED*/
itiioctl(dev, cmd, data, flag)
dev_t dev;
int cmd;
register caddr_t data;
int flag;
{
register struct uba_device *ui = itidinfo[minor(dev)];
switch (cmd) {
case ITIADDR:
copyout((caddr_t)&ui->ui_addr, (caddr_t)data, sizeof ui->ui_addr);
break;
default:
return (ENOTTY);
}
return (0);
}
/*ARGSUSED*/
itiintr(dev)
dev_t dev;
{}
/*
* Map a virtual address into users address space. Actually all we
* do is turn on the user mode write protection bits for the particular
* page of memory involved.
*/
maptouser(vaddress)
caddr_t vaddress;
{
Sysmap[((unsigned)vaddress-0x80000000)>>9].pg_prot=PG_UW>>27;
}
unmaptouser(vaddress)
caddr_t vaddress;
{
Sysmap[((unsigned)vaddress-0x80000000)>>9].pg_prot=PG_KW>>27;
}