--- zzzz-none-000/linux-2.6.19.2/arch/i386/kernel/vmlinux.lds.S 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/arch/i386/kernel/vmlinux.lds.S 2007-01-19 14:42:56.000000000 +0000 @@ -8,6 +8,13 @@ #include #include #include +#include + +#ifdef CONFIG_X86_PAE +#define PMD_SHIFT 21 +#else +#define PMD_SHIFT 22 +#endif OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) @@ -16,81 +23,19 @@ PHDRS { text PT_LOAD FLAGS(5); /* R_E */ - data PT_LOAD FLAGS(7); /* RWE */ + data PT_LOAD FLAGS(6); /* RW_ */ note PT_NOTE FLAGS(4); /* R__ */ } SECTIONS { . = __KERNEL_START; - 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 - KPROBES_TEXT - *(.fixup) - *(.gnu.warning) - } :text = 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 - - . = ALIGN(4); - __tracedata_start = .; - .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { - *(.tracedata) - } - __tracedata_end = .; - - /* writeable */ - . = ALIGN(4096); - .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ - *(.data) - CONSTRUCTORS - } :data - - . = ALIGN(4096); - __nosave_begin = .; - .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) } - . = ALIGN(4096); - __nosave_end = .; + phys_startup_32 = startup_32 - LOAD_OFFSET + __KERNEL_TEXT_OFFSET; - . = 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) - } - - /* rarely changed data like cpu maps */ - . = ALIGN(32); - .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) } - _edata = .; /* End of data section */ - -#ifdef CONFIG_STACK_UNWIND - . = ALIGN(4); - .eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) { - __start_unwind = .; - *(.eh_frame) - __end_unwind = .; - } -#endif - - . = ALIGN(THREAD_SIZE); /* init_task */ - .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { - *(.data.init_task) - } + .text.startup : AT(ADDR(.text.startup) - LOAD_OFFSET) { + BYTE(0xEA) /* jmp far */ + LONG(phys_startup_32) + SHORT(__BOOT_CS) + } :text = 0x9090 /* might get freed after init */ . = ALIGN(4096); @@ -115,11 +60,6 @@ /* 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 = .; @@ -145,9 +85,7 @@ .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 = .; @@ -157,9 +95,197 @@ __per_cpu_start = .; .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } __per_cpu_end = .; + + /* read-only */ + + . = ALIGN(4096); + .init.text (. - __KERNEL_TEXT_OFFSET) : AT(ADDR(.init.text) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { + _sinittext = .; + *(.init.text) + _einittext = .; + } + + /* .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 + __KERNEL_TEXT_OFFSET) { *(.exit.text) } + +#ifdef CONFIG_PAX_KERNEXEC + .text.align : AT(ADDR(.text.align) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { + . = ALIGN(__KERNEL_TEXT_OFFSET - LOAD_OFFSET) - 1; + BYTE(0) + } +#else . = ALIGN(4096); - __init_end = .; +#endif + + __init_end = . + __KERNEL_TEXT_OFFSET; /* freed after init ends here */ + + _text = .; /* Text and read-only data */ + .text : AT(ADDR(.text) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { + *(.text) + SCHED_TEXT + LOCK_TEXT + KPROBES_TEXT + *(.fixup) + *(.gnu.warning) + } + + _etext = .; /* End of text section */ + . += __KERNEL_TEXT_OFFSET; + . = ALIGN(16); /* Exception table */ + __start___ex_table = .; + __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) } + __stop___ex_table = .; + + . = ALIGN(4096); + .rodata.page_aligned : AT(ADDR(.rodata.page_aligned) - LOAD_OFFSET) { + *(.empty_zero_page) + +#ifdef CONFIG_X86_PAE + *(.swapper_pm_dir) +#endif + + *(.swapper_pg_dir) + *(.idt) + } + + RODATA + + . = ALIGN(4); + __tracedata_start = .; + .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { + *(.tracedata) + } + __tracedata_end = .; + +############### insert by patch ######### start ######### +#ifdef CONFIG_PAX_KERNEXEC + . = ALIGN(4096); + MODULES_VADDR = .; + + .module.text : AT(ADDR(.module.text) - LOAD_OFFSET) { + . += (4 * 1024 * 1024); + . = ALIGN(1 << PMD_SHIFT) - 1; + BYTE(0) + } + + MODULES_END = .; +#else + . = ALIGN(32); +#endif +############### insert by patch ######### end ######### + + /* writeable */ + .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ + *(.data) + CONSTRUCTORS + } :data + + . = ALIGN(4096); + __nosave_begin = .; + .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) } + . = ALIGN(4096); + __nosave_end = .; + + . = ALIGN(32); + .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { + *(.data.cacheline_aligned) + } + + /* rarely changed data like cpu maps */ + . = ALIGN(32); + .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) } + +#ifdef CONFIG_STACK_UNWIND + . = ALIGN(4); + .eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) { + __start_unwind = .; + *(.eh_frame) + __end_unwind = .; + } +#endif + + . = ALIGN(THREAD_SIZE); /* init_task */ + .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { + *(.data.init_task) + } + _edata = .; /* End of data section */ + . = ALIGN(4096); + +// /* might get freed after init */ +// __smp_alt_begin = .; +// __smp_alt_instructions = .; +// .smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) { +// *(.smp_altinstructions) +// } +// __smp_alt_instructions_end = .; +// . = ALIGN(4); +// __smp_locks = .; +// .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { +// *(.smp_locks) +// } +// __smp_locks_end = .; +// .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) { +// *(.smp_altinstr_replacement) +// } +// . = ALIGN(4096); +// __smp_alt_end = .; +// +// /* 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(L1_CACHE_BYTES); +// __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) {