diff options
author | marx <none@none> | 2006-02-22 14:40:43 -0800 |
---|---|---|
committer | marx <none@none> | 2006-02-22 14:40:43 -0800 |
commit | 65a89a64c60f3061bbe2381edaacc81660af9a95 (patch) | |
tree | 27a97480f4e69b95d2451fd4dd2954600ceab9f3 /usr/src/uts/intel/fs | |
parent | 4cfb6680b9cd5301c650963f65486e772bb13813 (diff) | |
download | illumos-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.c | 27 |
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 */ } /* |