|
|
researchv10 Norman
/*% 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);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.