From: Josh Poimboeuf <jpoimboe@kernel.org>
To: x86@kernel.org
Cc: linux-kernel@vger.kernel.org, Petr Mladek <pmladek@suse.com>,
Miroslav Benes <mbenes@suse.cz>,
Joe Lawrence <joe.lawrence@redhat.com>,
live-patching@vger.kernel.org, Song Liu <song@kernel.org>,
laokz <laokz@foxmail.com>, Jiri Kosina <jikos@kernel.org>,
Marcos Paulo de Souza <mpdesouza@suse.com>,
Weinan Liu <wnliu@google.com>,
Fazla Mehrab <a.mehrab@bytedance.com>,
Chen Zhongjin <chenzhongjin@huawei.com>,
Puranjay Mohan <puranjay@kernel.org>,
Dylan Hatch <dylanbhatch@google.com>
Subject: [PATCH v3 60/64] livepatch/klp-build: Add stub init code for livepatch modules
Date: Thu, 26 Jun 2025 16:55:47 -0700 [thread overview]
Message-ID: <47595fe6105e0eca4c219f1f9edbad4b0690a93d.1750980517.git.jpoimboe@kernel.org> (raw)
In-Reply-To: <cover.1750980516.git.jpoimboe@kernel.org>
Add a module initialization stub which can be linked with binary diff
objects to produce a livepatch module.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
scripts/livepatch/init.c | 108 +++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
create mode 100644 scripts/livepatch/init.c
diff --git a/scripts/livepatch/init.c b/scripts/livepatch/init.c
new file mode 100644
index 000000000000..2274d8f5a482
--- /dev/null
+++ b/scripts/livepatch/init.c
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Init code for a livepatch kernel module
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/livepatch.h>
+
+extern struct klp_object_ext __start_klp_objects[];
+extern struct klp_object_ext __stop_klp_objects[];
+
+static struct klp_patch *patch;
+
+static int __init livepatch_mod_init(void)
+{
+ struct klp_object *objs;
+ unsigned int nr_objs;
+ int ret;
+
+ nr_objs = __stop_klp_objects - __start_klp_objects;
+
+ if (!nr_objs) {
+ pr_err("nothing to patch!\n");
+ ret = -EINVAL;
+ goto err;
+ }
+
+ patch = kzalloc(sizeof(*patch), GFP_KERNEL);
+ if (!patch) {
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ objs = kzalloc(sizeof(struct klp_object) * (nr_objs + 1), GFP_KERNEL);
+ if (!objs) {
+ ret = -ENOMEM;
+ goto err_free_patch;
+ }
+
+ for (int i = 0; i < nr_objs; i++) {
+ struct klp_object_ext *obj_ext = __start_klp_objects + i;
+ struct klp_func_ext *funcs_ext = obj_ext->funcs;
+ unsigned int nr_funcs = obj_ext->nr_funcs;
+ struct klp_func *funcs = objs[i].funcs;
+ struct klp_object *obj = objs + i;
+
+ funcs = kzalloc(sizeof(struct klp_func) * (nr_funcs + 1), GFP_KERNEL);
+ if (!funcs) {
+ ret = -ENOMEM;
+ for (int j = 0; j < i; j++)
+ kfree(objs[i].funcs);
+ goto err_free_objs;
+ }
+
+ for (int j = 0; j < nr_funcs; j++) {
+ funcs[j].old_name = funcs_ext[j].old_name;
+ funcs[j].new_func = funcs_ext[j].new_func;
+ funcs[j].old_sympos = funcs_ext[j].sympos;
+ }
+
+ obj->name = obj_ext->name;
+ obj->funcs = funcs;
+
+ memcpy(&obj->callbacks, &obj_ext->callbacks, sizeof(struct klp_callbacks));
+ }
+
+ patch->mod = THIS_MODULE;
+ patch->objs = objs;
+
+ /* TODO patch->states */
+
+#ifdef KLP_NO_REPLACE
+ patch->replace = false;
+#else
+ patch->replace = true;
+#endif
+
+ return klp_enable_patch(patch);
+
+err_free_objs:
+ kfree(objs);
+err_free_patch:
+ kfree(patch);
+err:
+ return ret;
+}
+
+static void __exit livepatch_mod_exit(void)
+{
+ unsigned int nr_objs;
+
+ nr_objs = __stop_klp_objects - __start_klp_objects;
+
+ for (int i = 0; i < nr_objs; i++)
+ kfree(patch->objs[i].funcs);
+
+ kfree(patch->objs);
+ kfree(patch);
+}
+
+module_init(livepatch_mod_init);
+module_exit(livepatch_mod_exit);
+MODULE_LICENSE("GPL");
+MODULE_INFO(livepatch, "Y");
+MODULE_DESCRIPTION("Livepatch module");
--
2.49.0
next prev parent reply other threads:[~2025-06-26 23:56 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-26 23:54 [PATCH v3 00/64] objtool,livepatch: klp-build livepatch module generation Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 01/64] s390/vmlinux.lds.S: Prevent thunk functions from getting placed with normal text Josh Poimboeuf
2025-06-27 9:34 ` Heiko Carstens
2025-06-26 23:54 ` [PATCH v3 02/64] vmlinux.lds: Unify TEXT_MAIN, DATA_MAIN, and related macros Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 03/64] x86/module: Improve relocation error messages Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 04/64] x86/kprobes: Remove STACK_FRAME_NON_STANDARD annotation Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 05/64] compiler: Tweak __UNIQUE_ID() naming Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 06/64] compiler.h: Make addressable symbols less of an eyesore Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 07/64] elfnote: Change ELFNOTE() to use __UNIQUE_ID() Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 08/64] kbuild: Remove 'kmod_' prefix from __KBUILD_MODNAME Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 09/64] modpost: Ignore unresolved section bounds symbols Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 10/64] x86/alternative: Refactor INT3 call emulation selftest Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 11/64] objtool: Make find_symbol_containing() less arbitrary Josh Poimboeuf
2025-06-26 23:54 ` [PATCH v3 12/64] objtool: Fix broken error handling in read_symbols() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 13/64] objtool: Propagate elf_truncate_section() error in elf_write() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 14/64] objtool: Remove error handling boilerplate Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 15/64] objtool: Add empty symbols to the symbol tree again Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 16/64] objtool: Fix interval tree insertion for zero-length symbols Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 17/64] objtool: Fix weak symbol detection Josh Poimboeuf
2025-06-27 9:13 ` Peter Zijlstra
2025-06-27 15:42 ` Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 18/64] objtool: Fix x86 addend calculation Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 19/64] objtool: Fix __pa_symbol() relocation handling Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 20/64] objtool: Fix "unexpected end of section" warning for alternatives Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 21/64] objtool: Check for missing annotation entries in read_annotate() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 22/64] objtool: Const string cleanup Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 23/64] objtool: Clean up compiler flag usage Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 24/64] objtool: Remove .parainstructions reference Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 25/64] objtool: Convert elf iterator macros to use 'struct elf' Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 26/64] objtool: Add section/symbol type helpers Josh Poimboeuf
2025-06-27 10:29 ` Peter Zijlstra
2025-06-27 16:36 ` Josh Poimboeuf
2025-06-30 7:29 ` Peter Zijlstra
2025-07-01 19:05 ` Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 27/64] objtool: Mark .cold subfunctions Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 28/64] objtool: Fix weak symbol hole detection for .cold functions Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 29/64] objtool: Mark prefix functions Josh Poimboeuf
2025-06-27 10:31 ` Peter Zijlstra
2025-06-27 16:53 ` Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 30/64] objtool: Simplify reloc offset calculation in unwind_read_hints() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 31/64] objtool: Avoid emptying lists for duplicate sections Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 32/64] objtool: Rename --Werror to --werror Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 33/64] objtool: Resurrect --backup option Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 34/64] objtool: Reindent check_options[] Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 35/64] objtool: Refactor add_jump_destinations() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 36/64] objtool: Simplify special symbol handling in elf_update_symbol() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 37/64] objtool: Generalize elf_create_symbol() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 38/64] objtool: Generalize elf_create_section() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 39/64] objtool: Add elf_create_data() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 40/64] objtool: Add elf_create_reloc() and elf_init_reloc() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 41/64] objtool: Add elf_create_file() Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 42/64] kbuild,x86: Fix special section module permissions Josh Poimboeuf
2025-06-27 10:53 ` Peter Zijlstra
2025-06-27 17:34 ` Josh Poimboeuf
2025-06-30 7:31 ` Peter Zijlstra
2025-09-16 23:18 ` Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 43/64] x86/alternative: Define ELF section entry size for alternatives Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 44/64] x86/jump_label: Define ELF section entry size for jump labels Josh Poimboeuf
2025-06-27 10:48 ` Peter Zijlstra
2025-06-27 16:55 ` Josh Poimboeuf
2025-06-30 7:35 ` Peter Zijlstra
2025-06-26 23:55 ` [PATCH v3 45/64] x86/static_call: Define ELF section entry size of static calls Josh Poimboeuf
2025-06-27 10:51 ` Peter Zijlstra
2025-06-26 23:55 ` [PATCH v3 46/64] x86/extable: Define ELF section entry size for exception table Josh Poimboeuf
2025-06-27 10:52 ` Peter Zijlstra
2025-06-26 23:55 ` [PATCH v3 47/64] x86/bug: Define ELF section entry size for bug table Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 48/64] x86/orc: Define ELF section entry size for unwind hints Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 49/64] objtool: Unify STACK_FRAME_NON_STANDARD entry sizes Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 50/64] objtool/klp: Add --checksum option to generate per-function checksums Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 51/64] objtool/klp: Add --debug-checksum=<funcs> to show per-instruction checksums Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 52/64] objtool/klp: Introduce klp diff subcommand for diffing object files Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 53/64] objtool/klp: Add --debug option to show cloning decisions Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 54/64] objtool/klp: Add post-link subcommand to finalize livepatch modules Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 55/64] objtool: Disallow duplicate prefix symbols Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 56/64] objtool: Add base objtool support for livepatch modules Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 57/64] livepatch: Add CONFIG_KLP_BUILD Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 58/64] kbuild,objtool: Defer objtool validation step for CONFIG_KLP_BUILD Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 59/64] livepatch/klp-build: Introduce fix-patch-lines script to avoid __LINE__ diff noise Josh Poimboeuf
2025-06-26 23:55 ` Josh Poimboeuf [this message]
2025-06-26 23:55 ` [PATCH v3 61/64] livepatch/klp-build: Introduce klp-build script for generating livepatch modules Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 62/64] livepatch/klp-build: Add --debug option to show cloning decisions Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 63/64] livepatch/klp-build: Add --show-first-changed option to show function divergence Josh Poimboeuf
2025-06-26 23:55 ` [PATCH v3 64/64] livepatch: Introduce source code helpers for livepatch modules Josh Poimboeuf
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=47595fe6105e0eca4c219f1f9edbad4b0690a93d.1750980517.git.jpoimboe@kernel.org \
--to=jpoimboe@kernel.org \
--cc=a.mehrab@bytedance.com \
--cc=chenzhongjin@huawei.com \
--cc=dylanbhatch@google.com \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=laokz@foxmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=mpdesouza@suse.com \
--cc=pmladek@suse.com \
--cc=puranjay@kernel.org \
--cc=song@kernel.org \
--cc=wnliu@google.com \
--cc=x86@kernel.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