copy_to_user.S 2.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 *  linux/arch/arm/lib/copy_to_user.S
 *
 *  Author:	Nicolas Pitre
 *  Created:	Sep 29, 2005
 *  Copyright:	MontaVista Software, Inc.
 *
 *  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.
 */

#include <linux/linkage.h>
#include <asm/assembler.h>
15
#include <asm/unwind.h>
A
Al Viro 已提交
16
#include <asm/export.h>
17 18 19 20

/*
 * Prototype:
 *
21
 *	size_t arm_copy_to_user(void *to, const void *from, size_t n)
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 *
 * Purpose:
 *
 *	copy a block to user memory from kernel memory
 *
 * Params:
 *
 *	to = user memory
 *	from = kernel memory
 *	n = number of bytes to copy
 *
 * Return value:
 *
 *	Number of bytes NOT copied.
 */

38 39 40 41 42 43 44
#define LDR1W_SHIFT	0
#ifndef CONFIG_THUMB2_KERNEL
#define STR1W_SHIFT	0
#else
#define STR1W_SHIFT	1
#endif

45
	.macro ldr1w ptr reg abort
46
	W(ldr) \reg, [\ptr], #4
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
	.endm

	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
	.endm

	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
	.endm

	.macro ldr1b ptr reg cond=al abort
	ldr\cond\()b \reg, [\ptr], #1
	.endm

	.macro str1w ptr reg abort
62
	strusr	\reg, \ptr, 4, abort=\abort
63 64 65 66 67 68 69 70 71 72 73 74 75 76
	.endm

	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
	str1w \ptr, \reg1, \abort
	str1w \ptr, \reg2, \abort
	str1w \ptr, \reg3, \abort
	str1w \ptr, \reg4, \abort
	str1w \ptr, \reg5, \abort
	str1w \ptr, \reg6, \abort
	str1w \ptr, \reg7, \abort
	str1w \ptr, \reg8, \abort
	.endm

	.macro str1b ptr reg cond=al abort
77
	strusr	\reg, \ptr, 1, \cond, abort=\abort
78 79 80 81 82 83 84
	.endm

	.macro enter reg1 reg2
	mov	r3, #0
	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
	.endm

85 86 87 88
	.macro usave reg1 reg2
	UNWIND(	.save {r0, r2, r3, \reg1, \reg2}	)
	.endm

89 90 91 92 93 94 95
	.macro exit reg1 reg2
	add	sp, sp, #8
	ldmfd	sp!, {r0, \reg1, \reg2}
	.endm

	.text

96
ENTRY(__copy_to_user_std)
97
WEAK(arm_copy_to_user)
98 99 100

#include "copy_template.S"

101
ENDPROC(arm_copy_to_user)
102
ENDPROC(__copy_to_user_std)
A
Al Viro 已提交
103 104 105
#ifndef CONFIG_UACCESS_WITH_MEMCPY
EXPORT_SYMBOL(arm_copy_to_user)
#endif
106

107
	.pushsection .text.fixup,"ax"
108 109 110 111 112 113
	.align 0
	copy_abort_preamble
	ldmfd	sp!, {r1, r2, r3}
	sub	r0, r0, r1
	rsb	r0, r0, r2
	copy_abort_end
114
	.popsection
115