ad0d75ebac
The vmlinux on i386 does not report the correct physical address of the kernel. Instead in the physical address field it currently reports the virtual address of the kernel. This is patch is a bug fix that corrects vmlinux to report the proper physical addresses. This is potentially a help for crash dump analysis tools. This definitiely allows bootloaders that load vmlinux as a standard ELF executable. Bootloaders directly loading vmlinux become of practical importance when we consider the kexec on panic case. Signed-off-by: Eric Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
151 lines
3.8 KiB
ArmAsm
151 lines
3.8 KiB
ArmAsm
/* ld script to make i386 Linux kernel
|
|
* Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
|
|
*/
|
|
|
|
#define LOAD_OFFSET __PAGE_OFFSET
|
|
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/thread_info.h>
|
|
#include <asm/page.h>
|
|
|
|
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
|
OUTPUT_ARCH(i386)
|
|
ENTRY(phys_startup_32)
|
|
jiffies = jiffies_64;
|
|
SECTIONS
|
|
{
|
|
. = LOAD_OFFSET + 0x100000;
|
|
phys_startup_32 = startup_32 - LOAD_OFFSET;
|
|
/* read-only */
|
|
_text = .; /* Text and read-only data */
|
|
.text : AT(ADDR(.text) - LOAD_OFFSET) {
|
|
*(.text)
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
} = 0x9090
|
|
|
|
_etext = .; /* End of text section */
|
|
|
|
. = ALIGN(16); /* Exception table */
|
|
__start___ex_table = .;
|
|
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
|
|
__stop___ex_table = .;
|
|
|
|
RODATA
|
|
|
|
/* writeable */
|
|
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
|
|
*(.data)
|
|
CONSTRUCTORS
|
|
}
|
|
|
|
. = ALIGN(4096);
|
|
__nosave_begin = .;
|
|
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
|
|
. = ALIGN(4096);
|
|
__nosave_end = .;
|
|
|
|
. = ALIGN(4096);
|
|
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
|
|
*(.data.idt)
|
|
}
|
|
|
|
. = ALIGN(32);
|
|
.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
|
|
*(.data.cacheline_aligned)
|
|
}
|
|
|
|
_edata = .; /* End of data section */
|
|
|
|
. = ALIGN(THREAD_SIZE); /* init_task */
|
|
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
|
*(.data.init_task)
|
|
}
|
|
|
|
/* will be freed after init */
|
|
. = ALIGN(4096); /* Init code and data */
|
|
__init_begin = .;
|
|
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
|
_sinittext = .;
|
|
*(.init.text)
|
|
_einittext = .;
|
|
}
|
|
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
|
|
. = ALIGN(16);
|
|
__setup_start = .;
|
|
.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) }
|
|
__setup_end = .;
|
|
__initcall_start = .;
|
|
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
|
|
*(.initcall1.init)
|
|
*(.initcall2.init)
|
|
*(.initcall3.init)
|
|
*(.initcall4.init)
|
|
*(.initcall5.init)
|
|
*(.initcall6.init)
|
|
*(.initcall7.init)
|
|
}
|
|
__initcall_end = .;
|
|
__con_initcall_start = .;
|
|
.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
|
|
*(.con_initcall.init)
|
|
}
|
|
__con_initcall_end = .;
|
|
SECURITY_INIT
|
|
. = ALIGN(4);
|
|
__alt_instructions = .;
|
|
.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
|
|
*(.altinstructions)
|
|
}
|
|
__alt_instructions_end = .;
|
|
.altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
|
|
*(.altinstr_replacement)
|
|
}
|
|
/* .exit.text is discard at runtime, not link time, to deal with references
|
|
from .altinstructions and .eh_frame */
|
|
.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
|
|
.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
|
|
. = ALIGN(4096);
|
|
__initramfs_start = .;
|
|
.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
|
|
__initramfs_end = .;
|
|
. = ALIGN(32);
|
|
__per_cpu_start = .;
|
|
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
|
|
__per_cpu_end = .;
|
|
. = ALIGN(4096);
|
|
__init_end = .;
|
|
/* freed after init ends here */
|
|
|
|
__bss_start = .; /* BSS */
|
|
.bss.page_aligned : AT(ADDR(.bss.page_aligned) - LOAD_OFFSET) {
|
|
*(.bss.page_aligned)
|
|
}
|
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
|
*(.bss)
|
|
}
|
|
. = ALIGN(4);
|
|
__bss_stop = .;
|
|
|
|
_end = . ;
|
|
|
|
/* This is where the kernel creates the early boot page tables */
|
|
. = ALIGN(4096);
|
|
pg0 = .;
|
|
|
|
/* Sections to be discarded */
|
|
/DISCARD/ : {
|
|
*(.exitcall.exit)
|
|
}
|
|
|
|
/* Stabs debugging sections. */
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
.stab.index 0 : { *(.stab.index) }
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
.comment 0 : { *(.comment) }
|
|
}
|