mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-05-02 18:17:50 -04:00
Merge tag 'objtool-core-2025-12-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull objtool updates from Ingo Molnar:
- klp-build livepatch module generation (Josh Poimboeuf)
Introduce new objtool features and a klp-build script to generate
livepatch modules using a source .patch as input.
This builds on concepts from the longstanding out-of-tree kpatch
project which began in 2012 and has been used for many years to
generate livepatch modules for production kernels. However, this is a
complete rewrite which incorporates hard-earned lessons from 12+
years of maintaining kpatch.
Key improvements compared to kpatch-build:
- Integrated with objtool: Leverages objtool's existing control-flow
graph analysis to help detect changed functions.
- Works on vmlinux.o: Supports late-linked objects, making it
compatible with LTO, IBT, and similar.
- Simplified code base: ~3k fewer lines of code.
- Upstream: No more out-of-tree #ifdef hacks, far less cruft.
- Cleaner internals: Vastly simplified logic for
symbol/section/reloc inclusion and special section extraction.
- Robust __LINE__ macro handling: Avoids false positive binary diffs
caused by the __LINE__ macro by introducing a fix-patch-lines
script which injects #line directives into the source .patch to
preserve the original line numbers at compile time.
- Disassemble code with libopcodes instead of running objdump
(Alexandre Chartre)
- Disassemble support (-d option to objtool) by Alexandre Chartre,
which supports the decoding of various Linux kernel code generation
specials such as alternatives:
17ef: sched_balance_find_dst_group+0x62f mov 0x34(%r9),%edx
17f3: sched_balance_find_dst_group+0x633 | <alternative.17f3> | X86_FEATURE_POPCNT
17f3: sched_balance_find_dst_group+0x633 | call 0x17f8 <__sw_hweight64> | popcnt %rdi,%rax
17f8: sched_balance_find_dst_group+0x638 cmp %eax,%edx
... jump table alternatives:
1895: sched_use_asym_prio+0x5 test $0x8,%ch
1898: sched_use_asym_prio+0x8 je 0x18a9 <sched_use_asym_prio+0x19>
189a: sched_use_asym_prio+0xa | <jump_table.189a> | JUMP
189a: sched_use_asym_prio+0xa | jmp 0x18ae <sched_use_asym_prio+0x1e> | nop2
189c: sched_use_asym_prio+0xc mov $0x1,%eax
18a1: sched_use_asym_prio+0x11 and $0x80,%ecx
... exception table alternatives:
native_read_msr:
5b80: native_read_msr+0x0 mov %edi,%ecx
5b82: native_read_msr+0x2 | <ex_table.5b82> | EXCEPTION
5b82: native_read_msr+0x2 | rdmsr | resume at 0x5b84 <native_read_msr+0x4>
5b84: native_read_msr+0x4 shl $0x20,%rdx
.... x86 feature flag decoding (also see the X86_FEATURE_POPCNT
example in sched_balance_find_dst_group() above):
2faaf: start_thread_common.constprop.0+0x1f jne 0x2fba4 <start_thread_common.constprop.0+0x114>
2fab5: start_thread_common.constprop.0+0x25 | <alternative.2fab5> | X86_FEATURE_ALWAYS | X86_BUG_NULL_SEG
2fab5: start_thread_common.constprop.0+0x25 | jmp 0x2faba <.altinstr_aux+0x2f4> | jmp 0x4b0 <start_thread_common.constprop.0+0x3f> | nop5
2faba: start_thread_common.constprop.0+0x2a mov $0x2b,%eax
... NOP sequence shortening:
1048e2: snapshot_write_finalize+0xc2 je 0x104917 <snapshot_write_finalize+0xf7>
1048e4: snapshot_write_finalize+0xc4 nop6
1048ea: snapshot_write_finalize+0xca nop11
1048f5: snapshot_write_finalize+0xd5 nop11
104900: snapshot_write_finalize+0xe0 mov %rax,%rcx
104903: snapshot_write_finalize+0xe3 mov 0x10(%rdx),%rax
... and much more.
- Function validation tracing support (Alexandre Chartre)
- Various -ffunction-sections fixes (Josh Poimboeuf)
- Clang AutoFDO (Automated Feedback-Directed Optimizations) support
(Josh Poimboeuf)
- Misc fixes and cleanups (Borislav Petkov, Chen Ni, Dylan Hatch, Ingo
Molnar, John Wang, Josh Poimboeuf, Pankaj Raghav, Peter Zijlstra,
Thorsten Blum)
* tag 'objtool-core-2025-12-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (129 commits)
objtool: Fix segfault on unknown alternatives
objtool: Build with disassembly can fail when including bdf.h
objtool: Trim trailing NOPs in alternative
objtool: Add wide output for disassembly
objtool: Compact output for alternatives with one instruction
objtool: Improve naming of group alternatives
objtool: Add Function to get the name of a CPU feature
objtool: Provide access to feature and flags of group alternatives
objtool: Fix address references in alternatives
objtool: Disassemble jump table alternatives
objtool: Disassemble exception table alternatives
objtool: Print addresses with alternative instructions
objtool: Disassemble group alternatives
objtool: Print headers for alternatives
objtool: Preserve alternatives order
objtool: Add the --disas=<function-pattern> action
objtool: Do not validate IBT for .return_sites and .call_sites
objtool: Improve tracing of alternative instructions
objtool: Add functions to better name alternatives
objtool: Identify the different types of alternatives
...
This commit is contained in:
@@ -77,7 +77,7 @@ ITSTATIC void ITPREFIX ## _remove(ITSTRUCT *node, \
|
||||
* Cond2: start <= ITLAST(node) \
|
||||
*/ \
|
||||
\
|
||||
static ITSTRUCT * \
|
||||
ITSTATIC ITSTRUCT * \
|
||||
ITPREFIX ## _subtree_search(ITSTRUCT *node, ITTYPE start, ITTYPE last) \
|
||||
{ \
|
||||
while (true) { \
|
||||
@@ -104,12 +104,8 @@ ITPREFIX ## _subtree_search(ITSTRUCT *node, ITTYPE start, ITTYPE last) \
|
||||
if (ITSTART(node) <= last) { /* Cond1 */ \
|
||||
if (start <= ITLAST(node)) /* Cond2 */ \
|
||||
return node; /* node is leftmost match */ \
|
||||
if (node->ITRB.rb_right) { \
|
||||
node = rb_entry(node->ITRB.rb_right, \
|
||||
ITSTRUCT, ITRB); \
|
||||
if (start <= node->ITSUBTREE) \
|
||||
continue; \
|
||||
} \
|
||||
node = rb_entry(node->ITRB.rb_right, ITSTRUCT, ITRB); \
|
||||
continue; \
|
||||
} \
|
||||
return NULL; /* No match */ \
|
||||
} \
|
||||
|
||||
76
tools/include/linux/livepatch_external.h
Normal file
76
tools/include/linux/livepatch_external.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* External livepatch interfaces for patch creation tooling
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_LIVEPATCH_EXTERNAL_H_
|
||||
#define _LINUX_LIVEPATCH_EXTERNAL_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define KLP_RELOC_SEC_PREFIX ".klp.rela."
|
||||
#define KLP_SYM_PREFIX ".klp.sym."
|
||||
|
||||
#define __KLP_PRE_PATCH_PREFIX __klp_pre_patch_callback_
|
||||
#define __KLP_POST_PATCH_PREFIX __klp_post_patch_callback_
|
||||
#define __KLP_PRE_UNPATCH_PREFIX __klp_pre_unpatch_callback_
|
||||
#define __KLP_POST_UNPATCH_PREFIX __klp_post_unpatch_callback_
|
||||
|
||||
#define KLP_PRE_PATCH_PREFIX __stringify(__KLP_PRE_PATCH_PREFIX)
|
||||
#define KLP_POST_PATCH_PREFIX __stringify(__KLP_POST_PATCH_PREFIX)
|
||||
#define KLP_PRE_UNPATCH_PREFIX __stringify(__KLP_PRE_UNPATCH_PREFIX)
|
||||
#define KLP_POST_UNPATCH_PREFIX __stringify(__KLP_POST_UNPATCH_PREFIX)
|
||||
|
||||
struct klp_object;
|
||||
|
||||
typedef int (*klp_pre_patch_t)(struct klp_object *obj);
|
||||
typedef void (*klp_post_patch_t)(struct klp_object *obj);
|
||||
typedef void (*klp_pre_unpatch_t)(struct klp_object *obj);
|
||||
typedef void (*klp_post_unpatch_t)(struct klp_object *obj);
|
||||
|
||||
/**
|
||||
* struct klp_callbacks - pre/post live-(un)patch callback structure
|
||||
* @pre_patch: executed before code patching
|
||||
* @post_patch: executed after code patching
|
||||
* @pre_unpatch: executed before code unpatching
|
||||
* @post_unpatch: executed after code unpatching
|
||||
* @post_unpatch_enabled: flag indicating if post-unpatch callback
|
||||
* should run
|
||||
*
|
||||
* All callbacks are optional. Only the pre-patch callback, if provided,
|
||||
* will be unconditionally executed. If the parent klp_object fails to
|
||||
* patch for any reason, including a non-zero error status returned from
|
||||
* the pre-patch callback, no further callbacks will be executed.
|
||||
*/
|
||||
struct klp_callbacks {
|
||||
klp_pre_patch_t pre_patch;
|
||||
klp_post_patch_t post_patch;
|
||||
klp_pre_unpatch_t pre_unpatch;
|
||||
klp_post_unpatch_t post_unpatch;
|
||||
bool post_unpatch_enabled;
|
||||
};
|
||||
|
||||
/*
|
||||
* 'struct klp_{func,object}_ext' are compact "external" representations of
|
||||
* 'struct klp_{func,object}'. They are used by objtool for livepatch
|
||||
* generation. The structs are then read by the livepatch module and converted
|
||||
* to the real structs before calling klp_enable_patch().
|
||||
*
|
||||
* TODO make these the official API for klp_enable_patch(). That should
|
||||
* simplify livepatch's interface as well as its data structure lifetime
|
||||
* management.
|
||||
*/
|
||||
struct klp_func_ext {
|
||||
const char *old_name;
|
||||
void *new_func;
|
||||
unsigned long sympos;
|
||||
};
|
||||
|
||||
struct klp_object_ext {
|
||||
const char *name;
|
||||
struct klp_func_ext *funcs;
|
||||
struct klp_callbacks callbacks;
|
||||
unsigned int nr_funcs;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_LIVEPATCH_EXTERNAL_H_ */
|
||||
@@ -67,4 +67,6 @@ struct unwind_hint {
|
||||
#define ANNOTYPE_REACHABLE 8
|
||||
#define ANNOTYPE_NOCFI 9
|
||||
|
||||
#define ANNOTYPE_DATA_SPECIAL 1
|
||||
|
||||
#endif /* _LINUX_OBJTOOL_TYPES_H */
|
||||
|
||||
@@ -44,6 +44,20 @@ static inline bool strstarts(const char *str, const char *prefix)
|
||||
return strncmp(str, prefix, strlen(prefix)) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if a string ends with another.
|
||||
*/
|
||||
static inline bool str_ends_with(const char *str, const char *substr)
|
||||
{
|
||||
size_t len = strlen(str);
|
||||
size_t sublen = strlen(substr);
|
||||
|
||||
if (sublen > len)
|
||||
return false;
|
||||
|
||||
return !strcmp(str + len - sublen, substr);
|
||||
}
|
||||
|
||||
extern char * __must_check skip_spaces(const char *);
|
||||
|
||||
extern char *strim(char *);
|
||||
|
||||
Reference in New Issue
Block a user