lkml.org 
[lkml]   [2015]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/asm] x86/asm: Re-add parts of the manual CFI infrastructure
    Commit-ID:  7b956f035a9ef8bd3ef5490f49fc1bd834d8a70a
    Gitweb: http://git.kernel.org/tip/7b956f035a9ef8bd3ef5490f49fc1bd834d8a70a
    Author: Andy Lutomirski <luto@kernel.org>
    AuthorDate: Mon, 5 Oct 2015 17:47:57 -0700
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Fri, 9 Oct 2015 09:41:05 +0200

    x86/asm: Re-add parts of the manual CFI infrastructure

    Commit:

    131484c8da97 ("x86/debug: Remove perpetually broken, unmaintainable dwarf annotations")

    removed all the manual DWARF annotations outside the vDSO. It also removed
    the macros we used for the manual annotations.

    Re-add these macros so that we can clean up the vDSO annotations.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/4c70bb98a8b773c8ccfaabf6745e569ff43e7f65.1444091584.git.luto@kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/Makefile | 10 ++-
    arch/x86/include/asm/dwarf2.h | 170 ++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 178 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/Makefile b/arch/x86/Makefile
    index 747860c..2dfaa72 100644
    --- a/arch/x86/Makefile
    +++ b/arch/x86/Makefile
    @@ -159,6 +159,12 @@ endif
    sp-$(CONFIG_X86_32) := esp
    sp-$(CONFIG_X86_64) := rsp

    +# do binutils support CFI?
    +cfi := $(call as-instr,.cfi_startproc\n.cfi_rel_offset $(sp-y)$(comma)0\n.cfi_endproc,-DCONFIG_AS_CFI=1)
    +# is .cfi_signal_frame supported too?
    +cfi-sigframe := $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1)
    +cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTIONS=1)
    +
    # does binutils support specific instructions?
    asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1)
    asinstr += $(call as-instr,pshufb %xmm0$(comma)%xmm0,-DCONFIG_AS_SSSE3=1)
    @@ -166,8 +172,8 @@ asinstr += $(call as-instr,crc32l %eax$(comma)%eax,-DCONFIG_AS_CRC32=1)
    avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1)
    avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)

    -KBUILD_AFLAGS += $(asinstr) $(avx_instr) $(avx2_instr)
    -KBUILD_CFLAGS += $(asinstr) $(avx_instr) $(avx2_instr)
    +KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr)
    +KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr)

    LDFLAGS := -m elf_$(UTS_MACHINE)

    diff --git a/arch/x86/include/asm/dwarf2.h b/arch/x86/include/asm/dwarf2.h
    new file mode 100644
    index 0000000..de1cdaf
    --- /dev/null
    +++ b/arch/x86/include/asm/dwarf2.h
    @@ -0,0 +1,170 @@
    +#ifndef _ASM_X86_DWARF2_H
    +#define _ASM_X86_DWARF2_H
    +
    +#ifndef __ASSEMBLY__
    +#warning "asm/dwarf2.h should be only included in pure assembly files"
    +#endif
    +
    +/*
    + * Macros for dwarf2 CFI unwind table entries.
    + * See "as.info" for details on these pseudo ops. Unfortunately
    + * they are only supported in very new binutils, so define them
    + * away for older version.
    + */
    +
    +#ifdef CONFIG_AS_CFI
    +
    +#define CFI_STARTPROC .cfi_startproc
    +#define CFI_ENDPROC .cfi_endproc
    +#define CFI_DEF_CFA .cfi_def_cfa
    +#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
    +#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
    +#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
    +#define CFI_OFFSET .cfi_offset
    +#define CFI_REL_OFFSET .cfi_rel_offset
    +#define CFI_REGISTER .cfi_register
    +#define CFI_RESTORE .cfi_restore
    +#define CFI_REMEMBER_STATE .cfi_remember_state
    +#define CFI_RESTORE_STATE .cfi_restore_state
    +#define CFI_UNDEFINED .cfi_undefined
    +#define CFI_ESCAPE .cfi_escape
    +
    +#ifdef CONFIG_AS_CFI_SIGNAL_FRAME
    +#define CFI_SIGNAL_FRAME .cfi_signal_frame
    +#else
    +#define CFI_SIGNAL_FRAME
    +#endif
    +
    +#if defined(CONFIG_AS_CFI_SECTIONS) && defined(__ASSEMBLY__)
    + /*
    + * Emit CFI data in .debug_frame sections, not .eh_frame sections.
    + * The latter we currently just discard since we don't do DWARF
    + * unwinding at runtime. So only the offline DWARF information is
    + * useful to anyone. Note we should not use this directive if this
    + * file is used in the vDSO assembly, or if vmlinux.lds.S gets
    + * changed so it doesn't discard .eh_frame.
    + */
    + .cfi_sections .debug_frame
    +#endif
    +
    +#else
    +
    +/*
    + * Due to the structure of pre-exisiting code, don't use assembler line
    + * comment character # to ignore the arguments. Instead, use a dummy macro.
    + */
    +.macro cfi_ignore a=0, b=0, c=0, d=0
    +.endm
    +
    +#define CFI_STARTPROC cfi_ignore
    +#define CFI_ENDPROC cfi_ignore
    +#define CFI_DEF_CFA cfi_ignore
    +#define CFI_DEF_CFA_REGISTER cfi_ignore
    +#define CFI_DEF_CFA_OFFSET cfi_ignore
    +#define CFI_ADJUST_CFA_OFFSET cfi_ignore
    +#define CFI_OFFSET cfi_ignore
    +#define CFI_REL_OFFSET cfi_ignore
    +#define CFI_REGISTER cfi_ignore
    +#define CFI_RESTORE cfi_ignore
    +#define CFI_REMEMBER_STATE cfi_ignore
    +#define CFI_RESTORE_STATE cfi_ignore
    +#define CFI_UNDEFINED cfi_ignore
    +#define CFI_ESCAPE cfi_ignore
    +#define CFI_SIGNAL_FRAME cfi_ignore
    +
    +#endif
    +
    +/*
    + * An attempt to make CFI annotations more or less
    + * correct and shorter. It is implied that you know
    + * what you're doing if you use them.
    + */
    +#ifdef __ASSEMBLY__
    +#ifdef CONFIG_X86_64
    + .macro pushq_cfi reg
    + pushq \reg
    + CFI_ADJUST_CFA_OFFSET 8
    + .endm
    +
    + .macro pushq_cfi_reg reg
    + pushq %\reg
    + CFI_ADJUST_CFA_OFFSET 8
    + CFI_REL_OFFSET \reg, 0
    + .endm
    +
    + .macro popq_cfi reg
    + popq \reg
    + CFI_ADJUST_CFA_OFFSET -8
    + .endm
    +
    + .macro popq_cfi_reg reg
    + popq %\reg
    + CFI_ADJUST_CFA_OFFSET -8
    + CFI_RESTORE \reg
    + .endm
    +
    + .macro pushfq_cfi
    + pushfq
    + CFI_ADJUST_CFA_OFFSET 8
    + .endm
    +
    + .macro popfq_cfi
    + popfq
    + CFI_ADJUST_CFA_OFFSET -8
    + .endm
    +
    + .macro movq_cfi reg offset=0
    + movq %\reg, \offset(%rsp)
    + CFI_REL_OFFSET \reg, \offset
    + .endm
    +
    + .macro movq_cfi_restore offset reg
    + movq \offset(%rsp), %\reg
    + CFI_RESTORE \reg
    + .endm
    +#else /*!CONFIG_X86_64*/
    + .macro pushl_cfi reg
    + pushl \reg
    + CFI_ADJUST_CFA_OFFSET 4
    + .endm
    +
    + .macro pushl_cfi_reg reg
    + pushl %\reg
    + CFI_ADJUST_CFA_OFFSET 4
    + CFI_REL_OFFSET \reg, 0
    + .endm
    +
    + .macro popl_cfi reg
    + popl \reg
    + CFI_ADJUST_CFA_OFFSET -4
    + .endm
    +
    + .macro popl_cfi_reg reg
    + popl %\reg
    + CFI_ADJUST_CFA_OFFSET -4
    + CFI_RESTORE \reg
    + .endm
    +
    + .macro pushfl_cfi
    + pushfl
    + CFI_ADJUST_CFA_OFFSET 4
    + .endm
    +
    + .macro popfl_cfi
    + popfl
    + CFI_ADJUST_CFA_OFFSET -4
    + .endm
    +
    + .macro movl_cfi reg offset=0
    + movl %\reg, \offset(%esp)
    + CFI_REL_OFFSET \reg, \offset
    + .endm
    +
    + .macro movl_cfi_restore offset reg
    + movl \offset(%esp), %\reg
    + CFI_RESTORE \reg
    + .endm
    +#endif /*!CONFIG_X86_64*/
    +#endif /*__ASSEMBLY__*/
    +
    +#endif /* _ASM_X86_DWARF2_H */

    \
     
     \ /
      Last update: 2015-10-09 15:21    [W:4.584 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site