diff options
author | jake <jake@FreeBSD.org> | 2000-12-03 01:09:59 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2000-12-03 01:09:59 +0000 |
commit | d33c1d168c21cc363ad385b8c5a2cea928affa92 (patch) | |
tree | f5909fa9c8a14c837af7e6ce82f9f17f074ccbb0 /sys/amd64 | |
parent | f7e4c191135d4a06a1e450200717dbafd0ffc821 (diff) | |
download | FreeBSD-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.S | 6 | ||||
-rw-r--r-- | sys/amd64/amd64/swtch.s | 6 | ||||
-rw-r--r-- | sys/amd64/amd64/vm_machdep.c | 2 |
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; /* |