x86/extable changes for v3.5
Linus,
Please pull the latest x86-extable-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-extable-for-linus
HEAD: 8b5ad472991796b2347464922c72de2ca5a028f3 Revert "x86, extable: Disable presorted exception table for now"
The biggest change here is to allow the build-time sorting of the exception table, to speed up booting. This is achieved by the architecture enabling BUILDTIME_EXTABLE_SORT. This option is enabled for x86 and MIPS currently.
On x86 a number of fixes and changes were needed to allow build-time sorting of the exception table, in particular a relocation invariant exception table format was needed. This required the abstracting out of exception table protocol and the removal of 20 years of accumulated assumptions about the x86 exception table format.
While at it, this tree also cleans up various other aspects of exception handling, such as early(er) exception handling for rdmsr_safe() et al.
All in one, as the result of these changes the x86 exception code is now pretty nice and modern. As an added bonus any regressions in this code will be early and violent crashes, so if you see any of those, you'll know whom to blame!
out-of-topic modifications in x86-extable-for-linus:
----------------------------------------------------
Makefile # 1dbdc6f: kbuild/extable: Hook up sortextab arch/mips/Kconfig # 4b05449: MIPS: Select BUILDTIME_EXTABLE_SO init/Kconfig # 1dbdc6f: kbuild/extable: Hook up sortextab kernel/extable.c # d219e2e: extable: Skip sorting if sorted a scripts/.gitignore # a79f248: scripts: Add sortextable to sort scripts/Makefile # d59a168: scripts/sortextable: Handle relat
# a79f248: scripts: Add sortextable to sortscripts/sortextable.c # d59a168: scripts/sortextable: Handle relat
# a79f248: scripts: Add sortextable to sortscripts/sortextable.h # d59a168: scripts/sortextable: Handle relat
# a79f248: scripts: Add sortextable to sort
Thanks,
Ingo
------------------>
David Daney (7):
scripts: Add sortextable to sort the kernel's exception table.
extable: Skip sorting if sorted at build time. kbuild/extable: Hook up sortextable into the build system.
MIPS: Select BUILDTIME_EXTABLE_SORT
x86: Select BUILDTIME_EXTABLE_SORT scripts/sortextable: Handle relative entries, and other cleanups Revert "x86, extable: Disable presorted exception table for now"
H. Peter Anvin (28):
x86, nop: Make the ASM_NOP* macros work from assembly
x86: Add symbolic constant for exceptions with error code
x86, paravirt: Replace GET_CR2_INTO_RCX with GET_CR2_INTO_RAX
x86, extable: Add early_fixup_exception()
x86-64: Handle exception table entries during early boot
x86-32: Handle exception table entries during early boot
x86, doc: Revert "x86: Document rdmsr_safe restrictions"
x86, extable: Use .pushsection ... .popsection for _ASM_EXTABLE()
x86, extable: Remove open-coded exception table entries in arch/x86/ia32/ia32entry.S x86, extable: Remove open-coded exception table entries in arch/x86/kernel/entry_32.S x86, extable: Remove open-coded exception table entries in arch/x86/kernel/entry_64.S x86, extable: Remove open-coded exception table entries in arch/x86/kernel/test_rodata.c x86, extable: Remove open-coded exception table entries in arch/x86/lib/checksum_32.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/copy_user_64.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/copy_user_nocache_64.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/csum-copy_64.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/getuser.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/putuser.S x86, extable: Remove open-coded exception table entries in arch/x86/lib/usercopy_32.c x86, extable: Remove open-coded exception table entries in arch/x86/um/checksum_32.S x86, extable: Remove open-coded exception table entries in arch/x86/xen/xen-asm_32.S x86, extable: Remove the now-unused __ASM_EX_SEC macros
x86, extable: Remove open-coded exception table entries in arch/x86/include/asm/kvm_host.h x86, extable: Remove open-coded exception table entries in arch/x86/include/asm/xsave.h x86, extable: Remove open-coded exception table entries in arch/x86/ia32/ia32entry.S x86, extable: Add _ASM_EXTABLE_EX() macro
x86, extable: Disable presorted exception table for now
x86, extable: Switch to relative exception table entries
Makefile | 10 ++ arch/mips/Kconfig | 1 + arch/x86/Kconfig | 1 + arch/x86/ia32/ia32entry.S | 9 +- arch/x86/include/asm/asm.h | 38 +++-- arch/x86/include/asm/kvm_host.h | 5 +- arch/x86/include/asm/msr.h | 9 +- arch/x86/include/asm/nops.h | 4 + arch/x86/include/asm/paravirt.h | 6 +- arch/x86/include/asm/segment.h | 4 +- arch/x86/include/asm/uaccess.h | 25 +-- arch/x86/include/asm/xsave.h | 10 +- arch/x86/kernel/entry_32.S | 47 ++---- arch/x86/kernel/entry_64.S | 16 +- arch/x86/kernel/head_32.S | 223 ++++++++++++++----------- arch/x86/kernel/head_64.S | 80 ++++++--- arch/x86/kernel/test_rodata.c | 10 +- arch/x86/lib/checksum_32.S | 9 +- arch/x86/lib/copy_user_64.S | 63 +++---- arch/x86/lib/copy_user_nocache_64.S | 50 +++--- arch/x86/lib/csum-copy_64.S | 16 +- arch/x86/lib/getuser.S | 9 +- arch/x86/lib/putuser.S | 12 +- arch/x86/lib/usercopy_32.c | 232 ++++++++++++-------------- arch/x86/mm/extable.c | 142 +++++++++++++++- arch/x86/um/checksum_32.S | 9 +- arch/x86/xen/xen-asm_32.S | 6 +- init/Kconfig | 3 + kernel/extable.c | 8 +- scripts/.gitignore | 1 + scripts/Makefile | 3 + scripts/sortextable.c | 322 ++++++++++++++++++++++++++++++++++++ scripts/sortextable.h | 191 +++++++++++++++++++++ 33 files changed, 1118 insertions(+), 456 deletions(-) create mode 100644 scripts/sortextable.c create mode 100644 scripts/sortextable.h
Makefile +10 -0
@@ -784,6 +784,10 @@ quiet_cmd_vmlinux_version = GEN .version quiet_cmd_sysmap = SYSMAP cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap +# Sort exception table at build time +quiet_cmd_sortextable = SORTEX + cmd_sortextable = $(objtree)/scripts/sortextable + # Link of vmlinux # If CONFIG_KALLSYMS is set .version is already updated # Generate System.map and verify that the content is consistent
@@ -796,6 +800,12 @@ define rule_vmlinux__ $(call cmd,vmlinux__) $(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd + $(if $(CONFIG_BUILDTIME_EXTABLE_SORT), \ + $(Q)$(if $($(quiet)cmd_sortextable), \ + echo ' $($(quiet)cmd_sortextable) vmlinux' &&) \ + $(cmd_sortextable) vmlinux) + + $(Q)$(if $($(quiet)cmd_sysmap), \ echo ' $($(quiet)cmd_sysmap) System.map' &&) \ $(cmd_sysmap) $@ System.map; \
arch/mips/Kconfig +1 -0
@@ -29,6 +29,7 @@ config MIPS select HAVE_MEMBLOCK select HAVE_MEMBLOCK_NODE_MAP select ARCH_DISCARD_MEMBLOCK + select BUILDTIME_EXTABLE_SORT menu "Machine selection"
arch/x86/Kconfig +1 -0
@@ -82,6 +82,7 @@ config X86 select ARCH_HAVE_NMI_SAFE_CMPXCHG select GENERIC_IOMAP select DCACHE_WORD_ACCESS if !DEBUG_PAGEALLOC + select BUILDTIME_EXTABLE_SORT config INSTRUCTION_DECODER def_bool (KPROBES || PERF_EVENTS)
arch/x86/ia32/ia32entry.S +3 -6
@@ -13,6 +13,7 @@ #include <asm/thread_info.h> #include <asm/segment.h> #include <asm/irqflags.h> +#include <asm/asm.h> #include <linux/linkage.h> #include <linux/err.h>
@@ -146,9 +147,7 @@ ENTRY(ia32_sysenter_target) /* no need to do an access_ok check here because rbp has been 32bit zero extended */ 1: movl (%rbp),%ebp - .section __ex_table,"a" - .quad 1b,ia32_badarg - .previous + _ASM_EXTABLE(1b,ia32_badarg) orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) CFI_REMEMBER_STATE
@@ -303,9 +302,7 @@ ENTRY(ia32_cstar_target) 32bit zero extended */ /* hardware stack frame is complete now */ 1: movl (%r8),%r9d - .section __ex_table,"a" - .quad 1b,ia32_badarg - .previous + _ASM_EXTABLE(1b,ia32_badarg) orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) CFI_REMEMBER_STATE
arch/x86/include/asm/asm.h +26 -12
@@ -4,11 +4,9 @@#ifdef __ASSEMBLY__# define __ASM_FORM (x) x# define __ASM_FORM_COMMA (x) x, -# define __ASM_EX_SEC .section __ex_table, "a"#else # define __ASM_FORM (x) " " #x " "# define __ASM_FORM_COMMA (x) " " #x "," -# define __ASM_EX_SEC " .section __ex_table,\"a\"\n"#endif #ifdef CONFIG_X86_32
@@ -42,17 +40,33 @@/* Exception table entry */ #ifdef __ASSEMBLY__ -# define _ASM_EXTABLE (from,to) \ - __ASM_EX_SEC ; \ - _ASM_ALIGN ; \ - _ASM_PTR from , to ; \ - .previous +# define _ASM_EXTABLE (from,to) \ + .pushsection "__ex_table","a" ; \ + .balign 8 ; \ + .long (from) - . ; \ + .long (to) - . ; \ + .popsection + +# define _ASM_EXTABLE_EX (from,to) \ + .pushsection "__ex_table","a" ; \ + .balign 8 ; \ + .long (from) - . ; \ + .long (to) - . + 0x7ffffff0 ; \ + .popsection#else -# define _ASM_EXTABLE (from,to) \ - __ASM_EX_SEC \ - _ASM_ALIGN "\n" \ - _ASM_PTR #from "," #to "\n" \ - " .previous\n" +# define _ASM_EXTABLE (from,to) \ + " .pushsection \"__ex_table\",\"a\"\n" \ + " .balign 8\n" \ + " .long (" #from ") - .\n" \ + " .long (" #to ") - .\n" \ + " .popsection\n" + +# define _ASM_EXTABLE_EX (from,to) \ + " .pushsection \"__ex_table\",\"a\"\n" \ + " .balign 8\n" \ + " .long (" #from ") - .\n" \ + " .long (" #to ") - . + 0x7ffffff0\n" \ + " .popsection\n"#endif #endif /* _ASM_X86_ASM_H */
arch/x86/include/asm/kvm_host.h +2 -3
@@ -27,6 +27,7 @@#include <asm/desc.h> #include <asm/mtrr.h> #include <asm/msr-index.h> +#include <asm/asm.h> #define KVM_MAX_VCPUS 254#define KVM_SOFT_MAX_VCPUS 160
@@ -921,9 +922,7 @@ extern bool kvm_rebooting; __ASM_SIZE(push) " $666b \n\t" \"call kvm_spurious_fault \n\t" \".popsection \n\t" \ -".pushsection __ex_table, \"a\" \n\t" \ - _ASM_PTR" 666b, 667b \n\t" \ - ".popsection" + _ASM_EXTABLE(666b, 667b)#define __kvm_handle_fault_on_reboot (insn) \ ____kvm_handle_fault_on_reboot(insn, "")
arch/x86/include/asm/msr.h +1 -8
@@ -169,14 +169,7 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)return native_write_msr_safe (msr, low, high); } -/* -* rdmsr with exception handling. -* -* Please note that the exception handling works only after we've -* switched to the "smart" #GP handler in trap_init() which knows about -* exception tables - using this macro earlier than that causes machine -* hangs on boxes which do not implement the @msr in the first argument. -*/ +/* rdmsr with exception handling */ #define rdmsr_safe (msr, p1, p2) \ ({ \ int __err; \
arch/x86/include/asm/nops.h +4 -0
@@ -87,7 +87,11 @@#define P6_NOP8 0x0f,0x1f,0x84,0x00,0,0,0,0#define P6_NOP5_ATOMIC P6_NOP5 +#ifdef __ASSEMBLY__ +#define _ASM_MK_NOP (x) .byte x +#else #define _ASM_MK_NOP (x) ".byte " __stringify(x) "\n" +#endif #if defined(CONFIG_MK7 )#define ASM_NOP1 _ASM_MK_NOP(K7_NOP1)
arch/x86/include/asm/paravirt.h +2 -4
@@ -1023,10 +1023,8 @@ extern void default_banner(void); call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs) \ ) -#define GET_CR2_INTO_RCX \ - call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2); \ - movq %rax, %rcx; \ - xorq %rax, %rax; +#define GET_CR2_INTO_RAX \ + call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2)#define PARAVIRT_ADJUST_EXCEPTION_FRAME \ PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_adjust_exception_frame), \
arch/x86/include/asm/segment.h +3 -1
@@ -205,13 +205,15 @@#define IDT_ENTRIES 256#define NUM_EXCEPTION_VECTORS 32 +/* Bitmask of exception vectors which push an error code on the stack */ +#define EXCEPTION_ERRCODE_MASK 0x00027d00#define GDT_SIZE (GDT_ENTRIES * 8)#define GDT_ENTRY_TLS_ENTRIES 3#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)#ifdef __KERNEL__#ifndef __ASSEMBLY__ -extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS ][10 ]; +extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS ][2 +2 +5 ];/* * Load a segment. Fall back on loading the zero
arch/x86/include/asm/uaccess.h +15 -10
@@ -79,11 +79,12 @@#define access_ok (type, addr, size) (likely(__range_not_ok(addr, size) == 0))/* -* The exception table consists of pairs of addresses: the first is the -* address of an instruction that is allowed to fault, and the second is -* the address at which the program should continue. No registers are -* modified, so it is entirely up to the continuation code to figure out -* what to do. +* The exception table consists of pairs of addresses relative to the +* exception table enty itself: the first is the address of an +* instruction that is allowed to fault, and the second is the address +* at which the program should continue. No registers are modified, +* so it is entirely up to the continuation code to figure out what to +* do. * * All the routines below use bits of fixup code that are out of line * with the main instruction path. This means when everything is well,
@@ -92,10 +93,14 @@*/ struct exception_table_entry { -unsigned long insn, fixup; +int insn, fixup; }; +/* This is not the generic standard exception_table_entry format */ +#define ARCH_HAS_SORT_EXTABLE +#define ARCH_HAS_SEARCH_EXTABLE extern int fixup_exception (struct pt_regs *regs); +extern int early_fixup_exception (unsigned long *ip);/* * These are the main single-value transfer routines. They automatically
@@ -202,8 +207,8 @@ extern int __get_user_bad(void); asmvolatile ("1: movl %%eax,0(%1)\n" \"2: movl %%edx,4(%1)\n" \"3:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ - _ASM_EXTABLE(2b, 3b - 2b) \ + _ASM_EXTABLE_EX(1b, 2b) \ + _ASM_EXTABLE_EX(2b, 3b) \ : : "A" (x), "r" (addr))#define __put_user_x8 (x, ptr, __ret_pu) \
@@ -408,7 +413,7 @@ do { \#define __get_user_asm_ex (x, addr, itype, rtype, ltype) \ asm volatile("1: mov"itype" %1,%"rtype"0\n" \ "2:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ + _ASM_EXTABLE_EX(1b, 2b) \ : ltype(x) : "m" (__m(addr)))#define __put_user_nocheck (x, ptr, size) \
@@ -450,7 +455,7 @@ struct __large_struct { unsigned long buf[100]; };#define __put_user_asm_ex (x, addr, itype, rtype, ltype) \ asm volatile("1: mov"itype" %"rtype"0,%1\n" \ "2:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ + _ASM_EXTABLE_EX(1b, 2b) \ : : ltype(x), "m" (__m(addr)))/*
arch/x86/include/asm/xsave.h +2 -8
@@ -80,10 +80,7 @@ static inline int xsave_user(struct xsave_struct __user *buf)"3: movl $-1,%[err]\n" " jmp 2b\n" ".previous\n" -".section __ex_table,\"a\"\n" - _ASM_ALIGN"\n" - _ASM_PTR"1b,3b\n" -".previous" + _ASM_EXTABLE(1b ,3b ) : [err] "=r" (err) : "D" (buf), "a" (-1), "d" (-1), "0" (0) : "memory");
@@ -106,10 +103,7 @@ static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)"3: movl $-1,%[err]\n" " jmp 2b\n" ".previous\n" -".section __ex_table,\"a\"\n" - _ASM_ALIGN"\n" - _ASM_PTR"1b,3b\n" -".previous" + _ASM_EXTABLE(1b ,3b ) : [err] "=r" (err) : "D" (xstate), "a" (lmask), "d" (hmask), "0" (0) : "memory"); /* memory required? */
arch/x86/kernel/entry_32.S +14 -33
105 lines not on this page · raw message
arch/x86/kernel/entry_64.S +4 -12
@@ -55,6 +55,7 @@ #include <asm/paravirt.h> #include <asm/ftrace.h> #include <asm/percpu.h> +#include <asm/asm.h> #include <linux/err.h> /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */
@@ -900,18 +901,12 @@ restore_args: irq_return: INTERRUPT_RETURN - - .section __ex_table, "a" - .quad irq_return, bad_iret - .previous + _ASM_EXTABLE(irq_return, bad_iret) #ifdef CONFIG_PARAVIRT ENTRY(native_iret) iretq - - .section __ex_table,"a" - .quad native_iret, bad_iret - .previous + _ASM_EXTABLE(native_iret, bad_iret) #endif .section .fixup,"ax"
@@ -1181,10 +1176,7 @@ gs_change: CFI_ENDPROC END(native_load_gs_index) - .section __ex_table,"a" - .align 8 - .quad gs_change,bad_gs - .previous + _ASM_EXTABLE(gs_change,bad_gs) .section .fixup,"ax" /* running with kernelgs */ bad_gs:
arch/x86/kernel/head_32.S +129 -94
319 lines not on this page · raw message
arch/x86/kernel/head_64.S +59 -21
124 lines not on this page · raw message
arch/x86/kernel/test_rodata.c +2 -8
@@ -12,6 +12,7 @@#include <linux/module.h> #include <asm/cacheflush.h> #include <asm/sections.h> +#include <asm/asm.h> int rodata_test (void ) {
@@ -42,14 +43,7 @@ int rodata_test(void)".section .fixup,\"ax\"\n" "2: jmp 1b\n" ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 16\n" -#ifdef CONFIG_X86_32 - " .long 0b,2b\n" -#else - " .quad 0b,2b\n" -#endif - ".previous" + _ASM_EXTABLE(0b ,2b ) : [rslt] "=r" (result) : [rodata_test] "r" (&rodata_test_data), [zero] "r" (0UL) );
arch/x86/lib/checksum_32.S +3 -6
@@ -28,6 +28,7 @@ #include <linux/linkage.h> #include <asm/dwarf2.h> #include <asm/errno.h> +#include <asm/asm.h> /* * computes a partial checksum, e.g. for TCP/UDP fragments
@@ -282,15 +283,11 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, #define SRC(y...) \ 9999: y; \ - .section __ex_table, "a"; \ - .long 9999b, 6001f ; \ - .previous + _ASM_EXTABLE(9999b, 6001f) #define DST(y...) \ 9999: y; \ - .section __ex_table, "a"; \ - .long 9999b, 6002f ; \ - .previous + _ASM_EXTABLE(9999b, 6002f) #ifndef CONFIG_X86_USE_PPRO_CHECKSUM
arch/x86/lib/copy_user_64.S +26 -37
92 lines not on this page · raw message
arch/x86/lib/copy_user_nocache_64.S +23 -27
67 lines not on this page · raw message
arch/x86/lib/csum-copy_64.S +4 -12
@@ -8,6 +8,7 @@ #include <linux/linkage.h> #include <asm/dwarf2.h> #include <asm/errno.h> +#include <asm/asm.h> /* * Checksum copy with exception handling.
@@ -31,26 +32,17 @@ .macro source 10: - .section __ex_table, "a" - .align 8 - .quad 10b, .Lbad_source - .previous + _ASM_EXTABLE(10b, .Lbad_source) .endm .macro dest 20: - .section __ex_table, "a" - .align 8 - .quad 20b, .Lbad_dest - .previous + _ASM_EXTABLE(20b, .Lbad_dest) .endm .macro ignore L=.Lignore 30: - .section __ex_table, "a" - .align 8 - .quad 30b, \L - .previous + _ASM_EXTABLE(30b, \L) .endm
arch/x86/lib/getuser.S +4 -5
@@ -95,10 +95,9 @@ bad_get_user: CFI_ENDPROC END(bad_get_user) -.section __ex_table,"a" - _ASM_PTR 1b,bad_get_user - _ASM_PTR 2b,bad_get_user - _ASM_PTR 3b,bad_get_user + _ASM_EXTABLE(1b,bad_get_user) + _ASM_EXTABLE(2b,bad_get_user) + _ASM_EXTABLE(3b,bad_get_user) #ifdef CONFIG_X86_64 - _ASM_PTR 4b,bad_get_user + _ASM_EXTABLE(4b,bad_get_user) #endif
arch/x86/lib/putuser.S +5 -7
@@ -86,12 +86,10 @@ bad_put_user: EXIT END(bad_put_user) -.section __ex_table,"a" - _ASM_PTR 1b,bad_put_user - _ASM_PTR 2b,bad_put_user - _ASM_PTR 3b,bad_put_user - _ASM_PTR 4b,bad_put_user + _ASM_EXTABLE(1b,bad_put_user) + _ASM_EXTABLE(2b,bad_put_user) + _ASM_EXTABLE(3b,bad_put_user) + _ASM_EXTABLE(4b,bad_put_user) #ifdef CONFIG_X86_32 - _ASM_PTR 5b,bad_put_user + _ASM_EXTABLE(5b,bad_put_user) #endif -.previous
arch/x86/lib/usercopy_32.c +106 -126
280 lines not on this page · raw message
arch/x86/mm/extable.c +137 -5
163 lines not on this page · raw message
arch/x86/um/checksum_32.S +3 -6
@@ -26,6 +26,7 @@ */ #include <asm/errno.h> +#include <asm/asm.h> /* * computes a partial checksum, e.g. for TCP/UDP fragments
@@ -232,15 +233,11 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, #define SRC(y...) \ 9999: y; \ - .section __ex_table, "a"; \ - .long 9999b, 6001f ; \ - .previous + _ASM_EXTABLE(9999b, 6001f) #define DST(y...) \ 9999: y; \ - .section __ex_table, "a"; \ - .long 9999b, 6002f ; \ - .previous + _ASM_EXTABLE(9999b, 6002f) .align 4
arch/x86/xen/xen-asm_32.S +2 -4
@@ -14,6 +14,7 @@ #include <asm/thread_info.h> #include <asm/processor-flags.h> #include <asm/segment.h> +#include <asm/asm.h> #include <xen/interface/xen.h>
@@ -137,10 +138,7 @@ iret_restore_end: 1: iret xen_iret_end_crit: -.section __ex_table, "a" - .align 4 - .long 1b, iret_exc -.previous + _ASM_EXTABLE(1b, iret_exc) hyper_iret: /* put this out of line since its very rarely used */
init/Kconfig +3 -0
@@ -27,6 +27,9 @@ config IRQ_WORK bool depends on HAVE_IRQ_WORK +config BUILDTIME_EXTABLE_SORT + bool + menu "General setup" config EXPERIMENTAL
kernel/extable.c +7 -1
@@ -35,10 +35,16 @@ DEFINE_MUTEX(text_mutex);extern struct exception_table_entry __start___ex_table[];extern struct exception_table_entry __stop___ex_table[]; +/* Cleared by build time tools if the table is already sorted. */ +u32 __initdata main_extable_sort_needed =1 ; +/* Sort the kernel's built-in exception table */ void __init sort_main_extable (void ) { -sort_extable (__start___ex_table, __stop___ex_table); +if (main_extable_sort_needed) +sort_extable (__start___ex_table, __stop___ex_table); +else +pr_notice ("__ex_table already sorted, skipping sort\n" ); }/* Given an address, look for it in the exception tables. */
scripts/.gitignore +1 -0
@@ -9,3 +9,4 @@ unifdef ihex2fw recordmcount docproc +sortextable
scripts/Makefile +3 -0
@@ -13,6 +13,9 @@ hostprogs-$(CONFIG_LOGO) += pnmtologo hostprogs-$(CONFIG_VT) += conmakehash hostprogs-$(CONFIG_IKCONFIG) += bin2c hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount +hostprogs-$(CONFIG_BUILDTIME_EXTABLE_SORT) += sortextable + +HOSTCFLAGS_sortextable.o = -I$(srctree)/tools/include always := $(hostprogs-y) $(hostprogs-m)
scripts/sortextable.c new file +322 -0
322 lines not on this page · raw message
scripts/sortextable.h new file +191 -0
191 lines not on this page · raw message