Path: blob/master/arch/arm/lib/csumpartialcopyuser.S
10817 views
/*1* linux/arch/arm/lib/csumpartialcopyuser.S2*3* Copyright (C) 1995-1998 Russell King4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License version 2 as7* published by the Free Software Foundation.8*9* 27/03/03 Ian Molton Clean up CONFIG_CPU10*11*/12#include <linux/linkage.h>13#include <asm/assembler.h>14#include <asm/errno.h>15#include <asm/asm-offsets.h>1617.text1819.macro save_regs20stmfd sp!, {r1, r2, r4 - r8, lr}21.endm2223.macro load_regs24ldmfd sp!, {r1, r2, r4 - r8, pc}25.endm2627.macro load1b, reg128ldrusr \reg1, r0, 129.endm3031.macro load2b, reg1, reg232ldrusr \reg1, r0, 133ldrusr \reg2, r0, 134.endm3536.macro load1l, reg137ldrusr \reg1, r0, 438.endm3940.macro load2l, reg1, reg241ldrusr \reg1, r0, 442ldrusr \reg2, r0, 443.endm4445.macro load4l, reg1, reg2, reg3, reg446ldrusr \reg1, r0, 447ldrusr \reg2, r0, 448ldrusr \reg3, r0, 449ldrusr \reg4, r0, 450.endm5152/*53* unsigned int54* csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *err_ptr)55* r0 = src, r1 = dst, r2 = len, r3 = sum, [sp] = *err_ptr56* Returns : r0 = checksum, [[sp, #0], #0] = 0 or -EFAULT57*/5859#define FN_ENTRY ENTRY(csum_partial_copy_from_user)60#define FN_EXIT ENDPROC(csum_partial_copy_from_user)6162#include "csumpartialcopygeneric.S"6364/*65* FIXME: minor buglet here66* We don't return the checksum for the data present in the buffer. To do67* so properly, we would have to add in whatever registers were loaded before68* the fault, which, with the current asm above is not predictable.69*/70.pushsection .fixup,"ax"71.align 4729001: mov r4, #-EFAULT73ldr r5, [sp, #8*4] @ *err_ptr74str r4, [r5]75ldmia sp, {r1, r2} @ retrieve dst, len76add r2, r2, r177mov r0, #0 @ zero the buffer789002: teq r2, r179strneb r0, [r1], #180bne 9002b81load_regs82.popsection838485