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