PERFORCE change 28504 for review
Peter Wemm
peter at FreeBSD.org
Tue Apr 8 01:52:49 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=28504
Change 28504 by peter at peter_daintree on 2003/04/08 01:52:25
actually use hammer-style calling conventions rather than i386
style stack based conventions. This is both a blessing and a
curse.
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/support.s#16 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/support.s#16 (text+ko) ====
@@ -63,17 +63,12 @@
/*
* copyout(from_kernel, to_user, len) - MP SAFE
+ * %rdi, %rsi, %rdx
*/
ENTRY(copyout)
movq PCPU(CURPCB),%rax
movq $copyout_fault,PCB_ONFAULT(%rax)
- pushq %rsi
- pushq %rdi
- pushq %rbx
- movq 32(%rsp),%rsi
- movq 40(%rsp),%rdi
- movq 48(%rsp),%rbx
- testl %ebx,%ebx /* anything to do? */
+ testq %rdx,%rdx /* anything to do? */
jz done_copyout
/*
@@ -86,8 +81,8 @@
/*
* First, prevent address wrapping.
*/
- movq %rdi,%rax
- addq %rbx,%rax
+ movq %rsi,%rax
+ addq %rdx,%rax
jc copyout_fault
/*
* XXX STOP USING VM_MAXUSER_ADDRESS.
@@ -99,8 +94,9 @@
cmpq %rcx,%rax
ja copyout_fault
- /* bcopy(%rsi, %rdi, %rbx) */
- movq %rbx,%rcx
+ xchgq %rdi, %rsi
+ /* bcopy(%rsi, %rdi, %rdx) */
+ movq %rdx,%rcx
shrq $3,%rcx
cld
@@ -112,9 +108,6 @@
movsb
done_copyout:
- popq %rbx
- popq %rdi
- popq %rsi
xorq %rax,%rax
movq PCPU(CURPCB),%rdx
movq %rax,PCB_ONFAULT(%rdx)
@@ -122,9 +115,6 @@
ALIGN_TEXT
copyout_fault:
- popq %rbx
- popq %rdi
- popq %rsi
movq PCPU(CURPCB),%rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
@@ -132,26 +122,26 @@
/*
* copyin(from_user, to_kernel, len) - MP SAFE
+ * %rdi, %rsi, %rdx
*/
ENTRY(copyin)
movq PCPU(CURPCB),%rax
movq $copyin_fault,PCB_ONFAULT(%rax)
- pushq %rsi
- pushq %rdi
- movq 24(%rsp),%rsi /* caddr_t from */
- movq 32(%rsp),%rdi /* caddr_t to */
- movq 40(%rsp),%rcx /* size_t len */
+ testq %rdx,%rdx /* anything to do? */
+ jz done_copyin
/*
* make sure address is valid
*/
- movq %rsi,%rdx
- addq %rcx,%rdx
+ movq %rdi,%rax
+ addq %rdx,%rax
jc copyin_fault
- movq $VM_MAXUSER_ADDRESS,%rax
- cmpq %rax,%rdx
+ movq $VM_MAXUSER_ADDRESS,%rcx
+ cmpq %rcx,%rax
ja copyin_fault
+ xchgq %rdi, %rsi
+ movq %rdx, %rcx
movb %cl,%al
shrq $3,%rcx /* copy longword-wise */
cld
@@ -162,8 +152,7 @@
rep
movsb
- popq %rdi
- popq %rsi
+done_copyin:
xorq %rax,%rax
movq PCPU(CURPCB),%rdx
movq %rax,PCB_ONFAULT(%rdx)
@@ -171,8 +160,6 @@
ALIGN_TEXT
copyin_fault:
- popq %rdi
- popq %rsi
movq PCPU(CURPCB),%rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
@@ -180,19 +167,18 @@
/*
* casuptr. Compare and set user pointer. Returns -1 or the current value.
+ * dst = %rdi, old = %rsi, new = %rdx
*/
ENTRY(casuptr)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx /* dst */
movq $VM_MAXUSER_ADDRESS-4,%rax
- cmpq %rax,%rdx /* verify address is valid */
+ cmpq %rax,%rdi /* verify address is valid */
ja fusufault
- movq 16(%rsp),%rax /* old */
- movq 24(%rsp),%rcx /* new */
- cmpxchgq %rcx, (%rdx)
+ movq %rsi, %rax /* old */
+ cmpxchgq %rdx, (%rdi) /* new = %rdx */
/*
* The old value is in %eax. If the store succeeded it will be the
@@ -209,32 +195,31 @@
* fu{byte,sword,word} - MP SAFE
*
* Fetch a byte (sword, word) from user memory
+ * %rdi
*/
ENTRY(fuword64)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx /* from */
movq $VM_MAXUSER_ADDRESS-8,%rax
- cmpq %rax,%rdx /* verify address is valid */
+ cmpq %rax,%rdi /* verify address is valid */
ja fusufault
- movq (%rdx),%rax
+ movq (%rdi),%rax
movq $0,PCB_ONFAULT(%rcx)
ret
ENTRY(fuword32)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx /* from */
movq $VM_MAXUSER_ADDRESS-4,%rax
- cmpq %rax,%rdx /* verify address is valid */
+ cmpq %rax,%rdi /* verify address is valid */
ja fusufault
# XXX use the 64 extend
xorq %rax, %rax
- movl (%rdx),%eax
+ movl (%rdi),%eax
movq $0,PCB_ONFAULT(%rcx)
ret
@@ -258,15 +243,14 @@
ENTRY(fuword16)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-2,%rax
- cmpq %rax,%rdx
+ cmpq %rax,%rdi
ja fusufault
# XXX use the 64 extend
xorq %rax, %rax
- movzwl (%rdx),%eax
+ movzwl (%rdi),%eax
movq $0,PCB_ONFAULT(%rcx)
ret
@@ -276,15 +260,14 @@
ENTRY(fubyte)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-1,%rax
- cmpq %rax,%rdx
+ cmpq %rax,%rdi
ja fusufault
# XXX use the 64 extend
xorq %rax, %rax
- movzbl (%rdx),%eax
+ movzbl (%rdi),%eax
movq $0,PCB_ONFAULT(%rcx)
ret
@@ -300,18 +283,17 @@
* su{byte,sword,word} - MP SAFE
*
* Write a byte (word, longword) to user memory
+ * addr = %rdi, value = %rsi
*/
ENTRY(suword64)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-8,%rax
- cmpq %rax,%rdx /* verify address validity */
+ cmpq %rax,%rdi /* verify address validity */
ja fusufault
- movq 16(%rsp),%rax
- movq %rax,(%rdx)
+ movq %rsi,(%rdi)
xorq %rax,%rax
movq PCPU(CURPCB),%rcx
movq %rax,PCB_ONFAULT(%rcx)
@@ -320,14 +302,12 @@
ENTRY(suword32)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-4,%rax
- cmpq %rax,%rdx /* verify address validity */
+ cmpq %rax,%rdi /* verify address validity */
ja fusufault
- movl 16(%rsp),%eax
- movl %eax,(%rdx)
+ movl %esi,(%rdi)
xorq %rax,%rax
movq PCPU(CURPCB),%rcx
movq %rax,PCB_ONFAULT(%rcx)
@@ -342,14 +322,12 @@
ENTRY(suword16)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-2,%rax
- cmpq %rax,%rdx /* verify address validity */
+ cmpq %rax,%rdi /* verify address validity */
ja fusufault
- movw 16(%rsp),%ax
- movw %ax,(%rdx)
+ movw %si,(%rdi)
xorq %rax,%rax
movq PCPU(CURPCB),%rcx /* restore trashed register */
movq %rax,PCB_ONFAULT(%rcx)
@@ -361,14 +339,13 @@
ENTRY(subyte)
movq PCPU(CURPCB),%rcx
movq $fusufault,PCB_ONFAULT(%rcx)
- movq 8(%rsp),%rdx
movq $VM_MAXUSER_ADDRESS-1,%rax
- cmpq %rax,%rdx /* verify address validity */
+ cmpq %rax,%rdi /* verify address validity */
ja fusufault
- movb 16(%rsp),%al
- movb %al,(%rdx)
+ movl %esi, %eax
+ movb %al,(%rdi)
xorq %rax,%rax
movq PCPU(CURPCB),%rcx /* restore trashed register */
movq %rax,PCB_ONFAULT(%rcx)
@@ -376,6 +353,7 @@
/*
* copyinstr(from, to, maxlen, int *lencopied) - MP SAFE
+ * %rdi, %rsi, %rdx, %rcx
*
* copy a string from from to to, stop when a 0 character is reached.
* return ENAMETOOLONG if string is longer than maxlen, and
@@ -383,15 +361,12 @@
* return the actual length in *lencopied.
*/
ENTRY(copyinstr)
- pushq %rsi
- pushq %rdi
movq PCPU(CURPCB),%rcx
movq $cpystrflt,PCB_ONFAULT(%rcx)
+ movq %rdx, %r8 /* %r8 = maxlen */
+ movq %rcx, %r9 /* %r9 = *len */
+ xchgq %rdi, %rsi /* %rdi = from, %rsi = to */
- movq 24(%rsp),%rsi /* %esi = from */
- movq 32(%rsp),%rdi /* %edi = to */
- movq 40(%rsp),%rdx /* %edx = maxlen */
-
movq $VM_MAXUSER_ADDRESS,%rax
/* make sure 'from' is within bounds */
@@ -402,7 +377,7 @@
cmpq %rdx,%rax
jae 1f
movq %rax,%rdx
- movq %rax,40(%rsp)
+ movq %rax,%r8
1:
incq %rdx
cld
@@ -436,28 +411,23 @@
/* set *lencopied and return %eax */
movq PCPU(CURPCB),%rcx
movq $0,PCB_ONFAULT(%rcx)
- movq 40(%rsp),%rcx
- subq %rdx,%rcx
- movq 48(%rsp),%rdx
- testq %rdx,%rdx
+
+ testq %r9,%r9
jz 1f
- movq %rcx,(%rdx)
+ subq %rdx,%r8
+ movq %r8,(%r9)
1:
- popq %rdi
- popq %rsi
ret
/*
* copystr(from, to, maxlen, int *lencopied) - MP SAFE
+ * %rdi, %rsi, %rdx, %rcx
*/
ENTRY(copystr)
- pushq %rsi
- pushq %rdi
+ movq %rdx, %r8 /* %r8 = maxlen */
- movq 24(%rsp),%rsi /* %esi = from */
- movq 32(%rsp),%rdi /* %edi = to */
- movq 40(%rsp),%rdx /* %edx = maxlen */
+ xchgq %rdi, %rsi
incq %rdx
cld
1:
@@ -477,20 +447,18 @@
movq $ENAMETOOLONG,%rax
6:
+
+ testq %rcx, %rcx
+ jz 7f
/* set *lencopied and return %rax */
- movq 40(%rsp),%rcx
- subq %rdx,%rcx
- movq 48(%rsp),%rdx
- testq %rdx,%rdx
- jz 7f
- movq %rcx,(%rdx)
+ subq %rdx, %r8
+ movq %r8, (%rcx)
7:
- popq %rdi
- popq %rsi
ret
/*
* Handling of special 386 registers and descriptor tables etc
+ * %rdi
*/
/* void lgdt(struct region_descriptor *rdp); */
ENTRY(lgdt)
@@ -501,12 +469,6 @@
jmp 1f
nop
1:
- /* reload "stale" selectors */
- movl $KDSEL,%eax
- mov %ax,%ds
- mov %ax,%es
- mov %ax,%ss
-
/* reload code selector by turning return into intersegmental return */
popq %rax
pushq $KCSEL
More information about the p4-projects
mailing list