Page MenuHomeFreeBSD

D17286.id48358.diff
No OneTemporary

D17286.id48358.diff

Index: sys/amd64/amd64/support.S
===================================================================
--- sys/amd64/amd64/support.S
+++ sys/amd64/amd64/support.S
@@ -310,10 +310,7 @@
.macro COPYOUT smap erms
PUSH_FRAME_POINTER
movq PCPU(CURPCB),%r9
- /* Trap entry clears PSL.AC */
movq $copy_fault,PCB_ONFAULT(%r9)
- testq %rdx,%rdx /* anything to do? */
- jz 2f
/*
* Check explicitly for non-user addresses. If 486 write protection
@@ -338,10 +335,20 @@
cmpq %rcx,%rax
ja copy_fault
- xchgq %rdi,%rsi
- /* bcopy(%rsi, %rdi, %rdx) */
+ /*
+ * Set up arguments for rep movs*.
+ */
+ movq %rdi,%r8
+ movq %rsi,%rdi
+ movq %r8,%rsi
movq %rdx,%rcx
+ /*
+ * Set return value to zero. Remaining failure mode goes through
+ * copy_fault.
+ */
+ xorl %eax,%eax
+
SMAP_DISABLE \smap
.if \erms == 0
cmpq $15,%rcx
@@ -353,17 +360,16 @@
andb $7,%cl
jne 1f
SMAP_ENABLE \smap
- xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r9)
POP_FRAME_POINTER
ret
.endif
+ ALIGN_TEXT
1:
rep
movsb
+
SMAP_ENABLE \smap
-2:
- xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r9)
POP_FRAME_POINTER
ret
@@ -393,8 +399,6 @@
PUSH_FRAME_POINTER
movq PCPU(CURPCB),%r9
movq $copy_fault,PCB_ONFAULT(%r9)
- testq %rdx,%rdx /* anything to do? */
- jz 2f
/*
* make sure address is valid
@@ -406,9 +410,12 @@
cmpq %rcx,%rax
ja copy_fault
- xchgq %rdi,%rsi
+ movq %rdi,%r8
+ movq %rsi,%rdi
+ movq %r8,%rsi
movq %rdx,%rcx
- movb %cl,%al
+
+ xorl %eax,%eax
SMAP_DISABLE \smap
.if \erms == 0
@@ -417,22 +424,20 @@
shrq $3,%rcx /* copy longword-wise */
rep
movsq
- movb %al,%cl
+ movb %dl,%cl
andb $7,%cl /* copy remaining bytes */
jne 1f
SMAP_ENABLE \smap
- xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r9)
POP_FRAME_POINTER
ret
.endif
+ ALIGN_TEXT
1:
rep
movsb
SMAP_ENABLE \smap
-2:
- xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r9)
POP_FRAME_POINTER
ret
@@ -455,9 +460,9 @@
END(copyin_smap_erms)
ALIGN_TEXT
+ /* Trap entry clears PSL.AC */
copy_fault:
- movq PCPU(CURPCB),%rdx
- movq $0,PCB_ONFAULT(%rdx)
+ movq $0,PCB_ONFAULT(%r9)
movl $EFAULT,%eax
POP_FRAME_POINTER
ret

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 13, 6:15 AM (14 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29611908
Default Alt Text
D17286.id48358.diff (2 KB)

Event Timeline