xref: /openbmc/linux/arch/x86/include/asm/unwind_hints.h (revision ffb1b4a41016295e298409c9dbcacd55680bd6d4)
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
158faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_ENTRY end=1
16a09a6e23SPeter Zijlstra .endm
17a09a6e23SPeter Zijlstra 
18*ffb1b4a4SJosh Poimboeuf .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0 signal=1
19af79ded4SJosh Poimboeuf 	.if \base == %rsp
20af79ded4SJosh Poimboeuf 		.if \indirect
2139358a03SJosh Poimboeuf 			.set sp_reg, ORC_REG_SP_INDIRECT
22af79ded4SJosh Poimboeuf 		.else
2339358a03SJosh Poimboeuf 			.set sp_reg, ORC_REG_SP
24af79ded4SJosh Poimboeuf 		.endif
2539358a03SJosh Poimboeuf 	.elseif \base == %rbp
2639358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_BP
2739358a03SJosh Poimboeuf 	.elseif \base == %rdi
2839358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_DI
2939358a03SJosh Poimboeuf 	.elseif \base == %rdx
3039358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_DX
3139358a03SJosh Poimboeuf 	.elseif \base == %r10
3239358a03SJosh Poimboeuf 		.set sp_reg, ORC_REG_R10
3339358a03SJosh Poimboeuf 	.else
3439358a03SJosh Poimboeuf 		.error "UNWIND_HINT_REGS: bad base register"
3539358a03SJosh Poimboeuf 	.endif
3639358a03SJosh Poimboeuf 
3739358a03SJosh Poimboeuf 	.set sp_offset, \offset
3839358a03SJosh Poimboeuf 
39ee819aedSJulien Thierry 	.if \partial
40ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
4139358a03SJosh Poimboeuf 	.elseif \extra == 0
42ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS_PARTIAL
4339358a03SJosh Poimboeuf 		.set sp_offset, \offset + (16*8)
4439358a03SJosh Poimboeuf 	.else
45ee819aedSJulien Thierry 		.set type, UNWIND_HINT_TYPE_REGS
4639358a03SJosh Poimboeuf 	.endif
4739358a03SJosh Poimboeuf 
48*ffb1b4a4SJosh Poimboeuf 	UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type signal=\signal
4939358a03SJosh Poimboeuf .endm
5039358a03SJosh Poimboeuf 
51*ffb1b4a4SJosh Poimboeuf .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0 signal=1
52*ffb1b4a4SJosh Poimboeuf 	UNWIND_HINT_REGS base=\base offset=\offset partial=1 signal=\signal
5339358a03SJosh Poimboeuf .endm
5439358a03SJosh Poimboeuf 
55b735bd3eSJosh Poimboeuf .macro UNWIND_HINT_FUNC
56b735bd3eSJosh Poimboeuf 	UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
57e25eea89SPeter Zijlstra .endm
58e25eea89SPeter Zijlstra 
598faea26eSJosh Poimboeuf .macro UNWIND_HINT_SAVE
608faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
618faea26eSJosh Poimboeuf .endm
628faea26eSJosh Poimboeuf 
638faea26eSJosh Poimboeuf .macro UNWIND_HINT_RESTORE
648faea26eSJosh Poimboeuf 	UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
658faea26eSJosh Poimboeuf .endm
668faea26eSJosh Poimboeuf 
67eb4a3f7dSJosh Poimboeuf #else
68eb4a3f7dSJosh Poimboeuf 
69eb4a3f7dSJosh Poimboeuf #define UNWIND_HINT_FUNC \
70*ffb1b4a4SJosh Poimboeuf 	UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0, 0)
71eb4a3f7dSJosh Poimboeuf 
7239358a03SJosh Poimboeuf #endif /* __ASSEMBLY__ */
7339358a03SJosh Poimboeuf 
7439358a03SJosh Poimboeuf #endif /* _ASM_X86_UNWIND_HINTS_H */
75