objtool: Improve register reporting during function validation
When tracing function validation, instruction state changes can report changes involving registers. These registers are reported with the name "r<num>" (e.g. "r3"). Print the CPU specific register name instead of a generic name (e.g. print "rbx" instead of "r3" on x86). Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://patch.msgid.link/20251121095340.464045-13-alexandre.chartre@oracle.com
This commit is contained in:
committed by
Peter Zijlstra
parent
fcb268b47a
commit
26a453fb56
@@ -8,6 +8,17 @@
|
||||
#include <linux/objtool_types.h>
|
||||
#include <arch/elf.h>
|
||||
|
||||
const char *arch_reg_name[CFI_NUM_REGS] = {
|
||||
"zero", "ra", "tp", "sp",
|
||||
"a0", "a1", "a2", "a3",
|
||||
"a4", "a5", "a6", "a7",
|
||||
"t0", "t1", "t2", "t3",
|
||||
"t4", "t5", "t6", "t7",
|
||||
"t8", "u0", "fp", "s0",
|
||||
"s1", "s2", "s3", "s4",
|
||||
"s5", "s6", "s7", "s8"
|
||||
};
|
||||
|
||||
int arch_ftrace_match(const char *name)
|
||||
{
|
||||
return !strcmp(name, "_mcount");
|
||||
|
||||
@@ -9,6 +9,18 @@
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/builtin.h>
|
||||
|
||||
const char *arch_reg_name[CFI_NUM_REGS] = {
|
||||
"r0", "sp", "r2", "r3",
|
||||
"r4", "r5", "r6", "r7",
|
||||
"r8", "r9", "r10", "r11",
|
||||
"r12", "r13", "r14", "r15",
|
||||
"r16", "r17", "r18", "r19",
|
||||
"r20", "r21", "r22", "r23",
|
||||
"r24", "r25", "r26", "r27",
|
||||
"r28", "r29", "r30", "r31",
|
||||
"ra"
|
||||
};
|
||||
|
||||
int arch_ftrace_match(const char *name)
|
||||
{
|
||||
return !strcmp(name, "_mcount");
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
#include <objtool/builtin.h>
|
||||
#include <arch/elf.h>
|
||||
|
||||
const char *arch_reg_name[CFI_NUM_REGS] = {
|
||||
"rax", "rcx", "rdx", "rbx",
|
||||
"rsp", "rbp", "rsi", "rdi",
|
||||
"r8", "r9", "r10", "r11",
|
||||
"r12", "r13", "r14", "r15",
|
||||
"ra"
|
||||
};
|
||||
|
||||
int arch_ftrace_match(const char *name)
|
||||
{
|
||||
return !strcmp(name, "__fentry__");
|
||||
|
||||
@@ -103,6 +103,8 @@ bool arch_absolute_reloc(struct elf *elf, struct reloc *reloc);
|
||||
unsigned int arch_reloc_size(struct reloc *reloc);
|
||||
unsigned long arch_jump_table_sym_offset(struct reloc *reloc, struct reloc *table);
|
||||
|
||||
extern const char *arch_reg_name[CFI_NUM_REGS];
|
||||
|
||||
#ifdef DISAS
|
||||
|
||||
#include <bfd.h>
|
||||
|
||||
@@ -34,6 +34,7 @@ int trace_depth;
|
||||
static const char *cfi_reg_name(unsigned int reg)
|
||||
{
|
||||
static char rname_buffer[CFI_REG_NAME_MAXLEN];
|
||||
const char *rname;
|
||||
|
||||
switch (reg) {
|
||||
case CFI_UNDEFINED:
|
||||
@@ -46,6 +47,12 @@ static const char *cfi_reg_name(unsigned int reg)
|
||||
return "(bp)";
|
||||
}
|
||||
|
||||
if (reg < CFI_NUM_REGS) {
|
||||
rname = arch_reg_name[reg];
|
||||
if (rname)
|
||||
return rname;
|
||||
}
|
||||
|
||||
if (snprintf(rname_buffer, CFI_REG_NAME_MAXLEN, "r%d", reg) == -1)
|
||||
return "<error>";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user