aboutsummaryrefslogtreecommitdiff
path: root/arch/sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64')
-rw-r--r--arch/sparc64/kernel/vmlinux.lds.S45
1 files changed, 37 insertions, 8 deletions
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S
index 01f809617e5..4bfbeffb732 100644
--- a/arch/sparc64/kernel/vmlinux.lds.S
+++ b/arch/sparc64/kernel/vmlinux.lds.S
@@ -1,19 +1,45 @@
-/* ld script to make UltraLinux kernel */
+/* ld script for sparc32/sparc64 kernel */
-#include <asm/page.h>
#include <asm-generic/vmlinux.lds.h>
+#include <asm/page.h>
+
+#ifdef CONFIG_SPARC32
+#define INITIAL_ADDRESS 0x10000 + SIZEOF_HEADERS
+#define TEXTSTART 0xf0004000
+
+#define SMP_CACHE_BYTES_SHIFT 5
+
+#else
+#define SMP_CACHE_BYTES_SHIFT 6
+#define INITIAL_ADDRESS 0x4000
+#define TEXTSTART 0x0000000000404000
+
+#endif
+
+#define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT)
+#ifdef CONFIG_SPARC32
+OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc")
+OUTPUT_ARCH(sparc)
+ENTRY(_start)
+jiffies = jiffies_64 + 4;
+#else
+/* sparc64 */
OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
OUTPUT_ARCH(sparc:v9a)
ENTRY(_start)
-
jiffies = jiffies_64;
+#endif
+
SECTIONS
{
+ /* swapper_low_pmd_dir is sparc64 only */
swapper_low_pmd_dir = 0x0000000000402000;
- . = 0x4000;
- .text 0x0000000000404000 : {
+ . = INITIAL_ADDRESS;
+ .text TEXTSTART :
+ {
_text = .;
+ *(.text.head)
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
@@ -24,25 +50,27 @@ SECTIONS
PROVIDE (etext = .);
RO_DATA(PAGE_SIZE)
- .data : {
+ .data : {
DATA_DATA
CONSTRUCTORS
}
.data1 : {
*(.data1)
}
- . = ALIGN(64);
+ . = ALIGN(SMP_CACHE_BYTES);
.data.cacheline_aligned : {
*(.data.cacheline_aligned)
}
- . = ALIGN(64);
+ . = ALIGN(SMP_CACHE_BYTES);
.data.read_mostly : {
*(.data.read_mostly)
}
_edata = .;
PROVIDE (edata = .);
.fixup : {
+ __start___fixup = .;
*(.fixup)
+ __stop___fixup = .;
}
. = ALIGN(16);
__ex_table : {
@@ -59,6 +87,7 @@ SECTIONS
INIT_TEXT
_einittext = .;
}
+ __init_text_end = .;
.init.data : {
INIT_DATA
}