summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel/fs
diff options
context:
space:
mode:
authormarx <none@none>2006-02-22 14:40:43 -0800
committermarx <none@none>2006-02-22 14:40:43 -0800
commit65a89a64c60f3061bbe2381edaacc81660af9a95 (patch)
tree27a97480f4e69b95d2451fd4dd2954600ceab9f3 /usr/src/uts/intel/fs
parent4cfb6680b9cd5301c650963f65486e772bb13813 (diff)
downloadillumos-joyent-65a89a64c60f3061bbe2381edaacc81660af9a95.tar.gz
4852369 x86 panic due to redzone violation
Diffstat (limited to 'usr/src/uts/intel/fs')
-rw-r--r--usr/src/uts/intel/fs/proc/prmachdep.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/usr/src/uts/intel/fs/proc/prmachdep.c b/usr/src/uts/intel/fs/proc/prmachdep.c
index e0788476c4..12f0a52da4 100644
--- a/usr/src/uts/intel/fs/proc/prmachdep.c
+++ b/usr/src/uts/intel/fs/proc/prmachdep.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -305,16 +305,21 @@ prgetpsaddr(proc_t *p)
void
prstep(klwp_t *lwp, int watchstep)
{
- struct regs *r = lwptoregs(lwp);
-
ASSERT(MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
+ /*
+ * flag LWP so that its r_efl trace bit (PS_T) will be set on
+ * next return to usermode.
+ */
+ lwp->lwp_pcb.pcb_flags |= REQUEST_STEP;
+ lwp->lwp_pcb.pcb_flags &= ~REQUEST_NOSTEP;
+
if (watchstep)
lwp->lwp_pcb.pcb_flags |= WATCH_STEP;
else
lwp->lwp_pcb.pcb_flags |= NORMAL_STEP;
- r->r_ps |= PS_T; /* set the trace flag in PSW */
+ aston(lwptot(lwp)); /* let trap() set PS_T in rp->r_efl */
}
/*
@@ -323,13 +328,19 @@ prstep(klwp_t *lwp, int watchstep)
void
prnostep(klwp_t *lwp)
{
- struct regs *r = lwptoregs(lwp);
-
ASSERT(ttolwp(curthread) == lwp ||
MUTEX_NOT_HELD(&lwptoproc(lwp)->p_lock));
- r->r_ps &= ~PS_T; /* turn off trace flag in PSW */
- lwp->lwp_pcb.pcb_flags &= ~(NORMAL_STEP|WATCH_STEP|DEBUG_PENDING);
+ /*
+ * flag LWP so that its r_efl trace bit (PS_T) will be cleared on
+ * next return to usermode.
+ */
+ lwp->lwp_pcb.pcb_flags |= REQUEST_NOSTEP;
+
+ lwp->lwp_pcb.pcb_flags &=
+ ~(REQUEST_STEP|NORMAL_STEP|WATCH_STEP|DEBUG_PENDING);
+
+ aston(lwptot(lwp)); /* let trap() clear PS_T in rp->r_efl */
}
/*