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 17/* 18 * Prototype: 19 * 20 * size_t arm_copy_to_user(void *to, const void *from, size_t n) 21 * 22 * Purpose: 23 * 24 * copy a block to user memory from kernel memory 25 * 26 * Params: 27 * 28 * to = user memory 29 * from = kernel memory 30 * n = number of bytes to copy 31 * 32 * Return value: 33 * 34 * Number of bytes NOT copied. 35 */ 36 37#define LDR1W_SHIFT 0 38#ifndef CONFIG_THUMB2_KERNEL 39#define STR1W_SHIFT 0 40#else 41#define STR1W_SHIFT 1 42#endif 43 44 .macro ldr1w ptr reg abort 45 W(ldr) \reg, [\ptr], #4 46 .endm 47 48 .macro ldr4w ptr reg1 reg2 reg3 reg4 abort 49 ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4} 50 .endm 51 52 .macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort 53 ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} 54 .endm 55 56 .macro ldr1b ptr reg cond=al abort 57 ldr\cond\()b \reg, [\ptr], #1 58 .endm 59 60 .macro str1w ptr reg abort 61 strusr \reg, \ptr, 4, abort=\abort 62 .endm 63 64 .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort 65 str1w \ptr, \reg1, \abort 66 str1w \ptr, \reg2, \abort 67 str1w \ptr, \reg3, \abort 68 str1w \ptr, \reg4, \abort 69 str1w \ptr, \reg5, \abort 70 str1w \ptr, \reg6, \abort 71 str1w \ptr, \reg7, \abort 72 str1w \ptr, \reg8, \abort 73 .endm 74 75 .macro str1b ptr reg cond=al abort 76 strusr \reg, \ptr, 1, \cond, abort=\abort 77 .endm 78 79 .macro enter reg1 reg2 80 mov r3, #0 81 stmdb sp!, {r0, r2, r3, \reg1, \reg2} 82 .endm 83 84 .macro usave reg1 reg2 85 UNWIND( .save {r0, r2, r3, \reg1, \reg2} ) 86 .endm 87 88 .macro exit reg1 reg2 89 add sp, sp, #8 90 ldmfd sp!, {r0, \reg1, \reg2} 91 .endm 92 93 .text 94 95ENTRY(__copy_to_user_std) 96WEAK(arm_copy_to_user) 97 98#include "copy_template.S" 99 100ENDPROC(arm_copy_to_user) 101ENDPROC(__copy_to_user_std) 102 103 .pushsection .text.fixup,"ax" 104 .align 0 105 copy_abort_preamble 106 ldmfd sp!, {r1, r2, r3} 107 sub r0, r0, r1 108 rsb r0, r0, r2 109 copy_abort_end 110 .popsection 111 112