mirror of
https://github.com/torvalds/linux.git
synced 2024-10-31 01:01:52 +00:00
c4a84ae39b
This moves all fixup snippets to the .text.fixup section, which is a special section that gets emitted along with the .text section for each input object file, i.e., the snippets are kept much closer to the code they refer to, which helps prevent linker failure on large kernels. Acked-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
55 lines
1.3 KiB
ArmAsm
55 lines
1.3 KiB
ArmAsm
/*
|
|
* linux/arch/arm/lib/clear_user.S
|
|
*
|
|
* Copyright (C) 1995, 1996,1997,1998 Russell King
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <asm/assembler.h>
|
|
|
|
.text
|
|
|
|
/* Prototype: int __clear_user(void *addr, size_t sz)
|
|
* Purpose : clear some user memory
|
|
* Params : addr - user memory address to clear
|
|
* : sz - number of bytes to clear
|
|
* Returns : number of bytes NOT cleared
|
|
*/
|
|
ENTRY(__clear_user_std)
|
|
WEAK(__clear_user)
|
|
stmfd sp!, {r1, lr}
|
|
mov r2, #0
|
|
cmp r1, #4
|
|
blt 2f
|
|
ands ip, r0, #3
|
|
beq 1f
|
|
cmp ip, #2
|
|
strusr r2, r0, 1
|
|
strusr r2, r0, 1, le
|
|
strusr r2, r0, 1, lt
|
|
rsb ip, ip, #4
|
|
sub r1, r1, ip @ 7 6 5 4 3 2 1
|
|
1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7
|
|
strusr r2, r0, 4, pl, rept=2
|
|
bpl 1b
|
|
adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3
|
|
strusr r2, r0, 4, pl
|
|
2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x
|
|
strusr r2, r0, 1, ne, rept=2
|
|
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
|
|
it ne @ explicit IT needed for the label
|
|
USER( strnebt r2, [r0])
|
|
mov r0, #0
|
|
ldmfd sp!, {r1, pc}
|
|
ENDPROC(__clear_user)
|
|
ENDPROC(__clear_user_std)
|
|
|
|
.pushsection .text.fixup,"ax"
|
|
.align 0
|
|
9001: ldmfd sp!, {r0, pc}
|
|
.popsection
|
|
|