diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-05-29 04:58:31 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-05-29 05:51:38 -0400 |
commit | 2d9e2763c22a4ce41c3cc5f35366a51f1eba38dc (patch) | |
tree | 5a8ee71858b3ec58ff07a2cd9cf875cfb458cf63 | |
parent | 5f81941c9d47f783e834028dcfb8548809da5a53 (diff) |
[SPARC64]: Fix two bugs wrt. kernel 4MB TSB.
1) The TSB lookup was not using the correct hash mask.
2) It was not aligned on a boundary equal to it's size,
which is required by the sun4v Hypervisor.
wasn't having it's return value checked, and that bug will be fixed up
as well in a subsequent changeset.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc64/kernel/head.S | 29 | ||||
-rw-r--r-- | arch/sparc64/mm/init.c | 7 | ||||
-rw-r--r-- | include/asm-sparc64/tsb.h | 2 |
3 files changed, 31 insertions, 7 deletions
diff --git a/arch/sparc64/kernel/head.S b/arch/sparc64/kernel/head.S index 5c11529742d4..77259526cb15 100644 --- a/arch/sparc64/kernel/head.S +++ b/arch/sparc64/kernel/head.S | |||
@@ -653,33 +653,54 @@ setup_tba: | |||
653 | restore | 653 | restore |
654 | sparc64_boot_end: | 654 | sparc64_boot_end: |
655 | 655 | ||
656 | #include "ktlb.S" | ||
657 | #include "tsb.S" | ||
658 | #include "etrap.S" | 656 | #include "etrap.S" |
659 | #include "rtrap.S" | 657 | #include "rtrap.S" |
660 | #include "winfixup.S" | 658 | #include "winfixup.S" |
661 | #include "entry.S" | 659 | #include "entry.S" |
662 | #include "sun4v_tlb_miss.S" | 660 | #include "sun4v_tlb_miss.S" |
663 | #include "sun4v_ivec.S" | 661 | #include "sun4v_ivec.S" |
662 | #include "ktlb.S" | ||
663 | #include "tsb.S" | ||
664 | 664 | ||
665 | /* | 665 | /* |
666 | * The following skip makes sure the trap table in ttable.S is aligned | 666 | * The following skip makes sure the trap table in ttable.S is aligned |
667 | * on a 32K boundary as required by the v9 specs for TBA register. | 667 | * on a 32K boundary as required by the v9 specs for TBA register. |
668 | * | 668 | * |
669 | * We align to a 32K boundary, then we have the 32K kernel TSB, | 669 | * We align to a 32K boundary, then we have the 32K kernel TSB, |
670 | * then the 32K aligned trap table. | 670 | * the 64K kernel 4MB TSB, and then the 32K aligned trap table. |
671 | */ | 671 | */ |
672 | 1: | 672 | 1: |
673 | .skip 0x4000 + _start - 1b | 673 | .skip 0x4000 + _start - 1b |
674 | 674 | ||
675 | ! 0x0000000000408000 | ||
676 | |||
675 | .globl swapper_tsb | 677 | .globl swapper_tsb |
676 | swapper_tsb: | 678 | swapper_tsb: |
677 | .skip (32 * 1024) | 679 | .skip (32 * 1024) |
678 | 680 | ||
679 | ! 0x0000000000408000 | 681 | .globl swapper_4m_tsb |
682 | swapper_4m_tsb: | ||
683 | .skip (64 * 1024) | ||
684 | |||
685 | ! 0x0000000000420000 | ||
680 | 686 | ||
687 | /* Some care needs to be exercised if you try to move the | ||
688 | * location of the trap table relative to other things. For | ||
689 | * one thing there are br* instructions in some of the | ||
690 | * trap table entires which branch back to code in ktlb.S | ||
691 | * Those instructions can only handle a signed 16-bit | ||
692 | * displacement. | ||
693 | * | ||
694 | * There is a binutils bug (bugzilla #4558) which causes | ||
695 | * the relocation overflow checks for such instructions to | ||
696 | * not be done correctly. So bintuils will not notice the | ||
697 | * error and will instead write junk into the relocation and | ||
698 | * you'll have an unbootable kernel. | ||
699 | */ | ||
681 | #include "ttable.S" | 700 | #include "ttable.S" |
682 | 701 | ||
702 | ! 0x0000000000428000 | ||
703 | |||
683 | #include "systbls.S" | 704 | #include "systbls.S" |
684 | 705 | ||
685 | .data | 706 | .data |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 087cbf09d0b7..97af4311f787 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -61,8 +61,11 @@ unsigned long kern_linear_pte_xor[2] __read_mostly; | |||
61 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; | 61 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; |
62 | 62 | ||
63 | #ifndef CONFIG_DEBUG_PAGEALLOC | 63 | #ifndef CONFIG_DEBUG_PAGEALLOC |
64 | /* A special kernel TSB for 4MB and 256MB linear mappings. */ | 64 | /* A special kernel TSB for 4MB and 256MB linear mappings. |
65 | struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | 65 | * Space is allocated for this right after the trap table |
66 | * in arch/sparc64/kernel/head.S | ||
67 | */ | ||
68 | extern struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | ||
66 | #endif | 69 | #endif |
67 | 70 | ||
68 | #define MAX_BANKS 32 | 71 | #define MAX_BANKS 32 |
diff --git a/include/asm-sparc64/tsb.h b/include/asm-sparc64/tsb.h index ab55ffcb7bf4..76e4299dd9bc 100644 --- a/include/asm-sparc64/tsb.h +++ b/include/asm-sparc64/tsb.h | |||
@@ -271,7 +271,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
271 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ | 271 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ |
272 | sethi %hi(swapper_4m_tsb), REG1; \ | 272 | sethi %hi(swapper_4m_tsb), REG1; \ |
273 | or REG1, %lo(swapper_4m_tsb), REG1; \ | 273 | or REG1, %lo(swapper_4m_tsb), REG1; \ |
274 | and TAG, (KERNEL_TSB_NENTRIES - 1), REG2; \ | 274 | and TAG, (KERNEL_TSB4M_NENTRIES - 1), REG2; \ |
275 | sllx REG2, 4, REG2; \ | 275 | sllx REG2, 4, REG2; \ |
276 | add REG1, REG2, REG2; \ | 276 | add REG1, REG2, REG2; \ |
277 | KTSB_LOAD_QUAD(REG2, REG3); \ | 277 | KTSB_LOAD_QUAD(REG2, REG3); \ |