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 11*8faea26eSJosh Poimboeuf UNWIND_HINT type=UNWIND_HINT_TYPE_CALL end=1 1239358a03SJosh Poimboeuf .endm 1339358a03SJosh Poimboeuf 14a09a6e23SPeter Zijlstra .macro UNWIND_HINT_ENTRY 15*8faea26eSJosh Poimboeuf UNWIND_HINT type=UNWIND_HINT_TYPE_ENTRY end=1 16a09a6e23SPeter Zijlstra .endm 17a09a6e23SPeter Zijlstra 18ee819aedSJulien Thierry .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0 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 4839358a03SJosh Poimboeuf UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type 4939358a03SJosh Poimboeuf .endm 5039358a03SJosh Poimboeuf 5139358a03SJosh Poimboeuf .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0 52ee819aedSJulien Thierry UNWIND_HINT_REGS base=\base offset=\offset partial=1 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 59*8faea26eSJosh Poimboeuf .macro UNWIND_HINT_SAVE 60*8faea26eSJosh Poimboeuf UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE 61*8faea26eSJosh Poimboeuf .endm 62*8faea26eSJosh Poimboeuf 63*8faea26eSJosh Poimboeuf .macro UNWIND_HINT_RESTORE 64*8faea26eSJosh Poimboeuf UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE 65*8faea26eSJosh Poimboeuf .endm 66*8faea26eSJosh Poimboeuf 67eb4a3f7dSJosh Poimboeuf #else 68eb4a3f7dSJosh Poimboeuf 69eb4a3f7dSJosh Poimboeuf #define UNWIND_HINT_FUNC \ 70eb4a3f7dSJosh Poimboeuf UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0) 71eb4a3f7dSJosh Poimboeuf 7239358a03SJosh Poimboeuf #endif /* __ASSEMBLY__ */ 7339358a03SJosh Poimboeuf 7439358a03SJosh Poimboeuf #endif /* _ASM_X86_UNWIND_HINTS_H */ 75