Linux Audio

Check our new training course

Loading...
v6.2
 1#ifndef _ASM_X86_UNWIND_HINTS_H
 2#define _ASM_X86_UNWIND_HINTS_H
 3
 4#include <linux/objtool.h>
 5
 6#include "orc_types.h"
 7
 8#ifdef __ASSEMBLY__
 9
10.macro UNWIND_HINT_EMPTY
11	UNWIND_HINT type=UNWIND_HINT_TYPE_CALL end=1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12.endm
13
14.macro UNWIND_HINT_ENTRY
15	UNWIND_HINT type=UNWIND_HINT_TYPE_ENTRY end=1
16.endm
17
18.macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0
19	.if \base == %rsp
20		.if \indirect
21			.set sp_reg, ORC_REG_SP_INDIRECT
22		.else
23			.set sp_reg, ORC_REG_SP
24		.endif
25	.elseif \base == %rbp
26		.set sp_reg, ORC_REG_BP
27	.elseif \base == %rdi
28		.set sp_reg, ORC_REG_DI
29	.elseif \base == %rdx
30		.set sp_reg, ORC_REG_DX
31	.elseif \base == %r10
32		.set sp_reg, ORC_REG_R10
33	.else
34		.error "UNWIND_HINT_REGS: bad base register"
35	.endif
36
37	.set sp_offset, \offset
38
39	.if \partial
40		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
41	.elseif \extra == 0
42		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
43		.set sp_offset, \offset + (16*8)
44	.else
45		.set type, UNWIND_HINT_TYPE_REGS
46	.endif
47
48	UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type
49.endm
50
51.macro UNWIND_HINT_IRET_REGS base=%rsp offset=0
52	UNWIND_HINT_REGS base=\base offset=\offset partial=1
53.endm
54
55.macro UNWIND_HINT_FUNC
56	UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
57.endm
58
59.macro UNWIND_HINT_SAVE
60	UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
61.endm
62
63.macro UNWIND_HINT_RESTORE
64	UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
65.endm
 
 
 
 
 
 
66
67#else
68
69#define UNWIND_HINT_FUNC \
70	UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0)
71
72#endif /* __ASSEMBLY__ */
73
74#endif /* _ASM_X86_UNWIND_HINTS_H */
v4.17
  1#ifndef _ASM_X86_UNWIND_HINTS_H
  2#define _ASM_X86_UNWIND_HINTS_H
  3
 
 
  4#include "orc_types.h"
  5
  6#ifdef __ASSEMBLY__
  7
  8/*
  9 * In asm, there are two kinds of code: normal C-type callable functions and
 10 * the rest.  The normal callable functions can be called by other code, and
 11 * don't do anything unusual with the stack.  Such normal callable functions
 12 * are annotated with the ENTRY/ENDPROC macros.  Most asm code falls in this
 13 * category.  In this case, no special debugging annotations are needed because
 14 * objtool can automatically generate the ORC data for the ORC unwinder to read
 15 * at runtime.
 16 *
 17 * Anything which doesn't fall into the above category, such as syscall and
 18 * interrupt handlers, tends to not be called directly by other functions, and
 19 * often does unusual non-C-function-type things with the stack pointer.  Such
 20 * code needs to be annotated such that objtool can understand it.  The
 21 * following CFI hint macros are for this type of code.
 22 *
 23 * These macros provide hints to objtool about the state of the stack at each
 24 * instruction.  Objtool starts from the hints and follows the code flow,
 25 * making automatic CFI adjustments when it sees pushes and pops, filling out
 26 * the debuginfo as necessary.  It will also warn if it sees any
 27 * inconsistencies.
 28 */
 29.macro UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=0 type=ORC_TYPE_CALL
 30#ifdef CONFIG_STACK_VALIDATION
 31.Lunwind_hint_ip_\@:
 32	.pushsection .discard.unwind_hints
 33		/* struct unwind_hint */
 34		.long .Lunwind_hint_ip_\@ - .
 35		.short \sp_offset
 36		.byte \sp_reg
 37		.byte \type
 38	.popsection
 39#endif
 40.endm
 41
 42.macro UNWIND_HINT_EMPTY
 43	UNWIND_HINT sp_reg=ORC_REG_UNDEFINED
 44.endm
 45
 46.macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 iret=0
 47	.if \base == %rsp
 48		.if \indirect
 49			.set sp_reg, ORC_REG_SP_INDIRECT
 50		.else
 51			.set sp_reg, ORC_REG_SP
 52		.endif
 53	.elseif \base == %rbp
 54		.set sp_reg, ORC_REG_BP
 55	.elseif \base == %rdi
 56		.set sp_reg, ORC_REG_DI
 57	.elseif \base == %rdx
 58		.set sp_reg, ORC_REG_DX
 59	.elseif \base == %r10
 60		.set sp_reg, ORC_REG_R10
 61	.else
 62		.error "UNWIND_HINT_REGS: bad base register"
 63	.endif
 64
 65	.set sp_offset, \offset
 66
 67	.if \iret
 68		.set type, ORC_TYPE_REGS_IRET
 69	.elseif \extra == 0
 70		.set type, ORC_TYPE_REGS_IRET
 71		.set sp_offset, \offset + (16*8)
 72	.else
 73		.set type, ORC_TYPE_REGS
 74	.endif
 75
 76	UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type
 77.endm
 78
 79.macro UNWIND_HINT_IRET_REGS base=%rsp offset=0
 80	UNWIND_HINT_REGS base=\base offset=\offset iret=1
 81.endm
 82
 83.macro UNWIND_HINT_FUNC sp_offset=8
 84	UNWIND_HINT sp_offset=\sp_offset
 85.endm
 86
 87#else /* !__ASSEMBLY__ */
 
 
 88
 89#define UNWIND_HINT(sp_reg, sp_offset, type)			\
 90	"987: \n\t"						\
 91	".pushsection .discard.unwind_hints\n\t"		\
 92	/* struct unwind_hint */				\
 93	".long 987b - .\n\t"					\
 94	".short " __stringify(sp_offset) "\n\t"		\
 95	".byte " __stringify(sp_reg) "\n\t"			\
 96	".byte " __stringify(type) "\n\t"			\
 97	".popsection\n\t"
 98
 99#define UNWIND_HINT_SAVE UNWIND_HINT(0, 0, UNWIND_HINT_TYPE_SAVE)
100
101#define UNWIND_HINT_RESTORE UNWIND_HINT(0, 0, UNWIND_HINT_TYPE_RESTORE)
 
102
103#endif /* __ASSEMBLY__ */
104
105#endif /* _ASM_X86_UNWIND_HINTS_H */