Loading...
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 */
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 */