summaryrefslogtreecommitdiffstats
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
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.
-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
-rw-r--r--sys/i386/i386/swtch.s6
-rw-r--r--sys/i386/i386/vm_machdep.c2
5 files changed, 8 insertions, 14 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;
/*
diff --git a/sys/i386/i386/swtch.s b/sys/i386/i386/swtch.s
index 2d315fc..f19a7fb 100644
--- a/sys/i386/i386/swtch.s
+++ b/sys/i386/i386/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/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index 294a583..befe6fe 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/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