xref: /linux/arch/x86/include/asm/unwind_hints.h (revision 52a9dab6d892763b2a8334a568bd4e2c1a6fde66)
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 sp_reg=ORC_REG_UNDEFINED type=UNWIND_HINT_TYPE_CALL end=1
12 .endm
13 
14 .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0
15 	.if \base == %rsp
16 		.if \indirect
17 			.set sp_reg, ORC_REG_SP_INDIRECT
18 		.else
19 			.set sp_reg, ORC_REG_SP
20 		.endif
21 	.elseif \base == %rbp
22 		.set sp_reg, ORC_REG_BP
23 	.elseif \base == %rdi
24 		.set sp_reg, ORC_REG_DI
25 	.elseif \base == %rdx
26 		.set sp_reg, ORC_REG_DX
27 	.elseif \base == %r10
28 		.set sp_reg, ORC_REG_R10
29 	.else
30 		.error "UNWIND_HINT_REGS: bad base register"
31 	.endif
32 
33 	.set sp_offset, \offset
34 
35 	.if \partial
36 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
37 	.elseif \extra == 0
38 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
39 		.set sp_offset, \offset + (16*8)
40 	.else
41 		.set type, UNWIND_HINT_TYPE_REGS
42 	.endif
43 
44 	UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type
45 .endm
46 
47 .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0
48 	UNWIND_HINT_REGS base=\base offset=\offset partial=1
49 .endm
50 
51 .macro UNWIND_HINT_FUNC
52 	UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
53 .endm
54 
55 #else
56 
57 #define UNWIND_HINT_FUNC \
58 	UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0)
59 
60 #endif /* __ASSEMBLY__ */
61 
62 #endif /* _ASM_X86_UNWIND_HINTS_H */
63