diff options
| -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) |
