PERFORCE change 28172 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 4 21:13:50 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=28172
Change 28172 by peter at peter_overcee on 2003/04/04 21:13:22
make cpu_switch assemble. Still needs regparm work. needs to do
rest of saved registers. Needs PCB_E* renamed to PCB_R*
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/swtch.s#11 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/swtch.s#11 (text+ko) ====
@@ -54,28 +54,29 @@
* about its state. This is only a slight optimization and is probably
* not worth it anymore. Note that we need to clear the pm_active bits so
* we do need the old proc if it still exists.
- * 0(%esp) = ret
- * 4(%esp) = oldtd
- * 8(%esp) = newtd
+ * 0(%rsp) = ret
+ * 8(%rsp) = oldtd
+ * 16(%rsp) = newtd
*/
ENTRY(cpu_throw)
+ xorq %rsi, %rsi
movl PCPU(CPUID), %esi
- movl 4(%esp),%ecx /* Old thread */
- testl %ecx,%ecx /* no thread? */
+ movq 8(%rsp),%rcx /* Old thread */
+ testq %rcx,%rcx /* no thread? */
jz 1f
/* release bit from old pm_active */
- movl TD_PROC(%ecx), %eax /* thread->td_proc */
- movl P_VMSPACE(%eax), %ebx /* proc->p_vmspace */
- btrl %esi, VM_PMAP+PM_ACTIVE(%ebx) /* clear old */
+ movq TD_PROC(%rcx), %rax /* thread->td_proc */
+ movq P_VMSPACE(%rax), %rbx /* proc->p_vmspace */
+ btrq %rsi, VM_PMAP+PM_ACTIVE(%rbx) /* clear old */
1:
- movl 8(%esp),%ecx /* New thread */
- movl TD_PCB(%ecx),%edx
- movl PCB_CR3(%edx),%eax
- movl %eax,%cr3 /* new address space */
+ movq 16(%rsp),%rcx /* New thread */
+ movq TD_PCB(%rcx),%rdx
+ movq PCB_CR3(%rdx),%rax
+ movq %rax,%cr3 /* new address space */
/* set bit in new pm_active */
- movl TD_PROC(%ecx),%eax
- movl P_VMSPACE(%eax), %ebx
- btsl %esi, VM_PMAP+PM_ACTIVE(%ebx) /* set new */
+ movq TD_PROC(%rcx),%rax
+ movq P_VMSPACE(%rax), %rbx
+ btsq %rsi, VM_PMAP+PM_ACTIVE(%rbx) /* set new */
jmp sw1
/*
@@ -83,65 +84,66 @@
*
* Save the current thread state, then select the next thread to run
* and load its state.
- * 0(%esp) = ret
- * 4(%esp) = oldtd
- * 8(%esp) = newtd
+ * 0(%rsp) = ret
+ * 8(%rsp) = oldtd
+ * 16(%rsp) = newtd
*/
ENTRY(cpu_switch)
/* Switch to new thread. First, save context. */
- movl 4(%esp),%ecx
+ movq 8(%rsp),%rcx
#ifdef INVARIANTS
- testl %ecx,%ecx /* no thread? */
+ testq %rcx,%rcx /* no thread? */
jz badsw2 /* no, panic */
#endif
- movl TD_PCB(%ecx),%edx
+ movq TD_PCB(%rcx),%rdx
- movl (%esp),%eax /* Hardware registers */
- movl %eax,PCB_EIP(%edx)
- movl %ebx,PCB_EBX(%edx)
- movl %esp,PCB_ESP(%edx)
- movl %ebp,PCB_EBP(%edx)
- movl %esi,PCB_ESI(%edx)
- movl %edi,PCB_EDI(%edx)
- movl %gs,PCB_GS(%edx)
- pushfl /* PSL */
- popl PCB_PSL(%edx)
+ movq (%rsp),%rax /* Hardware registers */
+ movq %rax,PCB_EIP(%rdx)
+ movq %rbx,PCB_EBX(%rdx)
+ movq %rsp,PCB_ESP(%rdx)
+ movq %rbp,PCB_EBP(%rdx)
+ movq %rsi,PCB_ESI(%rdx)
+ movq %rdi,PCB_EDI(%rdx)
+#XXX movq %gs,PCB_GS(%rdx)
+ pushfq /* PSL */
+ popq PCB_PSL(%rdx)
/* have we used fp, and need a save? */
- cmpl %ecx,PCPU(FPCURTHREAD)
+ cmpq %rcx,PCPU(FPCURTHREAD)
jne 1f
- addl $PCB_SAVEFPU,%edx /* h/w bugs make saving complicated */
- pushl %edx
+ addq $PCB_SAVEFPU,%rdx /* h/w bugs make saving complicated */
+ pushq %rdx
call npxsave /* do it in a big C function */
- popl %eax
+ popq %rax
1:
/* Save is done. Now fire up new thread. Leave old vmspace. */
- movl %ecx,%edi
- movl 8(%esp),%ecx /* New thread */
+ movq %rcx,%rdi
+ movq 16(%rsp),%rcx /* New thread */
#ifdef INVARIANTS
- testl %ecx,%ecx /* no thread? */
+ testq %rcx,%rcx /* no thread? */
jz badsw3 /* no, panic */
#endif
- movl TD_PCB(%ecx),%edx
+ movq TD_PCB(%rcx),%rdx
+ xorq %rsi, %rsi
movl PCPU(CPUID), %esi
/* switch address space */
- movl PCB_CR3(%edx),%eax
- movl %eax,%cr3 /* new address space */
+ movq PCB_CR3(%rdx),%rax
+ movq %rax,%cr3 /* new address space */
/* Release bit from old pmap->pm_active */
- movl TD_PROC(%edi), %eax /* oldproc */
- movl P_VMSPACE(%eax), %ebx
- btrl %esi, VM_PMAP+PM_ACTIVE(%ebx) /* clear old */
+ movq TD_PROC(%rdi), %rax /* oldproc */
+ movq P_VMSPACE(%rax), %rbx
+ btrq %rsi, VM_PMAP+PM_ACTIVE(%rbx) /* clear old */
/* Set bit in new pmap->pm_active */
- movl TD_PROC(%ecx),%eax /* newproc */
- movl P_VMSPACE(%eax), %ebx
- btsl %esi, VM_PMAP+PM_ACTIVE(%ebx) /* set new */
+ movq TD_PROC(%rcx),%rax /* newproc */
+ movq P_VMSPACE(%rax), %rbx
+ btsq %rsi, VM_PMAP+PM_ACTIVE(%rbx) /* set new */
sw1:
/*
@@ -149,41 +151,83 @@
* to load up the rest of the next context.
*/
/* Restore context. */
- movl PCB_EBX(%edx),%ebx
- movl PCB_ESP(%edx),%esp
- 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_PSL(%edx)
- popfl
+ movq PCB_EBX(%rdx),%rbx
+ movq PCB_ESP(%rdx),%rsp
+ movq PCB_EBP(%rdx),%rbp
+ movq PCB_ESI(%rdx),%rsi
+ movq PCB_EDI(%rdx),%rdi
+ movq PCB_EIP(%rdx),%rax
+ movq %rax,(%rsp)
+ pushq PCB_PSL(%rdx)
+ popfq
- movl %edx, PCPU(CURPCB)
- movl %ecx, PCPU(CURTHREAD) /* into next thread */
+ movq %rdx, PCPU(CURPCB)
+ movq %rcx, PCPU(CURTHREAD) /* into next thread */
.globl cpu_switch_load_gs
cpu_switch_load_gs:
- movl PCB_GS(%edx),%gs
+#XXX movq PCB_GS(%rdx),%gs
ret
#ifdef INVARIANTS
badsw1:
- pushal
- pushl $sw0_1
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq $sw0_1
call panic
sw0_1: .asciz "cpu_throw: no newthread supplied"
badsw2:
- pushal
- pushl $sw0_2
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq $sw0_2
call panic
sw0_2: .asciz "cpu_switch: no curthread supplied"
badsw3:
- pushal
- pushl $sw0_3
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq $sw0_3
call panic
sw0_3: .asciz "cpu_switch: no newthread supplied"
#endif
@@ -194,23 +238,23 @@
*/
ENTRY(savectx)
/* Fetch PCB. */
- movl 4(%esp),%ecx
+ movq 8(%rsp),%rcx
/* Save caller's return address. Child won't execute this routine. */
- movl (%esp),%eax
- movl %eax,PCB_EIP(%ecx)
+ movq (%rsp),%rax
+ movq %rax,PCB_EIP(%rcx)
- movl %cr3,%eax
- movl %eax,PCB_CR3(%ecx)
+ movq %cr3,%rax
+ movq %rax,PCB_CR3(%rcx)
- movl %ebx,PCB_EBX(%ecx)
- movl %esp,PCB_ESP(%ecx)
- movl %ebp,PCB_EBP(%ecx)
- movl %esi,PCB_ESI(%ecx)
- movl %edi,PCB_EDI(%ecx)
- movl %gs,PCB_GS(%ecx)
- pushfl
- popl PCB_PSL(%ecx)
+ movq %rbx,PCB_EBX(%rcx)
+ movq %rsp,PCB_ESP(%rcx)
+ movq %rbp,PCB_EBP(%rcx)
+ movq %rsi,PCB_ESI(%rcx)
+ movq %rdi,PCB_EDI(%rcx)
+#XXX movq %gs,PCB_GS(%rcx)
+ pushfq
+ popq PCB_PSL(%rcx)
/*
* If fpcurthread == NULL, then the npx h/w state is irrelevant and the
@@ -224,29 +268,29 @@
* have to handle h/w bugs for reloading. We used to lose the
* parent's npx state for forks by forgetting to reload.
*/
- pushfl
+ pushfq
cli
- movl PCPU(FPCURTHREAD),%eax
- testl %eax,%eax
+ movq PCPU(FPCURTHREAD),%rax
+ testq %rax,%rax
je 1f
- pushl %ecx
- movl TD_PCB(%eax),%eax
- leal PCB_SAVEFPU(%eax),%eax
- pushl %eax
- pushl %eax
+ pushq %rcx
+ movq TD_PCB(%rax),%rax
+ leaq PCB_SAVEFPU(%rax),%rax
+ pushq %rax
+ pushq %rax
call npxsave
- addl $4,%esp
- popl %eax
- popl %ecx
+ addq $8,%rsp
+ popq %rax
+ popq %rcx
- pushl $PCB_SAVEFPU_SIZE
- leal PCB_SAVEFPU(%ecx),%ecx
- pushl %ecx
- pushl %eax
+ pushq $PCB_SAVEFPU_SIZE
+ leaq PCB_SAVEFPU(%rcx),%rcx
+ pushq %rcx
+ pushq %rax
call bcopy
- addl $12,%esp
+ addq $24,%rsp
1:
- popfl
+ popfq
ret
More information about the p4-projects
mailing list