18c2c3df3SCatalin Marinas/* 28c2c3df3SCatalin Marinas * ld script to make ARM Linux kernel 38c2c3df3SCatalin Marinas * taken from the i386 version by Russell King 48c2c3df3SCatalin Marinas * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> 58c2c3df3SCatalin Marinas */ 68c2c3df3SCatalin Marinas 78c2c3df3SCatalin Marinas#include <asm-generic/vmlinux.lds.h> 88c2c3df3SCatalin Marinas#include <asm/thread_info.h> 98c2c3df3SCatalin Marinas#include <asm/memory.h> 108c2c3df3SCatalin Marinas#include <asm/page.h> 118c2c3df3SCatalin Marinas 12a2c1d73bSMark Rutland#include "image.h" 13a2c1d73bSMark Rutland 148c2c3df3SCatalin Marinas#define ARM_EXIT_KEEP(x) 158c2c3df3SCatalin Marinas#define ARM_EXIT_DISCARD(x) x 168c2c3df3SCatalin Marinas 178c2c3df3SCatalin MarinasOUTPUT_ARCH(aarch64) 18af885f40SGeoff LevandENTRY(_text) 198c2c3df3SCatalin Marinas 208c2c3df3SCatalin Marinasjiffies = jiffies_64; 218c2c3df3SCatalin Marinas 222240bbb6SMarc Zyngier#define HYPERVISOR_TEXT \ 232240bbb6SMarc Zyngier /* \ 242240bbb6SMarc Zyngier * Force the alignment to be compatible with \ 252240bbb6SMarc Zyngier * the vectors requirements \ 262240bbb6SMarc Zyngier */ \ 272240bbb6SMarc Zyngier . = ALIGN(2048); \ 282240bbb6SMarc Zyngier VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \ 292240bbb6SMarc Zyngier *(.hyp.idmap.text) \ 302240bbb6SMarc Zyngier VMLINUX_SYMBOL(__hyp_idmap_text_end) = .; \ 312240bbb6SMarc Zyngier VMLINUX_SYMBOL(__hyp_text_start) = .; \ 322240bbb6SMarc Zyngier *(.hyp.text) \ 332240bbb6SMarc Zyngier VMLINUX_SYMBOL(__hyp_text_end) = .; 342240bbb6SMarc Zyngier 35a352ea3eSArd Biesheuvel/* 36a352ea3eSArd Biesheuvel * The size of the PE/COFF section that covers the kernel image, which 37a352ea3eSArd Biesheuvel * runs from stext to _edata, must be a round multiple of the PE/COFF 38a352ea3eSArd Biesheuvel * FileAlignment, which we set to its minimum value of 0x200. 'stext' 39a352ea3eSArd Biesheuvel * itself is 4 KB aligned, so padding out _edata to a 0x200 aligned 40a352ea3eSArd Biesheuvel * boundary should be sufficient. 41a352ea3eSArd Biesheuvel */ 42a352ea3eSArd BiesheuvelPECOFF_FILE_ALIGNMENT = 0x200; 43a352ea3eSArd Biesheuvel 44a352ea3eSArd Biesheuvel#ifdef CONFIG_EFI 45a352ea3eSArd Biesheuvel#define PECOFF_EDATA_PADDING \ 46a352ea3eSArd Biesheuvel .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); } 47a352ea3eSArd Biesheuvel#else 48a352ea3eSArd Biesheuvel#define PECOFF_EDATA_PADDING 49a352ea3eSArd Biesheuvel#endif 50a352ea3eSArd Biesheuvel 518c2c3df3SCatalin MarinasSECTIONS 528c2c3df3SCatalin Marinas{ 538c2c3df3SCatalin Marinas /* 548c2c3df3SCatalin Marinas * XXX: The linker does not define how output sections are 558c2c3df3SCatalin Marinas * assigned to input sections when there are multiple statements 568c2c3df3SCatalin Marinas * matching the same input section name. There is no documented 578c2c3df3SCatalin Marinas * order of matching. 588c2c3df3SCatalin Marinas */ 598c2c3df3SCatalin Marinas /DISCARD/ : { 608c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_TEXT) 618c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_DATA) 628c2c3df3SCatalin Marinas EXIT_CALL 638c2c3df3SCatalin Marinas *(.discard) 648c2c3df3SCatalin Marinas *(.discard.*) 658c2c3df3SCatalin Marinas } 668c2c3df3SCatalin Marinas 678c2c3df3SCatalin Marinas . = PAGE_OFFSET + TEXT_OFFSET; 688c2c3df3SCatalin Marinas 698c2c3df3SCatalin Marinas .head.text : { 708c2c3df3SCatalin Marinas _text = .; 718c2c3df3SCatalin Marinas HEAD_TEXT 728c2c3df3SCatalin Marinas } 738c2c3df3SCatalin Marinas .text : { /* Real text segment */ 748c2c3df3SCatalin Marinas _stext = .; /* Text and read-only data */ 758c2c3df3SCatalin Marinas __exception_text_start = .; 768c2c3df3SCatalin Marinas *(.exception.text) 778c2c3df3SCatalin Marinas __exception_text_end = .; 788c2c3df3SCatalin Marinas IRQENTRY_TEXT 798c2c3df3SCatalin Marinas TEXT_TEXT 808c2c3df3SCatalin Marinas SCHED_TEXT 818c2c3df3SCatalin Marinas LOCK_TEXT 822240bbb6SMarc Zyngier HYPERVISOR_TEXT 838c2c3df3SCatalin Marinas *(.fixup) 848c2c3df3SCatalin Marinas *(.gnu.warning) 858c2c3df3SCatalin Marinas . = ALIGN(16); 868c2c3df3SCatalin Marinas *(.got) /* Global offset table */ 878c2c3df3SCatalin Marinas } 888c2c3df3SCatalin Marinas 898c2c3df3SCatalin Marinas RO_DATA(PAGE_SIZE) 90adace895SWill Deacon EXCEPTION_TABLE(8) 91c80b7ee8SMark Salter NOTES 928c2c3df3SCatalin Marinas _etext = .; /* End of text and rodata section */ 938c2c3df3SCatalin Marinas 948c2c3df3SCatalin Marinas . = ALIGN(PAGE_SIZE); 958c2c3df3SCatalin Marinas __init_begin = .; 968c2c3df3SCatalin Marinas 978c2c3df3SCatalin Marinas INIT_TEXT_SECTION(8) 988c2c3df3SCatalin Marinas .exit.text : { 998c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_TEXT) 1008c2c3df3SCatalin Marinas } 1018c2c3df3SCatalin Marinas . = ALIGN(16); 1028c2c3df3SCatalin Marinas .init.data : { 1038c2c3df3SCatalin Marinas INIT_DATA 1048c2c3df3SCatalin Marinas INIT_SETUP(16) 1058c2c3df3SCatalin Marinas INIT_CALLS 1068c2c3df3SCatalin Marinas CON_INITCALL 1078c2c3df3SCatalin Marinas SECURITY_INITCALL 1088c2c3df3SCatalin Marinas INIT_RAM_FS 1098c2c3df3SCatalin Marinas } 1108c2c3df3SCatalin Marinas .exit.data : { 1118c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_DATA) 1128c2c3df3SCatalin Marinas } 1138c2c3df3SCatalin Marinas 1148c2c3df3SCatalin Marinas PERCPU_SECTION(64) 1158c2c3df3SCatalin Marinas 116562c85caSYalin Wang . = ALIGN(PAGE_SIZE); 1178c2c3df3SCatalin Marinas __init_end = .; 1188c2c3df3SCatalin Marinas 119*e039ee4eSAndre Przywara . = ALIGN(4); 120*e039ee4eSAndre Przywara .altinstructions : { 121*e039ee4eSAndre Przywara __alt_instructions = .; 122*e039ee4eSAndre Przywara *(.altinstructions) 123*e039ee4eSAndre Przywara __alt_instructions_end = .; 124*e039ee4eSAndre Przywara } 125*e039ee4eSAndre Przywara .altinstr_replacement : { 126*e039ee4eSAndre Przywara *(.altinstr_replacement) 127*e039ee4eSAndre Przywara } 128*e039ee4eSAndre Przywara 129*e039ee4eSAndre Przywara . = ALIGN(PAGE_SIZE); 1303c620626SMark Salter _data = .; 1318c2c3df3SCatalin Marinas _sdata = .; 1323c620626SMark Salter RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE) 133a352ea3eSArd Biesheuvel PECOFF_EDATA_PADDING 1348c2c3df3SCatalin Marinas _edata = .; 1358c2c3df3SCatalin Marinas 1368c2c3df3SCatalin Marinas BSS_SECTION(0, 0, 0) 137bd00cd5fSMark Rutland 138bd00cd5fSMark Rutland . = ALIGN(PAGE_SIZE); 139bd00cd5fSMark Rutland idmap_pg_dir = .; 140bd00cd5fSMark Rutland . += IDMAP_DIR_SIZE; 141bd00cd5fSMark Rutland swapper_pg_dir = .; 142bd00cd5fSMark Rutland . += SWAPPER_DIR_SIZE; 143bd00cd5fSMark Rutland 1448c2c3df3SCatalin Marinas _end = .; 1458c2c3df3SCatalin Marinas 1468c2c3df3SCatalin Marinas STABS_DEBUG 147a2c1d73bSMark Rutland 148a2c1d73bSMark Rutland HEAD_SYMBOLS 1498c2c3df3SCatalin Marinas} 1502240bbb6SMarc Zyngier 1512240bbb6SMarc Zyngier/* 1522240bbb6SMarc Zyngier * The HYP init code can't be more than a page long. 1532240bbb6SMarc Zyngier */ 1542240bbb6SMarc ZyngierASSERT(((__hyp_idmap_text_start + PAGE_SIZE) > __hyp_idmap_text_end), 1552240bbb6SMarc Zyngier "HYP init code too big") 156da57a369SMark Rutland 157da57a369SMark Rutland/* 158da57a369SMark Rutland * If padding is applied before .head.text, virt<->phys conversions will fail. 159da57a369SMark Rutland */ 160da57a369SMark RutlandASSERT(_text == (PAGE_OFFSET + TEXT_OFFSET), "HEAD is misaligned") 161