PERFORCE change 108299 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Mon Oct 23 03:06:11 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=108299
Change 108299 by gonzo at gonzo_hq on 2006/10/23 10:05:12
o Implement functions from "copystr" family.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips/copystr.S#4 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips/copystr.S#4 (text+ko) ====
@@ -34,14 +34,13 @@
#include <sys/errno.h>
/*
- * XXXMIPS: Implement these routines
- */
-/*
* copystr(9)
* <v0>int copystr(<a0>const void *src, <a1>void *dst, <a2>size_t len,
* <a3>size_t *done)
*/
ENTRY(copystr)
+ .set noreorder
+ .set noat
move v0, zero
beqz a2, 2f
move t1, zero
@@ -62,13 +61,88 @@
sw t1, 0(a3)
4: jr ra
nop
+ .set reorder
+ .set at
END(copystr)
-
-ENTRY(copyinstr)
- break
+/*
+ * int copyinstr(void *uaddr, void *kaddr, size_t maxlen, size_t *lencopied)
+ * Copy a NIL-terminated string, at most maxlen characters long, from the
+ * user's address space. Return the number of characters copied (including
+ * the NIL) in *lencopied. If the string is too long, return ENAMETOOLONG;
+ * else return 0 or EFAULT.
+ */
+LEAF(copyinstr)
+ .set noreorder
+ .set noat
+ lw t2, pcpup
+ lw v1, PC_CURPCB(t2)
+ la v0, _C_LABEL(copystrerr)
+ blt a0, zero, _C_LABEL(copystrerr)
+ sw v0, PCB_ONFAULT(v1)
+ move t0, a2
+ beq a2, zero, 4f
+1:
+ lbu v0, 0(a0)
+ subu a2, a2, 1
+ beq v0, zero, 2f
+ sb v0, 0(a1)
+ addu a0, a0, 1
+ bne a2, zero, 1b
+ addu a1, a1, 1
+4:
+ li v0, ENAMETOOLONG
+2:
+ beq a3, zero, 3f
+ subu a2, t0, a2
+ sw a2, 0(a3)
+3:
+ j ra # v0 is 0 or ENAMETOOLONG
+ sw zero, PCB_ONFAULT(v1)
+ .set reorder
+ .set at
END(copyinstr)
-ENTRY(copyoutstr)
- break
+/*
+ * int copyoutstr(void *uaddr, void *kaddr, size_t maxlen, size_t *lencopied);
+ * Copy a NIL-terminated string, at most maxlen characters long, into the
+ * user's address space. Return the number of characters copied (including
+ * the NIL) in *lencopied. If the string is too long, return ENAMETOOLONG;
+ * else return 0 or EFAULT.
+ */
+LEAF(copyoutstr)
+ .set noreorder
+ .set noat
+ lw t2, pcpup
+ lw v1, PC_CURPCB(t2)
+ la v0, _C_LABEL(copystrerr)
+ blt a1, zero, _C_LABEL(copystrerr)
+ sw v0, PCB_ONFAULT(v1)
+ move t0, a2
+ beq a2, zero, 4f
+1:
+ lbu v0, 0(a0)
+ subu a2, a2, 1
+ beq v0, zero, 2f
+ sb v0, 0(a1)
+ addu a0, a0, 1
+ bne a2, zero, 1b
+ addu a1, a1, 1
+4:
+ li v0, ENAMETOOLONG
+2:
+ beq a3, zero, 3f
+ subu a2, t0, a2
+ sw a2, 0(a3)
+3:
+ j ra # v0 is 0 or ENAMETOOLONG
+ sw zero, PCB_ONFAULT(v1)
+ .set reorder
+ .set at
END(copyoutstr)
+
+LEAF(copystrerr)
+ sw zero, PCB_ONFAULT(v1)
+ j ra
+ li v0, EFAULT # return EFAULT
+END(copystrerr)
More information about the p4-projects
mailing list