Linux 6.11-rc1
[linux-2.6-microblaze.git] / arch / x86 / include / asm / unwind_hints.h
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_END_OF_STACK
11         UNWIND_HINT type=UNWIND_HINT_TYPE_END_OF_STACK
12 .endm
13
14 .macro UNWIND_HINT_UNDEFINED
15         UNWIND_HINT type=UNWIND_HINT_TYPE_UNDEFINED
16 .endm
17
18 .macro UNWIND_HINT_ENTRY
19         VALIDATE_UNRET_BEGIN
20         UNWIND_HINT_END_OF_STACK
21 .endm
22
23 .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0 signal=1
24         .if \base == %rsp
25                 .if \indirect
26                         .set sp_reg, ORC_REG_SP_INDIRECT
27                 .else
28                         .set sp_reg, ORC_REG_SP
29                 .endif
30         .elseif \base == %rbp
31                 .set sp_reg, ORC_REG_BP
32         .elseif \base == %rdi
33                 .set sp_reg, ORC_REG_DI
34         .elseif \base == %rdx
35                 .set sp_reg, ORC_REG_DX
36         .elseif \base == %r10
37                 .set sp_reg, ORC_REG_R10
38         .else
39                 .error "UNWIND_HINT_REGS: bad base register"
40         .endif
41
42         .set sp_offset, \offset
43
44         .if \partial
45                 .set type, UNWIND_HINT_TYPE_REGS_PARTIAL
46         .elseif \extra == 0
47                 .set type, UNWIND_HINT_TYPE_REGS_PARTIAL
48                 .set sp_offset, \offset + (16*8)
49         .else
50                 .set type, UNWIND_HINT_TYPE_REGS
51         .endif
52
53         UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type signal=\signal
54 .endm
55
56 .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0 signal=1
57         UNWIND_HINT_REGS base=\base offset=\offset partial=1 signal=\signal
58 .endm
59
60 .macro UNWIND_HINT_IRET_ENTRY base=%rsp offset=0 signal=1
61         VALIDATE_UNRET_BEGIN
62         UNWIND_HINT_IRET_REGS base=\base offset=\offset signal=\signal
63 .endm
64
65 .macro UNWIND_HINT_FUNC
66         UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
67 .endm
68
69 .macro UNWIND_HINT_SAVE
70         UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
71 .endm
72
73 .macro UNWIND_HINT_RESTORE
74         UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
75 .endm
76
77 #else
78
79 #define UNWIND_HINT_UNDEFINED \
80         UNWIND_HINT(UNWIND_HINT_TYPE_UNDEFINED, 0, 0, 0)
81
82 #define UNWIND_HINT_FUNC \
83         UNWIND_HINT(UNWIND_HINT_TYPE_FUNC, ORC_REG_SP, 8, 0)
84
85 #define UNWIND_HINT_SAVE \
86         UNWIND_HINT(UNWIND_HINT_TYPE_SAVE, 0, 0, 0)
87
88 #define UNWIND_HINT_RESTORE \
89         UNWIND_HINT(UNWIND_HINT_TYPE_RESTORE, 0, 0, 0)
90
91 #endif /* __ASSEMBLY__ */
92
93 #endif /* _ASM_X86_UNWIND_HINTS_H */