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 */ 94