1 /* 1 /* 2 * This file is subject to the terms and condi 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the mai 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 4 * for more details. 5 * 5 * 6 * Copyright (C) 1996, 1999 by Ralf Baechle 6 * Copyright (C) 1996, 1999 by Ralf Baechle 7 * Copyright (C) 2011 MIPS Technologies, Inc. 7 * Copyright (C) 2011 MIPS Technologies, Inc. 8 */ 8 */ 9 #include <linux/errno.h> 9 #include <linux/errno.h> 10 #include <linux/export.h> 10 #include <linux/export.h> 11 #include <asm/asm.h> 11 #include <asm/asm.h> 12 #include <asm/asm-offsets.h> 12 #include <asm/asm-offsets.h> 13 #include <asm/regdef.h> 13 #include <asm/regdef.h> 14 14 15 #define EX(insn,reg,addr,handler) 15 #define EX(insn,reg,addr,handler) \ 16 9: insn reg, addr; 16 9: insn reg, addr; \ 17 .section __ex_table,"a"; 17 .section __ex_table,"a"; \ 18 PTR_WD 9b, handler; 18 PTR_WD 9b, handler; \ 19 .previous 19 .previous 20 20 21 /* 21 /* 22 * Returns: -EFAULT if exception before termin 22 * Returns: -EFAULT if exception before terminator, N if the entire 23 * buffer filled, else strlen. 23 * buffer filled, else strlen. 24 */ 24 */ 25 25 26 /* 26 /* 27 * Ugly special case have to check: we might g 27 * Ugly special case have to check: we might get passed a user space 28 * pointer which wraps into the kernel space. 28 * pointer which wraps into the kernel space. We don't deal with that. If 29 * it happens at most some bytes of the except 29 * it happens at most some bytes of the exceptions handlers will be copied. 30 */ 30 */ 31 31 32 LEAF(__strncpy_from_user_asm) 32 LEAF(__strncpy_from_user_asm) 33 move t0, zero 33 move t0, zero 34 move v1, a1 34 move v1, a1 35 #ifdef CONFIG_EVA 35 #ifdef CONFIG_EVA 36 .set push 36 .set push 37 .set eva 37 .set eva 38 1: EX(lbue, v0, (v1), .Lfault) 38 1: EX(lbue, v0, (v1), .Lfault) 39 .set pop 39 .set pop 40 #else 40 #else 41 1: EX(lbu, v0, (v1), .Lfault) 41 1: EX(lbu, v0, (v1), .Lfault) 42 #endif 42 #endif 43 PTR_ADDIU v1, 1 43 PTR_ADDIU v1, 1 44 R10KCBARRIER(0(ra)) 44 R10KCBARRIER(0(ra)) 45 sb v0, (a0) 45 sb v0, (a0) 46 beqz v0, 2f 46 beqz v0, 2f 47 PTR_ADDIU t0, 1 47 PTR_ADDIU t0, 1 48 PTR_ADDIU a0, 1 48 PTR_ADDIU a0, 1 49 bne t0, a2, 1b 49 bne t0, a2, 1b 50 2: PTR_ADDU v0, a1, t0 50 2: PTR_ADDU v0, a1, t0 51 xor v0, a1 51 xor v0, a1 52 bltz v0, .Lfault 52 bltz v0, .Lfault 53 move v0, t0 53 move v0, t0 54 jr ra 54 jr ra # return n 55 END(__strncpy_from_user_asm) 55 END(__strncpy_from_user_asm) 56 56 57 .Lfault: 57 .Lfault: 58 li v0, -EFAULT 58 li v0, -EFAULT 59 jr ra 59 jr ra 60 60 61 .section __ex_table,"a" 61 .section __ex_table,"a" 62 PTR_WD 1b, .Lfault 62 PTR_WD 1b, .Lfault 63 .previous 63 .previous 64 64 65 EXPORT_SYMBOL(__strncpy_from_user_asm) 65 EXPORT_SYMBOL(__strncpy_from_user_asm)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.