linux/arch/arm/lib/putuser.S
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/lib/putuser.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
  13 * them more efficient, especially as they return an error
  14 * value in addition to the "real" return value.
  15 *
  16 * __put_user_X
  17 *
  18 * Inputs:      r0 contains the address
  19 *              r1 contains the address limit, which must be preserved
  20 *              r2, r3 contains the value
  21 * Outputs:     r0 is the error code
  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 __put_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(__put_user_1)
  36        check_uaccess r0, 1, r1, ip, __put_user_bad
  371: TUSER(strb)  r2, [r0]
  38        mov     r0, #0
  39        ret     lr
  40ENDPROC(__put_user_1)
  41
  42ENTRY(__put_user_2)
  43        check_uaccess r0, 2, r1, ip, __put_user_bad
  44        mov     ip, r2, lsr #8
  45#ifdef CONFIG_THUMB2_KERNEL
  46#ifndef __ARMEB__
  472: TUSER(strb)  r2, [r0]
  483: TUSER(strb)  ip, [r0, #1]
  49#else
  502: TUSER(strb)  ip, [r0]
  513: TUSER(strb)  r2, [r0, #1]
  52#endif
  53#else   /* !CONFIG_THUMB2_KERNEL */
  54#ifndef __ARMEB__
  552: TUSER(strb)  r2, [r0], #1
  563: TUSER(strb)  ip, [r0]
  57#else
  582: TUSER(strb)  ip, [r0], #1
  593: TUSER(strb)  r2, [r0]
  60#endif
  61#endif  /* CONFIG_THUMB2_KERNEL */
  62        mov     r0, #0
  63        ret     lr
  64ENDPROC(__put_user_2)
  65
  66ENTRY(__put_user_4)
  67        check_uaccess r0, 4, r1, ip, __put_user_bad
  684: TUSER(str)   r2, [r0]
  69        mov     r0, #0
  70        ret     lr
  71ENDPROC(__put_user_4)
  72
  73ENTRY(__put_user_8)
  74        check_uaccess r0, 8, r1, ip, __put_user_bad
  75#ifdef CONFIG_THUMB2_KERNEL
  765: TUSER(str)   r2, [r0]
  776: TUSER(str)   r3, [r0, #4]
  78#else
  795: TUSER(str)   r2, [r0], #4
  806: TUSER(str)   r3, [r0]
  81#endif
  82        mov     r0, #0
  83        ret     lr
  84ENDPROC(__put_user_8)
  85
  86__put_user_bad:
  87        mov     r0, #-EFAULT
  88        ret     lr
  89ENDPROC(__put_user_bad)
  90
  91.pushsection __ex_table, "a"
  92        .long   1b, __put_user_bad
  93        .long   2b, __put_user_bad
  94        .long   3b, __put_user_bad
  95        .long   4b, __put_user_bad
  96        .long   5b, __put_user_bad
  97        .long   6b, __put_user_bad
  98.popsection
  99