xref: /openbmc/linux/arch/arm/lib/copy_to_user.S (revision 4dd1837d)
1/*
2 *  linux/arch/arm/lib/copy_to_user.S
3 *
4 *  Author:	Nicolas Pitre
5 *  Created:	Sep 29, 2005
6 *  Copyright:	MontaVista Software, Inc.
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU General Public License version 2 as
10 *  published by the Free Software Foundation.
11 */
12
13#include <linux/linkage.h>
14#include <asm/assembler.h>
15#include <asm/unwind.h>
16#include <asm/export.h>
17
18/*
19 * Prototype:
20 *
21 *	size_t arm_copy_to_user(void *to, const void *from, size_t n)
22 *
23 * Purpose:
24 *
25 *	copy a block to user memory from kernel memory
26 *
27 * Params:
28 *
29 *	to = user memory
30 *	from = kernel memory
31 *	n = number of bytes to copy
32 *
33 * Return value:
34 *
35 *	Number of bytes NOT copied.
36 */
37
38#define LDR1W_SHIFT	0
39#ifndef CONFIG_THUMB2_KERNEL
40#define STR1W_SHIFT	0
41#else
42#define STR1W_SHIFT	1
43#endif
44
45	.macro ldr1w ptr reg abort
46	W(ldr) \reg, [\ptr], #4
47	.endm
48
49	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
50	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
51	.endm
52
53	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
54	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
55	.endm
56
57	.macro ldr1b ptr reg cond=al abort
58	ldr\cond\()b \reg, [\ptr], #1
59	.endm
60
61	.macro str1w ptr reg abort
62	strusr	\reg, \ptr, 4, abort=\abort
63	.endm
64
65	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
66	str1w \ptr, \reg1, \abort
67	str1w \ptr, \reg2, \abort
68	str1w \ptr, \reg3, \abort
69	str1w \ptr, \reg4, \abort
70	str1w \ptr, \reg5, \abort
71	str1w \ptr, \reg6, \abort
72	str1w \ptr, \reg7, \abort
73	str1w \ptr, \reg8, \abort
74	.endm
75
76	.macro str1b ptr reg cond=al abort
77	strusr	\reg, \ptr, 1, \cond, abort=\abort
78	.endm
79
80	.macro enter reg1 reg2
81	mov	r3, #0
82	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
83	.endm
84
85	.macro usave reg1 reg2
86	UNWIND(	.save {r0, r2, r3, \reg1, \reg2}	)
87	.endm
88
89	.macro exit reg1 reg2
90	add	sp, sp, #8
91	ldmfd	sp!, {r0, \reg1, \reg2}
92	.endm
93
94	.text
95
96ENTRY(__copy_to_user_std)
97WEAK(arm_copy_to_user)
98
99#include "copy_template.S"
100
101ENDPROC(arm_copy_to_user)
102ENDPROC(__copy_to_user_std)
103#ifndef CONFIG_UACCESS_WITH_MEMCPY
104EXPORT_SYMBOL(arm_copy_to_user)
105#endif
106
107	.pushsection .text.fixup,"ax"
108	.align 0
109	copy_abort_preamble
110	ldmfd	sp!, {r1, r2, r3}
111	sub	r0, r0, r1
112	rsb	r0, r0, r2
113	copy_abort_end
114	.popsection
115
116