linux/arch/avr32/lib/strncpy_from_user.S
<<
>>
Prefs
   1/*
   2 * Copy to/from userspace with optional address space checking.
   3 *
   4 * Copyright 2004-2006 Atmel Corporation
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <linux/errno.h>
  11
  12#include <asm/page.h>
  13#include <asm/thread_info.h>
  14#include <asm/asm.h>
  15
  16        /*
  17         * long strncpy_from_user(char *dst, const char *src, long count)
  18         *
  19         * On success, returns the length of the string, not including
  20         * the terminating NUL.
  21         *
  22         * If the string is longer than count, returns count
  23         *
  24         * If userspace access fails, returns -EFAULT
  25         */
  26        .text
  27        .align  1
  28        .global strncpy_from_user
  29        .type   strncpy_from_user, "function"
  30strncpy_from_user:
  31        mov     r9, -EFAULT
  32        branch_if_kernel r8, __strncpy_from_user
  33        ret_if_privileged r8, r11, r10, r9
  34
  35        .global __strncpy_from_user
  36        .type   __strncpy_from_user, "function"
  37__strncpy_from_user:
  38        cp.w    r10, 0
  39        reteq   0
  40
  41        mov     r9, r10
  42
  431:      ld.ub   r8, r11++
  44        st.b    r12++, r8
  45        cp.w    r8, 0
  46        breq    2f
  47        sub     r9, 1
  48        brne    1b
  49
  502:      sub     r10, r9
  51        retal   r10
  52
  53        .section .fixup, "ax"
  54        .align  1
  553:      mov     r12, -EFAULT
  56        retal   r12
  57
  58        .section __ex_table, "a"
  59        .align  2
  60        .long   1b, 3b
  61