From d33c1d168c21cc363ad385b8c5a2cea928affa92 Mon Sep 17 00:00:00 2001 From: jake Date: Sun, 3 Dec 2000 01:09:59 +0000 Subject: [PATCH] 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. --- sys/amd64/amd64/cpu_switch.S | 6 ++---- sys/amd64/amd64/swtch.s | 6 ++---- sys/amd64/amd64/vm_machdep.c | 2 +- sys/i386/i386/swtch.s | 6 ++---- sys/i386/i386/vm_machdep.c | 2 +- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index 2d315fc5f787..f19a7fb4a69e 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 2d315fc5f787..f19a7fb4a69e 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 294a5838def0..befe6fee5199 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 2d315fc5f787..f19a7fb4a69e 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 294a5838def0..befe6fee5199 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; /*