Blame view

arch/arm/lib/getuser.S 1.59 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /*
   *  linux/arch/arm/lib/getuser.S
   *
   *  Copyright (C) 2001 Russell King
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   *  Idea from x86 version, (C) Copyright 1998 Linus Torvalds
   *
   * These functions have a non-standard call interface to make them more
   * efficient, especially as they return an error value in addition to
   * the "real" return value.
   *
   * __get_user_X
   *
   * Inputs:	r0 contains the address
   * Outputs:	r0 is the error code
   *		r2, r3 contains the zero-extended value
   *		lr corrupted
   *
4baa99224   Russell King   [ARM] move includ...
23
   * No other registers must be altered.  (see <asm/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
   * for specific ASM register usage).
   *
   * Note that ADDR_LIMIT is either 0 or 0xc0000000.
   * Note also that it is intended that __get_user_bad is not global.
   */
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
29
  #include <linux/linkage.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #include <asm/errno.h>
247055aa2   Catalin Marinas   ARM: 6384/1: Remo...
31
  #include <asm/domain.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
33
  ENTRY(__get_user_1)
247055aa2   Catalin Marinas   ARM: 6384/1: Remo...
34
  1:	T(ldrb)	r2, [r0]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
  	mov	r0, #0
  	mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
37
  ENDPROC(__get_user_1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38

93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
39
  ENTRY(__get_user_2)
8b592783a   Catalin Marinas   Thumb-2: Implemen...
40
  #ifdef CONFIG_THUMB2_KERNEL
247055aa2   Catalin Marinas   ARM: 6384/1: Remo...
41
42
  2:	T(ldrb)	r2, [r0]
  3:	T(ldrb)	r3, [r0, #1]
8b592783a   Catalin Marinas   Thumb-2: Implemen...
43
  #else
247055aa2   Catalin Marinas   ARM: 6384/1: Remo...
44
45
  2:	T(ldrb)	r2, [r0], #1
  3:	T(ldrb)	r3, [r0]
8b592783a   Catalin Marinas   Thumb-2: Implemen...
46
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
50
51
52
53
  #ifndef __ARMEB__
  	orr	r2, r2, r3, lsl #8
  #else
  	orr	r2, r3, r2, lsl #8
  #endif
  	mov	r0, #0
  	mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
54
  ENDPROC(__get_user_2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55

93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
56
  ENTRY(__get_user_4)
247055aa2   Catalin Marinas   ARM: 6384/1: Remo...
57
  4:	T(ldr)	r2, [r0]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
  	mov	r0, #0
  	mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
60
  ENDPROC(__get_user_4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
65
  __get_user_bad:
  	mov	r2, #0
  	mov	r0, #-EFAULT
  	mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
66
  ENDPROC(__get_user_bad)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67

4260415f6   Russell King   ARM: fix build er...
68
  .pushsection __ex_table, "a"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
  	.long	1b, __get_user_bad
  	.long	2b, __get_user_bad
  	.long	3b, __get_user_bad
  	.long	4b, __get_user_bad
4260415f6   Russell King   ARM: fix build er...
73
  .popsection