summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2000-12-03 01:09:59 +0000
committerjake <jake@FreeBSD.org>2000-12-03 01:09:59 +0000
commitd33c1d168c21cc363ad385b8c5a2cea928affa92 (patch)
treef5909fa9c8a14c837af7e6ce82f9f17f074ccbb0 /sys/amd64
parentf7e4c191135d4a06a1e450200717dbafd0ffc821 (diff)
downloadFreeBSD-src-d33c1d168c21cc363ad385b8c5a2cea928affa92.zip
FreeBSD-src-d33c1d168c21cc363ad385b8c5a2cea928affa92.tar.gz
Change cpu_switch to explicitly popl the callers program counter and
pushl that of the new process, rather than doing a movl (%esp) and assuming that the stack has been setup right. This make the initial stack setup slightly more sane, and will make it easier to stick an interrupted process onto the run queue without its knowing.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/cpu_switch.S6
-rw-r--r--sys/amd64/amd64/swtch.s6
-rw-r--r--sys/amd64/amd64/vm_machdep.c2
3 files changed, 5 insertions, 9 deletions
diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S
index 2d315fc..f19a7fb 100644
--- a/sys/amd64/amd64/cpu_switch.S
+++ b/sys/amd64/amd64/cpu_switch.S
@@ -103,8 +103,7 @@ ENTRY(cpu_switch)
movl P_ADDR(%ecx),%edx
- movl (%esp),%eax /* Hardware registers */
- movl %eax,PCB_EIP(%edx)
+ popl PCB_EIP(%edx) /* Hardware registers */
movl %ebx,PCB_EBX(%edx)
movl %esp,PCB_ESP(%edx)
movl %ebp,PCB_EBP(%edx)
@@ -254,8 +253,7 @@ sw1b:
movl PCB_EBP(%edx),%ebp
movl PCB_ESI(%edx),%esi
movl PCB_EDI(%edx),%edi
- movl PCB_EIP(%edx),%eax
- movl %eax,(%esp)
+ pushl PCB_EIP(%edx)
#ifdef SMP
#ifdef GRAB_LOPRIO /* hold LOPRIO for INTs */
diff --git a/sys/amd64/amd64/swtch.s b/sys/amd64/amd64/swtch.s
index 2d315fc..f19a7fb 100644
--- a/sys/amd64/amd64/swtch.s
+++ b/sys/amd64/amd64/swtch.s
@@ -103,8 +103,7 @@ ENTRY(cpu_switch)
movl P_ADDR(%ecx),%edx
- movl (%esp),%eax /* Hardware registers */
- movl %eax,PCB_EIP(%edx)
+ popl PCB_EIP(%edx) /* Hardware registers */
movl %ebx,PCB_EBX(%edx)
movl %esp,PCB_ESP(%edx)
movl %ebp,PCB_EBP(%edx)
@@ -254,8 +253,7 @@ sw1b:
movl PCB_EBP(%edx),%ebp
movl PCB_ESI(%edx),%esi
movl PCB_EDI(%edx),%edi
- movl PCB_EIP(%edx),%eax
- movl %eax,(%esp)
+ pushl PCB_EIP(%edx)
#ifdef SMP
#ifdef GRAB_LOPRIO /* hold LOPRIO for INTs */
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index 294a583..befe6fe 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -168,7 +168,7 @@ cpu_fork(p1, p2, flags)
pcb2->pcb_edi = 0;
pcb2->pcb_esi = (int)fork_return; /* fork_trampoline argument */
pcb2->pcb_ebp = 0;
- pcb2->pcb_esp = (int)p2->p_md.md_regs - sizeof(void *);
+ pcb2->pcb_esp = (int)p2->p_md.md_regs;
pcb2->pcb_ebx = (int)p2; /* fork_trampoline argument */
pcb2->pcb_eip = (int)fork_trampoline;
/*
OpenPOWER on IntegriCloud