The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/mips/mips/copystr.S

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: copy.S,v 1.5 2007/10/17 19:55:37 garbled Exp $ */
    2 
    3 /*-
    4  * Copyright (c) 1992, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    6  * 
    7  * This code is derived from software contributed to Berkeley by
    8  * Digital Equipment Corporation and Ralph Campbell.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. Neither the name of the University nor the names of its contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  *
   34  * Copyright (C) 1989 Digital Equipment Corporation.
   35  * Permission to use, copy, modify, and distribute this software and
   36  * its documentation for any purpose and without fee is hereby granted,
   37  * provided that the above copyright notice appears in all copies.
   38  * Digital Equipment Corporation makes no representations about the
   39  * suitability of this software for any purpose.  It is provided "as is"
   40  * without express or implied warranty.
   41  * 
   42  * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/loMem.s,
   43  *      v 1.1 89/07/11 17:55:04 nelson Exp  SPRITE (DECWRL)
   44  * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAsm.s,
   45  *      v 9.2 90/01/29 18:00:39 shirriff Exp  SPRITE (DECWRL)
   46  * from: Header: /sprite/src/kernel/vm/ds3100.md/vmPmaxAsm.s,
   47  *      v 1.1 89/07/10 14:27:41 nelson Exp  SPRITE (DECWRL)
   48  * 
   49  *      @(#)locore.s    8.5 (Berkeley) 1/4/94
   50  */
   51         
   52 #include "assym.s"
   53 #include <machine/asm.h>
   54 #include <machine/asmacros.h>
   55 __FBSDID("$FreeBSD: releng/8.0/sys/mips/mips/copystr.S 178217 2008-04-15 05:31:19Z imp $");
   56 
   57 #include <sys/errno.h>
   58 
   59 /*
   60  * copystr(9)
   61  * <v0>int copystr(<a0>const void *src, <a1>void *dst, <a2>size_t len,
   62  *                 <a3>size_t *done)
   63  */
   64 ENTRY(copystr)
   65         .set noreorder
   66         .set noat
   67         move    v0, zero
   68         beqz    a2, 2f
   69         move    t1, zero
   70 1:      subu    a2, 1
   71         lbu     t0, 0(a0)
   72         addu    a0, 1
   73         sb      t0, 0(a1)
   74         addu    a1, 1
   75         beqz    t0, 3f /* NULL  - end of string*/
   76         addu    t1, 1
   77         bnez    a2, 1b
   78         nop
   79 2:      /* ENAMETOOLONG */
   80         li      v0, ENAMETOOLONG
   81 3:      /* done != NULL -> how many bytes were copied */
   82         beqz    a3, 4f
   83         nop
   84         sw      t1, 0(a3)
   85 4:      jr      ra
   86         nop
   87         .set reorder
   88         .set at
   89 END(copystr)
   90 
   91 /*
   92  * int copyinstr(void *uaddr, void *kaddr, size_t maxlen, size_t *lencopied)
   93  * Copy a NIL-terminated string, at most maxlen characters long, from the
   94  * user's address space.  Return the number of characters copied (including
   95  * the NIL) in *lencopied.  If the string is too long, return ENAMETOOLONG;
   96  * else return 0 or EFAULT.
   97  */
   98 LEAF(copyinstr)
   99         .set noreorder
  100         .set noat
  101         lw      t2, pcpup
  102         lw      v1, PC_CURPCB(t2)
  103         la      v0, _C_LABEL(copystrerr)
  104         blt     a0, zero, _C_LABEL(copystrerr)
  105         sw      v0, PCB_ONFAULT(v1)
  106         move    t0, a2
  107         beq     a2, zero, 4f
  108 1:
  109         lbu     v0, 0(a0)
  110         subu    a2, a2, 1
  111         beq     v0, zero, 2f
  112         sb      v0, 0(a1)
  113         addu    a0, a0, 1
  114         bne     a2, zero, 1b
  115         addu    a1, a1, 1
  116 4:
  117         li      v0, ENAMETOOLONG
  118 2:
  119         beq     a3, zero, 3f
  120         subu    a2, t0, a2
  121         sw      a2, 0(a3)
  122 3:
  123         j       ra                              # v0 is 0 or ENAMETOOLONG
  124         sw      zero, PCB_ONFAULT(v1)
  125         .set reorder
  126         .set at
  127 END(copyinstr)
  128 
  129 /*
  130  * int copyoutstr(void *uaddr, void *kaddr, size_t maxlen, size_t *lencopied);
  131  * Copy a NIL-terminated string, at most maxlen characters long, into the
  132  * user's address space.  Return the number of characters copied (including
  133  * the NIL) in *lencopied.  If the string is too long, return ENAMETOOLONG;
  134  * else return 0 or EFAULT.
  135  */
  136 LEAF(copyoutstr)
  137         .set noreorder
  138         .set noat
  139         lw      t2, pcpup
  140         lw      v1, PC_CURPCB(t2)
  141         la      v0, _C_LABEL(copystrerr)
  142         blt     a1, zero, _C_LABEL(copystrerr)
  143         sw      v0, PCB_ONFAULT(v1)
  144         move    t0, a2
  145         beq     a2, zero, 4f
  146 1:
  147         lbu     v0, 0(a0)
  148         subu    a2, a2, 1
  149         beq     v0, zero, 2f
  150         sb      v0, 0(a1)
  151         addu    a0, a0, 1
  152         bne     a2, zero, 1b
  153         addu    a1, a1, 1
  154 4:
  155         li      v0, ENAMETOOLONG
  156 2:
  157         beq     a3, zero, 3f
  158         subu    a2, t0, a2
  159         sw      a2, 0(a3)
  160 3:
  161         j       ra                              # v0 is 0 or ENAMETOOLONG
  162         sw      zero, PCB_ONFAULT(v1)
  163         .set reorder
  164         .set at
  165 END(copyoutstr)
  166 
  167 LEAF(copystrerr)
  168         sw      zero, PCB_ONFAULT(v1)
  169         j       ra
  170         li      v0, EFAULT                      # return EFAULT
  171 END(copystrerr)

Cache object: 8b6ac908b0219c25540f874530e7a785


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.