diff options
Diffstat (limited to 'arch/mips/lib/strncpy_user.S')
-rw-r--r-- | arch/mips/lib/strncpy_user.S | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/mips/lib/strncpy_user.S b/arch/mips/lib/strncpy_user.S index d16c76fbfac7..7201b2ff08c8 100644 --- a/arch/mips/lib/strncpy_user.S +++ b/arch/mips/lib/strncpy_user.S | |||
@@ -30,29 +30,30 @@ | |||
30 | LEAF(__strncpy_from_user_asm) | 30 | LEAF(__strncpy_from_user_asm) |
31 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? | 31 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? |
32 | and v0, a1 | 32 | and v0, a1 |
33 | bnez v0, fault | 33 | bnez v0, .Lfault |
34 | 34 | ||
35 | FEXPORT(__strncpy_from_user_nocheck_asm) | 35 | FEXPORT(__strncpy_from_user_nocheck_asm) |
36 | move v0, zero | 36 | move v0, zero |
37 | move v1, a1 | 37 | move v1, a1 |
38 | .set noreorder | 38 | .set noreorder |
39 | 1: EX(lbu, t0, (v1), fault) | 39 | 1: EX(lbu, t0, (v1), .Lfault) |
40 | PTR_ADDIU v1, 1 | 40 | PTR_ADDIU v1, 1 |
41 | R10KCBARRIER(0(ra)) | ||
41 | beqz t0, 2f | 42 | beqz t0, 2f |
42 | sb t0, (a0) | 43 | sb t0, (a0) |
43 | PTR_ADDIU v0, 1 | 44 | PTR_ADDIU v0, 1 |
44 | bne v0, a2, 1b | ||
45 | PTR_ADDIU a0, 1 | ||
46 | .set reorder | 45 | .set reorder |
46 | PTR_ADDIU a0, 1 | ||
47 | bne v0, a2, 1b | ||
47 | 2: PTR_ADDU t0, a1, v0 | 48 | 2: PTR_ADDU t0, a1, v0 |
48 | xor t0, a1 | 49 | xor t0, a1 |
49 | bltz t0, fault | 50 | bltz t0, .Lfault |
50 | jr ra # return n | 51 | jr ra # return n |
51 | END(__strncpy_from_user_asm) | 52 | END(__strncpy_from_user_asm) |
52 | 53 | ||
53 | fault: li v0, -EFAULT | 54 | .Lfault: li v0, -EFAULT |
54 | jr ra | 55 | jr ra |
55 | 56 | ||
56 | .section __ex_table,"a" | 57 | .section __ex_table,"a" |
57 | PTR 1b, fault | 58 | PTR 1b, .Lfault |
58 | .previous | 59 | .previous |