diff options
-rw-r--r-- | sys/alpha/alpha/machdep.c | 6 | ||||
-rw-r--r-- | sys/alpha/alpha/mem.c | 287 |
2 files changed, 50 insertions, 243 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c index 68680ea..c8f3d33 100644 --- a/sys/alpha/alpha/machdep.c +++ b/sys/alpha/alpha/machdep.c @@ -112,7 +112,6 @@ #include <sys/sysctl.h> #include <sys/uio.h> #include <sys/linker.h> -#include <sys/random.h> #include <net/netisr.h> #include <vm/vm.h> #include <vm/vm_kern.h> @@ -1000,11 +999,6 @@ alpha_init(pfn, ptb, bim, bip, biv) (struct trapframe *)proc0paddr->u_pcb.pcb_hw.apcb_ksp; /* - * Initialise entropy pool. - */ - rand_initialize(); - - /* * Look at arguments passed to us and compute boothowto. */ diff --git a/sys/alpha/alpha/mem.c b/sys/alpha/alpha/mem.c index 4f98c8e..0fd0096 100644 --- a/sys/alpha/alpha/mem.c +++ b/sys/alpha/alpha/mem.c @@ -45,7 +45,6 @@ * Memory special file */ - #include <sys/param.h> #include <sys/kernel.h> #include <sys/systm.h> @@ -54,7 +53,6 @@ #include <sys/malloc.h> #include <sys/proc.h> #include <sys/msgbuf.h> -#include <sys/random.h> #include <sys/signalvar.h> #include <machine/frame.h> @@ -67,14 +65,16 @@ #include <vm/pmap.h> #include <vm/vm_extern.h> -static caddr_t zbuf; +static dev_t memdev, kmemdev; +#ifdef PERFMON +static dev_t perfdev; +#endif /* PERFMON */ static d_open_t mmopen; static d_close_t mmclose; static d_read_t mmrw; static d_ioctl_t mmioctl; static d_mmap_t memmmap; -static d_poll_t mmpoll; #define CDEV_MAJOR 2 static struct cdevsw mem_cdevsw = { @@ -83,7 +83,7 @@ static struct cdevsw mem_cdevsw = { /* read */ mmrw, /* write */ mmrw, /* ioctl */ mmioctl, - /* poll */ mmpoll, + /* poll */ (d_poll_t *)seltrue, /* mmap */ memmmap, /* strategy */ nostrategy, /* name */ "mem", @@ -94,26 +94,14 @@ static struct cdevsw mem_cdevsw = { /* bmaj */ -1 }; -/* - XXX the below should be used. However there is too much "16" - hardcodeing in kern_random.c right now. -- obrien #if NHWI > 0 #define ICU_LEN (NHWI) #else #define ICU_LEN (NSWI) #endif -*/ -#define ICU_LEN 16 - -static struct random_softc random_softc[ICU_LEN]; -static int random_ioctl __P((dev_t, u_long, caddr_t, int, struct proc *)); static int -mmclose(dev, flags, fmt, p) - dev_t dev; - int flags; - int fmt; - struct proc *p; +mmclose(dev_t dev, int flags, int fmt, struct proc *p) { switch (minor(dev)) { #ifdef PERFMON @@ -123,21 +111,17 @@ mmclose(dev, flags, fmt, p) default: break; } - return(0); + return (0); } static int -mmopen(dev, flags, fmt, p) - dev_t dev; - int flags; - int fmt; - struct proc *p; +mmopen(dev_t dev, int flags, int fmt, struct proc *p) { switch (minor(dev)) { case 0: case 1: - if (securelevel >= 1) + if ((flags & FWRITE) && securelevel > 0) return (EPERM); break; case 32: @@ -149,24 +133,18 @@ mmopen(dev, flags, fmt, p) default: break; } - return(0); + return (0); } /*ARGSUSED*/ -int -mmrw(dev, uio, flags) - dev_t dev; - struct uio *uio; - int flags; +static int +mmrw(dev_t dev, struct uio *uio, int flags) { - register vm_offset_t o, v; - register int c; - register struct iovec *iov; + vm_offset_t o, v; + int c; + struct iovec *iov; int error = 0, rw; - u_int poolsize; - caddr_t buf; - - buf = NULL; + vm_offset_t addr, eaddr; while (uio->uio_resid > 0 && !error) { iov = uio->uio_iov; @@ -198,8 +176,7 @@ kmemphys: continue; /* minor device 1 is kernel memory */ - case 1: { - vm_offset_t addr, eaddr; + case 1: v = uio->uio_offset; if (v >= ALPHA_K0SEG_BASE && v <= ALPHA_K0SEG_END) { @@ -222,83 +199,8 @@ kmemphys: VM_PROT_READ : VM_PROT_WRITE)) return (EFAULT); error = uiomove((caddr_t)v, c, uio); - continue; } -/* minor device 2 is EOF/rathole */ - case 2: - if (uio->uio_rw == UIO_READ) - return (0); - c = iov->iov_len; - break; - -/* minor device 3 (/dev/random) is source of filth on read, rathole on write */ - case 3: - if (uio->uio_rw == UIO_WRITE) { - c = iov->iov_len; - break; - } - if (buf == NULL) - buf = (caddr_t) - malloc(PAGE_SIZE, M_TEMP, M_WAITOK); - c = min(iov->iov_len, PAGE_SIZE); - poolsize = read_random(buf, c); - if (poolsize == 0) { - if (buf) - free(buf, M_TEMP); - return (0); - } - c = min(c, poolsize); - error = uiomove(buf, c, uio); - continue; - -/* minor device 4 (/dev/urandom) is source of muck on read, rathole on write */ - case 4: - if (uio->uio_rw == UIO_WRITE) { - c = iov->iov_len; - break; - } - if (CURSIG(curproc) != 0) { - /* - * Use tsleep() to get the error code right. - * It should return immediately. - */ - error = tsleep(&random_softc[0], - PZERO | PCATCH, "urand", 1); - if (error != 0 && error != EWOULDBLOCK) - continue; - } - if (buf == NULL) - buf = (caddr_t) - malloc(PAGE_SIZE, M_TEMP, M_WAITOK); - c = min(iov->iov_len, PAGE_SIZE); - poolsize = read_random_unlimited(buf, c); - c = min(c, poolsize); - error = uiomove(buf, c, uio); - continue; - -/* minor device 12 (/dev/zero) is source of nulls on read, rathole on write */ - case 12: - if (uio->uio_rw == UIO_WRITE) { - c = iov->iov_len; - break; - } - /* - * On the first call, allocate and zero a page - * of memory for use with /dev/zero. - */ - if (zbuf == NULL) { - zbuf = (caddr_t) - malloc(PAGE_SIZE, M_TEMP, M_WAITOK); - bzero(zbuf, PAGE_SIZE); - } - c = min(iov->iov_len, PAGE_SIZE); - error = uiomove(zbuf, c, uio); - continue; - - default: - return (ENXIO); - } if (error) break; iov->iov_base += c; @@ -306,8 +208,6 @@ kmemphys: uio->uio_offset += c; uio->uio_resid -= c; } - if (buf) - free(buf, M_TEMP); return (error); } @@ -322,9 +222,7 @@ memmmap(dev_t dev, vm_offset_t offset, int prot) * /dev/mem is the only one that makes sense through this * interface. For /dev/kmem any physaddr we return here * could be transient and hence incorrect or invalid at - * a later time. /dev/null just doesn't make any sense - * and /dev/zero is a hack that is handled via the default - * pager in mmap(). + * a later time. */ if (minor(dev) != 0) return (-1); @@ -337,28 +235,10 @@ memmmap(dev_t dev, vm_offset_t offset, int prot) return (alpha_btop(ALPHA_PHYS_TO_K0SEG(offset))); } -/* - * Allow userland to select which interrupts will be used in the muck - * gathering business. - */ static int -mmioctl(dev, cmd, cmdarg, flags, p) - dev_t dev; - u_long cmd; - caddr_t cmdarg; - int flags; - struct proc *p; +mmioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, struct proc *p) { -#if 0 - static u_int16_t interrupt_allowed = 0; - u_int16_t interrupt_mask; -#endif - switch(minor(dev)) { - case 3: - case 4: - return random_ioctl(dev, cmd, cmdarg, flags, p); - #ifdef PERFMON case 32: return perfmon_ioctl(dev, cmd, cmdarg, flags, p); @@ -367,111 +247,44 @@ mmioctl(dev, cmd, cmdarg, flags, p) return ENODEV; } - if (*(u_int16_t *)cmdarg >= 16) - return (EINVAL); - -#if 0 - /* Only root can do this */ - error = suser(p); - if (error) { - return (error); - } - interrupt_mask = 1 << *(u_int16_t *)cmdarg; - - switch (cmd) { - - case MEM_SETIRQ: - if (!(interrupt_allowed & interrupt_mask)) { - disable_intr(); - interrupt_allowed |= interrupt_mask; - sec_intr_handler[*(u_int16_t *)cmdarg] = - intr_handler[*(u_int16_t *)cmdarg]; - intr_handler[*(u_int16_t *)cmdarg] = - add_interrupt_randomness; - sec_intr_unit[*(u_int16_t *)cmdarg] = - intr_unit[*(u_int16_t *)cmdarg]; - intr_unit[*(u_int16_t *)cmdarg] = - *(u_int16_t *)cmdarg; - enable_intr(); - } - else return (EPERM); - break; - - case MEM_CLEARIRQ: - if (interrupt_allowed & interrupt_mask) { - disable_intr(); - interrupt_allowed &= ~(interrupt_mask); - intr_handler[*(u_int16_t *)cmdarg] = - sec_intr_handler[*(u_int16_t *)cmdarg]; - intr_unit[*(u_int16_t *)cmdarg] = - sec_intr_unit[*(u_int16_t *)cmdarg]; - enable_intr(); - } - else return (EPERM); - break; - - case MEM_RETURNIRQ: - *(u_int16_t *)cmdarg = interrupt_allowed; - break; - - default: - return (ENOTTY); - } -#endif return (0); } -int -mmpoll(dev, events, p) - dev_t dev; - int events; - struct proc *p; -{ - switch (minor(dev)) { - case 3: /* /dev/random */ - /* return random_poll(dev, events, p);*/ - case 4: /* /dev/urandom */ - default: - return seltrue(dev, events, p); - } -} - -int -iszerodev(dev) - dev_t dev; -{ - return (((major(dev) == mem_cdevsw.d_maj) - && minor(dev) == 12) -/* or the osf/1 zero device */ - ||((major(dev) == 0) - && (minor(dev) == 0x02600000))); -} - -static void -mem_drvinit(void *unused) +static int +mem_modevent(module_t mod, int type, void *data) { + switch(type) { + case MOD_LOAD: + if (bootverbose) + printf("mem: <memory & I/O>\n"); + /* Initialise memory range handling */ + if (mem_range_softc.mr_op != NULL) + mem_range_softc.mr_op->init(&mem_range_softc); + + memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM, + 0640, "mem"); + kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM, + 0640, "kmem"); +#ifdef PERFMON + perfdev = make_dev(&mem_cdevsw, 32, UID_ROOT, GID_KMEM, + 0640, "perfmon"); +#endif /* PERFMON */ + return 0; - cdevsw_add(&mem_cdevsw); - make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM, 0640, "mem"); - make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); - make_dev(&mem_cdevsw, 2, UID_ROOT, GID_WHEEL, 0666, "null"); - make_dev(&mem_cdevsw, 3, UID_ROOT, GID_WHEEL, 0644, "random"); - make_dev(&mem_cdevsw, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); - make_dev(&mem_cdevsw, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); + case MOD_UNLOAD: + destroy_dev(memdev); + destroy_dev(kmemdev); #ifdef PERFMON - make_dev(&mem_cdevsw, 32, UID_ROOT, GID_KMEM, 0640, "perfmon"); + destroy_dev(perfdev); #endif /* PERFMON */ -} + return 0; -static int -random_ioctl(dev, cmd, data, flags, p) - dev_t dev; - u_long cmd; - caddr_t data; - int flags; - struct proc *p; -{ - return (0); + case MOD_SHUTDOWN: + return 0; + + default: + return EOPNOTSUPP; + } } -SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) +DEV_MODULE(mem, mem_modevent, NULL); |