#include <sys/param.h>
#include <sys/systm.h>
#include <sys/ioctl.h>
#include <sys/tty.h>
#include <sys/conf.h>
#include <dev/ppc/cons.h>
struct bdevsw bdevsw[] =
{
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
NO_BDEVICE,
};
int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
extern struct tty *km_tty[];
dev_t chrtoblk(dev_t dev);
int chrtoblk_set(int cdev, int bdev);
int isdisk(dev_t dev, int type);
int iskmemdev(dev_t dev);
int cttyopen(dev_t dev, int flag, int mode, struct proc *p);
int cttyread(dev_t dev, struct uio *uio, int flag);
int cttywrite(dev_t dev, struct uio *uio, int flag);
int cttyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p);
int cttyselect(dev_t dev, int flag, void* wql, struct proc *p);
int mmread(dev_t dev, struct uio *uio, int flag);
int mmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p);
int mmwrite(dev_t dev, struct uio *uio, int flag);
#define mmselect (select_fcn_t *)seltrue
#if 1
#ifdef NPTY
#undef NPTY
#endif
#define NPTY 32
#else
#include <pty.h>
#endif
#if NPTY > 0
extern struct tty *pt_tty[];
extern d_open_t ptsopen;
extern d_close_t ptsclose;
extern d_read_t ptsread;
extern d_write_t ptswrite;
extern d_stop_t ptsstop;
extern d_putc_t ptsputc;
extern d_open_t ptcopen;
extern d_close_t ptcclose;
extern d_read_t ptcread;
extern d_write_t ptcwrite;
extern d_select_t ptcselect;
extern d_ioctl_t ptyioctl;
#else
#define ptsopen eno_opcl
#define ptsclose eno_opcl
#define ptsread eno_rdwrt
#define ptswrite eno_rdwrt
#define ptsstop nulldev
#define ptsputc nulldev
#define ptcopen eno_opcl
#define ptcclose eno_opcl
#define ptcread eno_rdwrt
#define ptcwrite eno_rdwrt
#define ptcselect eno_select
#define ptyioctl eno_ioctl
#endif
extern d_open_t logopen;
extern d_close_t logclose;
extern d_read_t logread;
extern d_ioctl_t logioctl;
extern d_select_t logselect;
struct cdevsw cdevsw[] =
{
{
consopen, consclose, consread, conswrite,
consioctl, ((stop_fcn_t *)&nulldev),
((reset_fcn_t *)&nulldev),
0, consselect,
eno_mmap, eno_strat, cons_getc, cons_putc, D_TTY
},
NO_CDEVICE,
{
cttyopen, ((open_close_fcn_t *)&nulldev),
cttyread, cttywrite,
cttyioctl, ((stop_fcn_t *)&nulldev),
((reset_fcn_t *)&nulldev),
0, cttyselect,
eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
},
{
((open_close_fcn_t *)&nulldev),
((open_close_fcn_t *)&nulldev),
mmread, mmwrite,
mmioctl, ((stop_fcn_t *)&nulldev),
((reset_fcn_t *)&nulldev),
0, mmselect,
eno_mmap, eno_strat, eno_getc, eno_putc, D_DISK
},
{
ptsopen, ptsclose, ptsread, ptswrite,
ptyioctl, ptsstop, ((reset_fcn_t *)&nulldev),
pt_tty, ttselect,
eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
},
{
ptcopen, ptcclose, ptcread, ptcwrite,
ptyioctl, ((stop_fcn_t *)&nulldev),
((reset_fcn_t *)&nulldev),
0, ptcselect,
eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
},
{
logopen, logclose, logread, eno_rdwrt,
logioctl, eno_stop, ((reset_fcn_t *)&nulldev),
0, logselect,
eno_mmap, eno_strat, eno_getc, eno_putc, 0
},
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
{
kmopen, kmclose, kmread, kmwrite,
kmioctl, ((stop_fcn_t *)&nulldev),
((reset_fcn_t *)&nulldev),
km_tty, ttselect,
eno_mmap, eno_strat, kmgetc, kmputc, 0
},
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
NO_CDEVICE,
};
int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
#include <sys/vnode.h>
int
isdisk(dev_t dev, int type)
{
dev_t maj = major(dev);
switch (type) {
case VCHR:
maj = chrtoblk(maj);
if (maj == NODEV) {
break;
}
case VBLK:
if (bdevsw[maj].d_type == D_DISK) {
return (1);
}
break;
}
return(0);
}
static int chrtoblktab[] = {
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
6, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, NODEV,
NODEV, 1,
NODEV, NODEV,
NODEV,
};
dev_t
chrtoblk(dev_t dev)
{
int blkmaj;
if (major(dev) >= nchrdev)
return(NODEV);
blkmaj = chrtoblktab[major(dev)];
if (blkmaj == NODEV)
return(NODEV);
return(makedev(blkmaj, minor(dev)));
}
int
chrtoblk_set(int cdev, int bdev)
{
if (cdev >= nchrdev)
return (NODEV);
if (bdev != NODEV && bdev >= nblkdev)
return (NODEV);
chrtoblktab[cdev] = bdev;
return 0;
}
int
iskmemdev(dev_t dev)
{
return (major(dev) == 3 && minor(dev) < 2);
}