浏览代码

[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: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Kumar Gala 17 年之前
父节点
当前提交
366234f657
共有 2 个文件被更改,包括 24 次插入24 次删除
  1. 23 24
      arch/powerpc/kernel/vmlinux.lds.S
  2. 1 0
      include/asm-powerpc/page.h

+ 23 - 24
arch/powerpc/kernel/vmlinux.lds.S

@@ -31,7 +31,7 @@ SECTIONS
  */
  */
 
 
 	/* Text and gots */
 	/* Text and gots */
-	.text : {
+	.text : AT(ADDR(.text) - LOAD_OFFSET) {
 		ALIGN_FUNCTION();
 		ALIGN_FUNCTION();
 		*(.text.head)
 		*(.text.head)
 		_text = .;
 		_text = .;
@@ -56,7 +56,7 @@ SECTIONS
 	RODATA
 	RODATA
 
 
 	/* Exception & bug tables */
 	/* Exception & bug tables */
-	__ex_table : {
+	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
 		__start___ex_table = .;
 		__start___ex_table = .;
 		*(__ex_table)
 		*(__ex_table)
 		__stop___ex_table = .;
 		__stop___ex_table = .;
@@ -72,7 +72,7 @@ SECTIONS
 	. = ALIGN(PAGE_SIZE);
 	. = ALIGN(PAGE_SIZE);
 	__init_begin = .;
 	__init_begin = .;
 
 
-	.init.text : {
+	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
 		_sinittext = .;
 		_sinittext = .;
 		INIT_TEXT
 		INIT_TEXT
 		_einittext = .;
 		_einittext = .;
@@ -81,11 +81,11 @@ SECTIONS
 	/* .exit.text is discarded at runtime, not link time,
 	/* .exit.text is discarded at runtime, not link time,
 	 * to deal with references from __bug_table
 	 * to deal with references from __bug_table
 	 */
 	 */
-	.exit.text : {
+	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
 		EXIT_TEXT
 		EXIT_TEXT
 	}
 	}
 
 
-	.init.data : {
+	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
 		INIT_DATA
 		INIT_DATA
 		__vtop_table_begin = .;
 		__vtop_table_begin = .;
 		*(.vtop_fixup);
 		*(.vtop_fixup);
@@ -101,19 +101,19 @@ SECTIONS
 	}
 	}
 
 
 	. = ALIGN(16);
 	. = ALIGN(16);
-	.init.setup : {
+	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
 		__setup_start = .;
 		__setup_start = .;
 		*(.init.setup)
 		*(.init.setup)
 		__setup_end = .;
 		__setup_end = .;
 	}
 	}
 
 
-	.initcall.init : {
+	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
 		__initcall_start = .;
 		__initcall_start = .;
 		INITCALLS
 		INITCALLS
 		__initcall_end = .;
 		__initcall_end = .;
 		}
 		}
 
 
-	.con_initcall.init : {
+	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
 		__con_initcall_start = .;
 		__con_initcall_start = .;
 		*(.con_initcall.init)
 		*(.con_initcall.init)
 		__con_initcall_end = .;
 		__con_initcall_end = .;
@@ -122,14 +122,14 @@ SECTIONS
 	SECURITY_INIT
 	SECURITY_INIT
 
 
 	. = ALIGN(8);
 	. = ALIGN(8);
-	__ftr_fixup : {
+	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
 		__start___ftr_fixup = .;
 		__start___ftr_fixup = .;
 		*(__ftr_fixup)
 		*(__ftr_fixup)
 		__stop___ftr_fixup = .;
 		__stop___ftr_fixup = .;
 	}
 	}
 #ifdef CONFIG_PPC64
 #ifdef CONFIG_PPC64
 	. = ALIGN(8);
 	. = ALIGN(8);
-	__fw_ftr_fixup : {
+	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
 		__start___fw_ftr_fixup = .;
 		__start___fw_ftr_fixup = .;
 		*(__fw_ftr_fixup)
 		*(__fw_ftr_fixup)
 		__stop___fw_ftr_fixup = .;
 		__stop___fw_ftr_fixup = .;
@@ -137,14 +137,14 @@ SECTIONS
 #endif
 #endif
 #ifdef CONFIG_BLK_DEV_INITRD
 #ifdef CONFIG_BLK_DEV_INITRD
 	. = ALIGN(PAGE_SIZE);
 	. = ALIGN(PAGE_SIZE);
-	.init.ramfs : {
+	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
 		__initramfs_start = .;
 		__initramfs_start = .;
 		*(.init.ramfs)
 		*(.init.ramfs)
 		__initramfs_end = .;
 		__initramfs_end = .;
 	}
 	}
 #endif
 #endif
 	. = ALIGN(PAGE_SIZE);
 	. = ALIGN(PAGE_SIZE);
-	.data.percpu : {
+	.data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
 		__per_cpu_start = .;
 		__per_cpu_start = .;
 		*(.data.percpu)
 		*(.data.percpu)
 		*(.data.percpu.shared_aligned)
 		*(.data.percpu.shared_aligned)
@@ -152,7 +152,7 @@ SECTIONS
 	}
 	}
 
 
 	. = ALIGN(8);
 	. = ALIGN(8);
-	.machine.desc : {
+	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
 		__machine_desc_start = . ;
 		__machine_desc_start = . ;
 		*(.machine.desc)
 		*(.machine.desc)
 		__machine_desc_end = . ;
 		__machine_desc_end = . ;
@@ -170,25 +170,24 @@ SECTIONS
 	_sdata = .;
 	_sdata = .;
 
 
 #ifdef CONFIG_PPC32
 #ifdef CONFIG_PPC32
-	.data    :
-	{
+	.data : AT(ADDR(.data) - LOAD_OFFSET) {
 		DATA_DATA
 		DATA_DATA
 		*(.sdata)
 		*(.sdata)
 		*(.got.plt) *(.got)
 		*(.got.plt) *(.got)
 	}
 	}
 #else
 #else
-	.data : {
+	.data : AT(ADDR(.data) - LOAD_OFFSET) {
 		DATA_DATA
 		DATA_DATA
 		*(.data.rel*)
 		*(.data.rel*)
 		*(.toc1)
 		*(.toc1)
 		*(.branch_lt)
 		*(.branch_lt)
 	}
 	}
 
 
-	.opd : {
+	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
 		*(.opd)
 		*(.opd)
 	}
 	}
 
 
-	.got : {
+	.got : AT(ADDR(.got) - LOAD_OFFSET) {
 		__toc_start = .;
 		__toc_start = .;
 		*(.got)
 		*(.got)
 		*(.toc)
 		*(.toc)
@@ -205,26 +204,26 @@ SECTIONS
 #else
 #else
 	. = ALIGN(16384);
 	. = ALIGN(16384);
 #endif
 #endif
-	.data.init_task : {
+	.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
 		*(.data.init_task)
 		*(.data.init_task)
 	}
 	}
 
 
 	. = ALIGN(PAGE_SIZE);
 	. = ALIGN(PAGE_SIZE);
-	.data.page_aligned : {
+	.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
 		*(.data.page_aligned)
 		*(.data.page_aligned)
 	}
 	}
 
 
-	.data.cacheline_aligned : {
+	.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
 		*(.data.cacheline_aligned)
 		*(.data.cacheline_aligned)
 	}
 	}
 
 
 	. = ALIGN(L1_CACHE_BYTES);
 	. = ALIGN(L1_CACHE_BYTES);
-	.data.read_mostly : {
+	.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
 		*(.data.read_mostly)
 		*(.data.read_mostly)
 	}
 	}
 
 
 	. = ALIGN(PAGE_SIZE);
 	. = ALIGN(PAGE_SIZE);
-	__data_nosave : {
+	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
 		__nosave_begin = .;
 		__nosave_begin = .;
 		*(.data.nosave)
 		*(.data.nosave)
 		. = ALIGN(PAGE_SIZE);
 		. = ALIGN(PAGE_SIZE);
@@ -235,7 +234,7 @@ SECTIONS
  * And finally the bss
  * And finally the bss
  */
  */
 
 
-	.bss : {
+	.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
 		__bss_start = .;
 		__bss_start = .;
 		*(.sbss) *(.scommon)
 		*(.sbss) *(.scommon)
 		*(.dynbss)
 		*(.dynbss)

+ 1 - 0
include/asm-powerpc/page.h

@@ -53,6 +53,7 @@
 
 
 #define PAGE_OFFSET     ASM_CONST(CONFIG_KERNEL_START)
 #define PAGE_OFFSET     ASM_CONST(CONFIG_KERNEL_START)
 #define KERNELBASE      (PAGE_OFFSET + PHYSICAL_START)
 #define KERNELBASE      (PAGE_OFFSET + PHYSICAL_START)
+#define LOAD_OFFSET	PAGE_OFFSET
 
 
 #ifdef CONFIG_FLATMEM
 #ifdef CONFIG_FLATMEM
 #define pfn_valid(pfn)		((pfn) < max_mapnr)
 #define pfn_valid(pfn)		((pfn) < max_mapnr)