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_FUNC \ 80 UNWIND_HINT(UNWIND_HINT_TYPE_FUNC, ORC_REG_SP, 8, 0) 81 82 #endif /* __ASSEMBLY__ */ 83 84 #endif /* _ASM_X86_UNWIND_HINTS_H */ 85