Since the EXCEPTION_TABLE is read-only, collapse it into RO_DATA. Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Borislav Petkov <bp@suse.de> Acked-by: Helge Deller <deller@gmx.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: linux-alpha@vger.kernel.org Cc: linux-arch@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-c6x-dev@linux-c6x.org Cc: linux-ia64@vger.kernel.org Cc: linux-parisc@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-s390@vger.kernel.org Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Simek <monstr@monstr.eu> Cc: Rick Edgecombe <rick.p.edgecombe@intel.com> Cc: Segher Boessenkool <segher@kernel.crashing.org> Cc: Sven Schnelle <svens@stackframe.org> Cc: Will Deacon <will@kernel.org> Cc: x86-ml <x86@kernel.org> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Link: https://lkml.kernel.org/r/20191029211351.13243-24-keescook@chromium.org
		
			
				
	
	
		
			185 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*    Kernel link layout for various "sections"
 | |
|  *
 | |
|  *    Copyright (C) 1999-2003 Matthew Wilcox <willy at parisc-linux.org>
 | |
|  *    Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org>
 | |
|  *    Copyright (C) 2000 John Marvin <jsm at parisc-linux.org>
 | |
|  *    Copyright (C) 2000 Michael Ang <mang with subcarrier.org>
 | |
|  *    Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
 | |
|  *    Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org>
 | |
|  *    Copyright (C) 2006-2013 Helge Deller <deller@gmx.de>
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Put page table entries (swapper_pg_dir) as the first thing in .bss. This
 | |
|  * will ensure that it has .bss alignment (PAGE_SIZE).
 | |
|  */
 | |
| #define BSS_FIRST_SECTIONS	*(.data..vm0.pmd) \
 | |
| 				*(.data..vm0.pgd) \
 | |
| 				*(.data..vm0.pte)
 | |
| 
 | |
| #define CC_USING_PATCHABLE_FUNCTION_ENTRY
 | |
| #define RO_EXCEPTION_TABLE_ALIGN	8
 | |
| 
 | |
| #include <asm-generic/vmlinux.lds.h>
 | |
| 
 | |
| /* needed for the processor specific cache alignment size */	
 | |
| #include <asm/cache.h>
 | |
| #include <asm/page.h>
 | |
| #include <asm/asm-offsets.h>
 | |
| #include <asm/thread_info.h>
 | |
| 	
 | |
| /* ld script to make hppa Linux kernel */
 | |
| #ifndef CONFIG_64BIT
 | |
| OUTPUT_FORMAT("elf32-hppa-linux")
 | |
| OUTPUT_ARCH(hppa)
 | |
| #else
 | |
| OUTPUT_FORMAT("elf64-hppa-linux")
 | |
| OUTPUT_ARCH(hppa:hppa2.0w)
 | |
| #endif
 | |
| 
 | |
| #define EXIT_TEXT_SECTIONS()	.exit.text : { EXIT_TEXT }
 | |
| #if !defined(CONFIG_64BIT) || defined(CONFIG_MLONGCALLS)
 | |
| #define MLONGCALL_KEEP(x)
 | |
| #define MLONGCALL_DISCARD(x)	x
 | |
| #else
 | |
| #define MLONGCALL_KEEP(x)	x
 | |
| #define MLONGCALL_DISCARD(x)
 | |
| #endif
 | |
| 
 | |
| ENTRY(parisc_kernel_start)
 | |
| #ifndef CONFIG_64BIT
 | |
| jiffies = jiffies_64 + 4;
 | |
| #else
 | |
| jiffies = jiffies_64;
 | |
| #endif
 | |
| SECTIONS
 | |
| {
 | |
| 	. = KERNEL_BINARY_TEXT_START;
 | |
| 
 | |
| 	__init_begin = .;
 | |
| 	HEAD_TEXT_SECTION
 | |
| 	MLONGCALL_DISCARD(INIT_TEXT_SECTION(8))
 | |
| 
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	INIT_DATA_SECTION(PAGE_SIZE)
 | |
| 	MLONGCALL_DISCARD(EXIT_TEXT_SECTIONS())
 | |
| 	.exit.data :
 | |
| 	{
 | |
| 		EXIT_DATA
 | |
| 	}
 | |
| 	PERCPU_SECTION(8)
 | |
| 	. = ALIGN(4);
 | |
| 	.altinstructions : {
 | |
| 		__alt_instructions = .;
 | |
| 		*(.altinstructions)
 | |
| 		__alt_instructions_end = .;
 | |
| 	}
 | |
| 	. = ALIGN(HUGEPAGE_SIZE);
 | |
| 	__init_end = .;
 | |
| 	/* freed after init ends here */
 | |
| 
 | |
| 	_text = .;		/* Text and read-only data */
 | |
| 	_stext = .;
 | |
| 	MLONGCALL_KEEP(INIT_TEXT_SECTION(8))
 | |
| 	.text ALIGN(PAGE_SIZE) : {
 | |
| 		TEXT_TEXT
 | |
| 		LOCK_TEXT
 | |
| 		SCHED_TEXT
 | |
| 		CPUIDLE_TEXT
 | |
| 		KPROBES_TEXT
 | |
| 		IRQENTRY_TEXT
 | |
| 		SOFTIRQENTRY_TEXT
 | |
| 		*(.text.do_softirq)
 | |
| 		*(.text.sys_exit)
 | |
| 		*(.text.do_sigaltstack)
 | |
| 		*(.text.do_fork)
 | |
| 		*(.text.div)
 | |
| 		*($$*)			/* millicode routines */
 | |
| 		*(.text.*)
 | |
| 		*(.fixup)
 | |
| 		*(.lock.text)		/* out-of-line lock text */
 | |
| 		*(.gnu.warning)
 | |
| 	}
 | |
| 	MLONGCALL_KEEP(EXIT_TEXT_SECTIONS())
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	_etext = .;
 | |
| 	/* End of text section */
 | |
| 
 | |
| 	/* Start of data section */
 | |
| 	_sdata = .;
 | |
| 
 | |
| 	/* Architecturally we need to keep __gp below 0x1000000 and thus
 | |
| 	 * in front of RO_DATA() which stores lots of tracepoint
 | |
| 	 * and ftrace symbols. */
 | |
| #ifdef CONFIG_64BIT
 | |
| 	. = ALIGN(16);
 | |
| 	/* Linkage tables */
 | |
| 	.opd : {
 | |
| 		__start_opd = .;
 | |
| 		*(.opd)
 | |
| 		__end_opd = .;
 | |
| 	} PROVIDE (__gp = .);
 | |
| 	.plt : {
 | |
| 		*(.plt)
 | |
| 	}
 | |
| 	.dlt : {
 | |
| 		*(.dlt)
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| 	RO_DATA(8)
 | |
| 
 | |
| 	/* unwind info */
 | |
| 	.PARISC.unwind : {
 | |
| 		__start___unwind = .;
 | |
| 		*(.PARISC.unwind)
 | |
| 		__stop___unwind = .;
 | |
| 	}
 | |
| 
 | |
| 	/* writeable */
 | |
| 	/* Make sure this is page aligned so
 | |
| 	 * that we can properly leave these
 | |
| 	 * as writable
 | |
| 	 */
 | |
| 	. = ALIGN(HUGEPAGE_SIZE);
 | |
| 	data_start = .;
 | |
| 
 | |
| 	/* Data */
 | |
| 	RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, PAGE_SIZE)
 | |
| 
 | |
| 	/* PA-RISC locks requires 16-byte alignment */
 | |
| 	. = ALIGN(16);
 | |
| 	.data..lock_aligned : {
 | |
| 		*(.data..lock_aligned)
 | |
| 	}
 | |
| 
 | |
| 	/* End of data section */
 | |
| 	_edata = .;
 | |
| 
 | |
| 	/* BSS */
 | |
| 	BSS_SECTION(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE)
 | |
| 
 | |
| 	. = ALIGN(HUGEPAGE_SIZE);
 | |
| 	_end = . ;
 | |
| 
 | |
| 	STABS_DEBUG
 | |
| 	.note 0 : { *(.note) }
 | |
| 
 | |
| 	/* Sections to be discarded */
 | |
| 	DISCARDS
 | |
| 	/DISCARD/ : {
 | |
| #ifdef CONFIG_64BIT
 | |
| 		/* temporary hack until binutils is fixed to not emit these
 | |
| 	 	 * for static binaries
 | |
| 		 */
 | |
| 		*(.interp)
 | |
| 		*(.dynsym)
 | |
| 		*(.dynstr)
 | |
| 		*(.dynamic)
 | |
| 		*(.hash)
 | |
| 		*(.gnu.hash)
 | |
| #endif
 | |
| 	}
 | |
| }
 |