diff options
-rw-r--r-- | arch/parisc/include/asm/ldcw.h | 2 | ||||
-rw-r--r-- | arch/parisc/kernel/entry.S | 13 | ||||
-rw-r--r-- | arch/parisc/kernel/pacache.S | 9 |
3 files changed, 20 insertions, 4 deletions
diff --git a/arch/parisc/include/asm/ldcw.h b/arch/parisc/include/asm/ldcw.h index dd5a08aaa4da..3eb4bfc1fb36 100644 --- a/arch/parisc/include/asm/ldcw.h +++ b/arch/parisc/include/asm/ldcw.h | |||
@@ -12,6 +12,7 @@ | |||
12 | for the semaphore. */ | 12 | for the semaphore. */ |
13 | 13 | ||
14 | #define __PA_LDCW_ALIGNMENT 16 | 14 | #define __PA_LDCW_ALIGNMENT 16 |
15 | #define __PA_LDCW_ALIGN_ORDER 4 | ||
15 | #define __ldcw_align(a) ({ \ | 16 | #define __ldcw_align(a) ({ \ |
16 | unsigned long __ret = (unsigned long) &(a)->lock[0]; \ | 17 | unsigned long __ret = (unsigned long) &(a)->lock[0]; \ |
17 | __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ | 18 | __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ |
@@ -29,6 +30,7 @@ | |||
29 | ldcd). */ | 30 | ldcd). */ |
30 | 31 | ||
31 | #define __PA_LDCW_ALIGNMENT 4 | 32 | #define __PA_LDCW_ALIGNMENT 4 |
33 | #define __PA_LDCW_ALIGN_ORDER 2 | ||
32 | #define __ldcw_align(a) (&(a)->slock) | 34 | #define __ldcw_align(a) (&(a)->slock) |
33 | #define __LDCW "ldcw,co" | 35 | #define __LDCW "ldcw,co" |
34 | 36 | ||
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index f3cecf5117cf..e95207c0565e 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <asm/pgtable.h> | 35 | #include <asm/pgtable.h> |
36 | #include <asm/signal.h> | 36 | #include <asm/signal.h> |
37 | #include <asm/unistd.h> | 37 | #include <asm/unistd.h> |
38 | #include <asm/ldcw.h> | ||
38 | #include <asm/thread_info.h> | 39 | #include <asm/thread_info.h> |
39 | 40 | ||
40 | #include <linux/linkage.h> | 41 | #include <linux/linkage.h> |
@@ -46,6 +47,14 @@ | |||
46 | #endif | 47 | #endif |
47 | 48 | ||
48 | .import pa_tlb_lock,data | 49 | .import pa_tlb_lock,data |
50 | .macro load_pa_tlb_lock reg | ||
51 | #if __PA_LDCW_ALIGNMENT > 4 | ||
52 | load32 PA(pa_tlb_lock) + __PA_LDCW_ALIGNMENT-1, \reg | ||
53 | depi 0,31,__PA_LDCW_ALIGN_ORDER, \reg | ||
54 | #else | ||
55 | load32 PA(pa_tlb_lock), \reg | ||
56 | #endif | ||
57 | .endm | ||
49 | 58 | ||
50 | /* space_to_prot macro creates a prot id from a space id */ | 59 | /* space_to_prot macro creates a prot id from a space id */ |
51 | 60 | ||
@@ -457,7 +466,7 @@ | |||
457 | .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault | 466 | .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault |
458 | #ifdef CONFIG_SMP | 467 | #ifdef CONFIG_SMP |
459 | cmpib,COND(=),n 0,\spc,2f | 468 | cmpib,COND(=),n 0,\spc,2f |
460 | load32 PA(pa_tlb_lock),\tmp | 469 | load_pa_tlb_lock \tmp |
461 | 1: LDCW 0(\tmp),\tmp1 | 470 | 1: LDCW 0(\tmp),\tmp1 |
462 | cmpib,COND(=) 0,\tmp1,1b | 471 | cmpib,COND(=) 0,\tmp1,1b |
463 | nop | 472 | nop |
@@ -480,7 +489,7 @@ | |||
480 | /* Release pa_tlb_lock lock. */ | 489 | /* Release pa_tlb_lock lock. */ |
481 | .macro tlb_unlock1 spc,tmp | 490 | .macro tlb_unlock1 spc,tmp |
482 | #ifdef CONFIG_SMP | 491 | #ifdef CONFIG_SMP |
483 | load32 PA(pa_tlb_lock),\tmp | 492 | load_pa_tlb_lock \tmp |
484 | tlb_unlock0 \spc,\tmp | 493 | tlb_unlock0 \spc,\tmp |
485 | #endif | 494 | #endif |
486 | .endm | 495 | .endm |
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index adf7187f8951..2d40c4ff3f69 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <asm/assembly.h> | 36 | #include <asm/assembly.h> |
37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
38 | #include <asm/cache.h> | 38 | #include <asm/cache.h> |
39 | #include <asm/ldcw.h> | ||
39 | #include <linux/linkage.h> | 40 | #include <linux/linkage.h> |
40 | 41 | ||
41 | .text | 42 | .text |
@@ -333,8 +334,12 @@ ENDPROC_CFI(flush_data_cache_local) | |||
333 | 334 | ||
334 | .macro tlb_lock la,flags,tmp | 335 | .macro tlb_lock la,flags,tmp |
335 | #ifdef CONFIG_SMP | 336 | #ifdef CONFIG_SMP |
336 | ldil L%pa_tlb_lock,%r1 | 337 | #if __PA_LDCW_ALIGNMENT > 4 |
337 | ldo R%pa_tlb_lock(%r1),\la | 338 | load32 pa_tlb_lock + __PA_LDCW_ALIGNMENT-1, \la |
339 | depi 0,31,__PA_LDCW_ALIGN_ORDER, \la | ||
340 | #else | ||
341 | load32 pa_tlb_lock, \la | ||
342 | #endif | ||
338 | rsm PSW_SM_I,\flags | 343 | rsm PSW_SM_I,\flags |
339 | 1: LDCW 0(\la),\tmp | 344 | 1: LDCW 0(\la),\tmp |
340 | cmpib,<>,n 0,\tmp,3f | 345 | cmpib,<>,n 0,\tmp,3f |