1/* 2 * linux/arch/arm/lib/copy_from_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_from_user(void *to, const void *from, size_t n) 20 * 21 * Purpose: 22 * 23 * copy a block to kernel memory from user memory 24 * 25 * Params: 26 * 27 * to = kernel memory 28 * from = user 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 37100: ldrt \reg, [\ptr], #4 38 .section __ex_table, "a" 39 .long 100b, \abort 40 .previous 41 .endm 42 43 .macro ldr4w ptr reg1 reg2 reg3 reg4 abort 44 ldr1w \ptr, \reg1, \abort 45 ldr1w \ptr, \reg2, \abort 46 ldr1w \ptr, \reg3, \abort 47 ldr1w \ptr, \reg4, \abort 48 .endm 49 50 .macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort 51 ldr4w \ptr, \reg1, \reg2, \reg3, \reg4, \abort 52 ldr4w \ptr, \reg5, \reg6, \reg7, \reg8, \abort 53 .endm 54 55 .macro ldr1b ptr reg cond=al abort 56100: ldr\cond\()bt \reg, [\ptr], #1 57 .section __ex_table, "a" 58 .long 100b, \abort 59 .previous 60 .endm 61 62 .macro str1w ptr reg abort 63 str \reg, [\ptr], #4 64 .endm 65 66 .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort 67 stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} 68 .endm 69 70 .macro str1b ptr reg cond=al abort 71 str\cond\()b \reg, [\ptr], #1 72 .endm 73 74 .macro enter reg1 reg2 75 mov r3, #0 76 stmdb sp!, {r0, r2, r3, \reg1, \reg2} 77 .endm 78 79 .macro exit reg1 reg2 80 add sp, sp, #8 81 ldmfd sp!, {r0, \reg1, \reg2} 82 .endm 83 84 .text 85 86ENTRY(__copy_from_user) 87 88#include "copy_template.S" 89 90 .section .fixup,"ax" 91 .align 0 92 copy_abort_preamble 93 ldmfd sp!, {r1, r2} 94 sub r3, r0, r1 95 rsb r1, r3, r2 96 str r1, [sp] 97 bl __memzero 98 ldr r0, [sp], #4 99 copy_abort_end 100 .previous 101 102