diff options
| author | KATO Takenori <kato@FreeBSD.org> | 2000-08-18 09:22:01 +0000 |
|---|---|---|
| committer | KATO Takenori <kato@FreeBSD.org> | 2000-08-18 09:22:01 +0000 |
| commit | a19d469b8a8f917fe4bf3dfe47a0638c0fa9512b (patch) | |
| tree | 9247d38d88fe8bda20f15e247401d4edf9b8d631 | |
| parent | d13d9d71516e21668d9386675f9d9a3f4c26fa11 (diff) | |
Notes
| -rw-r--r-- | sys/pc98/i386/machdep.c | 18 | ||||
| -rw-r--r-- | sys/pc98/pc98/machdep.c | 18 |
2 files changed, 36 insertions, 0 deletions
diff --git a/sys/pc98/i386/machdep.c b/sys/pc98/i386/machdep.c index 5f2952aa20ac..f63a452ce7a6 100644 --- a/sys/pc98/i386/machdep.c +++ b/sys/pc98/i386/machdep.c @@ -2511,6 +2511,24 @@ set_dbregs(p, dbregs) struct dbreg *dbregs; { struct pcb *pcb; + int i; + u_int32_t mask1, mask2; + + /* + * Don't let an illegal value for dr7 get set. Specifically, + * check for undefined settings. Setting these bit patterns + * result in undefined behaviour and can lead to an unexpected + * TRCTRAP. + */ + for (i = 0, mask1 = 0x3<<16, mask2 = 0x2<<16; i < 8; + i++, mask1 <<= 2, mask2 <<= 2) + if ((dbregs->dr7 & mask1) == mask2) + return (EINVAL); + + if (dbregs->dr7 & 0x0000fc00) + return (EINVAL); + + pcb = &p->p_addr->u_pcb; diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 5f2952aa20ac..f63a452ce7a6 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -2511,6 +2511,24 @@ set_dbregs(p, dbregs) struct dbreg *dbregs; { struct pcb *pcb; + int i; + u_int32_t mask1, mask2; + + /* + * Don't let an illegal value for dr7 get set. Specifically, + * check for undefined settings. Setting these bit patterns + * result in undefined behaviour and can lead to an unexpected + * TRCTRAP. + */ + for (i = 0, mask1 = 0x3<<16, mask2 = 0x2<<16; i < 8; + i++, mask1 <<= 2, mask2 <<= 2) + if ((dbregs->dr7 & mask1) == mask2) + return (EINVAL); + + if (dbregs->dr7 & 0x0000fc00) + return (EINVAL); + + pcb = &p->p_addr->u_pcb; |
