xref: /openbmc/linux/arch/ia64/kernel/gate.lds.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds/*
31a43be74SRoland McGrath * Linker script for gate DSO.  The gate pages are an ELF shared object
41a43be74SRoland McGrath * prelinked to its virtual address, with only one read-only segment and
51a43be74SRoland McGrath * one execute-only segment (both fit in one page).  This script controls
61a43be74SRoland McGrath * its layout.
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
9c140d879SDavid Howells#include <asm/page.h>
101da177e4SLinus Torvalds
111da177e4SLinus TorvaldsSECTIONS
121da177e4SLinus Torvalds{
131da177e4SLinus Torvalds	. = GATE_ADDR + SIZEOF_HEADERS;
141da177e4SLinus Torvalds
151da177e4SLinus Torvalds	.hash			: { *(.hash) }		:readable
160b0bf7a3SRoland McGrath	.gnu.hash		: { *(.gnu.hash) }
171da177e4SLinus Torvalds	.dynsym			: { *(.dynsym) }
181da177e4SLinus Torvalds	.dynstr			: { *(.dynstr) }
191da177e4SLinus Torvalds	.gnu.version		: { *(.gnu.version) }
201da177e4SLinus Torvalds	.gnu.version_d		: { *(.gnu.version_d) }
211da177e4SLinus Torvalds	.gnu.version_r		: { *(.gnu.version_r) }
221a43be74SRoland McGrath
23172c5106SRoland McGrath	.note			: { *(.note*) }		:readable	:note
24172c5106SRoland McGrath
251da177e4SLinus Torvalds	.dynamic		: { *(.dynamic) }	:readable	:dynamic
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds	/*
281a43be74SRoland McGrath	 * This linker script is used both with -r and with -shared.  For
291a43be74SRoland McGrath	 * the layouts to match, we need to skip more than enough space for
301a43be74SRoland McGrath	 * the dynamic symbol table et al.  If this amount is insufficient,
311a43be74SRoland McGrath	 * ld -shared will barf.  Just increase it here.
321da177e4SLinus Torvalds	 */
331f0abae8SAndrew Morton	. = GATE_ADDR + 0x600;
341da177e4SLinus Torvalds
35dafb9320SDenys Vlasenko	.data..patch		: {
36e55645ecSLuis R. Rodriguez		__start_gate_mckinley_e9_patchlist = .;
37dafb9320SDenys Vlasenko		*(.data..patch.mckinley_e9)
38e55645ecSLuis R. Rodriguez		__end_gate_mckinley_e9_patchlist = .;
391da177e4SLinus Torvalds
40e55645ecSLuis R. Rodriguez		__start_gate_vtop_patchlist = .;
41dafb9320SDenys Vlasenko		*(.data..patch.vtop)
42e55645ecSLuis R. Rodriguez		__end_gate_vtop_patchlist = .;
431da177e4SLinus Torvalds
44e55645ecSLuis R. Rodriguez		__start_gate_fsyscall_patchlist = .;
45dafb9320SDenys Vlasenko		*(.data..patch.fsyscall_table)
46e55645ecSLuis R. Rodriguez		__end_gate_fsyscall_patchlist = .;
471da177e4SLinus Torvalds
48e55645ecSLuis R. Rodriguez		__start_gate_brl_fsys_bubble_down_patchlist = .;
49dafb9320SDenys Vlasenko		*(.data..patch.brl_fsys_bubble_down)
50e55645ecSLuis R. Rodriguez		__end_gate_brl_fsys_bubble_down_patchlist = .;
511da177e4SLinus Torvalds	}						:readable
521a43be74SRoland McGrath
531da177e4SLinus Torvalds	.IA_64.unwind_info	: { *(.IA_64.unwind_info*) }
541da177e4SLinus Torvalds	.IA_64.unwind		: { *(.IA_64.unwind*) }	:readable	:unwind
551da177e4SLinus Torvalds#ifdef HAVE_BUGGY_SEGREL
561da177e4SLinus Torvalds	.text (GATE_ADDR + PAGE_SIZE) : { *(.text) *(.text.*) }	:readable
571da177e4SLinus Torvalds#else
581da177e4SLinus Torvalds	. = ALIGN(PERCPU_PAGE_SIZE) + (. & (PERCPU_PAGE_SIZE - 1));
591da177e4SLinus Torvalds	.text			: { *(.text) *(.text.*) }	:epc
601da177e4SLinus Torvalds#endif
611da177e4SLinus Torvalds
621da177e4SLinus Torvalds	/DISCARD/		: {
631da177e4SLinus Torvalds		*(.got.plt) *(.got)
641da177e4SLinus Torvalds		*(.data .data.* .gnu.linkonce.d.*)
651da177e4SLinus Torvalds		*(.dynbss)
661da177e4SLinus Torvalds		*(.bss .bss.* .gnu.linkonce.b.*)
671da177e4SLinus Torvalds		*(__ex_table)
683283a67dSJes Sorensen		*(__mca_table)
691da177e4SLinus Torvalds	}
701da177e4SLinus Torvalds}
711da177e4SLinus Torvalds
721da177e4SLinus Torvalds/*
731a43be74SRoland McGrath * ld does not recognize this name token; use the constant.
741a43be74SRoland McGrath */
751a43be74SRoland McGrath#define	PT_IA_64_UNWIND	0x70000001
761a43be74SRoland McGrath
771a43be74SRoland McGrath/*
781da177e4SLinus Torvalds * We must supply the ELF program headers explicitly to get just one
791da177e4SLinus Torvalds * PT_LOAD segment, and set the flags explicitly to make segments read-only.
801da177e4SLinus Torvalds */
811da177e4SLinus TorvaldsPHDRS
821da177e4SLinus Torvalds{
831da177e4SLinus Torvalds	readable	PT_LOAD	FILEHDR	PHDRS	FLAGS(4);	/* PF_R */
841da177e4SLinus Torvalds#ifndef HAVE_BUGGY_SEGREL
851da177e4SLinus Torvalds	epc		PT_LOAD	FILEHDR PHDRS	FLAGS(1);	/* PF_X */
861da177e4SLinus Torvalds#endif
871da177e4SLinus Torvalds	dynamic		PT_DYNAMIC		FLAGS(4);	/* PF_R */
88172c5106SRoland McGrath	note		PT_NOTE			FLAGS(4);	/* PF_R */
891a43be74SRoland McGrath	unwind		PT_IA_64_UNWIND;
901da177e4SLinus Torvalds}
911da177e4SLinus Torvalds
921da177e4SLinus Torvalds/*
931da177e4SLinus Torvalds * This controls what symbols we export from the DSO.
941da177e4SLinus Torvalds */
951da177e4SLinus TorvaldsVERSION
961da177e4SLinus Torvalds{
971da177e4SLinus Torvalds	LINUX_2.5 {
981da177e4SLinus Torvalds	global:
991da177e4SLinus Torvalds		__kernel_syscall_via_break;
1001da177e4SLinus Torvalds		__kernel_syscall_via_epc;
1011da177e4SLinus Torvalds		__kernel_sigtramp;
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds	local: *;
1041da177e4SLinus Torvalds	};
1051da177e4SLinus Torvalds}
1061da177e4SLinus Torvalds
1071da177e4SLinus Torvalds/* The ELF entry point can be used to set the AT_SYSINFO value.  */
1081da177e4SLinus TorvaldsENTRY(__kernel_syscall_via_epc)
109