cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vmlinux.lds.S (8847B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifdef CONFIG_PPC64
      3#define PROVIDE32(x)	PROVIDE(__unused__##x)
      4#else
      5#define PROVIDE32(x)	PROVIDE(x)
      6#endif
      7
      8#define BSS_FIRST_SECTIONS *(.bss.prominit)
      9#define EMITS_PT_NOTE
     10#define RO_EXCEPTION_TABLE_ALIGN	0
     11
     12#define SOFT_MASK_TABLE(align)						\
     13	. = ALIGN(align);						\
     14	__soft_mask_table : AT(ADDR(__soft_mask_table) - LOAD_OFFSET) {	\
     15		__start___soft_mask_table = .;				\
     16		KEEP(*(__soft_mask_table))				\
     17		__stop___soft_mask_table = .;				\
     18	}
     19
     20#define RESTART_TABLE(align)						\
     21	. = ALIGN(align);						\
     22	__restart_table : AT(ADDR(__restart_table) - LOAD_OFFSET) {	\
     23		__start___restart_table = .;				\
     24		KEEP(*(__restart_table))				\
     25		__stop___restart_table = .;				\
     26	}
     27
     28#include <asm/page.h>
     29#include <asm-generic/vmlinux.lds.h>
     30#include <asm/cache.h>
     31#include <asm/thread_info.h>
     32
     33#define STRICT_ALIGN_SIZE	(1 << CONFIG_DATA_SHIFT)
     34
     35ENTRY(_stext)
     36
     37PHDRS {
     38	text PT_LOAD FLAGS(7); /* RWX */
     39	note PT_NOTE FLAGS(0);
     40}
     41
     42#ifdef CONFIG_PPC64
     43OUTPUT_ARCH(powerpc:common64)
     44jiffies = jiffies_64;
     45#else
     46OUTPUT_ARCH(powerpc:common)
     47jiffies = jiffies_64 + 4;
     48#endif
     49SECTIONS
     50{
     51	. = KERNELBASE;
     52
     53/*
     54 * Text, read only data and other permanent read-only sections
     55 */
     56
     57	_text = .;
     58	_stext = .;
     59
     60	/*
     61	 * Head text.
     62	 * This needs to be in its own output section to avoid ld placing
     63	 * branch trampoline stubs randomly throughout the fixed sections,
     64	 * which it will do (even if the branch comes from another section)
     65	 * in order to optimize stub generation.
     66	 */
     67	.head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
     68#ifdef CONFIG_PPC64
     69		KEEP(*(.head.text.first_256B));
     70#ifdef CONFIG_PPC_BOOK3E
     71#else
     72		KEEP(*(.head.text.real_vectors));
     73		*(.head.text.real_trampolines);
     74		KEEP(*(.head.text.virt_vectors));
     75		*(.head.text.virt_trampolines);
     76# if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
     77		KEEP(*(.head.data.fwnmi_page));
     78# endif
     79#endif
     80#else /* !CONFIG_PPC64 */
     81		HEAD_TEXT
     82#endif
     83	} :text
     84
     85	__head_end = .;
     86
     87#ifdef CONFIG_PPC64
     88	/*
     89	 * ALIGN(0) overrides the default output section alignment because
     90	 * this needs to start right after .head.text in order for fixed
     91	 * section placement to work.
     92	 */
     93	.text ALIGN(0) : AT(ADDR(.text) - LOAD_OFFSET) {
     94#ifdef CONFIG_LD_HEAD_STUB_CATCH
     95		KEEP(*(.linker_stub_catch));
     96		. = . ;
     97#endif
     98
     99#else
    100	.text : AT(ADDR(.text) - LOAD_OFFSET) {
    101		ALIGN_FUNCTION();
    102#endif
    103		/* careful! __ftr_alt_* sections need to be close to .text */
    104		*(.text.hot .text.hot.* TEXT_MAIN .text.fixup .text.unlikely .text.unlikely.* .fixup __ftr_alt_* .ref.text);
    105#ifdef CONFIG_PPC64
    106		*(.tramp.ftrace.text);
    107#endif
    108		NOINSTR_TEXT
    109		SCHED_TEXT
    110		CPUIDLE_TEXT
    111		LOCK_TEXT
    112		KPROBES_TEXT
    113		IRQENTRY_TEXT
    114		SOFTIRQENTRY_TEXT
    115		/*
    116		 * -Os builds call FP save/restore functions. The powerpc64
    117		 * linker generates those on demand in the .sfpr section.
    118		 * .sfpr gets placed at the beginning of a group of input
    119		 * sections, which can break start-of-text offset if it is
    120		 * included with the main text sections, so put it by itself.
    121		 */
    122		*(.sfpr);
    123		MEM_KEEP(init.text)
    124		MEM_KEEP(exit.text)
    125
    126#ifdef CONFIG_PPC32
    127		*(.got1)
    128		__got2_start = .;
    129		*(.got2)
    130		__got2_end = .;
    131#endif /* CONFIG_PPC32 */
    132
    133	} :text
    134
    135	. = ALIGN(PAGE_SIZE);
    136	_etext = .;
    137	PROVIDE32 (etext = .);
    138
    139	/* Read-only data */
    140	RO_DATA(PAGE_SIZE)
    141
    142#ifdef CONFIG_PPC64
    143	SOFT_MASK_TABLE(8)
    144	RESTART_TABLE(8)
    145
    146	.opd : AT(ADDR(.opd) - LOAD_OFFSET) {
    147		__start_opd = .;
    148		KEEP(*(.opd))
    149		__end_opd = .;
    150	}
    151
    152	. = ALIGN(8);
    153	__stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) {
    154		__start___stf_entry_barrier_fixup = .;
    155		*(__stf_entry_barrier_fixup)
    156		__stop___stf_entry_barrier_fixup = .;
    157	}
    158
    159	. = ALIGN(8);
    160	__uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) {
    161		__start___uaccess_flush_fixup = .;
    162		*(__uaccess_flush_fixup)
    163		__stop___uaccess_flush_fixup = .;
    164	}
    165
    166	. = ALIGN(8);
    167	__entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
    168		__start___entry_flush_fixup = .;
    169		*(__entry_flush_fixup)
    170		__stop___entry_flush_fixup = .;
    171	}
    172
    173	. = ALIGN(8);
    174	__scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
    175		__start___scv_entry_flush_fixup = .;
    176		*(__scv_entry_flush_fixup)
    177		__stop___scv_entry_flush_fixup = .;
    178	}
    179
    180	. = ALIGN(8);
    181	__stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
    182		__start___stf_exit_barrier_fixup = .;
    183		*(__stf_exit_barrier_fixup)
    184		__stop___stf_exit_barrier_fixup = .;
    185	}
    186
    187	. = ALIGN(8);
    188	__rfi_flush_fixup : AT(ADDR(__rfi_flush_fixup) - LOAD_OFFSET) {
    189		__start___rfi_flush_fixup = .;
    190		*(__rfi_flush_fixup)
    191		__stop___rfi_flush_fixup = .;
    192	}
    193#endif /* CONFIG_PPC64 */
    194
    195#ifdef CONFIG_PPC_BARRIER_NOSPEC
    196	. = ALIGN(8);
    197	__spec_barrier_fixup : AT(ADDR(__spec_barrier_fixup) - LOAD_OFFSET) {
    198		__start___barrier_nospec_fixup = .;
    199		*(__barrier_nospec_fixup)
    200		__stop___barrier_nospec_fixup = .;
    201	}
    202#endif /* CONFIG_PPC_BARRIER_NOSPEC */
    203
    204#ifdef CONFIG_PPC_FSL_BOOK3E
    205	. = ALIGN(8);
    206	__spec_btb_flush_fixup : AT(ADDR(__spec_btb_flush_fixup) - LOAD_OFFSET) {
    207		__start__btb_flush_fixup = .;
    208		*(__btb_flush_fixup)
    209		__stop__btb_flush_fixup = .;
    210	}
    211#endif
    212
    213/*
    214 * Init sections discarded at runtime
    215 */
    216	. = ALIGN(STRICT_ALIGN_SIZE);
    217	__init_begin = .;
    218	. = ALIGN(PAGE_SIZE);
    219	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
    220		_sinittext = .;
    221		INIT_TEXT
    222
    223		/*
    224		 *.init.text might be RO so we must ensure this section ends on
    225		 * a page boundary.
    226		 */
    227		. = ALIGN(PAGE_SIZE);
    228		_einittext = .;
    229#ifdef CONFIG_PPC64
    230		*(.tramp.ftrace.init);
    231#endif
    232	} :text
    233
    234	/* .exit.text is discarded at runtime, not link time,
    235	 * to deal with references from __bug_table
    236	 */
    237	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
    238		EXIT_TEXT
    239	}
    240
    241	. = ALIGN(PAGE_SIZE);
    242
    243	INIT_DATA_SECTION(16)
    244
    245	. = ALIGN(8);
    246	__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
    247		__start___ftr_fixup = .;
    248		KEEP(*(__ftr_fixup))
    249		__stop___ftr_fixup = .;
    250	}
    251	. = ALIGN(8);
    252	__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
    253		__start___mmu_ftr_fixup = .;
    254		KEEP(*(__mmu_ftr_fixup))
    255		__stop___mmu_ftr_fixup = .;
    256	}
    257	. = ALIGN(8);
    258	__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
    259		__start___lwsync_fixup = .;
    260		KEEP(*(__lwsync_fixup))
    261		__stop___lwsync_fixup = .;
    262	}
    263#ifdef CONFIG_PPC64
    264	. = ALIGN(8);
    265	__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
    266		__start___fw_ftr_fixup = .;
    267		KEEP(*(__fw_ftr_fixup))
    268		__stop___fw_ftr_fixup = .;
    269	}
    270#endif
    271
    272	PERCPU_SECTION(L1_CACHE_BYTES)
    273
    274	. = ALIGN(8);
    275	.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
    276		__machine_desc_start = . ;
    277		KEEP(*(.machine.desc))
    278		__machine_desc_end = . ;
    279	}
    280#ifdef CONFIG_RELOCATABLE
    281	. = ALIGN(8);
    282	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
    283	{
    284		__dynamic_symtab = .;
    285		*(.dynsym)
    286	}
    287	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
    288	.dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
    289	{
    290		__dynamic_start = .;
    291		*(.dynamic)
    292	}
    293	.hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
    294	.gnu.hash : AT(ADDR(.gnu.hash) - LOAD_OFFSET) { *(.gnu.hash) }
    295	.interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
    296	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
    297	{
    298		__rela_dyn_start = .;
    299		*(.rela*)
    300	}
    301#endif
    302	/* .exit.data is discarded at runtime, not link time,
    303	 * to deal with references from .exit.text
    304	 */
    305	.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
    306		EXIT_DATA
    307	}
    308
    309	/* freed after init ends here */
    310	. = ALIGN(PAGE_SIZE);
    311	__init_end = .;
    312
    313/*
    314 * And now the various read/write data
    315 */
    316
    317	. = ALIGN(PAGE_SIZE);
    318	_sdata = .;
    319
    320#ifdef CONFIG_PPC32
    321	.data : AT(ADDR(.data) - LOAD_OFFSET) {
    322		DATA_DATA
    323		*(.data.rel*)
    324		*(SDATA_MAIN)
    325		*(.sdata2)
    326		*(.got.plt) *(.got)
    327		*(.plt)
    328		*(.branch_lt)
    329	}
    330#else
    331	.data : AT(ADDR(.data) - LOAD_OFFSET) {
    332		DATA_DATA
    333		*(.data.rel*)
    334		*(.toc1)
    335		*(.branch_lt)
    336	}
    337
    338	.got : AT(ADDR(.got) - LOAD_OFFSET) ALIGN(256) {
    339		*(.got)
    340#ifndef CONFIG_RELOCATABLE
    341		__prom_init_toc_start = .;
    342		arch/powerpc/kernel/prom_init.o*(.toc)
    343		__prom_init_toc_end = .;
    344#endif
    345		*(.toc)
    346	}
    347#endif
    348
    349	/* The initial task and kernel stack */
    350	INIT_TASK_DATA_SECTION(THREAD_ALIGN)
    351
    352	.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
    353		PAGE_ALIGNED_DATA(PAGE_SIZE)
    354	}
    355
    356	.data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
    357		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
    358	}
    359
    360	.data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
    361		READ_MOSTLY_DATA(L1_CACHE_BYTES)
    362	}
    363
    364	. = ALIGN(PAGE_SIZE);
    365	.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
    366		NOSAVE_DATA
    367	}
    368
    369	BUG_TABLE
    370
    371	. = ALIGN(PAGE_SIZE);
    372	_edata  =  .;
    373	PROVIDE32 (edata = .);
    374
    375/*
    376 * And finally the bss
    377 */
    378
    379	BSS_SECTION(0, 0, 0)
    380
    381	. = ALIGN(PAGE_SIZE);
    382	_end = . ;
    383	PROVIDE32 (end = .);
    384
    385	STABS_DEBUG
    386	DWARF_DEBUG
    387	ELF_DETAILS
    388
    389	DISCARDS
    390	/DISCARD/ : {
    391		*(*.EMB.apuinfo)
    392		*(.glink .iplt .plt .rela* .comment)
    393		*(.gnu.version*)
    394		*(.gnu.attributes)
    395		*(.eh_frame)
    396	}
    397}