xref: /openbmc/linux/arch/x86/include/asm/unwind_hints.h (revision 4708ea14bef314fc901857eefd65678236a9f2d9)
139358a03SJosh Poimboeuf #ifndef _ASM_X86_UNWIND_HINTS_H
239358a03SJosh Poimboeuf #define _ASM_X86_UNWIND_HINTS_H
339358a03SJosh Poimboeuf 
4ee819aedSJulien Thierry #include <linux/objtool.h>
5ee819aedSJulien Thierry 
639358a03SJosh Poimboeuf #include "orc_types.h"
739358a03SJosh Poimboeuf 
839358a03SJosh Poimboeuf #ifdef __ASSEMBLY__
939358a03SJosh Poimboeuf 
1039358a03SJosh Poimboeuf .macro UNWIND_HINT_EMPTY
118faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_CALL end=1
1239358a03SJosh Poimboeuf .endm
1339358a03SJosh Poimboeuf 
14a09a6e23SPeter Zijlstra .macro UNWIND_HINT_ENTRY
15*4708ea14SJosh Poimboeuf 	VALIDATE_UNRET_BEGIN
16*4708ea14SJosh Poimboeuf 	UNWIND_HINT_EMPTY
17a09a6e23SPeter Zijlstra .endm
18a09a6e23SPeter Zijlstra 
19ffb1b4a4SJosh Poimboeuf .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0 signal=1
20af79ded4SJosh Poimboeuf 	.if \base == %rsp
21af79ded4SJosh Poimboeuf 		.if \indirect
2239358a03SJosh Poimboeuf 			.set sp_reg, ORC_REG_SP_INDIRECT
23af79ded4SJosh Poimboeuf 		.else
2439358a03SJosh Poimboeuf 			.set sp_reg, ORC_REG_SP
25af79ded4SJosh Poimboeuf 		.endif
2639358a03SJosh Poimboeuf 	.elseif \base == %rbp
2739358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_BP
2839358a03SJosh Poimboeuf 	.elseif \base == %rdi
2939358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_DI
3039358a03SJosh Poimboeuf 	.elseif \base == %rdx
3139358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_DX
3239358a03SJosh Poimboeuf 	.elseif \base == %r10
3339358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_R10
3439358a03SJosh Poimboeuf 	.else
3539358a03SJosh Poimboeuf 		.error "UNWIND_HINT_REGS: bad base register"
3639358a03SJosh Poimboeuf 	.endif
3739358a03SJosh Poimboeuf 
3839358a03SJosh Poimboeuf 	.set sp_offset, \offset
3939358a03SJosh Poimboeuf 
40ee819aedSJulien Thierry 	.if \partial
41ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
4239358a03SJosh Poimboeuf 	.elseif \extra == 0
43ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
4439358a03SJosh Poimboeuf 		.set sp_offset, \offset + (16*8)
4539358a03SJosh Poimboeuf 	.else
46ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS
4739358a03SJosh Poimboeuf 	.endif
4839358a03SJosh Poimboeuf 
49ffb1b4a4SJosh Poimboeuf 	UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type signal=\signal
5039358a03SJosh Poimboeuf .endm
5139358a03SJosh Poimboeuf 
52ffb1b4a4SJosh Poimboeuf .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0 signal=1
53ffb1b4a4SJosh Poimboeuf 	UNWIND_HINT_REGS base=\base offset=\offset partial=1 signal=\signal
5439358a03SJosh Poimboeuf .endm
5539358a03SJosh Poimboeuf 
56*4708ea14SJosh Poimboeuf .macro UNWIND_HINT_IRET_ENTRY base=%rsp offset=0 signal=1
57*4708ea14SJosh Poimboeuf 	VALIDATE_UNRET_BEGIN
58*4708ea14SJosh Poimboeuf 	UNWIND_HINT_IRET_REGS base=\base offset=\offset signal=\signal
59*4708ea14SJosh Poimboeuf .endm
60*4708ea14SJosh Poimboeuf 
61b735bd3eSJosh Poimboeuf .macro UNWIND_HINT_FUNC
62b735bd3eSJosh Poimboeuf 	UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
63e25eea89SPeter Zijlstra .endm
64e25eea89SPeter Zijlstra 
658faea26eSJosh Poimboeuf .macro UNWIND_HINT_SAVE
668faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
678faea26eSJosh Poimboeuf .endm
688faea26eSJosh Poimboeuf 
698faea26eSJosh Poimboeuf .macro UNWIND_HINT_RESTORE
708faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
718faea26eSJosh Poimboeuf .endm
728faea26eSJosh Poimboeuf 
73eb4a3f7dSJosh Poimboeuf #else
74eb4a3f7dSJosh Poimboeuf 
75eb4a3f7dSJosh Poimboeuf #define UNWIND_HINT_FUNC \
76d88ebba4SJosh Poimboeuf 	UNWIND_HINT(UNWIND_HINT_TYPE_FUNC, ORC_REG_SP, 8, 0, 0)
77eb4a3f7dSJosh Poimboeuf 
7839358a03SJosh Poimboeuf #endif /* __ASSEMBLY__ */
7939358a03SJosh Poimboeuf 
8039358a03SJosh Poimboeuf #endif /* _ASM_X86_UNWIND_HINTS_H */
81