18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright (C) 2008-2009 Michal Simek <monstr@monstr.eu>
38c2ecf20Sopenharmony_ci * Copyright (C) 2008-2009 PetaLogix
48c2ecf20Sopenharmony_ci * Copyright (C) 2006 Atmark Techno, Inc.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
78c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive
88c2ecf20Sopenharmony_ci * for more details.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ciOUTPUT_ARCH(microblaze)
128c2ecf20Sopenharmony_ciENTRY(microblaze_start)
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#define RO_EXCEPTION_TABLE_ALIGN	16
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <asm/cache.h>
178c2ecf20Sopenharmony_ci#include <asm/page.h>
188c2ecf20Sopenharmony_ci#include <asm-generic/vmlinux.lds.h>
198c2ecf20Sopenharmony_ci#include <asm/thread_info.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#ifdef __MICROBLAZEEL__
228c2ecf20Sopenharmony_cijiffies = jiffies_64;
238c2ecf20Sopenharmony_ci#else
248c2ecf20Sopenharmony_cijiffies = jiffies_64 + 4;
258c2ecf20Sopenharmony_ci#endif
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ciSECTIONS {
288c2ecf20Sopenharmony_ci	. = CONFIG_KERNEL_START;
298c2ecf20Sopenharmony_ci	microblaze_start = CONFIG_KERNEL_BASE_ADDR;
308c2ecf20Sopenharmony_ci	.text : AT(ADDR(.text) - LOAD_OFFSET) {
318c2ecf20Sopenharmony_ci		_text = . ;
328c2ecf20Sopenharmony_ci		_stext = . ;
338c2ecf20Sopenharmony_ci		HEAD_TEXT
348c2ecf20Sopenharmony_ci		TEXT_TEXT
358c2ecf20Sopenharmony_ci		*(.fixup)
368c2ecf20Sopenharmony_ci		EXIT_TEXT
378c2ecf20Sopenharmony_ci		EXIT_CALL
388c2ecf20Sopenharmony_ci		SCHED_TEXT
398c2ecf20Sopenharmony_ci		CPUIDLE_TEXT
408c2ecf20Sopenharmony_ci		LOCK_TEXT
418c2ecf20Sopenharmony_ci		KPROBES_TEXT
428c2ecf20Sopenharmony_ci		IRQENTRY_TEXT
438c2ecf20Sopenharmony_ci		SOFTIRQENTRY_TEXT
448c2ecf20Sopenharmony_ci		. = ALIGN (4) ;
458c2ecf20Sopenharmony_ci		_etext = . ;
468c2ecf20Sopenharmony_ci	}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	. = ALIGN (4) ;
498c2ecf20Sopenharmony_ci	__fdt_blob : AT(ADDR(__fdt_blob) - LOAD_OFFSET) {
508c2ecf20Sopenharmony_ci		_fdt_start = . ;		/* place for fdt blob */
518c2ecf20Sopenharmony_ci		*(__fdt_blob) ;			/* Any link-placed DTB */
528c2ecf20Sopenharmony_ci	        . = _fdt_start + 0x10000;	/* Pad up to 64kbyte */
538c2ecf20Sopenharmony_ci		_fdt_end = . ;
548c2ecf20Sopenharmony_ci	}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	. = ALIGN(16);
578c2ecf20Sopenharmony_ci	RO_DATA(4096)
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	/*
608c2ecf20Sopenharmony_ci	 * sdata2 section can go anywhere, but must be word aligned
618c2ecf20Sopenharmony_ci	 * and SDA2_BASE must point to the middle of it
628c2ecf20Sopenharmony_ci	 */
638c2ecf20Sopenharmony_ci	.sdata2 : AT(ADDR(.sdata2) - LOAD_OFFSET) {
648c2ecf20Sopenharmony_ci		_ssrw = .;
658c2ecf20Sopenharmony_ci		. = ALIGN(PAGE_SIZE); /* page aligned when MMU used */
668c2ecf20Sopenharmony_ci		*(.sdata2)
678c2ecf20Sopenharmony_ci	. = ALIGN(8);
688c2ecf20Sopenharmony_ci	_essrw = .;
698c2ecf20Sopenharmony_ci	_ssrw_size = _essrw - _ssrw;
708c2ecf20Sopenharmony_ci	_KERNEL_SDA2_BASE_ = _ssrw + (_ssrw_size / 2);
718c2ecf20Sopenharmony_ci	}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	_sdata = . ;
748c2ecf20Sopenharmony_ci	RW_DATA(32, PAGE_SIZE, THREAD_SIZE)
758c2ecf20Sopenharmony_ci	_edata = . ;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	/* Under the microblaze ABI, .sdata and .sbss must be contiguous */
788c2ecf20Sopenharmony_ci	. = ALIGN(8);
798c2ecf20Sopenharmony_ci	.sdata : AT(ADDR(.sdata) - LOAD_OFFSET) {
808c2ecf20Sopenharmony_ci		_ssro = .;
818c2ecf20Sopenharmony_ci		*(.sdata)
828c2ecf20Sopenharmony_ci	}
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	.sbss :	AT(ADDR(.sbss) - LOAD_OFFSET) {
858c2ecf20Sopenharmony_ci		_ssbss = .;
868c2ecf20Sopenharmony_ci		*(.sbss)
878c2ecf20Sopenharmony_ci		_esbss = .;
888c2ecf20Sopenharmony_ci		_essro = .;
898c2ecf20Sopenharmony_ci		_ssro_size = _essro - _ssro ;
908c2ecf20Sopenharmony_ci		_KERNEL_SDA_BASE_ = _ssro + (_ssro_size / 2) ;
918c2ecf20Sopenharmony_ci	}
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	PERCPU_SECTION(L1_CACHE_BYTES)
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	. = ALIGN(PAGE_SIZE);
968c2ecf20Sopenharmony_ci	__init_begin = .;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	INIT_TEXT_SECTION(PAGE_SIZE)
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
1018c2ecf20Sopenharmony_ci		INIT_DATA
1028c2ecf20Sopenharmony_ci	}
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	. = ALIGN(4);
1058c2ecf20Sopenharmony_ci	.init.ivt : AT(ADDR(.init.ivt) - LOAD_OFFSET) {
1068c2ecf20Sopenharmony_ci		__ivt_start = .;
1078c2ecf20Sopenharmony_ci		*(.init.ivt)
1088c2ecf20Sopenharmony_ci		__ivt_end = .;
1098c2ecf20Sopenharmony_ci	}
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
1128c2ecf20Sopenharmony_ci		INIT_SETUP(0)
1138c2ecf20Sopenharmony_ci	}
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET ) {
1168c2ecf20Sopenharmony_ci		INIT_CALLS
1178c2ecf20Sopenharmony_ci	}
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
1208c2ecf20Sopenharmony_ci		CON_INITCALL
1218c2ecf20Sopenharmony_ci	}
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	__init_end_before_initramfs = .;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
1268c2ecf20Sopenharmony_ci		INIT_RAM_FS
1278c2ecf20Sopenharmony_ci	}
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	__init_end = .;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	.bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) {
1328c2ecf20Sopenharmony_ci		/* page aligned when MMU used */
1338c2ecf20Sopenharmony_ci		__bss_start = . ;
1348c2ecf20Sopenharmony_ci			*(.bss*)
1358c2ecf20Sopenharmony_ci			*(COMMON)
1368c2ecf20Sopenharmony_ci		. = ALIGN (4) ;
1378c2ecf20Sopenharmony_ci		__bss_stop = . ;
1388c2ecf20Sopenharmony_ci	}
1398c2ecf20Sopenharmony_ci	. = ALIGN(PAGE_SIZE);
1408c2ecf20Sopenharmony_ci	_end = .;
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	DISCARDS
1438c2ecf20Sopenharmony_ci}
144