diff options
Diffstat (limited to 'include/asm-mips')
-rw-r--r-- | include/asm-mips/delay.h | 11 | ||||
-rw-r--r-- | include/asm-mips/stackframe.h | 9 | ||||
-rw-r--r-- | include/asm-mips/uaccess.h | 13 |
3 files changed, 29 insertions, 4 deletions
diff --git a/include/asm-mips/delay.h b/include/asm-mips/delay.h index de5105d05f1e..b0bccd2c4ed5 100644 --- a/include/asm-mips/delay.h +++ b/include/asm-mips/delay.h | |||
@@ -28,7 +28,7 @@ static inline void __delay(unsigned long loops) | |||
28 | " .set reorder \n" | 28 | " .set reorder \n" |
29 | : "=r" (loops) | 29 | : "=r" (loops) |
30 | : "0" (loops)); | 30 | : "0" (loops)); |
31 | else if (sizeof(long) == 8) | 31 | else if (sizeof(long) == 8 && !DADDI_WAR) |
32 | __asm__ __volatile__ ( | 32 | __asm__ __volatile__ ( |
33 | " .set noreorder \n" | 33 | " .set noreorder \n" |
34 | " .align 3 \n" | 34 | " .align 3 \n" |
@@ -37,6 +37,15 @@ static inline void __delay(unsigned long loops) | |||
37 | " .set reorder \n" | 37 | " .set reorder \n" |
38 | : "=r" (loops) | 38 | : "=r" (loops) |
39 | : "0" (loops)); | 39 | : "0" (loops)); |
40 | else if (sizeof(long) == 8 && DADDI_WAR) | ||
41 | __asm__ __volatile__ ( | ||
42 | " .set noreorder \n" | ||
43 | " .align 3 \n" | ||
44 | "1: bnez %0, 1b \n" | ||
45 | " dsubu %0, %2 \n" | ||
46 | " .set reorder \n" | ||
47 | : "=r" (loops) | ||
48 | : "0" (loops), "r" (1)); | ||
40 | } | 49 | } |
41 | 50 | ||
42 | 51 | ||
diff --git a/include/asm-mips/stackframe.h b/include/asm-mips/stackframe.h index fb41a8d76392..051e1af0bb95 100644 --- a/include/asm-mips/stackframe.h +++ b/include/asm-mips/stackframe.h | |||
@@ -6,6 +6,7 @@ | |||
6 | * Copyright (C) 1994, 95, 96, 99, 2001 Ralf Baechle | 6 | * Copyright (C) 1994, 95, 96, 99, 2001 Ralf Baechle |
7 | * Copyright (C) 1994, 1995, 1996 Paul M. Antoine. | 7 | * Copyright (C) 1994, 1995, 1996 Paul M. Antoine. |
8 | * Copyright (C) 1999 Silicon Graphics, Inc. | 8 | * Copyright (C) 1999 Silicon Graphics, Inc. |
9 | * Copyright (C) 2007 Maciej W. Rozycki | ||
9 | */ | 10 | */ |
10 | #ifndef _ASM_STACKFRAME_H | 11 | #ifndef _ASM_STACKFRAME_H |
11 | #define _ASM_STACKFRAME_H | 12 | #define _ASM_STACKFRAME_H |
@@ -145,8 +146,16 @@ | |||
145 | .set reorder | 146 | .set reorder |
146 | /* Called from user mode, new stack. */ | 147 | /* Called from user mode, new stack. */ |
147 | get_saved_sp | 148 | get_saved_sp |
149 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
148 | 8: move k0, sp | 150 | 8: move k0, sp |
149 | PTR_SUBU sp, k1, PT_SIZE | 151 | PTR_SUBU sp, k1, PT_SIZE |
152 | #else | ||
153 | .set at=k0 | ||
154 | 8: PTR_SUBU k1, PT_SIZE | ||
155 | .set noat | ||
156 | move k0, sp | ||
157 | move sp, k1 | ||
158 | #endif | ||
150 | LONG_S k0, PT_R29(sp) | 159 | LONG_S k0, PT_R29(sp) |
151 | LONG_S $3, PT_R3(sp) | 160 | LONG_S $3, PT_R3(sp) |
152 | /* | 161 | /* |
diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index c30c718994c9..66523d610950 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Copyright (C) 1996, 1997, 1998, 1999, 2000, 03, 04 by Ralf Baechle | 6 | * Copyright (C) 1996, 1997, 1998, 1999, 2000, 03, 04 by Ralf Baechle |
7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | 7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. |
8 | * Copyright (C) 2007 Maciej W. Rozycki | ||
8 | */ | 9 | */ |
9 | #ifndef _ASM_UACCESS_H | 10 | #ifndef _ASM_UACCESS_H |
10 | #define _ASM_UACCESS_H | 11 | #define _ASM_UACCESS_H |
@@ -387,6 +388,12 @@ extern void __put_user_unknown(void); | |||
387 | "jal\t" #destination "\n\t" | 388 | "jal\t" #destination "\n\t" |
388 | #endif | 389 | #endif |
389 | 390 | ||
391 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
392 | #define DADDI_SCRATCH "$0" | ||
393 | #else | ||
394 | #define DADDI_SCRATCH "$3" | ||
395 | #endif | ||
396 | |||
390 | extern size_t __copy_user(void *__to, const void *__from, size_t __n); | 397 | extern size_t __copy_user(void *__to, const void *__from, size_t __n); |
391 | 398 | ||
392 | #define __invoke_copy_to_user(to, from, n) \ | 399 | #define __invoke_copy_to_user(to, from, n) \ |
@@ -403,7 +410,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); | |||
403 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ | 410 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ |
404 | : \ | 411 | : \ |
405 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ | 412 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ |
406 | "memory"); \ | 413 | DADDI_SCRATCH, "memory"); \ |
407 | __cu_len_r; \ | 414 | __cu_len_r; \ |
408 | }) | 415 | }) |
409 | 416 | ||
@@ -512,7 +519,7 @@ extern size_t __copy_user_inatomic(void *__to, const void *__from, size_t __n); | |||
512 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ | 519 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ |
513 | : \ | 520 | : \ |
514 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ | 521 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ |
515 | "memory"); \ | 522 | DADDI_SCRATCH, "memory"); \ |
516 | __cu_len_r; \ | 523 | __cu_len_r; \ |
517 | }) | 524 | }) |
518 | 525 | ||
@@ -535,7 +542,7 @@ extern size_t __copy_user_inatomic(void *__to, const void *__from, size_t __n); | |||
535 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ | 542 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ |
536 | : \ | 543 | : \ |
537 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ | 544 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ |
538 | "memory"); \ | 545 | DADDI_SCRATCH, "memory"); \ |
539 | __cu_len_r; \ | 546 | __cu_len_r; \ |
540 | }) | 547 | }) |
541 | 548 | ||