linux/arch/arm/lib/getuser.S
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/lib/getuser.S
   3 *
   4 *  Copyright (C) 2001 Russell King
   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 *  Idea from x86 version, (C) Copyright 1998 Linus Torvalds
  11 *
  12 * These functions have a non-standard call interface to make them more
  13 * efficient, especially as they return an error value in addition to
  14 * the "real" return value.
  15 *
  16 * __get_user_X
  17 *
  18 * Inputs:      r0 contains the address
  19 *              r1 contains the address limit, which must be preserved
  20 * Outputs:     r0 is the error code
  21 *              r2 contains the zero-extended value
  22 *              lr corrupted
  23 *
  24 * No other registers must be altered.  (see <asm/uaccess.h>
  25 * for specific ASM register usage).
  26 *
  27 * Note that ADDR_LIMIT is either 0 or 0xc0000000.
  28 * Note also that it is intended that __get_user_bad is not global.
  29 */
  30#include <linux/linkage.h>
  31#include <asm/assembler.h>
  32#include <asm/errno.h>
  33#include <asm/domain.h>
  34
  35ENTRY(__get_user_1)
  36        check_uaccess r0, 1, r1, r2, __get_user_bad
  371: TUSER(ldrb)  r2, [r0]
  38        mov     r0, #0
  39        mov     pc, lr
  40ENDPROC(__get_user_1)
  41
  42ENTRY(__get_user_2)
  43        check_uaccess r0, 2, r1, r2, __get_user_bad
  44#ifdef CONFIG_CPU_USE_DOMAINS
  45rb      .req    ip
  462:      ldrbt   r2, [r0], #1
  473:      ldrbt   rb, [r0], #0
  48#else
  49rb      .req    r0
  502:      ldrb    r2, [r0]
  513:      ldrb    rb, [r0, #1]
  52#endif
  53#ifndef __ARMEB__
  54        orr     r2, r2, rb, lsl #8
  55#else
  56        orr     r2, rb, r2, lsl #8
  57#endif
  58        mov     r0, #0
  59        mov     pc, lr
  60ENDPROC(__get_user_2)
  61
  62ENTRY(__get_user_4)
  63        check_uaccess r0, 4, r1, r2, __get_user_bad
  644: TUSER(ldr)   r2, [r0]
  65        mov     r0, #0
  66        mov     pc, lr
  67ENDPROC(__get_user_4)
  68
  69__get_user_bad:
  70        mov     r2, #0
  71        mov     r0, #-EFAULT
  72        mov     pc, lr
  73ENDPROC(__get_user_bad)
  74
  75.pushsection __ex_table, "a"
  76        .long   1b, __get_user_bad
  77        .long   2b, __get_user_bad
  78        .long   3b, __get_user_bad
  79        .long   4b, __get_user_bad
  80.popsection
  81