diff options
author | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-09-18 21:44:45 +0000 |
---|---|---|
committer | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-09-18 21:44:45 +0000 |
commit | 624d6c2c693ea7709b991d0af6356844efe7df2f (patch) | |
tree | 994ea3821268d1e7d35e6b7d67876fbba4c03b04 | |
parent | 8c63c18993342392cec181727aadbab2937e2380 (diff) |
Pass the loader script file thru cpp for CONFIG_MAPPED_KERNEL support.
-rw-r--r-- | arch/mips64/Makefile | 5 | ||||
-rw-r--r-- | arch/mips64/ld.script.elf32.S | 112 | ||||
-rw-r--r-- | include/asm-mips64/sn/mapped_kernel.h | 2 |
3 files changed, 119 insertions, 0 deletions
diff --git a/arch/mips64/Makefile b/arch/mips64/Makefile index 77609a84a..c145f2a47 100644 --- a/arch/mips64/Makefile +++ b/arch/mips64/Makefile @@ -12,6 +12,7 @@ # # Select the object file format to substitute into the linker script. # +CPP=$(CC) -E ifdef CONFIG_CPU_LITTLE_ENDIAN tool-prefix = mips64el-linux- else @@ -129,6 +130,10 @@ else 64bit-bfd = elf64-bigmips endif +vmlinux: arch/mips64/ld.script.elf32 +arch/mips64/ld.script.elf32: arch/mips64/ld.script.elf32.S + $(CPP) -C -P -I$(HPATH) -imacros $(HPATH)/asm-mips64/sn/mapped_kernel.h -Umips arch/mips64/ld.script.elf32.S > arch/mips64/ld.script.elf32 + ifdef CONFIG_MAPPED_KERNEL vmlinux.64: vmlinux $(OBJCOPY) -O $(64bit-bfd) --change-addresses=0xbfffffff40000000 $< $@ diff --git a/arch/mips64/ld.script.elf32.S b/arch/mips64/ld.script.elf32.S new file mode 100644 index 000000000..8afa60329 --- /dev/null +++ b/arch/mips64/ld.script.elf32.S @@ -0,0 +1,112 @@ +OUTPUT_ARCH(mips) +ENTRY(kernel_entry) +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + .init : { *(.init) } =0 + .text : + { + *(.text) + *(.rodata) + *(.rodata1) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } =0 + _etext = .; + + . = ALIGN(16384); + . = . + MAPPED_OFFSET; /* for CONFIG_MAPPED_KERNEL */ + .data.init_task : { *(.data.init_task) } + + /* Startup code */ + . = ALIGN(4096); + __init_begin = .; + .text.init : { *(.text.init) } + .data.init : { *(.data.init) } + . = ALIGN(16); + __setup_start = .; + .setup.init : { *(.setup.init) } + __setup_end = .; + __initcall_start = .; + .initcall.init : { *(.initcall.init) } + __initcall_end = .; + . = ALIGN(4096); /* Align double page for init_task_union */ + __init_end = .; + + . = ALIGN(4096); + .data.page_aligned : { *(.data.idt) } + + . = ALIGN(32); + .data.cacheline_aligned : { *(.data.cacheline_aligned) } + + .fini : { *(.fini) } =0 + .reginfo : { *(.reginfo) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. It would + be more correct to do this: + . = .; + The current expression does not correctly handle the case of a + text segment ending precisely at the end of a page; it causes the + data segment to skip a page. The above expression does not have + this problem, but it will currently (2/95) cause BFD to allocate + a single segment, combining both text and data, for this case. + This will prevent the text segment from being shared among + multiple executions of the program; I think that is more + important than losing a page of the virtual address space (note + that no actual memory is lost; the page which is skipped can not + be referenced). */ + . = .; + .data : + { + _fdata = . ; + *(.data) + CONSTRUCTORS + } + .data1 : { *(.data1) } + .lit8 : { *(.lit8) } + .lit4 : { *(.lit4) } + .ctors : { *(.ctors) } + .dtors : { *(.dtors) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { *(.sdata) } + _edata = .; + + .sbss : { *(.sbss) *(.scommon) } + .bss : + { + *(.dynbss) + *(.bss) + *(COMMON) + _end = . ; + } + + /* Sections to be discarded */ + /DISCARD/ : + { + *(.text.exit) + *(.data.exit) + *(.exitcall.exit) + } + + /* These are needed for ELF backends which have not yet been + converted to the new style linker. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + /* DWARF debug sections. + Symbols in the .debug DWARF section are relative to the beginning of the + section so we begin .debug at 0. It's not clear yet what needs to happen + for the others. */ + .debug 0 : { *(.debug) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .line 0 : { *(.line) } + /* These must appear regardless of . */ + .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } + .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } +} diff --git a/include/asm-mips64/sn/mapped_kernel.h b/include/asm-mips64/sn/mapped_kernel.h index 373be38d4..536a1edbb 100644 --- a/include/asm-mips64/sn/mapped_kernel.h +++ b/include/asm-mips64/sn/mapped_kernel.h @@ -39,11 +39,13 @@ #define MAPPED_KERN_RW_TO_PHYS(x) \ ((unsigned long)MAPPED_ADDR_RW_TO_PHYS(x) | \ MAPPED_KERN_RW_PHYSBASE(get_compact_nodeid())) +#define MAPPED_OFFSET 16777216 #else /* CONFIG_MAPPED_KERNEL */ #define MAPPED_KERN_RO_TO_PHYS(x) (x - CKSEG0) #define MAPPED_KERN_RW_TO_PHYS(x) (x - CKSEG0) +#define MAPPED_OFFSET 0 #endif /* CONFIG_MAPPED_KERNEL */ |