提交 e7c0219b 编写于 作者: P Peter Zijlstra 提交者: Ingo Molnar

objtool: Fix !CFI insn_state propagation

Objtool keeps per instruction CFI state in struct insn_state and will
save/restore this where required. However, insn_state has grown some
!CFI state, and this must not be saved/restored (that would
loose/destroy state).

Fix this by moving the CFI specific parts of insn_state into struct
cfi_state.
Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: NMiroslav Benes <mbenes@suse.cz>
Reviewed-by: NAlexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: NJosh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/20200416115119.045821071@infradead.orgSigned-off-by: NIngo Molnar <mingo@kernel.org>
上级 a3608f59
...@@ -19,8 +19,20 @@ struct cfi_reg { ...@@ -19,8 +19,20 @@ struct cfi_reg {
}; };
struct cfi_init_state { struct cfi_init_state {
struct cfi_reg regs[CFI_NUM_REGS];
struct cfi_reg cfa; struct cfi_reg cfa;
};
struct cfi_state {
struct cfi_reg regs[CFI_NUM_REGS]; struct cfi_reg regs[CFI_NUM_REGS];
struct cfi_reg vals[CFI_NUM_REGS];
struct cfi_reg cfa;
int stack_size;
int drap_reg, drap_offset;
unsigned char type;
bool bp_scratch;
bool drap;
bool end;
}; };
#endif /* _OBJTOOL_CFI_H */ #endif /* _OBJTOOL_CFI_H */
此差异已折叠。
...@@ -14,15 +14,10 @@ ...@@ -14,15 +14,10 @@
#include <linux/hashtable.h> #include <linux/hashtable.h>
struct insn_state { struct insn_state {
struct cfi_reg cfa; struct cfi_state cfi;
struct cfi_reg regs[CFI_NUM_REGS];
int stack_size;
unsigned char type;
bool bp_scratch;
bool drap, end, uaccess, df;
unsigned int uaccess_stack; unsigned int uaccess_stack;
int drap_reg, drap_offset; bool uaccess;
struct cfi_reg vals[CFI_NUM_REGS]; bool df;
}; };
struct instruction { struct instruction {
...@@ -45,7 +40,7 @@ struct instruction { ...@@ -45,7 +40,7 @@ struct instruction {
struct list_head alts; struct list_head alts;
struct symbol *func; struct symbol *func;
struct list_head stack_ops; struct list_head stack_ops;
struct insn_state state; struct cfi_state cfi;
struct orc_entry orc; struct orc_entry orc;
}; };
......
...@@ -16,10 +16,10 @@ int create_orc(struct objtool_file *file) ...@@ -16,10 +16,10 @@ int create_orc(struct objtool_file *file)
for_each_insn(file, insn) { for_each_insn(file, insn) {
struct orc_entry *orc = &insn->orc; struct orc_entry *orc = &insn->orc;
struct cfi_reg *cfa = &insn->state.cfa; struct cfi_reg *cfa = &insn->cfi.cfa;
struct cfi_reg *bp = &insn->state.regs[CFI_BP]; struct cfi_reg *bp = &insn->cfi.regs[CFI_BP];
orc->end = insn->state.end; orc->end = insn->cfi.end;
if (cfa->base == CFI_UNDEFINED) { if (cfa->base == CFI_UNDEFINED) {
orc->sp_reg = ORC_REG_UNDEFINED; orc->sp_reg = ORC_REG_UNDEFINED;
...@@ -75,7 +75,7 @@ int create_orc(struct objtool_file *file) ...@@ -75,7 +75,7 @@ int create_orc(struct objtool_file *file)
orc->sp_offset = cfa->offset; orc->sp_offset = cfa->offset;
orc->bp_offset = bp->offset; orc->bp_offset = bp->offset;
orc->type = insn->state.type; orc->type = insn->cfi.type;
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册