diff options
author | markm <markm@FreeBSD.org> | 1995-12-27 11:18:29 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 1995-12-27 11:18:29 +0000 |
commit | 4686e7539f5d0f85b72b1a9ab612733767afad75 (patch) | |
tree | 9bc70466d960e121df3cd4d810f242c27bce0911 /sys | |
parent | 40901180928bff411d4c017d9974ddf2104f7cda (diff) | |
download | FreeBSD-src-4686e7539f5d0f85b72b1a9ab612733767afad75.zip FreeBSD-src-4686e7539f5d0f85b72b1a9ab612733767afad75.tar.gz |
Modify the ioctl to handle revectored interrupts for the entropy gatherers.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/mem.c | 35 | ||||
-rw-r--r-- | sys/i386/i386/mem.c | 35 |
2 files changed, 60 insertions, 10 deletions
diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c index 28819f6..5327ff9 100644 --- a/sys/amd64/amd64/mem.c +++ b/sys/amd64/amd64/mem.c @@ -38,7 +38,7 @@ * * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 - * $Id: mem.c,v 1.26 1995/12/14 23:50:54 bde Exp $ + * $Id: mem.c,v 1.27 1995/12/21 19:22:49 julian Exp $ */ /* @@ -374,6 +374,8 @@ mmioctl(dev, cmd, cmdarg, flags, p) int flags; struct proc *p; { + static u_int16_t interrupt_allowed = 0; + u_int16_t interrupt_mask; int error; if (minor(dev) != 3 && minor(dev) != 4) @@ -384,18 +386,41 @@ mmioctl(dev, cmd, cmdarg, flags, p) /* Only root can do this */ error = suser(p->p_ucred, &p->p_acflag); - if (error != 0) { + if (error) { return (error); } + interrupt_mask = 1 << *(u_int16_t *)cmdarg; - switch (cmd){ + switch (cmd) { case MEM_SETIRQ: - interrupt_allowed |= 1 << *(u_int16_t *)cmdarg; + 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: - interrupt_allowed &= ~(1 << *(u_int16_t *)cmdarg); + 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: diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index 28819f6..5327ff9 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -38,7 +38,7 @@ * * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 - * $Id: mem.c,v 1.26 1995/12/14 23:50:54 bde Exp $ + * $Id: mem.c,v 1.27 1995/12/21 19:22:49 julian Exp $ */ /* @@ -374,6 +374,8 @@ mmioctl(dev, cmd, cmdarg, flags, p) int flags; struct proc *p; { + static u_int16_t interrupt_allowed = 0; + u_int16_t interrupt_mask; int error; if (minor(dev) != 3 && minor(dev) != 4) @@ -384,18 +386,41 @@ mmioctl(dev, cmd, cmdarg, flags, p) /* Only root can do this */ error = suser(p->p_ucred, &p->p_acflag); - if (error != 0) { + if (error) { return (error); } + interrupt_mask = 1 << *(u_int16_t *)cmdarg; - switch (cmd){ + switch (cmd) { case MEM_SETIRQ: - interrupt_allowed |= 1 << *(u_int16_t *)cmdarg; + 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: - interrupt_allowed &= ~(1 << *(u_int16_t *)cmdarg); + 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: |