Path: blob/master/arch/unicore32/lib/copy_from_user.S
10817 views
/*1* linux/arch/unicore32/lib/copy_from_user.S2*3* Code specific to PKUnity SoC and UniCore ISA4*5* Copyright (C) 2001-2010 GUAN Xue-tao6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License version 2 as9* published by the Free Software Foundation.10*/1112#include <linux/linkage.h>13#include <asm/assembler.h>1415/*16* Prototype:17*18* size_t __copy_from_user(void *to, const void *from, size_t n)19*20* Purpose:21*22* copy a block to kernel memory from user memory23*24* Params:25*26* to = kernel memory27* from = user memory28* n = number of bytes to copy29*30* Return value:31*32* Number of bytes NOT copied.33*/3435.macro ldr1w ptr reg abort36ldrusr \reg, \ptr, 4, abort=\abort37.endm3839.macro ldr4w ptr reg1 reg2 reg3 reg4 abort40100: ldm.w (\reg1, \reg2, \reg3, \reg4), [\ptr]+41.pushsection __ex_table, "a"42.align 343.long 100b, \abort44.popsection45.endm4647.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort48100: ldm.w (\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8), [\ptr]+49.pushsection __ex_table, "a"50.align 351.long 100b, \abort52.popsection53.endm5455.macro ldr1b ptr reg cond=al abort56ldrusr \reg, \ptr, 1, \cond, abort=\abort57.endm5859.macro str1w ptr reg abort60stw.w \reg, [\ptr]+, #461.endm6263.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort64stm.w (\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8), [\ptr]+65.endm6667.macro str1b ptr reg cond=al abort68.ifnc \cond, al69b\cond 201f70b 202f71.endif72201: stb.w \reg, [\ptr]+, #173202:74.endm7576.macro enter77mov r3, #078stm.w (r0, r2, r3), [sp-]79.endm8081.macro exit82add sp, sp, #883ldm.w (r0), [sp]+84mov pc, lr85.endm8687.text8889ENTRY(__copy_from_user)9091#include "copy_template.S"9293ENDPROC(__copy_from_user)9495.pushsection .fixup,"ax"96.align 097copy_abort_preamble98ldm.w (r1, r2), [sp]+99sub r3, r0, r1100rsub r2, r3, r2101stw r2, [sp]102mov r1, #0103b.l memset104ldw.w r0, [sp]+, #4105copy_abort_end106.popsection107108109110