Author: markj
Date: Mon Jan 21 19:37:12 2019
New Revision: 343274
URL: https://svnweb.freebsd.org/changeset/base/343274

Log:
  Deduplicate common code in copyin()/copyout() with a macro.
  
  No functional change intended.
  
  Submitted by: Mitchell Horne <mhorne...@gmail.com>
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D18850

Modified:
  head/sys/riscv/riscv/copyinout.S

Modified: head/sys/riscv/riscv/copyinout.S
==============================================================================
--- head/sys/riscv/riscv/copyinout.S    Mon Jan 21 19:33:05 2019        
(r343273)
+++ head/sys/riscv/riscv/copyinout.S    Mon Jan 21 19:37:12 2019        
(r343274)
@@ -52,60 +52,61 @@ copyio_fault_nopcb:
 END(copyio_fault)
 
 /*
- * Copies from a kernel to user address
+ * copycommon - common copy routine
  *
- * int copyout(const void *kaddr, void *udaddr, size_t len)
+ * a0 - Source address
+ * a1 - Destination address
+ * a2 - Size of copy
  */
-ENTRY(copyout)
-       beqz    a2, 2f          /* If len == 0 then skip loop */
-       add     a3, a1, a2
-       li      a4, VM_MAXUSER_ADDRESS
-       bgt     a3, a4, copyio_fault_nopcb
-
+       .macro copycommon
        la      a6, copyio_fault /* Get the handler address */
        SET_FAULT_HANDLER(a6, a7) /* Set the handler */
        ENTER_USER_ACCESS(a7)
 
-1:     lb      a4, 0(a0)       /* Load from kaddr */
+1:     lb      a4, 0(a0)       /* Load from src */
        addi    a0, a0, 1
-       sb      a4, 0(a1)       /* Store in uaddr */
+       sb      a4, 0(a1)       /* Store in dest */
        addi    a1, a1, 1
        addi    a2, a2, -1      /* len-- */
        bnez    a2, 1b
 
        EXIT_USER_ACCESS(a7)
        SET_FAULT_HANDLER(x0, a7) /* Clear the handler */
+       .endm
 
-2:     li      a0, 0           /* return 0 */
+/*
+ * Copies from a kernel to user address
+ *
+ * int copyout(const void *kaddr, void *udaddr, size_t len)
+ */
+ENTRY(copyout)
+       beqz    a2, copyout_end /* If len == 0 then skip loop */
+       add     a3, a1, a2
+       li      a4, VM_MAXUSER_ADDRESS
+       bgt     a3, a4, copyio_fault_nopcb
+
+       copycommon
+
+copyout_end:
+       li      a0, 0           /* return 0 */
        ret
 END(copyout)
 
 /*
  * Copies from a user to kernel address
  *
- * int copyin(const void *uaddr, void *kdaddr, size_t len)
+ * int copyin(const void *uaddr, void *kaddr, size_t len)
  */
 ENTRY(copyin)
-       beqz    a2, 2f          /* If len == 0 then skip loop */
+       beqz    a2, copyin_end  /* If len == 0 then skip loop */
        add     a3, a0, a2
        li      a4, VM_MAXUSER_ADDRESS
        bgt     a3, a4, copyio_fault_nopcb
 
-       la      a6, copyio_fault /* Get the handler address */
-       SET_FAULT_HANDLER(a6, a7) /* Set the handler */
-       ENTER_USER_ACCESS(a7)
+       copycommon
 
-1:     lb      a4, 0(a0)       /* Load from uaddr */
-       addi    a0, a0, 1
-       sb      a4, 0(a1)       /* Store in kaddr */
-       addi    a1, a1, 1
-       addi    a2, a2, -1      /* len-- */
-       bnez    a2, 1b
-
-       EXIT_USER_ACCESS(a7)
-       SET_FAULT_HANDLER(x0, a7) /* Clear the handler */
-
-2:     li      a0, 0           /* return 0 */
+copyin_end:
+       li      a0, 0           /* return 0 */
        ret
 END(copyin)
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to