diff options
| -rw-r--r-- | arch/parisc/kernel/head.S | 6 | ||||
| -rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 138 | ||||
| -rw-r--r-- | arch/parisc/mm/init.c | 19 |
3 files changed, 78 insertions, 85 deletions
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index d2d58258aea6..d4dc588c0dc1 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
| @@ -41,9 +41,7 @@ END(boot_args) | |||
| 41 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ | 41 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ |
| 42 | .import $global$ /* forward declaration */ | 42 | .import $global$ /* forward declaration */ |
| 43 | #endif /*!CONFIG_64BIT*/ | 43 | #endif /*!CONFIG_64BIT*/ |
| 44 | .export _stext,data /* Kernel want it this way! */ | 44 | ENTRY(parisc_kernel_start) |
| 45 | _stext: | ||
| 46 | ENTRY(stext) | ||
| 47 | .proc | 45 | .proc |
| 48 | .callinfo | 46 | .callinfo |
| 49 | 47 | ||
| @@ -347,7 +345,7 @@ smp_slave_stext: | |||
| 347 | .procend | 345 | .procend |
| 348 | #endif /* CONFIG_SMP */ | 346 | #endif /* CONFIG_SMP */ |
| 349 | 347 | ||
| 350 | ENDPROC(stext) | 348 | ENDPROC(parisc_kernel_start) |
| 351 | 349 | ||
| 352 | #ifndef CONFIG_64BIT | 350 | #ifndef CONFIG_64BIT |
| 353 | .section .data..read_mostly | 351 | .section .data..read_mostly |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 4bb095a2f6fc..0dacc5ca555a 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
| @@ -6,24 +6,19 @@ | |||
| 6 | * Copyright (C) 2000 Michael Ang <mang with subcarrier.org> | 6 | * Copyright (C) 2000 Michael Ang <mang with subcarrier.org> |
| 7 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 7 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
| 8 | * Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org> | 8 | * Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org> |
| 9 | * Copyright (C) 2006 Helge Deller <deller@gmx.de> | 9 | * Copyright (C) 2006-2013 Helge Deller <deller@gmx.de> |
| 10 | * | 10 | */ |
| 11 | * | 11 | |
| 12 | * This program is free software; you can redistribute it and/or modify | 12 | /* |
| 13 | * it under the terms of the GNU General Public License as published by | 13 | * Put page table entries (swapper_pg_dir) as the first thing in .bss. This |
| 14 | * the Free Software Foundation; either version 2 of the License, or | 14 | * will ensure that it has .bss alignment (PAGE_SIZE). |
| 15 | * (at your option) any later version. | ||
| 16 | * | ||
| 17 | * This program is distributed in the hope that it will be useful, | ||
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 20 | * GNU General Public License for more details. | ||
| 21 | * | ||
| 22 | * You should have received a copy of the GNU General Public License | ||
| 23 | * along with this program; if not, write to the Free Software | ||
| 24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 25 | */ | 15 | */ |
| 16 | #define BSS_FIRST_SECTIONS *(.data..vm0.pmd) \ | ||
| 17 | *(.data..vm0.pgd) \ | ||
| 18 | *(.data..vm0.pte) | ||
| 19 | |||
| 26 | #include <asm-generic/vmlinux.lds.h> | 20 | #include <asm-generic/vmlinux.lds.h> |
| 21 | |||
| 27 | /* needed for the processor specific cache alignment size */ | 22 | /* needed for the processor specific cache alignment size */ |
| 28 | #include <asm/cache.h> | 23 | #include <asm/cache.h> |
| 29 | #include <asm/page.h> | 24 | #include <asm/page.h> |
| @@ -39,7 +34,7 @@ OUTPUT_FORMAT("elf64-hppa-linux") | |||
| 39 | OUTPUT_ARCH(hppa:hppa2.0w) | 34 | OUTPUT_ARCH(hppa:hppa2.0w) |
| 40 | #endif | 35 | #endif |
| 41 | 36 | ||
| 42 | ENTRY(_stext) | 37 | ENTRY(parisc_kernel_start) |
| 43 | #ifndef CONFIG_64BIT | 38 | #ifndef CONFIG_64BIT |
| 44 | jiffies = jiffies_64 + 4; | 39 | jiffies = jiffies_64 + 4; |
| 45 | #else | 40 | #else |
| @@ -49,11 +44,29 @@ SECTIONS | |||
| 49 | { | 44 | { |
| 50 | . = KERNEL_BINARY_TEXT_START; | 45 | . = KERNEL_BINARY_TEXT_START; |
| 51 | 46 | ||
| 47 | __init_begin = .; | ||
| 48 | HEAD_TEXT_SECTION | ||
| 49 | INIT_TEXT_SECTION(8) | ||
| 50 | |||
| 51 | . = ALIGN(PAGE_SIZE); | ||
| 52 | INIT_DATA_SECTION(PAGE_SIZE) | ||
| 53 | /* we have to discard exit text and such at runtime, not link time */ | ||
| 54 | .exit.text : | ||
| 55 | { | ||
| 56 | EXIT_TEXT | ||
| 57 | } | ||
| 58 | .exit.data : | ||
| 59 | { | ||
| 60 | EXIT_DATA | ||
| 61 | } | ||
| 62 | PERCPU_SECTION(8) | ||
| 63 | . = ALIGN(PAGE_SIZE); | ||
| 64 | __init_end = .; | ||
| 65 | /* freed after init ends here */ | ||
| 66 | |||
| 52 | _text = .; /* Text and read-only data */ | 67 | _text = .; /* Text and read-only data */ |
| 53 | .head ALIGN(16) : { | 68 | _stext = .; |
| 54 | HEAD_TEXT | 69 | .text ALIGN(PAGE_SIZE) : { |
| 55 | } = 0 | ||
| 56 | .text ALIGN(16) : { | ||
| 57 | TEXT_TEXT | 70 | TEXT_TEXT |
| 58 | SCHED_TEXT | 71 | SCHED_TEXT |
| 59 | LOCK_TEXT | 72 | LOCK_TEXT |
| @@ -68,21 +81,28 @@ SECTIONS | |||
| 68 | *(.lock.text) /* out-of-line lock text */ | 81 | *(.lock.text) /* out-of-line lock text */ |
| 69 | *(.gnu.warning) | 82 | *(.gnu.warning) |
| 70 | } | 83 | } |
| 71 | /* End of text section */ | 84 | . = ALIGN(PAGE_SIZE); |
| 72 | _etext = .; | 85 | _etext = .; |
| 86 | /* End of text section */ | ||
| 73 | 87 | ||
| 74 | /* Start of data section */ | 88 | /* Start of data section */ |
| 75 | _sdata = .; | 89 | _sdata = .; |
| 76 | 90 | ||
| 77 | RODATA | 91 | RO_DATA_SECTION(8) |
| 78 | 92 | ||
| 79 | /* writeable */ | 93 | #ifdef CONFIG_64BIT |
| 80 | /* Make sure this is page aligned so | 94 | . = ALIGN(16); |
| 81 | * that we can properly leave these | 95 | /* Linkage tables */ |
| 82 | * as writable | 96 | .opd : { |
| 83 | */ | 97 | *(.opd) |
| 84 | . = ALIGN(PAGE_SIZE); | 98 | } PROVIDE (__gp = .); |
| 85 | data_start = .; | 99 | .plt : { |
| 100 | *(.plt) | ||
| 101 | } | ||
| 102 | .dlt : { | ||
| 103 | *(.dlt) | ||
| 104 | } | ||
| 105 | #endif | ||
| 86 | 106 | ||
| 87 | /* unwind info */ | 107 | /* unwind info */ |
| 88 | .PARISC.unwind : { | 108 | .PARISC.unwind : { |
| @@ -91,7 +111,15 @@ SECTIONS | |||
| 91 | __stop___unwind = .; | 111 | __stop___unwind = .; |
| 92 | } | 112 | } |
| 93 | 113 | ||
| 94 | EXCEPTION_TABLE(16) | 114 | /* writeable */ |
| 115 | /* Make sure this is page aligned so | ||
| 116 | * that we can properly leave these | ||
| 117 | * as writable | ||
| 118 | */ | ||
| 119 | . = ALIGN(PAGE_SIZE); | ||
| 120 | data_start = .; | ||
| 121 | |||
| 122 | EXCEPTION_TABLE(8) | ||
| 95 | NOTES | 123 | NOTES |
| 96 | 124 | ||
| 97 | /* Data */ | 125 | /* Data */ |
| @@ -107,54 +135,8 @@ SECTIONS | |||
| 107 | _edata = .; | 135 | _edata = .; |
| 108 | 136 | ||
| 109 | /* BSS */ | 137 | /* BSS */ |
| 110 | __bss_start = .; | 138 | BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 8) |
| 111 | /* page table entries need to be PAGE_SIZE aligned */ | ||
| 112 | . = ALIGN(PAGE_SIZE); | ||
| 113 | .data..vmpages : { | ||
| 114 | *(.data..vm0.pmd) | ||
| 115 | *(.data..vm0.pgd) | ||
| 116 | *(.data..vm0.pte) | ||
| 117 | } | ||
| 118 | .bss : { | ||
| 119 | *(.bss) | ||
| 120 | *(COMMON) | ||
| 121 | } | ||
| 122 | __bss_stop = .; | ||
| 123 | |||
| 124 | #ifdef CONFIG_64BIT | ||
| 125 | . = ALIGN(16); | ||
| 126 | /* Linkage tables */ | ||
| 127 | .opd : { | ||
| 128 | *(.opd) | ||
| 129 | } PROVIDE (__gp = .); | ||
| 130 | .plt : { | ||
| 131 | *(.plt) | ||
| 132 | } | ||
| 133 | .dlt : { | ||
| 134 | *(.dlt) | ||
| 135 | } | ||
| 136 | #endif | ||
| 137 | 139 | ||
| 138 | /* reserve space for interrupt stack by aligning __init* to 16k */ | ||
| 139 | . = ALIGN(16384); | ||
| 140 | __init_begin = .; | ||
| 141 | INIT_TEXT_SECTION(16384) | ||
| 142 | . = ALIGN(PAGE_SIZE); | ||
| 143 | INIT_DATA_SECTION(16) | ||
| 144 | /* we have to discard exit text and such at runtime, not link time */ | ||
| 145 | .exit.text : | ||
| 146 | { | ||
| 147 | EXIT_TEXT | ||
| 148 | } | ||
| 149 | .exit.data : | ||
| 150 | { | ||
| 151 | EXIT_DATA | ||
| 152 | } | ||
| 153 | |||
| 154 | PERCPU_SECTION(L1_CACHE_BYTES) | ||
| 155 | . = ALIGN(PAGE_SIZE); | ||
| 156 | __init_end = .; | ||
| 157 | /* freed after init ends here */ | ||
| 158 | _end = . ; | 140 | _end = . ; |
| 159 | 141 | ||
| 160 | STABS_DEBUG | 142 | STABS_DEBUG |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index b0f96c0e6316..96f8168cf4ec 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <asm/sections.h> | 32 | #include <asm/sections.h> |
| 33 | 33 | ||
| 34 | extern int data_start; | 34 | extern int data_start; |
| 35 | extern void parisc_kernel_start(void); /* Kernel entry point in head.S */ | ||
| 35 | 36 | ||
| 36 | #if PT_NLEVELS == 3 | 37 | #if PT_NLEVELS == 3 |
| 37 | /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout | 38 | /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout |
| @@ -324,8 +325,9 @@ static void __init setup_bootmem(void) | |||
| 324 | reserve_bootmem_node(NODE_DATA(0), 0UL, | 325 | reserve_bootmem_node(NODE_DATA(0), 0UL, |
| 325 | (unsigned long)(PAGE0->mem_free + | 326 | (unsigned long)(PAGE0->mem_free + |
| 326 | PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); | 327 | PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); |
| 327 | reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), | 328 | reserve_bootmem_node(NODE_DATA(0), __pa(KERNEL_BINARY_TEXT_START), |
| 328 | (unsigned long)(_end - _text), BOOTMEM_DEFAULT); | 329 | (unsigned long)(_end - KERNEL_BINARY_TEXT_START), |
| 330 | BOOTMEM_DEFAULT); | ||
| 329 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), | 331 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), |
| 330 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT), | 332 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT), |
| 331 | BOOTMEM_DEFAULT); | 333 | BOOTMEM_DEFAULT); |
| @@ -378,6 +380,17 @@ static void __init setup_bootmem(void) | |||
| 378 | request_resource(&sysram_resources[0], &pdcdata_resource); | 380 | request_resource(&sysram_resources[0], &pdcdata_resource); |
| 379 | } | 381 | } |
| 380 | 382 | ||
| 383 | static int __init parisc_text_address(unsigned long vaddr) | ||
| 384 | { | ||
| 385 | static unsigned long head_ptr __initdata; | ||
| 386 | |||
| 387 | if (!head_ptr) | ||
| 388 | head_ptr = PAGE_MASK & (unsigned long) | ||
| 389 | dereference_function_descriptor(&parisc_kernel_start); | ||
| 390 | |||
| 391 | return core_kernel_text(vaddr) || vaddr == head_ptr; | ||
| 392 | } | ||
| 393 | |||
| 381 | static void __init map_pages(unsigned long start_vaddr, | 394 | static void __init map_pages(unsigned long start_vaddr, |
| 382 | unsigned long start_paddr, unsigned long size, | 395 | unsigned long start_paddr, unsigned long size, |
| 383 | pgprot_t pgprot, int force) | 396 | pgprot_t pgprot, int force) |
| @@ -466,7 +479,7 @@ static void __init map_pages(unsigned long start_vaddr, | |||
| 466 | */ | 479 | */ |
| 467 | if (force) | 480 | if (force) |
| 468 | pte = __mk_pte(address, pgprot); | 481 | pte = __mk_pte(address, pgprot); |
| 469 | else if (core_kernel_text(vaddr) && | 482 | else if (parisc_text_address(vaddr) && |
| 470 | address != fv_addr) | 483 | address != fv_addr) |
| 471 | pte = __mk_pte(address, PAGE_KERNEL_EXEC); | 484 | pte = __mk_pte(address, PAGE_KERNEL_EXEC); |
| 472 | else | 485 | else |
