linux/arch/mips/lib/strnlen_user.S
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (c) 1996, 1998, 1999, 2004 by Ralf Baechle
   7 * Copyright (c) 1999 Silicon Graphics, Inc.
   8 */
   9#include <asm/asm.h>
  10#include <asm/asm-offsets.h>
  11#include <asm/regdef.h>
  12
  13#define EX(insn,reg,addr,handler)                       \
  149:      insn    reg, addr;                              \
  15        .section __ex_table,"a";                        \
  16        PTR     9b, handler;                            \
  17        .previous
  18
  19/*
  20 * Return the size of a string including the ending NUL character up to a
  21 * maximum of a1 or 0 in case of error.
  22 *
  23 * Note: for performance reasons we deliberately accept that a user may
  24 *       make strlen_user and strnlen_user access the first few KSEG0
  25 *       bytes.  There's nothing secret there.  On 64-bit accessing beyond
  26 *       the maximum is a tad hairier ...
  27 */
  28LEAF(__strnlen_user_asm)
  29        LONG_L          v0, TI_ADDR_LIMIT($28)  # pointer ok?
  30        and             v0, a0
  31        bnez            v0, .Lfault
  32
  33FEXPORT(__strnlen_user_nocheck_asm)
  34        move            v0, a0
  35        PTR_ADDU        a1, a0                  # stop pointer
  361:      beq             v0, a1, 1f              # limit reached?
  37        EX(lb, t0, (v0), .Lfault)
  38        PTR_ADDU        v0, 1
  39        bnez            t0, 1b
  401:      PTR_SUBU        v0, a0
  41        jr              ra
  42        END(__strnlen_user_asm)
  43
  44.Lfault:
  45        move            v0, zero
  46        jr              ra
  47
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.