Commit 366234f6 authored by Kumar Gala's avatar Kumar Gala Committed by Paul Mackerras
Browse files

[POWERPC] Update linker script to properly set physical addresses



We can set LOAD_OFFSET and use the AT attribute on sections and the
linker will properly set the physical address of the LOAD program
header for us.

This allows us to know how the PHYSICAL_START the user configured a
kernel with by just looking at the resulting vmlinux ELF.

This is pretty much stolen from how x86 does things in their linker
scripts.

Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent d04ceb3f
Loading
Loading
Loading
Loading
+23 −24
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ SECTIONS
 */

	/* Text and gots */
	.text : {
	.text : AT(ADDR(.text) - LOAD_OFFSET) {
		ALIGN_FUNCTION();
		*(.text.head)
		_text = .;
@@ -56,7 +56,7 @@ SECTIONS
	RODATA

	/* Exception & bug tables */
	__ex_table : {
	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
		__start___ex_table = .;
		*(__ex_table)
		__stop___ex_table = .;
@@ -72,7 +72,7 @@ SECTIONS
	. = ALIGN(PAGE_SIZE);
	__init_begin = .;

	.init.text : {
	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
		_sinittext = .;
		INIT_TEXT
		_einittext = .;
@@ -81,11 +81,11 @@ SECTIONS
	/* .exit.text is discarded at runtime, not link time,
	 * to deal with references from __bug_table
	 */
	.exit.text : {
	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
		EXIT_TEXT
	}

	.init.data : {
	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
		INIT_DATA
		__vtop_table_begin = .;
		*(.vtop_fixup);
@@ -101,19 +101,19 @@ SECTIONS
	}

	. = ALIGN(16);
	.init.setup : {
	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
		__setup_start = .;
		*(.init.setup)
		__setup_end = .;
	}

	.initcall.init : {
	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
		__initcall_start = .;
		INITCALLS
		__initcall_end = .;
		}

	.con_initcall.init : {
	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
		__con_initcall_start = .;
		*(.con_initcall.init)
		__con_initcall_end = .;
@@ -122,14 +122,14 @@ SECTIONS
	SECURITY_INIT

	. = ALIGN(8);
	__ftr_fixup : {
	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
		__start___ftr_fixup = .;
		*(__ftr_fixup)
		__stop___ftr_fixup = .;
	}
#ifdef CONFIG_PPC64
	. = ALIGN(8);
	__fw_ftr_fixup : {
	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
		__start___fw_ftr_fixup = .;
		*(__fw_ftr_fixup)
		__stop___fw_ftr_fixup = .;
@@ -137,14 +137,14 @@ SECTIONS
#endif
#ifdef CONFIG_BLK_DEV_INITRD
	. = ALIGN(PAGE_SIZE);
	.init.ramfs : {
	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
		__initramfs_start = .;
		*(.init.ramfs)
		__initramfs_end = .;
	}
#endif
	. = ALIGN(PAGE_SIZE);
	.data.percpu : {
	.data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
		__per_cpu_start = .;
		*(.data.percpu)
		*(.data.percpu.shared_aligned)
@@ -152,7 +152,7 @@ SECTIONS
	}

	. = ALIGN(8);
	.machine.desc : {
	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
		__machine_desc_start = . ;
		*(.machine.desc)
		__machine_desc_end = . ;
@@ -170,25 +170,24 @@ SECTIONS
	_sdata = .;

#ifdef CONFIG_PPC32
	.data    :
	{
	.data : AT(ADDR(.data) - LOAD_OFFSET) {
		DATA_DATA
		*(.sdata)
		*(.got.plt) *(.got)
	}
#else
	.data : {
	.data : AT(ADDR(.data) - LOAD_OFFSET) {
		DATA_DATA
		*(.data.rel*)
		*(.toc1)
		*(.branch_lt)
	}

	.opd : {
	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
		*(.opd)
	}

	.got : {
	.got : AT(ADDR(.got) - LOAD_OFFSET) {
		__toc_start = .;
		*(.got)
		*(.toc)
@@ -205,26 +204,26 @@ SECTIONS
#else
	. = ALIGN(16384);
#endif
	.data.init_task : {
	.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
		*(.data.init_task)
	}

	. = ALIGN(PAGE_SIZE);
	.data.page_aligned : {
	.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
		*(.data.page_aligned)
	}

	.data.cacheline_aligned : {
	.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
		*(.data.cacheline_aligned)
	}

	. = ALIGN(L1_CACHE_BYTES);
	.data.read_mostly : {
	.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
		*(.data.read_mostly)
	}

	. = ALIGN(PAGE_SIZE);
	__data_nosave : {
	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
		__nosave_begin = .;
		*(.data.nosave)
		. = ALIGN(PAGE_SIZE);
@@ -235,7 +234,7 @@ SECTIONS
 * And finally the bss
 */

	.bss : {
	.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
		__bss_start = .;
		*(.sbss) *(.scommon)
		*(.dynbss)
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@

#define PAGE_OFFSET     ASM_CONST(CONFIG_KERNEL_START)
#define KERNELBASE      (PAGE_OFFSET + PHYSICAL_START)
#define LOAD_OFFSET	PAGE_OFFSET

#ifdef CONFIG_FLATMEM
#define pfn_valid(pfn)		((pfn) < max_mapnr)