From: Alexandre Chartre <alexandre.chartre@oracle.com>
To: linux-kernel@vger.kernel.org, mingo@kernel.org,
jpoimboe@kernel.org, peterz@infradead.org,
david.laight.linux@gmail.com
Cc: alexandre.chartre@oracle.com
Subject: [PATCH v6 10/30] objtool: Add option to trace function validation
Date: Fri, 21 Nov 2025 10:53:20 +0100 [thread overview]
Message-ID: <20251121095340.464045-11-alexandre.chartre@oracle.com> (raw)
In-Reply-To: <20251121095340.464045-1-alexandre.chartre@oracle.com>
Add an option to trace and have information during the validation
of specified functions. Functions are specified with the --trace
option which can be a single function name (e.g. --trace foo to
trace the function with the name "foo"), or a shell wildcard
pattern (e.g. --trace foo* to trace all functions with a name
starting with "foo").
Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com>
---
tools/objtool/Build | 1 +
tools/objtool/builtin-check.c | 1 +
tools/objtool/check.c | 104 +++++++++++++++++----
tools/objtool/disas.c | 115 ++++++++++++++++++++++++
tools/objtool/include/objtool/builtin.h | 1 +
tools/objtool/include/objtool/check.h | 6 +-
tools/objtool/include/objtool/disas.h | 11 +++
tools/objtool/include/objtool/trace.h | 68 ++++++++++++++
tools/objtool/include/objtool/warn.h | 1 +
tools/objtool/trace.c | 9 ++
10 files changed, 299 insertions(+), 18 deletions(-)
create mode 100644 tools/objtool/include/objtool/trace.h
create mode 100644 tools/objtool/trace.c
diff --git a/tools/objtool/Build b/tools/objtool/Build
index 9d1e8f28ef953..9982e665d58da 100644
--- a/tools/objtool/Build
+++ b/tools/objtool/Build
@@ -9,6 +9,7 @@ objtool-y += elf.o
objtool-y += objtool.o
objtool-$(BUILD_DISAS) += disas.o
+objtool-$(BUILD_DISAS) += trace.o
objtool-$(BUILD_ORC) += orc_gen.o orc_dump.o
objtool-$(BUILD_KLP) += builtin-klp.o klp-diff.o klp-post-link.o
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index aab7fa9c7e00a..3329d370006b4 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -103,6 +103,7 @@ static const struct option check_options[] = {
OPT_STRING('o', "output", &opts.output, "file", "output file name"),
OPT_BOOLEAN(0, "sec-address", &opts.sec_address, "print section addresses in warnings"),
OPT_BOOLEAN(0, "stats", &opts.stats, "print statistics"),
+ OPT_STRING(0, "trace", &opts.trace, "func", "trace function validation"),
OPT_BOOLEAN('v', "verbose", &opts.verbose, "verbose warnings"),
OPT_BOOLEAN(0, "werror", &opts.werror, "return error on warnings"),
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 42a33898b695d..2352b9668b126 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -4,6 +4,7 @@
*/
#define _GNU_SOURCE /* memmem() */
+#include <fnmatch.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
@@ -15,6 +16,7 @@
#include <objtool/disas.h>
#include <objtool/check.h>
#include <objtool/special.h>
+#include <objtool/trace.h>
#include <objtool/warn.h>
#include <objtool/checksum.h>
#include <objtool/util.h>
@@ -37,7 +39,9 @@ static struct cfi_state init_cfi;
static struct cfi_state func_cfi;
static struct cfi_state force_undefined_cfi;
-static size_t sym_name_max_len;
+struct disas_context *objtool_disas_ctx;
+
+size_t sym_name_max_len;
struct instruction *find_insn(struct objtool_file *file,
struct section *sec, unsigned long offset)
@@ -3608,8 +3612,10 @@ static bool skip_alt_group(struct instruction *insn)
return false;
/* ANNOTATE_IGNORE_ALTERNATIVE */
- if (insn->alt_group->ignore)
+ if (insn->alt_group->ignore) {
+ TRACE_INSN(insn, "alt group ignored");
return true;
+ }
/*
* For NOP patched with CLAC/STAC, only follow the latter to avoid
@@ -3715,6 +3721,8 @@ static void checksum_update_insn(struct objtool_file *file, struct symbol *func,
static int validate_branch(struct objtool_file *file, struct symbol *func,
struct instruction *insn, struct insn_state state);
+static int do_validate_branch(struct objtool_file *file, struct symbol *func,
+ struct instruction *insn, struct insn_state state);
static int validate_insn(struct objtool_file *file, struct symbol *func,
struct instruction *insn, struct insn_state *statep,
@@ -3736,8 +3744,10 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
if (!insn->hint && !insn_cfi_match(insn, &statep->cfi))
return 1;
- if (insn->visited & visited)
+ if (insn->visited & visited) {
+ TRACE_INSN(insn, "already visited");
return 0;
+ }
} else {
nr_insns_visited++;
}
@@ -3774,8 +3784,10 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
* It will be seen later via the
* straight-line path.
*/
- if (!prev_insn)
+ if (!prev_insn) {
+ TRACE_INSN(insn, "defer restore");
return 0;
+ }
WARN_INSN(insn, "objtool isn't smart enough to handle this CFI save/restore combo");
return 1;
@@ -3803,13 +3815,23 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
return 1;
if (insn->alts) {
+ int i, num_alts;
+
+ num_alts = 0;
+ for (alt = insn->alts; alt; alt = alt->next)
+ num_alts++;
+
+ i = 1;
for (alt = insn->alts; alt; alt = alt->next) {
+ TRACE_INSN(insn, "alternative %d/%d", i, num_alts);
ret = validate_branch(file, func, alt->insn, *statep);
if (ret) {
BT_INSN(insn, "(alt)");
return ret;
}
+ i++;
}
+ TRACE_INSN(insn, "alternative DEFAULT");
}
if (skip_alt_group(insn))
@@ -3821,10 +3843,16 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
switch (insn->type) {
case INSN_RETURN:
+ TRACE_INSN(insn, "return");
return validate_return(func, insn, statep);
case INSN_CALL:
case INSN_CALL_DYNAMIC:
+ if (insn->type == INSN_CALL)
+ TRACE_INSN(insn, "call");
+ else
+ TRACE_INSN(insn, "indirect call");
+
ret = validate_call(file, insn, statep);
if (ret)
return ret;
@@ -3840,13 +3868,18 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
case INSN_JUMP_CONDITIONAL:
case INSN_JUMP_UNCONDITIONAL:
if (is_sibling_call(insn)) {
+ TRACE_INSN(insn, "sibling call");
ret = validate_sibling_call(file, insn, statep);
if (ret)
return ret;
} else if (insn->jump_dest) {
- ret = validate_branch(file, func,
- insn->jump_dest, *statep);
+ if (insn->type == INSN_JUMP_UNCONDITIONAL)
+ TRACE_INSN(insn, "unconditional jump");
+ else
+ TRACE_INSN(insn, "jump taken");
+
+ ret = validate_branch(file, func, insn->jump_dest, *statep);
if (ret) {
BT_INSN(insn, "(branch)");
return ret;
@@ -3856,10 +3889,12 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
if (insn->type == INSN_JUMP_UNCONDITIONAL)
return 0;
+ TRACE_INSN(insn, "jump not taken");
break;
case INSN_JUMP_DYNAMIC:
case INSN_JUMP_DYNAMIC_CONDITIONAL:
+ TRACE_INSN(insn, "indirect jump");
if (is_sibling_call(insn)) {
ret = validate_sibling_call(file, insn, statep);
if (ret)
@@ -3872,6 +3907,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
case INSN_SYSCALL:
+ TRACE_INSN(insn, "syscall");
if (func && (!next_insn || !next_insn->hint)) {
WARN_INSN(insn, "unsupported instruction in callable function");
return 1;
@@ -3880,6 +3916,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
case INSN_SYSRET:
+ TRACE_INSN(insn, "sysret");
if (func && (!next_insn || !next_insn->hint)) {
WARN_INSN(insn, "unsupported instruction in callable function");
return 1;
@@ -3888,6 +3925,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
return 0;
case INSN_STAC:
+ TRACE_INSN(insn, "stac");
if (!opts.uaccess)
break;
@@ -3900,6 +3938,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
case INSN_CLAC:
+ TRACE_INSN(insn, "clac");
if (!opts.uaccess)
break;
@@ -3917,6 +3956,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
case INSN_STD:
+ TRACE_INSN(insn, "std");
if (statep->df) {
WARN_INSN(insn, "recursive STD");
return 1;
@@ -3926,6 +3966,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
case INSN_CLD:
+ TRACE_INSN(insn, "cld");
if (!statep->df && func) {
WARN_INSN(insn, "redundant CLD");
return 1;
@@ -3938,8 +3979,10 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
break;
}
- *dead_end = insn->dead_end;
+ if (insn->dead_end)
+ TRACE_INSN(insn, "dead end");
+ *dead_end = insn->dead_end;
return 0;
}
@@ -3949,8 +3992,8 @@ static int validate_insn(struct objtool_file *file, struct symbol *func,
* each instruction and validate all the rules described in
* tools/objtool/Documentation/objtool.txt.
*/
-static int validate_branch(struct objtool_file *file, struct symbol *func,
- struct instruction *insn, struct insn_state state)
+static int do_validate_branch(struct objtool_file *file, struct symbol *func,
+ struct instruction *insn, struct insn_state state)
{
struct instruction *next_insn, *prev_insn = NULL;
bool dead_end;
@@ -3959,7 +4002,8 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
if (func && func->ignore)
return 0;
- while (1) {
+ do {
+ insn->trace = 0;
next_insn = next_insn_to_validate(file, insn);
if (opts.checksum && func && insn->sec)
@@ -3982,10 +4026,15 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
ret = validate_insn(file, func, insn, &state, prev_insn, next_insn,
&dead_end);
- if (dead_end)
- break;
- if (!next_insn) {
+ if (!insn->trace) {
+ if (ret)
+ TRACE_INSN(insn, "warning (%d)", ret);
+ else
+ TRACE_INSN(insn, NULL);
+ }
+
+ if (!dead_end && !next_insn) {
if (state.cfi.cfa.base == CFI_UNDEFINED)
return 0;
if (file->ignore_unreachables)
@@ -3999,7 +4048,20 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
prev_insn = insn;
insn = next_insn;
- }
+
+ } while (!dead_end);
+
+ return ret;
+}
+
+static int validate_branch(struct objtool_file *file, struct symbol *func,
+ struct instruction *insn, struct insn_state state)
+{
+ int ret;
+
+ trace_depth_inc();
+ ret = do_validate_branch(file, func, insn, state);
+ trace_depth_dec();
return ret;
}
@@ -4460,10 +4522,18 @@ static int validate_symbol(struct objtool_file *file, struct section *sec,
if (opts.checksum)
checksum_init(func);
+ if (opts.trace && !fnmatch(opts.trace, sym->name, 0)) {
+ trace_enable();
+ TRACE("%s: validation begin\n", sym->name);
+ }
+
ret = validate_branch(file, func, insn, *state);
if (ret)
BT_INSN(insn, "<=== (sym)");
+ TRACE("%s: validation %s\n\n", sym->name, ret ? "failed" : "end");
+ trace_disable();
+
if (opts.checksum)
checksum_finish(func);
@@ -4875,8 +4945,6 @@ static void free_insns(struct objtool_file *file)
free(chunk->addr);
}
-static struct disas_context *objtool_disas_ctx;
-
const char *objtool_disas_insn(struct instruction *insn)
{
struct disas_context *dctx = objtool_disas_ctx;
@@ -4898,8 +4966,10 @@ int check(struct objtool_file *file)
* disassembly context to disassemble instruction or function
* on warning or backtrace.
*/
- if (opts.verbose || opts.backtrace) {
+ if (opts.verbose || opts.backtrace || opts.trace) {
disas_ctx = disas_context_create(file);
+ if (!disas_ctx)
+ opts.trace = false;
objtool_disas_ctx = disas_ctx;
}
diff --git a/tools/objtool/disas.c b/tools/objtool/disas.c
index a030b06c121d2..0ca6e6c8559fd 100644
--- a/tools/objtool/disas.c
+++ b/tools/objtool/disas.c
@@ -308,6 +308,121 @@ char *disas_result(struct disas_context *dctx)
return dctx->result;
}
+#define DISAS_INSN_OFFSET_SPACE 10
+#define DISAS_INSN_SPACE 60
+
+/*
+ * Print a message in the instruction flow. If insn is not NULL then
+ * the instruction address is printed in addition of the message,
+ * otherwise only the message is printed. In all cases, the instruction
+ * itself is not printed.
+ */
+static int disas_vprint(FILE *stream, struct section *sec, unsigned long offset,
+ int depth, const char *format, va_list ap)
+{
+ const char *addr_str;
+ int i, n;
+ int len;
+
+ len = sym_name_max_len + DISAS_INSN_OFFSET_SPACE;
+ if (depth < 0) {
+ len += depth;
+ depth = 0;
+ }
+
+ n = 0;
+
+ if (sec) {
+ addr_str = offstr(sec, offset);
+ n += fprintf(stream, "%6lx: %-*s ", offset, len, addr_str);
+ free((char *)addr_str);
+ } else {
+ len += DISAS_INSN_OFFSET_SPACE + 1;
+ n += fprintf(stream, "%-*s", len, "");
+ }
+
+ /* print vertical bars to show the code flow */
+ for (i = 0; i < depth; i++)
+ n += fprintf(stream, "| ");
+
+ if (format)
+ n += vfprintf(stream, format, ap);
+
+ return n;
+}
+
+/*
+ * Print a message in the instruction flow. If insn is not NULL then
+ * the instruction address is printed in addition of the message,
+ * otherwise only the message is printed. In all cases, the instruction
+ * itself is not printed.
+ */
+void disas_print_info(FILE *stream, struct instruction *insn, int depth,
+ const char *format, ...)
+{
+ struct section *sec;
+ unsigned long off;
+ va_list args;
+
+ if (insn) {
+ sec = insn->sec;
+ off = insn->offset;
+ } else {
+ sec = NULL;
+ off = 0;
+ }
+
+ va_start(args, format);
+ disas_vprint(stream, sec, off, depth, format, args);
+ va_end(args);
+}
+
+/*
+ * Print an instruction address (offset and function), the instruction itself
+ * and an optional message.
+ */
+void disas_print_insn(FILE *stream, struct disas_context *dctx,
+ struct instruction *insn, int depth,
+ const char *format, ...)
+{
+ char fake_nop_insn[32];
+ const char *insn_str;
+ bool fake_nop;
+ va_list args;
+ int len;
+
+ /*
+ * Alternative can insert a fake nop, sometimes with no
+ * associated section so nothing to disassemble.
+ */
+ fake_nop = (!insn->sec && insn->type == INSN_NOP);
+ if (fake_nop) {
+ snprintf(fake_nop_insn, 32, "<fake nop> (%d bytes)", insn->len);
+ insn_str = fake_nop_insn;
+ } else {
+ disas_insn(dctx, insn);
+ insn_str = disas_result(dctx);
+ }
+
+ /* print the instruction */
+ len = (depth + 1) * 2 < DISAS_INSN_SPACE ? DISAS_INSN_SPACE - (depth+1) * 2 : 1;
+ disas_print_info(stream, insn, depth, "%-*s", len, insn_str);
+
+ /* print message if any */
+ if (!format)
+ return;
+
+ if (strcmp(format, "\n") == 0) {
+ fprintf(stream, "\n");
+ return;
+ }
+
+ fprintf(stream, " - ");
+ va_start(args, format);
+ vfprintf(stream, format, args);
+ va_end(args);
+}
+
/*
* Disassemble a single instruction. Return the size of the instruction.
*/
diff --git a/tools/objtool/include/objtool/builtin.h b/tools/objtool/include/objtool/builtin.h
index bb0b25eb08ba4..991365c10f0e9 100644
--- a/tools/objtool/include/objtool/builtin.h
+++ b/tools/objtool/include/objtool/builtin.h
@@ -41,6 +41,7 @@ struct opts {
const char *output;
bool sec_address;
bool stats;
+ const char *trace;
bool verbose;
bool werror;
};
diff --git a/tools/objtool/include/objtool/check.h b/tools/objtool/include/objtool/check.h
index f96aabd7d54dc..fde958683485f 100644
--- a/tools/objtool/include/objtool/check.h
+++ b/tools/objtool/include/objtool/check.h
@@ -66,7 +66,8 @@ struct instruction {
visited : 4,
no_reloc : 1,
hole : 1,
- fake : 1;
+ fake : 1,
+ trace : 1;
/* 9 bit hole */
struct alt_group *alt_group;
@@ -143,4 +144,7 @@ struct instruction *next_insn_same_sec(struct objtool_file *file, struct instruc
const char *objtool_disas_insn(struct instruction *insn);
+extern size_t sym_name_max_len;
+extern struct disas_context *objtool_disas_ctx;
+
#endif /* _CHECK_H */
diff --git a/tools/objtool/include/objtool/disas.h b/tools/objtool/include/objtool/disas.h
index 1aee1fbe0bb97..5db75d06f2197 100644
--- a/tools/objtool/include/objtool/disas.h
+++ b/tools/objtool/include/objtool/disas.h
@@ -19,6 +19,11 @@ int disas_info_init(struct disassemble_info *dinfo,
const char *options);
size_t disas_insn(struct disas_context *dctx, struct instruction *insn);
char *disas_result(struct disas_context *dctx);
+void disas_print_info(FILE *stream, struct instruction *insn, int depth,
+ const char *format, ...);
+void disas_print_insn(FILE *stream, struct disas_context *dctx,
+ struct instruction *insn, int depth,
+ const char *format, ...);
#else /* DISAS */
@@ -51,6 +56,12 @@ static inline char *disas_result(struct disas_context *dctx)
return NULL;
}
+static inline void disas_print_info(FILE *stream, struct instruction *insn,
+ int depth, const char *format, ...) {}
+static inline void disas_print_insn(FILE *stream, struct disas_context *dctx,
+ struct instruction *insn, int depth,
+ const char *format, ...) {}
+
#endif /* DISAS */
#endif /* _DISAS_H */
diff --git a/tools/objtool/include/objtool/trace.h b/tools/objtool/include/objtool/trace.h
new file mode 100644
index 0000000000000..3f3c830ed114e
--- /dev/null
+++ b/tools/objtool/include/objtool/trace.h
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates.
+ */
+
+#ifndef _TRACE_H
+#define _TRACE_H
+
+#include <objtool/check.h>
+#include <objtool/disas.h>
+
+#ifdef DISAS
+
+extern bool trace;
+extern int trace_depth;
+
+#define TRACE(fmt, ...) \
+({ if (trace) \
+ fprintf(stderr, fmt, ##__VA_ARGS__); \
+})
+
+#define TRACE_INSN(insn, fmt, ...) \
+({ \
+ if (trace) { \
+ disas_print_insn(stderr, objtool_disas_ctx, \
+ insn, trace_depth - 1, \
+ fmt, ##__VA_ARGS__); \
+ fprintf(stderr, "\n"); \
+ insn->trace = 1; \
+ } \
+})
+
+static inline void trace_enable(void)
+{
+ trace = true;
+ trace_depth = 0;
+}
+
+static inline void trace_disable(void)
+{
+ trace = false;
+}
+
+static inline void trace_depth_inc(void)
+{
+ if (trace)
+ trace_depth++;
+}
+
+static inline void trace_depth_dec(void)
+{
+ if (trace)
+ trace_depth--;
+}
+
+#else /* DISAS */
+
+#define TRACE(fmt, ...) ({})
+#define TRACE_INSN(insn, fmt, ...) ({})
+
+static inline void trace_enable(void) {}
+static inline void trace_disable(void) {}
+static inline void trace_depth_inc(void) {}
+static inline void trace_depth_dec(void) {}
+
+#endif
+
+#endif /* _TRACE_H */
diff --git a/tools/objtool/include/objtool/warn.h b/tools/objtool/include/objtool/warn.h
index f32abc7b1be14..25ff7942b4d54 100644
--- a/tools/objtool/include/objtool/warn.h
+++ b/tools/objtool/include/objtool/warn.h
@@ -97,6 +97,7 @@ static inline char *offstr(struct section *sec, unsigned long offset)
_len = (_len < 50) ? 50 - _len : 0; \
WARN(" %s: " format " %*s%s", _str, ##__VA_ARGS__, _len, "", _istr); \
free(_str); \
+ __insn->trace = 1; \
} \
})
diff --git a/tools/objtool/trace.c b/tools/objtool/trace.c
new file mode 100644
index 0000000000000..134cc33ffe970
--- /dev/null
+++ b/tools/objtool/trace.c
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates.
+ */
+
+#include <objtool/trace.h>
+
+bool trace;
+int trace_depth;
--
2.43.5
next prev parent reply other threads:[~2025-11-21 9:54 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-21 9:53 [PATCH v6 00/30] objtool: Function validation tracing Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 01/30] objtool: Move disassembly functions to a separated file Alexandre Chartre
2025-11-24 9:12 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 02/30] objtool: Create disassembly context Alexandre Chartre
2025-11-24 9:12 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 03/30] objtool: Disassemble code with libopcodes instead of running objdump Alexandre Chartre
2025-11-24 9:12 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-25 18:16 ` [PATCH v6 03/30] " Nathan Chancellor
2025-11-26 9:00 ` Alexandre Chartre
2025-11-26 10:07 ` David Laight
2025-11-26 10:29 ` Alexandre Chartre
2025-12-09 6:58 ` Guenter Roeck
2025-12-09 7:51 ` Alexandre Chartre
2025-12-09 15:11 ` Guenter Roeck
2025-12-09 22:25 ` Maciej W. Rozycki
2025-12-10 5:08 ` Guenter Roeck
2025-12-10 7:53 ` Alexandre Chartre
2025-12-10 15:26 ` Guenter Roeck
2025-12-10 16:36 ` Alexandre Chartre
2025-12-10 18:42 ` Guenter Roeck
2025-12-10 21:54 ` Guenter Roeck
2025-12-15 16:00 ` Alexandre Chartre
2025-12-15 16:46 ` Guenter Roeck
2025-12-10 7:06 ` Alexandre Chartre
2025-12-10 8:56 ` Peter Zijlstra
2025-12-10 8:53 ` Peter Zijlstra
2025-12-10 12:01 ` Maciej W. Rozycki
2025-11-21 9:53 ` [PATCH v6 04/30] tool build: Remove annoying newline in build output Alexandre Chartre
2025-11-24 9:12 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 05/30] objtool: Print symbol during disassembly Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 06/30] objtool: Store instruction disassembly result Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 07/30] objtool: Disassemble instruction on warning or backtrace Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 08/30] objtool: Extract code to validate instruction from the validate branch loop Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 09/30] objtool: Record symbol name max length Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` Alexandre Chartre [this message]
2025-11-24 9:11 ` [tip: objtool/core] objtool: Add option to trace function validation tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 11/30] objtool: Trace instruction state changes during " Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-12-01 20:23 ` [PATCH v6 11/30] " Nathan Chancellor
2025-12-02 1:30 ` Josh Poimboeuf
2025-12-02 8:34 ` Alexandre Chartre
2025-12-02 16:13 ` Josh Poimboeuf
2025-12-02 18:09 ` David Laight
2025-11-21 9:53 ` [PATCH v6 12/30] objtool: Improve register reporting " Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 13/30] objtool: Identify the different types of alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 14/30] objtool: Add functions to better name alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 15/30] objtool: Improve tracing of alternative instructions Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 16/30] objtool: Do not validate IBT for .return_sites and .call_sites Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 17/30] objtool: Add the --disas=<function-pattern> action Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 18/30] objtool: Preserve alternatives order Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 19/30] objtool: Print headers for alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 20/30] objtool: Disassemble group alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 21/30] objtool: Print addresses with alternative instructions Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 22/30] objtool: Disassemble exception table alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 23/30] objtool: Disassemble jump " Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 24/30] objtool: Fix address references in alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 25/30] objtool: Provide access to feature and flags of group alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 26/30] objtool: Function to get the name of a CPU feature Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:44 ` tip-bot2 for Alexandre Chartre
2025-11-24 11:59 ` Peter Zijlstra
2025-11-24 12:26 ` Borislav Petkov
2025-11-24 12:40 ` Alexandre Chartre
2025-11-24 19:05 ` david laight
2025-11-24 16:43 ` Alexandre Chartre
2025-11-24 20:14 ` Borislav Petkov
2025-11-24 19:49 ` [tip: objtool/core] objtool: Add " tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 27/30] objtool: Improve naming of group alternatives Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:44 ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49 ` tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 28/30] objtool: Compact output for alternatives with one instruction Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43 ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49 ` tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 29/30] objtool: Add wide output for disassembly Alexandre Chartre
2025-11-24 9:11 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43 ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49 ` tip-bot2 for Alexandre Chartre
2025-11-21 9:53 ` [PATCH v6 30/30] objtool: Trim trailing NOPs in alternative Alexandre Chartre
2025-11-24 9:10 ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43 ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49 ` tip-bot2 for Alexandre Chartre
2025-11-21 10:36 ` [PATCH v6 00/30] objtool: Function validation tracing Peter Zijlstra
2025-11-21 13:16 ` Alexandre Chartre
2025-11-21 13:51 ` Alexandre Chartre
2025-11-21 14:30 ` Peter Zijlstra
2025-11-24 11:04 ` Borislav Petkov
2025-11-24 11:39 ` Alexandre Chartre
2025-11-24 12:39 ` Borislav Petkov
2025-11-24 12:27 ` David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251121095340.464045-11-alexandre.chartre@oracle.com \
--to=alexandre.chartre@oracle.com \
--cc=david.laight.linux@gmail.com \
--cc=jpoimboe@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®