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