diff options
author | dg <dg@FreeBSD.org> | 1996-01-30 12:54:21 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1996-01-30 12:54:21 +0000 |
commit | 7b11911f521e96aa70e311bee69358da327490cb (patch) | |
tree | e9e10d3c352b0bb894ea16f16e909095c3542819 /sys/amd64 | |
parent | ed8a6cec36d5a133d2c4419aeb20ac9e162e9ab5 (diff) | |
download | FreeBSD-src-7b11911f521e96aa70e311bee69358da327490cb.zip FreeBSD-src-7b11911f521e96aa70e311bee69358da327490cb.tar.gz |
savectx() strikes again: the saved stack pointer wasn't properly adjusted
to remove the return address. It's only the frame pointer and luck that
allowed the code to work at all.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/cpu_switch.S | 7 | ||||
-rw-r--r-- | sys/amd64/amd64/swtch.s | 7 | ||||
-rw-r--r-- | sys/amd64/amd64/vm_machdep.c | 14 |
3 files changed, 11 insertions, 17 deletions
diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index fdaacd2..a07a559 100644 --- a/sys/amd64/amd64/cpu_switch.S +++ b/sys/amd64/amd64/cpu_switch.S @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: swtch.s,v 1.25 1996/01/03 21:41:29 wollman Exp $ + * $Id: swtch.s,v 1.26 1996/01/23 02:39:16 davidg Exp $ */ #include "npx.h" /* for NNPX */ @@ -510,7 +510,7 @@ ENTRY(mvesp) * Update pcb, saving current processor state. */ ENTRY(savectx) - /* PCB */ + /* fetch PCB */ movl 4(%esp),%ecx /* caller's return address - child won't execute this routine */ @@ -519,7 +519,8 @@ ENTRY(savectx) movl $1,PCB_EAX(%ecx) /* return 1 in child */ movl %ebx,PCB_EBX(%ecx) - movl %esp,PCB_ESP(%ecx) + leal 4(%esp),%eax /* stack minus return address */ + movl %eax,PCB_ESP(%ecx) movl %ebp,PCB_EBP(%ecx) movl %esi,PCB_ESI(%ecx) movl %edi,PCB_EDI(%ecx) diff --git a/sys/amd64/amd64/swtch.s b/sys/amd64/amd64/swtch.s index fdaacd2..a07a559 100644 --- a/sys/amd64/amd64/swtch.s +++ b/sys/amd64/amd64/swtch.s @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: swtch.s,v 1.25 1996/01/03 21:41:29 wollman Exp $ + * $Id: swtch.s,v 1.26 1996/01/23 02:39:16 davidg Exp $ */ #include "npx.h" /* for NNPX */ @@ -510,7 +510,7 @@ ENTRY(mvesp) * Update pcb, saving current processor state. */ ENTRY(savectx) - /* PCB */ + /* fetch PCB */ movl 4(%esp),%ecx /* caller's return address - child won't execute this routine */ @@ -519,7 +519,8 @@ ENTRY(savectx) movl $1,PCB_EAX(%ecx) /* return 1 in child */ movl %ebx,PCB_EBX(%ecx) - movl %esp,PCB_ESP(%ecx) + leal 4(%esp),%eax /* stack minus return address */ + movl %eax,PCB_ESP(%ecx) movl %ebp,PCB_EBP(%ecx) movl %esi,PCB_ESI(%ecx) movl %edi,PCB_EDI(%ecx) diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index a8edbbd..5f1f50f 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $Id: vm_machdep.c,v 1.51 1996/01/19 03:57:43 dyson Exp $ + * $Id: vm_machdep.c,v 1.52 1996/01/23 02:39:17 davidg Exp $ */ #include "npx.h" @@ -587,17 +587,9 @@ cpu_fork(p1, p2) pmap_activate(&p2->p_vmspace->vm_pmap, &up->u_pcb); /* - * - * Arrange for a non-local goto when the new process - * is started, to resume here, returning nonzero from setjmp. + * Return (0) in parent, (1) in child. */ - if (savectx(&up->u_pcb)) { - /* - * Return 1 in child. - */ - return (1); - } - return (0); + return (savectx(&up->u_pcb)); } void |