diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-04-08 04:42:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-04-08 04:42:05 -0400 |
commit | 8b65bb57d87a66cd156f856f28f2bd72d7b2395e (patch) | |
tree | 476525df2e81648751ff8f3595a4c10ea88aea05 /arch/sparc | |
parent | 542380a208c5eda9c27f9db099daa9d544626960 (diff) | |
parent | 86e1066fe2af51dce4351c2357223e0d902dfc7a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Pull sparc fixes from David Miller:
"Several fixes here, mostly having to due with either build errors or
memory corruptions depending upon whether you have THP enabled or not"
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
sparc: remove unused wp_works_ok macro
sparc32: Export vac_cache_size to fix build error
sparc64: Fix memory corruption when THP is enabled
sparc64: Fix kernel panic due to erroneous #ifdef surrounding pmd_write()
arch/sparc: Avoid DCTI Couples
sparc64: kern_addr_valid regression
sparc64: Add support for 2G hugepages
sparc64: Fix size check in huge_pte_alloc
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/include/asm/page_64.h | 3 | ||||
-rw-r--r-- | arch/sparc/include/asm/pgtable_64.h | 15 | ||||
-rw-r--r-- | arch/sparc/include/asm/processor_32.h | 6 | ||||
-rw-r--r-- | arch/sparc/include/asm/processor_64.h | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/head_64.S | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/misctrap.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/rtrap_64.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/spiterrs.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/sun4v_tlb_miss.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/urtt_fill.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/winfixup.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/NG2memcpy.S | 4 | ||||
-rw-r--r-- | arch/sparc/lib/NG4memcpy.S | 1 | ||||
-rw-r--r-- | arch/sparc/lib/NG4memset.S | 1 | ||||
-rw-r--r-- | arch/sparc/lib/NGmemcpy.S | 1 | ||||
-rw-r--r-- | arch/sparc/mm/hugetlbpage.c | 9 | ||||
-rw-r--r-- | arch/sparc/mm/init_64.c | 6 | ||||
-rw-r--r-- | arch/sparc/mm/srmmu.c | 1 | ||||
-rw-r--r-- | arch/sparc/mm/tlb.c | 6 | ||||
-rw-r--r-- | arch/sparc/mm/tsb.c | 4 |
20 files changed, 47 insertions, 25 deletions
diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_64.h index f294dd42fc7d..5961b2d8398a 100644 --- a/arch/sparc/include/asm/page_64.h +++ b/arch/sparc/include/asm/page_64.h | |||
@@ -17,6 +17,7 @@ | |||
17 | 17 | ||
18 | #define HPAGE_SHIFT 23 | 18 | #define HPAGE_SHIFT 23 |
19 | #define REAL_HPAGE_SHIFT 22 | 19 | #define REAL_HPAGE_SHIFT 22 |
20 | #define HPAGE_2GB_SHIFT 31 | ||
20 | #define HPAGE_256MB_SHIFT 28 | 21 | #define HPAGE_256MB_SHIFT 28 |
21 | #define HPAGE_64K_SHIFT 16 | 22 | #define HPAGE_64K_SHIFT 16 |
22 | #define REAL_HPAGE_SIZE (_AC(1,UL) << REAL_HPAGE_SHIFT) | 23 | #define REAL_HPAGE_SIZE (_AC(1,UL) << REAL_HPAGE_SHIFT) |
@@ -27,7 +28,7 @@ | |||
27 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 28 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
28 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | 29 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA |
29 | #define REAL_HPAGE_PER_HPAGE (_AC(1,UL) << (HPAGE_SHIFT - REAL_HPAGE_SHIFT)) | 30 | #define REAL_HPAGE_PER_HPAGE (_AC(1,UL) << (HPAGE_SHIFT - REAL_HPAGE_SHIFT)) |
30 | #define HUGE_MAX_HSTATE 3 | 31 | #define HUGE_MAX_HSTATE 4 |
31 | #endif | 32 | #endif |
32 | 33 | ||
33 | #ifndef __ASSEMBLY__ | 34 | #ifndef __ASSEMBLY__ |
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 8a598528ec1f..6fbd931f0570 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h | |||
@@ -679,26 +679,27 @@ static inline unsigned long pmd_pfn(pmd_t pmd) | |||
679 | return pte_pfn(pte); | 679 | return pte_pfn(pte); |
680 | } | 680 | } |
681 | 681 | ||
682 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 682 | #define __HAVE_ARCH_PMD_WRITE |
683 | static inline unsigned long pmd_dirty(pmd_t pmd) | 683 | static inline unsigned long pmd_write(pmd_t pmd) |
684 | { | 684 | { |
685 | pte_t pte = __pte(pmd_val(pmd)); | 685 | pte_t pte = __pte(pmd_val(pmd)); |
686 | 686 | ||
687 | return pte_dirty(pte); | 687 | return pte_write(pte); |
688 | } | 688 | } |
689 | 689 | ||
690 | static inline unsigned long pmd_young(pmd_t pmd) | 690 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
691 | static inline unsigned long pmd_dirty(pmd_t pmd) | ||
691 | { | 692 | { |
692 | pte_t pte = __pte(pmd_val(pmd)); | 693 | pte_t pte = __pte(pmd_val(pmd)); |
693 | 694 | ||
694 | return pte_young(pte); | 695 | return pte_dirty(pte); |
695 | } | 696 | } |
696 | 697 | ||
697 | static inline unsigned long pmd_write(pmd_t pmd) | 698 | static inline unsigned long pmd_young(pmd_t pmd) |
698 | { | 699 | { |
699 | pte_t pte = __pte(pmd_val(pmd)); | 700 | pte_t pte = __pte(pmd_val(pmd)); |
700 | 701 | ||
701 | return pte_write(pte); | 702 | return pte_young(pte); |
702 | } | 703 | } |
703 | 704 | ||
704 | static inline unsigned long pmd_trans_huge(pmd_t pmd) | 705 | static inline unsigned long pmd_trans_huge(pmd_t pmd) |
diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h index 365d4cb267b4..dd27159819eb 100644 --- a/arch/sparc/include/asm/processor_32.h +++ b/arch/sparc/include/asm/processor_32.h | |||
@@ -18,12 +18,6 @@ | |||
18 | #include <asm/signal.h> | 18 | #include <asm/signal.h> |
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | 20 | ||
21 | /* | ||
22 | * The sparc has no problems with write protection | ||
23 | */ | ||
24 | #define wp_works_ok 1 | ||
25 | #define wp_works_ok__is_a_macro /* for versions in ksyms.c */ | ||
26 | |||
27 | /* Whee, this is STACK_TOP + PAGE_SIZE and the lowest kernel address too... | 21 | /* Whee, this is STACK_TOP + PAGE_SIZE and the lowest kernel address too... |
28 | * That one page is used to protect kernel from intruders, so that | 22 | * That one page is used to protect kernel from intruders, so that |
29 | * we can make our access_ok test faster | 23 | * we can make our access_ok test faster |
diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h index 6448cfc8292f..b58ee9018433 100644 --- a/arch/sparc/include/asm/processor_64.h +++ b/arch/sparc/include/asm/processor_64.h | |||
@@ -18,10 +18,6 @@ | |||
18 | #include <asm/ptrace.h> | 18 | #include <asm/ptrace.h> |
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | 20 | ||
21 | /* The sparc has no problems with write protection */ | ||
22 | #define wp_works_ok 1 | ||
23 | #define wp_works_ok__is_a_macro /* for versions in ksyms.c */ | ||
24 | |||
25 | /* | 21 | /* |
26 | * User lives in his very own context, and cannot reference us. Note | 22 | * User lives in his very own context, and cannot reference us. Note |
27 | * that TASK_SIZE is a misnomer, it really gives maximum user virtual | 23 | * that TASK_SIZE is a misnomer, it really gives maximum user virtual |
diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 6aa3da152c20..44101196d02b 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S | |||
@@ -96,6 +96,7 @@ sparc64_boot: | |||
96 | andn %g1, PSTATE_AM, %g1 | 96 | andn %g1, PSTATE_AM, %g1 |
97 | wrpr %g1, 0x0, %pstate | 97 | wrpr %g1, 0x0, %pstate |
98 | ba,a,pt %xcc, 1f | 98 | ba,a,pt %xcc, 1f |
99 | nop | ||
99 | 100 | ||
100 | .globl prom_finddev_name, prom_chosen_path, prom_root_node | 101 | .globl prom_finddev_name, prom_chosen_path, prom_root_node |
101 | .globl prom_getprop_name, prom_mmu_name, prom_peer_name | 102 | .globl prom_getprop_name, prom_mmu_name, prom_peer_name |
@@ -613,6 +614,7 @@ niagara_tlb_fixup: | |||
613 | nop | 614 | nop |
614 | 615 | ||
615 | ba,a,pt %xcc, 80f | 616 | ba,a,pt %xcc, 80f |
617 | nop | ||
616 | niagara4_patch: | 618 | niagara4_patch: |
617 | call niagara4_patch_copyops | 619 | call niagara4_patch_copyops |
618 | nop | 620 | nop |
@@ -622,6 +624,7 @@ niagara4_patch: | |||
622 | nop | 624 | nop |
623 | 625 | ||
624 | ba,a,pt %xcc, 80f | 626 | ba,a,pt %xcc, 80f |
627 | nop | ||
625 | 628 | ||
626 | niagara2_patch: | 629 | niagara2_patch: |
627 | call niagara2_patch_copyops | 630 | call niagara2_patch_copyops |
@@ -632,6 +635,7 @@ niagara2_patch: | |||
632 | nop | 635 | nop |
633 | 636 | ||
634 | ba,a,pt %xcc, 80f | 637 | ba,a,pt %xcc, 80f |
638 | nop | ||
635 | 639 | ||
636 | niagara_patch: | 640 | niagara_patch: |
637 | call niagara_patch_copyops | 641 | call niagara_patch_copyops |
diff --git a/arch/sparc/kernel/misctrap.S b/arch/sparc/kernel/misctrap.S index 34b4933900bf..9276d2f0dd86 100644 --- a/arch/sparc/kernel/misctrap.S +++ b/arch/sparc/kernel/misctrap.S | |||
@@ -82,6 +82,7 @@ do_stdfmna: | |||
82 | call handle_stdfmna | 82 | call handle_stdfmna |
83 | add %sp, PTREGS_OFF, %o0 | 83 | add %sp, PTREGS_OFF, %o0 |
84 | ba,a,pt %xcc, rtrap | 84 | ba,a,pt %xcc, rtrap |
85 | nop | ||
85 | .size do_stdfmna,.-do_stdfmna | 86 | .size do_stdfmna,.-do_stdfmna |
86 | 87 | ||
87 | .type breakpoint_trap,#function | 88 | .type breakpoint_trap,#function |
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S index 216948ca4382..709a82ebd294 100644 --- a/arch/sparc/kernel/rtrap_64.S +++ b/arch/sparc/kernel/rtrap_64.S | |||
@@ -237,6 +237,7 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 | |||
237 | bne,pt %xcc, user_rtt_fill_32bit | 237 | bne,pt %xcc, user_rtt_fill_32bit |
238 | wrpr %g1, %cwp | 238 | wrpr %g1, %cwp |
239 | ba,a,pt %xcc, user_rtt_fill_64bit | 239 | ba,a,pt %xcc, user_rtt_fill_64bit |
240 | nop | ||
240 | 241 | ||
241 | user_rtt_fill_fixup_dax: | 242 | user_rtt_fill_fixup_dax: |
242 | ba,pt %xcc, user_rtt_fill_fixup_common | 243 | ba,pt %xcc, user_rtt_fill_fixup_common |
diff --git a/arch/sparc/kernel/spiterrs.S b/arch/sparc/kernel/spiterrs.S index 4a73009f66a5..d7e540842809 100644 --- a/arch/sparc/kernel/spiterrs.S +++ b/arch/sparc/kernel/spiterrs.S | |||
@@ -86,6 +86,7 @@ __spitfire_cee_trap_continue: | |||
86 | rd %pc, %g7 | 86 | rd %pc, %g7 |
87 | 87 | ||
88 | ba,a,pt %xcc, 2f | 88 | ba,a,pt %xcc, 2f |
89 | nop | ||
89 | 90 | ||
90 | 1: ba,pt %xcc, etrap_irq | 91 | 1: ba,pt %xcc, etrap_irq |
91 | rd %pc, %g7 | 92 | rd %pc, %g7 |
diff --git a/arch/sparc/kernel/sun4v_tlb_miss.S b/arch/sparc/kernel/sun4v_tlb_miss.S index 6179e19bc9b9..c19f352f46c7 100644 --- a/arch/sparc/kernel/sun4v_tlb_miss.S +++ b/arch/sparc/kernel/sun4v_tlb_miss.S | |||
@@ -352,6 +352,7 @@ sun4v_mna: | |||
352 | call sun4v_do_mna | 352 | call sun4v_do_mna |
353 | add %sp, PTREGS_OFF, %o0 | 353 | add %sp, PTREGS_OFF, %o0 |
354 | ba,a,pt %xcc, rtrap | 354 | ba,a,pt %xcc, rtrap |
355 | nop | ||
355 | 356 | ||
356 | /* Privileged Action. */ | 357 | /* Privileged Action. */ |
357 | sun4v_privact: | 358 | sun4v_privact: |
diff --git a/arch/sparc/kernel/urtt_fill.S b/arch/sparc/kernel/urtt_fill.S index 5604a2b051d4..364af3250646 100644 --- a/arch/sparc/kernel/urtt_fill.S +++ b/arch/sparc/kernel/urtt_fill.S | |||
@@ -92,6 +92,7 @@ user_rtt_fill_fixup_common: | |||
92 | call sun4v_data_access_exception | 92 | call sun4v_data_access_exception |
93 | nop | 93 | nop |
94 | ba,a,pt %xcc, rtrap | 94 | ba,a,pt %xcc, rtrap |
95 | nop | ||
95 | 96 | ||
96 | 1: call spitfire_data_access_exception | 97 | 1: call spitfire_data_access_exception |
97 | nop | 98 | nop |
diff --git a/arch/sparc/kernel/winfixup.S b/arch/sparc/kernel/winfixup.S index 855019a8590e..1ee173cc3c39 100644 --- a/arch/sparc/kernel/winfixup.S +++ b/arch/sparc/kernel/winfixup.S | |||
@@ -152,6 +152,8 @@ fill_fixup_dax: | |||
152 | call sun4v_data_access_exception | 152 | call sun4v_data_access_exception |
153 | nop | 153 | nop |
154 | ba,a,pt %xcc, rtrap | 154 | ba,a,pt %xcc, rtrap |
155 | nop | ||
155 | 1: call spitfire_data_access_exception | 156 | 1: call spitfire_data_access_exception |
156 | nop | 157 | nop |
157 | ba,a,pt %xcc, rtrap | 158 | ba,a,pt %xcc, rtrap |
159 | nop | ||
diff --git a/arch/sparc/lib/NG2memcpy.S b/arch/sparc/lib/NG2memcpy.S index c629dbd121b6..64dcd6cdb606 100644 --- a/arch/sparc/lib/NG2memcpy.S +++ b/arch/sparc/lib/NG2memcpy.S | |||
@@ -326,11 +326,13 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
326 | blu 170f | 326 | blu 170f |
327 | nop | 327 | nop |
328 | ba,a,pt %xcc, 180f | 328 | ba,a,pt %xcc, 180f |
329 | nop | ||
329 | 330 | ||
330 | 4: /* 32 <= low bits < 48 */ | 331 | 4: /* 32 <= low bits < 48 */ |
331 | blu 150f | 332 | blu 150f |
332 | nop | 333 | nop |
333 | ba,a,pt %xcc, 160f | 334 | ba,a,pt %xcc, 160f |
335 | nop | ||
334 | 5: /* 0 < low bits < 32 */ | 336 | 5: /* 0 < low bits < 32 */ |
335 | blu,a 6f | 337 | blu,a 6f |
336 | cmp %g2, 8 | 338 | cmp %g2, 8 |
@@ -338,6 +340,7 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
338 | blu 130f | 340 | blu 130f |
339 | nop | 341 | nop |
340 | ba,a,pt %xcc, 140f | 342 | ba,a,pt %xcc, 140f |
343 | nop | ||
341 | 6: /* 0 < low bits < 16 */ | 344 | 6: /* 0 < low bits < 16 */ |
342 | bgeu 120f | 345 | bgeu 120f |
343 | nop | 346 | nop |
@@ -475,6 +478,7 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
475 | brz,pt %o2, 85f | 478 | brz,pt %o2, 85f |
476 | sub %o0, %o1, GLOBAL_SPARE | 479 | sub %o0, %o1, GLOBAL_SPARE |
477 | ba,a,pt %XCC, 90f | 480 | ba,a,pt %XCC, 90f |
481 | nop | ||
478 | 482 | ||
479 | .align 64 | 483 | .align 64 |
480 | 75: /* 16 < len <= 64 */ | 484 | 75: /* 16 < len <= 64 */ |
diff --git a/arch/sparc/lib/NG4memcpy.S b/arch/sparc/lib/NG4memcpy.S index 75bb93b1437f..78ea962edcbe 100644 --- a/arch/sparc/lib/NG4memcpy.S +++ b/arch/sparc/lib/NG4memcpy.S | |||
@@ -530,4 +530,5 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ | |||
530 | bne,pt %icc, 1b | 530 | bne,pt %icc, 1b |
531 | EX_ST(STORE(stb, %g1, %o0 - 0x01), NG4_retl_o2_plus_1) | 531 | EX_ST(STORE(stb, %g1, %o0 - 0x01), NG4_retl_o2_plus_1) |
532 | ba,a,pt %icc, .Lexit | 532 | ba,a,pt %icc, .Lexit |
533 | nop | ||
533 | .size FUNC_NAME, .-FUNC_NAME | 534 | .size FUNC_NAME, .-FUNC_NAME |
diff --git a/arch/sparc/lib/NG4memset.S b/arch/sparc/lib/NG4memset.S index 41da4bdd95cb..7c0c81f18837 100644 --- a/arch/sparc/lib/NG4memset.S +++ b/arch/sparc/lib/NG4memset.S | |||
@@ -102,4 +102,5 @@ NG4bzero: | |||
102 | bne,pt %icc, 1b | 102 | bne,pt %icc, 1b |
103 | add %o0, 0x30, %o0 | 103 | add %o0, 0x30, %o0 |
104 | ba,a,pt %icc, .Lpostloop | 104 | ba,a,pt %icc, .Lpostloop |
105 | nop | ||
105 | .size NG4bzero,.-NG4bzero | 106 | .size NG4bzero,.-NG4bzero |
diff --git a/arch/sparc/lib/NGmemcpy.S b/arch/sparc/lib/NGmemcpy.S index d88c4ed50a00..cd654a719b27 100644 --- a/arch/sparc/lib/NGmemcpy.S +++ b/arch/sparc/lib/NGmemcpy.S | |||
@@ -394,6 +394,7 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */ | |||
394 | brz,pt %i2, 85f | 394 | brz,pt %i2, 85f |
395 | sub %o0, %i1, %i3 | 395 | sub %o0, %i1, %i3 |
396 | ba,a,pt %XCC, 90f | 396 | ba,a,pt %XCC, 90f |
397 | nop | ||
397 | 398 | ||
398 | .align 64 | 399 | .align 64 |
399 | 70: /* 16 < len <= 64 */ | 400 | 70: /* 16 < len <= 64 */ |
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index 323bc6b6e3ad..ee5273ad918d 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c | |||
@@ -143,6 +143,10 @@ static pte_t sun4v_hugepage_shift_to_tte(pte_t entry, unsigned int shift) | |||
143 | pte_val(entry) = pte_val(entry) & ~_PAGE_SZALL_4V; | 143 | pte_val(entry) = pte_val(entry) & ~_PAGE_SZALL_4V; |
144 | 144 | ||
145 | switch (shift) { | 145 | switch (shift) { |
146 | case HPAGE_2GB_SHIFT: | ||
147 | hugepage_size = _PAGE_SZ2GB_4V; | ||
148 | pte_val(entry) |= _PAGE_PMD_HUGE; | ||
149 | break; | ||
146 | case HPAGE_256MB_SHIFT: | 150 | case HPAGE_256MB_SHIFT: |
147 | hugepage_size = _PAGE_SZ256MB_4V; | 151 | hugepage_size = _PAGE_SZ256MB_4V; |
148 | pte_val(entry) |= _PAGE_PMD_HUGE; | 152 | pte_val(entry) |= _PAGE_PMD_HUGE; |
@@ -183,6 +187,9 @@ static unsigned int sun4v_huge_tte_to_shift(pte_t entry) | |||
183 | unsigned int shift; | 187 | unsigned int shift; |
184 | 188 | ||
185 | switch (tte_szbits) { | 189 | switch (tte_szbits) { |
190 | case _PAGE_SZ2GB_4V: | ||
191 | shift = HPAGE_2GB_SHIFT; | ||
192 | break; | ||
186 | case _PAGE_SZ256MB_4V: | 193 | case _PAGE_SZ256MB_4V: |
187 | shift = HPAGE_256MB_SHIFT; | 194 | shift = HPAGE_256MB_SHIFT; |
188 | break; | 195 | break; |
@@ -261,7 +268,7 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, | |||
261 | if (!pmd) | 268 | if (!pmd) |
262 | return NULL; | 269 | return NULL; |
263 | 270 | ||
264 | if (sz == PMD_SHIFT) | 271 | if (sz >= PMD_SIZE) |
265 | pte = (pte_t *)pmd; | 272 | pte = (pte_t *)pmd; |
266 | else | 273 | else |
267 | pte = pte_alloc_map(mm, pmd, addr); | 274 | pte = pte_alloc_map(mm, pmd, addr); |
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index ccd455328989..0cda653ae007 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -337,6 +337,10 @@ static int __init setup_hugepagesz(char *string) | |||
337 | hugepage_shift = ilog2(hugepage_size); | 337 | hugepage_shift = ilog2(hugepage_size); |
338 | 338 | ||
339 | switch (hugepage_shift) { | 339 | switch (hugepage_shift) { |
340 | case HPAGE_2GB_SHIFT: | ||
341 | hv_pgsz_mask = HV_PGSZ_MASK_2GB; | ||
342 | hv_pgsz_idx = HV_PGSZ_IDX_2GB; | ||
343 | break; | ||
340 | case HPAGE_256MB_SHIFT: | 344 | case HPAGE_256MB_SHIFT: |
341 | hv_pgsz_mask = HV_PGSZ_MASK_256MB; | 345 | hv_pgsz_mask = HV_PGSZ_MASK_256MB; |
342 | hv_pgsz_idx = HV_PGSZ_IDX_256MB; | 346 | hv_pgsz_idx = HV_PGSZ_IDX_256MB; |
@@ -1563,7 +1567,7 @@ bool kern_addr_valid(unsigned long addr) | |||
1563 | if ((long)addr < 0L) { | 1567 | if ((long)addr < 0L) { |
1564 | unsigned long pa = __pa(addr); | 1568 | unsigned long pa = __pa(addr); |
1565 | 1569 | ||
1566 | if ((addr >> max_phys_bits) != 0UL) | 1570 | if ((pa >> max_phys_bits) != 0UL) |
1567 | return false; | 1571 | return false; |
1568 | 1572 | ||
1569 | return pfn_valid(pa >> PAGE_SHIFT); | 1573 | return pfn_valid(pa >> PAGE_SHIFT); |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index def82f6d626f..8e76ebba2986 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
@@ -54,6 +54,7 @@ | |||
54 | enum mbus_module srmmu_modtype; | 54 | enum mbus_module srmmu_modtype; |
55 | static unsigned int hwbug_bitmask; | 55 | static unsigned int hwbug_bitmask; |
56 | int vac_cache_size; | 56 | int vac_cache_size; |
57 | EXPORT_SYMBOL(vac_cache_size); | ||
57 | int vac_line_size; | 58 | int vac_line_size; |
58 | 59 | ||
59 | extern struct resource sparc_iomap; | 60 | extern struct resource sparc_iomap; |
diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c index afda3bbf7854..ee8066c3d96c 100644 --- a/arch/sparc/mm/tlb.c +++ b/arch/sparc/mm/tlb.c | |||
@@ -154,7 +154,7 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr, | |||
154 | if (pte_val(*pte) & _PAGE_VALID) { | 154 | if (pte_val(*pte) & _PAGE_VALID) { |
155 | bool exec = pte_exec(*pte); | 155 | bool exec = pte_exec(*pte); |
156 | 156 | ||
157 | tlb_batch_add_one(mm, vaddr, exec, false); | 157 | tlb_batch_add_one(mm, vaddr, exec, PAGE_SHIFT); |
158 | } | 158 | } |
159 | pte++; | 159 | pte++; |
160 | vaddr += PAGE_SIZE; | 160 | vaddr += PAGE_SIZE; |
@@ -209,9 +209,9 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr, | |||
209 | pte_t orig_pte = __pte(pmd_val(orig)); | 209 | pte_t orig_pte = __pte(pmd_val(orig)); |
210 | bool exec = pte_exec(orig_pte); | 210 | bool exec = pte_exec(orig_pte); |
211 | 211 | ||
212 | tlb_batch_add_one(mm, addr, exec, true); | 212 | tlb_batch_add_one(mm, addr, exec, REAL_HPAGE_SHIFT); |
213 | tlb_batch_add_one(mm, addr + REAL_HPAGE_SIZE, exec, | 213 | tlb_batch_add_one(mm, addr + REAL_HPAGE_SIZE, exec, |
214 | true); | 214 | REAL_HPAGE_SHIFT); |
215 | } else { | 215 | } else { |
216 | tlb_batch_pmd_scan(mm, addr, orig); | 216 | tlb_batch_pmd_scan(mm, addr, orig); |
217 | } | 217 | } |
diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c index 0a04811f06b7..bedf08b22a47 100644 --- a/arch/sparc/mm/tsb.c +++ b/arch/sparc/mm/tsb.c | |||
@@ -122,7 +122,7 @@ void flush_tsb_user(struct tlb_batch *tb) | |||
122 | 122 | ||
123 | spin_lock_irqsave(&mm->context.lock, flags); | 123 | spin_lock_irqsave(&mm->context.lock, flags); |
124 | 124 | ||
125 | if (tb->hugepage_shift < HPAGE_SHIFT) { | 125 | if (tb->hugepage_shift < REAL_HPAGE_SHIFT) { |
126 | base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; | 126 | base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; |
127 | nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; | 127 | nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; |
128 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) | 128 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) |
@@ -155,7 +155,7 @@ void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr, | |||
155 | 155 | ||
156 | spin_lock_irqsave(&mm->context.lock, flags); | 156 | spin_lock_irqsave(&mm->context.lock, flags); |
157 | 157 | ||
158 | if (hugepage_shift < HPAGE_SHIFT) { | 158 | if (hugepage_shift < REAL_HPAGE_SHIFT) { |
159 | base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; | 159 | base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; |
160 | nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; | 160 | nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; |
161 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) | 161 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) |