summaryrefslogtreecommitdiffstats
path: root/arch/parisc/mm/init.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-12-04 08:54:36 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2013-12-04 08:54:36 -0800
commit8aa9c36788ee5ebf7a1377742d577911bfc9cfe7 (patch)
tree273361c41f33968e89f88efa2c4cd38ebff6fd7a /arch/parisc/mm/init.c
parent278717909d47d86fbb20ab66dfeaa84560a2f8f2 (diff)
parenta16ab68ee96005382738c706fd06bdd874d9185b (diff)
Merge branch 'parisc-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parsic updates from Helge Deller: - a fix for the mmap(MAP_FIXED|MAP_SHARED) syscall to the same address which was already given in a previous call (fixes locale-gen on debian) - change the memory layout of the kernel to avoid the need for the -mlong-calls compiler option (depends on commit 5ecbe3c3c690 - "kernel/extable: fix address-checks for core_kernel and init areas") - defconfig updates, e.g. use the SIL680 driver instead of the SIIMAGE driver - add more parisc machine names to the machine database * 'parisc-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: update 64bit defconfigs and use SIL680 instead of SIIMAGE driver parisc: remove CONFIG_MLONGCALLS=y from defconfigs parisc: fix kernel memory layout in vmlinux.ld.S parisc: use kernel_text_address() in unwind functions parisc: remove empty SERIAL_PORT_DFNS in serial.h parisc: add some more machine names to hardware database parisc: fix mmap(MAP_FIXED|MAP_SHARED) to already mmapped address
Diffstat (limited to 'arch/parisc/mm/init.c')
-rw-r--r--arch/parisc/mm/init.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
index b0f96c0e631..96f8168cf4e 100644
--- a/arch/parisc/mm/init.c
+++ b/arch/parisc/mm/init.c
@@ -32,6 +32,7 @@
#include <asm/sections.h>
extern int data_start;
+extern void parisc_kernel_start(void); /* Kernel entry point in head.S */
#if PT_NLEVELS == 3
/* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout
@@ -324,8 +325,9 @@ static void __init setup_bootmem(void)
reserve_bootmem_node(NODE_DATA(0), 0UL,
(unsigned long)(PAGE0->mem_free +
PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT);
- reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text),
- (unsigned long)(_end - _text), BOOTMEM_DEFAULT);
+ reserve_bootmem_node(NODE_DATA(0), __pa(KERNEL_BINARY_TEXT_START),
+ (unsigned long)(_end - KERNEL_BINARY_TEXT_START),
+ BOOTMEM_DEFAULT);
reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT),
((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT),
BOOTMEM_DEFAULT);
@@ -378,6 +380,17 @@ static void __init setup_bootmem(void)
request_resource(&sysram_resources[0], &pdcdata_resource);
}
+static int __init parisc_text_address(unsigned long vaddr)
+{
+ static unsigned long head_ptr __initdata;
+
+ if (!head_ptr)
+ head_ptr = PAGE_MASK & (unsigned long)
+ dereference_function_descriptor(&parisc_kernel_start);
+
+ return core_kernel_text(vaddr) || vaddr == head_ptr;
+}
+
static void __init map_pages(unsigned long start_vaddr,
unsigned long start_paddr, unsigned long size,
pgprot_t pgprot, int force)
@@ -466,7 +479,7 @@ static void __init map_pages(unsigned long start_vaddr,
*/
if (force)
pte = __mk_pte(address, pgprot);
- else if (core_kernel_text(vaddr) &&
+ else if (parisc_text_address(vaddr) &&
address != fv_addr)
pte = __mk_pte(address, PAGE_KERNEL_EXEC);
else