forked from Minki/linux
465ca5d6a0
This corrects assembler warnings and broken code generated in __strncpy_from_user_asm: arch/mips/lib/strncpy_user.S: Assembler messages: arch/mips/lib/strncpy_user.S:52: Warning: Macro instruction expanded into multiple instructions in a branch delay slot with the CPU_DADDI_WORKAROUNDS option set. The function schedules delay slots manually where there is really no need to as GAS is happy to do it all itself, so undo it all and remove `.set noreorder'. Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/6685/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
85 lines
1.8 KiB
ArmAsm
85 lines
1.8 KiB
ArmAsm
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1996, 1999 by Ralf Baechle
|
|
* Copyright (C) 2011 MIPS Technologies, Inc.
|
|
*/
|
|
#include <linux/errno.h>
|
|
#include <asm/asm.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/regdef.h>
|
|
|
|
#define EX(insn,reg,addr,handler) \
|
|
9: insn reg, addr; \
|
|
.section __ex_table,"a"; \
|
|
PTR 9b, handler; \
|
|
.previous
|
|
|
|
/*
|
|
* Returns: -EFAULT if exception before terminator, N if the entire
|
|
* buffer filled, else strlen.
|
|
*/
|
|
|
|
/*
|
|
* Ugly special case have to check: we might get passed a user space
|
|
* pointer which wraps into the kernel space. We don't deal with that. If
|
|
* it happens at most some bytes of the exceptions handlers will be copied.
|
|
*/
|
|
|
|
.macro __BUILD_STRNCPY_ASM func
|
|
LEAF(__strncpy_from_\func\()_asm)
|
|
LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok?
|
|
and v0, a1
|
|
bnez v0, .Lfault\@
|
|
|
|
FEXPORT(__strncpy_from_\func\()_nocheck_asm)
|
|
move t0, zero
|
|
move v1, a1
|
|
.ifeqs "\func","kernel"
|
|
1: EX(lbu, v0, (v1), .Lfault\@)
|
|
.else
|
|
1: EX(lbue, v0, (v1), .Lfault\@)
|
|
.endif
|
|
PTR_ADDIU v1, 1
|
|
R10KCBARRIER(0(ra))
|
|
sb v0, (a0)
|
|
beqz v0, 2f
|
|
PTR_ADDIU t0, 1
|
|
PTR_ADDIU a0, 1
|
|
bne t0, a2, 1b
|
|
2: PTR_ADDU v0, a1, t0
|
|
xor v0, a1
|
|
bltz v0, .Lfault\@
|
|
move v0, t0
|
|
jr ra # return n
|
|
END(__strncpy_from_\func\()_asm)
|
|
|
|
.Lfault\@:
|
|
li v0, -EFAULT
|
|
jr ra
|
|
|
|
.section __ex_table,"a"
|
|
PTR 1b, .Lfault\@
|
|
.previous
|
|
|
|
.endm
|
|
|
|
#ifndef CONFIG_EVA
|
|
/* Set aliases */
|
|
.global __strncpy_from_user_asm
|
|
.global __strncpy_from_user_nocheck_asm
|
|
.set __strncpy_from_user_asm, __strncpy_from_kernel_asm
|
|
.set __strncpy_from_user_nocheck_asm, __strncpy_from_kernel_nocheck_asm
|
|
#endif
|
|
|
|
__BUILD_STRNCPY_ASM kernel
|
|
|
|
#ifdef CONFIG_EVA
|
|
.set push
|
|
.set eva
|
|
__BUILD_STRNCPY_ASM user
|
|
.set pop
|
|
#endif
|