summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarkm <markm@FreeBSD.org>1995-12-27 11:18:29 +0000
committermarkm <markm@FreeBSD.org>1995-12-27 11:18:29 +0000
commit4686e7539f5d0f85b72b1a9ab612733767afad75 (patch)
tree9bc70466d960e121df3cd4d810f242c27bce0911 /sys
parent40901180928bff411d4c017d9974ddf2104f7cda (diff)
downloadFreeBSD-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.c35
-rw-r--r--sys/i386/i386/mem.c35
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:
OpenPOWER on IntegriCloud