From ae0d95355144939d77e52b113491a540d90ef961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Tue, 5 Nov 2024 10:25:12 +0100 Subject: [PATCH] Sync from SUSE:ALP:Source:Standard:1.0 kernel-livepatch-MICRO-6-0_Update_3 revision 50def70bb264e3123718330c12f0cc9d --- .gitattributes | 23 + Makefile | 14 + config.sh | 1 + kallsyms_relocs.c | 129 +++ kallsyms_relocs.h | 19 + kernel-livepatch-MICRO-6-0_Update_3.changes | 1111 +++++++++++++++++++ kernel-livepatch-MICRO-6-0_Update_3.spec | 101 ++ klp_convert.h | 16 + klp_syscalls.h | 111 ++ klp_trace.h | 101 ++ livepatch_main.c | 92 ++ shadow.h | 6 + source-timestamp | 3 + uname_patch.tar.bz2 | 3 + 14 files changed, 1730 insertions(+) create mode 100644 .gitattributes create mode 100644 Makefile create mode 100644 config.sh create mode 100644 kallsyms_relocs.c create mode 100644 kallsyms_relocs.h create mode 100644 kernel-livepatch-MICRO-6-0_Update_3.changes create mode 100644 kernel-livepatch-MICRO-6-0_Update_3.spec create mode 100644 klp_convert.h create mode 100644 klp_syscalls.h create mode 100644 klp_trace.h create mode 100644 livepatch_main.c create mode 100644 shadow.h create mode 100644 source-timestamp create mode 100644 uname_patch.tar.bz2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fecc750 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..916b2b9 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +KDIR ?= /lib/modules/`uname -r`/build + +ccflags-y += -I$(obj) + +obj-m := livepatch-@@RPMRELEASE@@.o + +livepatch-@@RPMRELEASE@@-y := kallsyms_relocs.o livepatch_main.o uname_patch/livepatch_uname.o + +default: + $(MAKE) -C $(KDIR) M=$(CURDIR) modules + +clean: + $(MAKE) -C $(KDIR) M=$(CURDIR) clean + diff --git a/config.sh b/config.sh new file mode 100644 index 0000000..dccdc8e --- /dev/null +++ b/config.sh @@ -0,0 +1 @@ +IBS_PROJECT=SUSE:ALP:Source:Standard:Core:1.0:Build diff --git a/kallsyms_relocs.c b/kallsyms_relocs.c new file mode 100644 index 0000000..c25ede3 --- /dev/null +++ b/kallsyms_relocs.c @@ -0,0 +1,129 @@ +/* + * kallsyms_relocs.c - resolve non-exported symbols + * + * Copyright (C) 2018 SUSE + * Author: Nicolai Stange + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include +#include +#include "kallsyms_relocs.h" + +struct find_args +{ + struct klp_kallsyms_reloc reloc; + unsigned long match_count; +}; + +static int __find_callback(void *data, const char *name, unsigned long addr) +{ + struct find_args *args = data; + + if (strcmp(args->reloc.symname, name)) + return 0; + + args->match_count++; + + /* + * Finish the search when the symbol is found for the desired + * position or the position is not defined. + */ + if (!args->reloc.sympos || args->match_count == args->reloc.sympos) { + *args->reloc.addr = (void *)addr; + return 1; + } + + return 0; +} + +static +int (*klpe_module_kallsyms_on_each_symbol)(const char *modname, + int (*fn)(void *, const char *, + unsigned long), + void *data); + +static int __klp_resolve_kallsyms_relocs(struct klp_kallsyms_reloc *relocs, + unsigned long count) +{ + unsigned long i; + struct find_args args; + + for (i = 0; i < count; ++i) { + *relocs[i].addr = NULL; + args.reloc = relocs[i]; + args.match_count = 0; + + if (args.reloc.objname) { + klpe_module_kallsyms_on_each_symbol(args.reloc.objname, + __find_callback, + &args); + } else { + kallsyms_on_each_symbol(__find_callback, &args); + } + + if (!*relocs[i].addr) { + if (relocs[i].objname) { + pr_err("livepatch: symbol %s:%s not resolved\n", + relocs[i].objname, relocs[i].symname); + } else { + pr_err("livepatch: symbol %s not resolved\n", + relocs[i].symname); + } + + return -ENOENT; + } + } + + return 0; +} + +struct module *(*klpe_find_module)(const char *name); + +/* Bootstrap: resolve non-exported module_kallsyms_on_each_symbol() */ +int klp_kallsyms_relocs_init(void) +{ + static struct klp_kallsyms_reloc bootstrap_relocs[] = { + { "module_kallsyms_on_each_symbol", + (void *)&klpe_module_kallsyms_on_each_symbol }, + { "find_module", (void *)&klpe_find_module }, + }; + + /* Already initialized? */ + if (klpe_module_kallsyms_on_each_symbol) + return 0; + + /* + * All relocations are against symbols from vmlinux, the yet + * unresolved klpe_module_kallsyms_on_each_symbol() will not + * get invoked and the call below will work fine at this stage + * already. + */ + return __klp_resolve_kallsyms_relocs(bootstrap_relocs, + ARRAY_SIZE(bootstrap_relocs)); +} + +int klp_resolve_kallsyms_relocs(struct klp_kallsyms_reloc *relocs, + unsigned long count) +{ + int ret; + + ret = klp_kallsyms_relocs_init(); + if (ret) + return ret; + + return __klp_resolve_kallsyms_relocs(relocs, count); +} diff --git a/kallsyms_relocs.h b/kallsyms_relocs.h new file mode 100644 index 0000000..85cd0be --- /dev/null +++ b/kallsyms_relocs.h @@ -0,0 +1,19 @@ +#ifndef _KLP_KALLSYMS_RELOCS +#define _KLP_KALLSYMS_RELOCS + +struct klp_kallsyms_reloc +{ + const char *symname; + void **addr; + const char *objname; + unsigned long sympos; +}; + +int klp_kallsyms_relocs_init(void); + +int klp_resolve_kallsyms_relocs(struct klp_kallsyms_reloc *relocs, + unsigned long count); + +extern struct module *(*klpe_find_module)(const char *name); + +#endif /* _KLP_KALLSYMS_RELOCS */ diff --git a/kernel-livepatch-MICRO-6-0_Update_3.changes b/kernel-livepatch-MICRO-6-0_Update_3.changes new file mode 100644 index 0000000..2a8431a --- /dev/null +++ b/kernel-livepatch-MICRO-6-0_Update_3.changes @@ -0,0 +1,1111 @@ +------------------------------------------------------------------- +Mon Sep 30 17:57:42 CEST 2024 - nstange@suse.de + +- New branch for MICRO-6-0_Update_3 +- commit f95a323 + +------------------------------------------------------------------- +Mon Sep 2 13:02:29 CEST 2024 - nstange@suse.de + +- scripts: make tar-up recognize SLE Micro codestreams +- commit be8c692 + +------------------------------------------------------------------- +Mon Oct 23 11:19:00 CEST 2023 - nstange@suse.de + +- klp_syscalls.h: adapt to kernels >= 6.1 on s390x and ppc64le + There had been a couple of changes to the kernel's architecture specific + syscall related definitions on ppc64le and s390x, which require some + amendments to the klp_syscalls.h abstraction wrappers to enable support: + - 7e92e01b7245 ("powerpc: Provide syscall wrapper"), + - 94746890202c ("powerpc: Don't add __powerpc_ prefix to syscall entry + points"), + - 2213d44e140f ("s390/syscalls: get rid of system call alias functions"). + Implement that. +- commit 049524d + +------------------------------------------------------------------- +Fri Oct 13 11:26:56 CEST 2023 - nstange@suse.de + +- kallsyms_relocs: Drop 'mod' argument from symbol iteration callback + With upstream commit 3703bd54cd37 ("kallsyms: Delete an unused parameter + related to {module_}kallsyms_on_each_symbol()"), the 'mod' argument is + no longer passed to the kallsyms symbol iteration callbacks. Drop it from + the kallsyms_relocs helper implementation accordingly. +- commit e5e774b + +------------------------------------------------------------------- +Mon Feb 27 18:56:17 CET 2023 - mpdesouza@suse.com + +- create-makefile.sh: Add Kbuild.inc files support + Check if there are Kbuild.inc files and copy it's content into the new + Makefile. An example of Kbuild.inc can be used to enable -Werror for specific + object on all architectures: + CFLAGS_livepatch_main.o = -Werror +- commit a23f264 + +------------------------------------------------------------------- +Fri Feb 10 19:10:03 CET 2023 - mpdesouza@suse.com + +- livepatch_main.c: Remove KLP_NOREG_API checks + All currently supported codestreams define KLP_NOREG_API, making this + checks obsolete. +- commit 06c9fa0 + +------------------------------------------------------------------- +Mon Dec 12 01:53:36 CET 2022 - mpdesouza@suse.com + +- klp_trace.h: Add KLPR_TRACE_EVENT macros + Currently klp-ccp cannot track and redefine macros that use livepatches + or exported symbols, thus generating a large amount of code that needs + to be massaged. These macros define two variants of TRACE_EVENT macros, + for kernels older than 5.10, and another version for > 5.10, which + dropped data_args argument. +- commit 288960b + +------------------------------------------------------------------- +Thu Oct 27 15:59:38 CEST 2022 - nstange@suse.de + +- klp_syscalls.h: fix KLP_COMPAT_SYSCALL_SYM() macro for s390 + Currently, the KLP_COMPAT_SYSCALL_SYM() expands to the __s390_compat_*() + variant, which expects the original types for its arguments, not longs. + For compatibility with the other archs, make it expand to the __se_compat_*() + version expecting longs for its arguments. +- commit 36a47e5 + +------------------------------------------------------------------- +Tue Oct 18 13:09:46 CEST 2022 - nstange@suse.de + +- rpm: enable support for builds against the -RT kernel variant + Currently there is only support for building a kernel-livepatch package against + the default flavor of the canonical () kernel variant. Livepatches for + the -RT variant will be provided in the future though. Prepare the packaging + scripts for this. + More specifically, make scripts/tar-up.sh extract an optional "variant" + component from the codestream name (as read from scripts/release-version.sh): +- SLE15-SP4-RT_Update_xy would specify a -RT variant while +- SLE15-SP4_Update_xy retains its meaning and referes to the variant + as before. + Introduce a %variant macro to the spec file and make tar-up.sh to set its value, + just alongside the other substitutions its already doing. + Make the spec file's package name and dependency specification to depend on + the %variant as appropriate. +- commit c5dc06b + +------------------------------------------------------------------- +Thu Jun 16 08:16:19 CEST 2022 - nstange@suse.de + +- uname_patch: include livepatch_uname.h from the uname livepatch code + Currently, livepatch_uname.c doesn't include livepatch_uname.h, which prohibits + compile-time protoype checking. Include livepatch_uname.h from + livepatch_uname.c, just as it's always being done for all the other livepatches, + too. +- commit c3ba44c + +------------------------------------------------------------------- +Thu Jun 16 08:08:52 CEST 2022 - nstange@suse.de + +- klp_syscalls: provide s390x variant of KLP_SYSCALL_DECLx() for kernels >= 5.12 + s390x' syscall prototypes have changed with kernel commit 3a790cc1c9ef ("s390: + pass struct pt_regs instead of registers to syscalls") accepted for v5.12. + Add a corresponding KLP_SYSCALL_DECLx() #define to klp_syscalls.h. +- commit 9380841 + +------------------------------------------------------------------- +Fri Jun 10 10:49:32 CEST 2022 - nstange@suse.de + +- kallsyms_relocs: allow for explicit initialization + Currently, the kallsyms_relocs code initializes itself in a lazy fashion upon + the first usage of its klp_resolve_kallsyms_relocs(). + However, that initialization code, __kallsyms_relocs_init(), is now also in + charge of populating the klpe_find_module function pointer. As users might + depend on klpe_find_module() before their first call to + klp_resolve_kallsyms_relocs(), give them a means to trigger the initialization + explicitly: rename __kallsyms_relocs_init() to klp_kallsyms_relocs_init() and + make it externally visible. +- commit 5fe7b9f + +------------------------------------------------------------------- +Fri Jun 10 10:42:28 CEST 2022 - nstange@suse.de + +- kallsyms_relocs: lookup find_module() at initialization time + The livepatch initialization handlers invoking the kallsyms_relocs functionality + for their resp. target modules usually depend on the kernel's find_module(). + However, with upstream commit 089049f6c995 ("module: unexport find_module and + module_mutex"), find_module() got unexported and is no longer directly + available. + Make the kallsyms_relocs initialization code look it up via kallsyms and + make the result available to livepatch initialization handlers via the + new, externally visible klpe_find_module function poiner. +- commit 7c53b1f + +------------------------------------------------------------------- +Fri Jun 10 10:36:19 CEST 2022 - nstange@suse.de + +- kallsyms_relocs: give klp_module_kallsyms_on_each_symbol a "klpe_" prefix + In line with our usual convention of giving symbols populated by means of + kallsyms-lookups a "klpe_" prefix, rename the internal + "klp_module_kallsyms_on_each_symbol" to "klpe_module_kallsyms_on_each_symbol". +- commit 20e54d1 + +------------------------------------------------------------------- +Fri Jun 10 10:25:55 CEST 2022 - nstange@suse.de + +- kallsyms_relocs: factor out lookup code and make __kallsyms_relocs_init() use it + Currently, __kallsyms_relocs_init() contains some open-coded kallsyms lookup for + filling in the klp_module_kallsyms_on_each_symbol function pointer at bootstrap + time. Future commits will make the init code to populate some more symbols, + which more or less resembles the functionality klp_resolve_kallsyms_relocs() is + already providing. + Enable code reuse by factoring out the kallsyms lookup related pieces from + klp_resolve_kallsyms_relocs() into the new __klp_resolve_kallsyms_relocs() + and make both, klp_resolve_kallsyms_relocs() and __kallsyms_relocs_init() to + invoke it. +- commit 1bef553 + +------------------------------------------------------------------- +Fri Jun 10 09:47:40 CEST 2022 - nstange@suse.de + +- kallsyms_relocs: strip underscore prefix from __klp_resolve_kallsyms_relocs() + The double undescore prefix of "__klp_resolve_kallsyms_relocs()" suggests that + the caller is supposed to take care of some locking, of module_mutex in this + case. + However, since upstream commit 013c1667cf78 ("kallsyms: refactor + {,module_}kallsyms_on_each_symbol"), module_kallsyms_on_each_symbol(), and + hence also the __klp_resolve_kallsyms_relocs() using that, doesn't need to + have module_mutex locked by callers anymore. + To reflect this, remove the underscore prefix from + __klp_resolve_kallsyms_relocs() and drop the comment about module_mutex from + the code. +- commit 4476b8b + +------------------------------------------------------------------- +Thu Feb 24 10:36:40 CET 2022 - mbenes@suse.cz + +- livepatch: Add MODULE_INFO with a git revision + A git HEAD revision was removed from "uname -v" output. Add it as + MODULE_INFO to a live patch kernel module, so it can be acquired by + modinfo tool if needed. The information is also available in a rpm + changelog. +- commit ff67cb6 + +------------------------------------------------------------------- +Wed Feb 23 19:21:44 CET 2022 - mbenes@suse.cz + +- uname_patch: Trim klp tag to fix the overflow + SLE15-SP4 introduces an option to specify a preempt model during boot. + new_utsname->version was updated to take this into account and contains + PREEMPT_DYNAMIC tag now. In the end, there is not much space left to + include our klp_tag and it overflows. Instead of removing the tag + completely, trim it so that the user can at least easily spot that a + live patch is installed on the system. + A git HEAD revision will be stored elsewhere. + While at it, make the tag const. + References: bsc#1196281 +- commit 51e46f7 + +------------------------------------------------------------------- +Wed Feb 23 19:20:37 CET 2022 - mbenes@suse.cz + +- uname_patch: Update to v5.14 kernel/sys.c + Backport upstream commit 88a686728b37 ("kbuild: simplify access to the + kernel's version"). +- commit 86c9d55 + +------------------------------------------------------------------- +Thu Aug 5 16:50:11 CEST 2021 - nstange@suse.de + +- scripts/register-patches.sh: fix issue with per-klp_object #if-guards + scripts/register-patches.sh is supposed to #if-guard each constructed + klp_object instance by the logical or of the individual functions' + associated conditions as specified in the corresponding + patched_funcs.csv entries. If only one such function entry doesn't have a + condition associated with it, the compound logical || would always evaluate + to true though and thus, register-patches.sh should skip the + per-klp_object #if-guard alltogether in this case. + To this end, the inner loop iterating over the function entries resets the + array o_conds of unique conditions seen for the current object and breaks + out upon encountering an unconditional patch entry, i.e. one w/o an empty + condition field. The problem is that the break from the inner loop has no + effect on the outer loop over the different patched_funcs.csv's and thus, + the emptied o_conds array can get populated again in the course of + processing a later patched_funcs.csv. Later code would then find the + non-empty o_conds and guard the currently constructed klp_object by oring + its individual entries together rather than omitting the #if-guard as a + whole as it should. + Fix this by introducing the boolean variable "any_unconds", flip it to true + upon encountering an unconditional function entry and force the o_conds + array to empty if any_unconds is found to be set once the outer loop has + completed. +- commit dae55a1 + +------------------------------------------------------------------- +Wed Jan 13 11:41:32 CET 2021 - nstange@suse.de + +- klp_syscalls.h: fix syscall prototype mismatch on s390x for kernels >= 4.17 + The __SYSCALL_DEFINEx(x, name, ...) macro as defined in + arch/s390/include/asm/syscall_wrapper.h declares two protoypes for + a given syscall: __s390x_sys##name() and __se_sys##name(). The former + symbol is made to be an alias to the latter and the function arguments are + of the "real" type as specified in the macro invocation whereas the + latter's argument types are transformed into longs. + Currently the KLP_SYSCALL_SYM() helper macro from our klp_syscalls.h + evaluates to the __s390x_sys##name() variant, but its expansion result is + intended to be used with KLP_SYSCALL_DECLx(), which does the transformation + of the arguments' types to longs. This results in compilation errors due to + the syscall prototype declaration from KLP_SYSCALL_DECLx() confliciting + with the one from __SYSCALL_DEFINEx(), if visible. + The current behaviour of KLP_SYSCALL_DECLx() should be retained in order + to keep it working for the compatibility stubs, i.e. with + KLP_SYSCALL_COMPAT_STUB_SYM(). So fix the issue by making KLP_SYSCALL_SYM() + to evaluate to the __se_sys##name() variant on 390x for kernel versions >= + 4.17. +- commit 862bd77 + +------------------------------------------------------------------- +Tue Jan 12 13:38:00 CET 2021 - nstange@suse.de + +- scripts/register-patches.sh: stringify klp_funcs' ->old_name + In order to enable the use of e.g. KLP_SYSCALL_SYM() for the to be + livepatched function's name in patched_funcs.csv, make register-patches.sh + wrap the emitted klp_funcs' ->old_name initialization values with + __stringify() rather than writing string tokens directly. +- commit f54c4d6 + +------------------------------------------------------------------- +Tue May 19 15:01:34 CEST 2020 - mbenes@suse.cz + +- scripts: Disable use of klp-convert + klp-convert tool was introduced to improve a situation with unexported + symbols while preparing live patches. However, it is still not stable + enough and upstream still needs to decide the purpose of the tool. Given + that it is used only for uname patch and only on SLE15-SP1 it is better + to just disable it for now. + At the same, leave the infrastructure in place, because we might use it + in the future. +- commit 3397b3e + +------------------------------------------------------------------- +Wed Apr 8 10:14:20 CEST 2020 - nstange@suse.de + +- scripts: enable s390x for SLE12-SP4 + The initial live patch shall be built on s390x for future SLE12-SP4 kernel + releases. Make tar-up.sh add s390x to ExclusiveArch from the (not yet + existing) SLE12-SP4_Update_13 onwards. +- commit f49a99e + +------------------------------------------------------------------- +Mon Mar 30 11:59:20 CEST 2020 - nstange@suse.de + +- scripts: enable s390x for SLE15-SP2 +- commit 933574a + +------------------------------------------------------------------- +Wed Mar 25 10:45:50 CET 2020 - nstange@suse.de + +- scripts: Generate ExclusiveArch in spec file dynamically + s390x support is slowly being introduced for newly created + master-livepatch based branches. In order to avoid problems with existing + branches for e.g. the maintenance team, don't add s390x to the hard-coded + list of ExclusiveArchs, but let tar-up.sh enable it dynamically depending + on the codestream in question. + For now, s390x builds will be enabled on SLE12-SP5, beginning with + SLE12-SP5_Update_3 onwards. +- commit 27b683d + +------------------------------------------------------------------- +Mon Dec 2 13:49:24 CET 2019 - mbenes@suse.cz + +- Revert "shadow variables: allow for dynamic initialization" + This reverts commit 843c6fa42429afc1682cdb39119e7a011af2abc9. +- commit 23d37c8 + +------------------------------------------------------------------- +Mon Dec 2 13:40:37 CET 2019 - mbenes@suse.cz + +- Revert "shadow variables: introduce upstream patch" + This reverts commit e899c4fd3fe7602ebd70f578d8475f1049de7c78. +- commit c1be24c + +------------------------------------------------------------------- +Mon Dec 2 13:38:18 CET 2019 - mbenes@suse.cz + +- Revert "shadow variables: drop EXPORT_SYMBOL()s" + This reverts commit ac6cfebd7f831213ebcd4b2690672871572ec49e. +- commit 5771a4b + +------------------------------------------------------------------- +Mon Dec 2 13:38:04 CET 2019 - mbenes@suse.cz + +- Revert "shadow variables: share shadow data among KGraft modules" + This reverts commit 8e1e705d4d56981949f7ae3854d8e1cc2be7f40f. +- commit 1c87412 + +------------------------------------------------------------------- +Mon Dec 2 13:37:30 CET 2019 - mbenes@suse.cz + +- Revert "shadow variables: add KGR_SHADOW_ID helper" + This reverts commit 237c8f3d13c382321d3e65d138d328eae0b82f6c. +- commit 41936fd + +------------------------------------------------------------------- +Sat Sep 7 18:53:16 CEST 2019 - nstange@suse.de + +- uname_patch: convert to the syscall stub wrapper macros from klp_syscalls.h + In order to make the live patch to the newuname() syscall work on + kernels >= 4.17 again, convert it to the KLP_SYSCALL_*() wrapper macros + provided by klp_syscalls.h. + References: bsc#1149841 +- commit b5af38e + +------------------------------------------------------------------- +Sat Sep 7 18:53:15 CEST 2019 - nstange@suse.de + +- Provide wrapper macros for syscall naming + Live patching syscall stubs is a common task, for example any live patch + package modifies the newuname syscall. + For the actual definitions of the live patched syscall stubs, the + __SYSCALL_DEFINEx() name can always be (and often has been) used like e.g. + __SYSCALL_DEFINEx(3, _klp_timer_create, const clockid_t, which_clock, + struct sigevent __user *, timer_event_spec, + timer_t __user *, created_timer_id) + { + /* New implementation */ + } + Up to kernel 4.16, this used to define a function named + "SyS_klp_timer_create" which could then be used to live patch the + "SyS_timer_create". + However, beginning with kernel version 4.17, resp. upstream commits + - fa697140f9a2 ("syscalls/x86: Use 'struct pt_regs' based syscall calling + convention for 64-bit syscalls") + - e145242ea0df ("syscalls/core, syscalls/x86: Clean up syscall stub + naming convention") + - d5a00528b58c ("syscalls/core, syscalls/x86: Rename struct pt_regs-based + sys_*() to __x64_sys_*()"), + things became more complex: + - The naming of the resulting stubs now varies across architecture. + - Some architectures (x86_64, s390x) instantiate an additional + compat stub for syscalls sharing a common implementation between 32 and + 64 bits. (The 32 bit entry code used to convert from the 32 bit ABI to + 64 bit and simply call the 64 bit syscall stub afterwards. That's + handled by the new 32 bit stubs now.) + - The stubs' signatures have changed: each argument used to get mapped + to either long or long long, but on x86_64, the stubs are now receiving + a single struct pt_regs only -- it's their responsibility to extract + the arguments as appropriate. + In order to not require each and every live patch touching syscalls to + include an insane amount of ifdeffery, provide a set of #defines hiding it: + 1.) KLP_SYSCALL_SYM(name) expands to the syscall stub name for 64 bits + as defined by _SYSCALL_DEFINEx(x, _name, ...). + 2.) If the architeture requires 32bit specific stubs for syscalls sharing + a common implementation between 32 and 64bits, the + KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS macro is defined. + 3.) If KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS is defined, then + KLP_SYSCALL_COMPAT_STUB_SYM(name) expands to the syscall stub name + for 32 bits as defined by _SYSCALL_DEFINEx(x, _name, ...). + 4.) For syscalls not sharing a common implementation between 32 and + 64 bits, i.e. those defined by COMPAT_SYSCALL_DEFINEx(), + the macro KLP_COMPAT_SYSCALL_SYM(name) expands to the stub name + defined as defined by COMPAT_SYSCALL_DEFINEx(x, _name, ...). + 5.) Finally, for hiding differences between the signatures, + provide the macro KLP_SYSCALL_DECLx(x, sym, ...) which + expands to a declaration of sym, with the x arguments either + mapped to long resp. long long each, or collapsed to a single + struct pt_regs argument as appropriate for the architecture. + Note that these macros are defined as appropriate on kernels before and + after 4.17, so that live patch code can be shared. + References: bsc#1149841 +- commit da7b9a5 + +------------------------------------------------------------------- +Sat Aug 24 19:06:03 CEST 2019 - nstange@suse.de + +- scripts/create-makefile.sh: add -I flag for toplevel directory to ccflags-y + Since upstream commit 58156ba4468f ("kbuild: skip 'addtree' and 'flags' + magic for external module build") Kbuild won't add an -I flag for an + external module's toplevel source directory to the compilation flags + anymore. + This results in compilation errors like the following: + uname_patch/livepatch_uname.c:36:10: fatal error: klp_convert.h: No such + file or directory + #include "klp_convert.h" + ^~~~~~~~~~~~~~~ + Fix this by appending '-I$(obj)' to ccflags-y within the Makefile created + by scripts/create-makefile.sh. Note that "$(obj)" is set to the current + source directory before the Makefile is sourced by Kbuild. +- commit b30a48e + +------------------------------------------------------------------- +Thu Mar 7 15:23:42 CET 2019 - mbenes@suse.cz + +- livepatch_main.c: Adaptation to a new livepatch API + The atomic replace patch set among others removed the two-stage API. + There is no (un)registration step needed now. SLES backport defines + KLP_NOREG_API macro to easily distinguish whether the kernel provides + the old or the new API. Use it and change the module init and exit + functions accordingly. +- commit 060163b + +------------------------------------------------------------------- +Thu Feb 7 14:13:00 CET 2019 - mbenes@suse.cz + +- uname_patch: Use klp-convert macros and rely on klp-convert where + possible +- commit 4c9eb70 + +------------------------------------------------------------------- +Wed Feb 6 14:12:44 CET 2019 - mbenes@suse.cz + +- Define macros to switch easily between klp-convert and kallsyms + Kallsyms trick does not have to be used for resolving undefined symbols + when klp-convert is available. It would be great though to share live + patches sources between both modes of operation. + Define macros to help with the task. Their definitions depend on + whether USE_KLP_CONVERT macro is defined. tar-up.sh script is + responsible to decide. +- commit e3a42b7 + +------------------------------------------------------------------- +Wed Feb 6 10:53:44 CET 2019 - mbenes@suse.cz + +- Use klp-convert where provided + klp-convert tool converts undefined symbols in a live patch kernel module + to special relocation records which are resolved by the kernel. It + allows to omit kallsyms tricks. + Wire it to the spec file and let tar-up.sh script decide if it is to be + used depending on a codestream. SLE15-SP1 is supported currently. +- commit 3efd330 + +------------------------------------------------------------------- +Tue Dec 11 11:27:23 CET 2018 - mbenes@suse.cz + +- uname_patch: don't hold uts_sem while accessing userspace memory + Backport upstream patch 42a0cc347858 ("sys: don't hold uts_sem while + accessing userspace memory"). +- commit d4e00de + +------------------------------------------------------------------- +Tue Oct 2 16:38:19 CEST 2018 - mbenes@suse.cz + +- scripts/tar-up.sh: Add ppc64le to ExclusiveArch even for SLE12-SP2 +- commit 77a8a8b + +------------------------------------------------------------------- +Wed Aug 8 15:08:00 CEST 2018 - nstange@suse.de + +- Provide common kallsyms wrapper API + With bsc#1103203, the need for disambiguating between a multiply + defined symbol arose. This is something the kallsyms_lookup_name() based + code snippet we used to copy&paste to every individual CVE fix can't + handle. + Implement a proper wrapper API for doing the kallsyms lookups. +- commit bd113d8 + +------------------------------------------------------------------- +Wed Aug 8 15:07:59 CEST 2018 - nstange@suse.de + +- Provide common kallsyms wrapper API + With bsc#1103203, the need for disambiguating between a multiply + defined symbol arose. This is something the kallsyms_lookup_name() based + code snippet we used to copy&paste to every individual CVE fix can't + handle. + Implement a proper wrapper API for doing the kallsyms lookups. +- commit 4aed7d2 + +------------------------------------------------------------------- +Wed Jul 11 13:55:14 CEST 2018 - nstange@suse.de + +- provide KGR_SHADOW_ID() helper macro +- provide KLP_SHADOW_ID() helper macro + In analogy to the KGR_SHADOW_ID() macro, introduce KLP_SHADOW_ID() for + the construction of unique shadow variable id's. +- commit 7325c49 + +------------------------------------------------------------------- +Sun Jul 8 13:02:18 CEST 2018 - nstange@suse.de + +- scripts/register-patches.sh: implement conditional inclusion + Currently, subpatches provide a patched_funcs.csv file describing what + needs to be patched. register-patches.sh inspects those to assemble one + global klp_patch structure. + The current format for these patched_funcs.csv's is + obj old_func(,sympos) newfun + However, sometimes subpatches depend on some kernel configuration values + like CONFIG_X86_64 and functions shall get patched only if the target + kernel configuration matches. + Extends the patched_funcs.csv format to + obj old_func(,sympos) newfun (cpp condition) + where everything coming after 'newfun' is taken to be a CPP condition to be + used for conditional inclusion. In case there's no condition specified, + assign that entry the same semantics as if a '1' had been given. + Make register-patches.sh guard the corresponding klp_func entries with #if + pragmas. + Furthermore, let it guard the enclosing klp_object instances by or'ing + together all its klp_funcs' conditions. + For the sake of better readability, omit redundant #if pragmas as well as + condition clauses. In particular, +- if a function entry hasn't got any condition explicitly specified, + there won't be any #if pragma, neither at the klp_func nor at the + klp_object level, +- if multiple function entries for an object are protected by the same + condition, it'll be or'ed in at the klp_object level only once, +- if all of an object's functions share the same condition, no #if pragmas + will be emitted at the klp_func level because they would only duplicate + what's already there for the enclosing object and +- multiple subsequent function entries sharing the same condition get + collated. +- commit 56f0729 + +------------------------------------------------------------------- +Sun Jul 8 13:02:17 CEST 2018 - nstange@suse.de + +- scripts/register-patches.sh: allow spaces as patched_funcs.csv separators + Currently there's one single cut(1) usage which requires that (single) tabs + are used as field separators for the patched_funcs.csv. + As the rest of the code can deal with sequences of any whitespace already, + this imposes an unnecessary restriction on the format. + Substitute that cut(1) usage by a sed(1) invocation as appropriate. +- commit 9852661 + +------------------------------------------------------------------- +Mon Jun 4 15:20:08 CEST 2018 - mbenes@suse.cz + +- livepatch_main.c: Set .replace to true +- commit 643f04c + +------------------------------------------------------------------- +Mon May 14 08:30:00 CEST 2018 - nstange@suse.de + +- scrips/create-makefile.sh: add support for assembly files +- commit cf2464a + +------------------------------------------------------------------- +Mon Mar 5 15:44:31 CET 2018 - nstange@suse.de + +- shadow variables: allow for dynamic initialization + Currently, the only shadow variable initialization scheme exposed by the + allocation API is to let klp_shadow_alloc() resp. klp_shadow_get_or_alloc() + memcpy some user provided buffer to the freshly allocated shadow variable. + This is too limited for shadow structures containing pointers into + themselves like list_heads or mutexes. + Change the internal __klp_shadow_get_or_alloc() to take a pointer to an + initializer functions and call that in place of the memcpy() operation. + In order to retain former functionality of klp_shadow_alloc() and + klp_shadow_get_or_alloc(), make them pass the new + __klp_shadow_memcpy_init() wrapper to __klp_shadow_get_or_alloc(). + Finally, introduce the new klp_shadow_alloc_with_init() and + klp_shadow_get_or_alloc_with_init() which pass a user provided initializer + function pointer onwards to __klp_shadow_get_or_alloc(). +- commit 843c6fa + +------------------------------------------------------------------- +Wed Dec 6 14:40:14 CET 2017 - mbenes@suse.cz + +- Revert "shadow variables: introduce upstream patch" + This reverts commit e899c4fd3fe7602ebd70f578d8475f1049de7c78. +- commit a27c66a + +------------------------------------------------------------------- +Wed Dec 6 14:37:09 CET 2017 - mbenes@suse.cz + +- Revert "shadow variables: drop EXPORT_SYMBOL()s" + This reverts commit ac6cfebd7f831213ebcd4b2690672871572ec49e. +- commit 40d0ba6 + +------------------------------------------------------------------- +Wed Dec 6 14:37:06 CET 2017 - mbenes@suse.cz + +- Revert "shadow variables: share shadow data among KGraft modules" + This reverts commit 8e1e705d4d56981949f7ae3854d8e1cc2be7f40f. +- commit d184b38 + +------------------------------------------------------------------- +Wed Dec 6 14:36:56 CET 2017 - mbenes@suse.cz + +- Revert "shadow variables: add KGR_SHADOW_ID helper" + This reverts commit 237c8f3d13c382321d3e65d138d328eae0b82f6c. +- commit 22d6153 + +------------------------------------------------------------------- +Wed Dec 6 12:18:06 CET 2017 - mbenes@suse.cz + +- rpm/config.sh: Use SUSE:SLE-15:GA project +- commit ff32fc9 + +------------------------------------------------------------------- +Wed Dec 6 12:14:17 CET 2017 - mbenes@suse.cz + +- Revert "scripts: Generate ExclusiveArch in spec file dynamically" + This reverts commit 95ed856ea8f99b4e48d7d324278b3628d2ac2fa2. + SLE15 will support ppc64le arch from the beginning. +- commit 92e9bdb + +------------------------------------------------------------------- +Tue Dec 5 16:42:04 CET 2017 - mbenes@suse.cz + +- uname_patch: fix UNAME26 for 4.0 + Backport upstream commit 39afb5ee4640 ("kernel/sys.c: fix UNAME26 for + 4.0"). +- commit 5988feb + +------------------------------------------------------------------- +Mon Dec 4 15:25:24 CET 2017 - mbenes@suse.cz + +- Revert "Add compat.h to deal with changes of KGR_PATCH macro" + This reverts commit 4186bef35862029a2fd36ba4a73d5fa538992709. + All currently supported kernels (that is, everything since + SLE12_Update_14 and SLE12-SP1_Update_5) have sympos support. We can drop + compat, because we don't need it anymore. +- commit 11e3220 + +------------------------------------------------------------------- +Thu Nov 30 15:15:20 CET 2017 - mbenes@suse.cz + +- scripts: Generate ExclusiveArch in spec file dynamically + ppc64le architecture kernel support is not present in all currently + supported branches. It may cause problem for the maintenance team. + Generate ExclusiveArch dynamically. It should be 'ppc64le x86_64' for + SLE12-SP3 and 'x86_64' for the rest. +- commit 95ed856 + +------------------------------------------------------------------- +Thu Nov 16 14:27:46 CET 2017 - mbenes@suse.cz + +- rpm/kgraft-patch.spec: Add ppc64le as a supported arch + ppc64le is about to be supported in Live Patching product. Add it to + ExclusiveArch tag. +- commit 8437c94 + +------------------------------------------------------------------- +Thu Nov 16 14:26:35 CET 2017 - mbenes@suse.cz + +- rpm/kgraft-patch.spec: Remove s390x from supported archs + s390x is not supported in Live Patching product. Remove it from + ExclusiveArch. +- commit f9614f2 + +------------------------------------------------------------------- +Tue Oct 31 10:34:53 CET 2017 - nstange@suse.de + +- livepatch_main.c: klp_patch_init(): fix error handling + In case either of the invocations of klp_register_patch() or + klp_enable_patch() fails, anything which has been setup by the prior + per-(sub-)patch initialiation code, i.e. the expansion of + @@KLP_PATCHES_INIT_CALLS@@, won't get undone. + Fix this. + Also make klp_patch_init() look more like the common 'goto err' idiom + and adjust scripts/register_patches.sh accordingly. + Fix for commit 7e20201cdcb8 ("kGraft to livepatch migration. API + change."). +- commit 6552b44 + +------------------------------------------------------------------- +Tue Oct 31 10:34:52 CET 2017 - nstange@suse.de + +- scripts/register_patches.sh: generate klp_object array + The KLP API doesn't take a flat list of to be patched functions + like KGraft did, but introduces an intermediate layer: struct + klp_object. + Each klp_patch instance is supposed to reference an array of + klp_object's which in turn provide an array of klp_func's each. + To facilitate merging, we want to generate this list of klp_object's + automatically, exactly like we did for the flat function list with KGraft. + For each klp_patch instance, there must be at most one klp_object entry + referring to the same object. + Hence care must be taken not to add an entry for the same object twice + in case two different (sub-)patches both patch some functions therein. + Require from each (sub-)patch to provide the list of to be patched + symbols in a file named SUBPATCH/patched_funcs.csv with each line + conforming to the + obj old_func(,sympos) new_func + pattern. + Make scripts/register.sh generate an klp_object array initializer based on + this and let it expand the @@KLP_PATCHES_OBJS@@ tag within livepatch_main.c + accordingly. + Do not replace the now obsolete @@KLP_PATCHES_FUNCS@@ anymore. + Add and remove the @@KLP_PATCHES_OBJS@@ and @@KLP_PATCHES_FUNCS@@ + markers to and from livepatch_main.c respectively. + [ mb: amend copy&paste error ($newfun at the end of uname klp_func[]) ] +- commit 0fe721b + +------------------------------------------------------------------- +Thu Oct 26 13:54:06 CEST 2017 - lpechacek@suse.com + +- kGraft to livepatch migration. External rename. + External rename and thus final step of kGraft -> upstream livepatch + migration. kgraft-patch* modules are now livepatch* and live in + /lib/modules/$(uname -r)/livepatch. + References: fate#323682 + [ mb: changelog ] +- commit f842fd5 + +------------------------------------------------------------------- +Thu Oct 5 12:12:29 CEST 2017 - nstange@suse.de + +- shadow variables: add KGR_SHADOW_ID helper + As shadow variables are supposed to be shared among different KGraft + modules their id's must be compile time constants. + Introduce the KGR_SHADOW_ID helper macro for generating them in a uniform + manner based on the bsc# number and a local id. +- commit 237c8f3 + +------------------------------------------------------------------- +Thu Oct 5 12:12:28 CEST 2017 - nstange@suse.de + +- shadow variables: share shadow data among KGraft modules + As it stands, each KGraft module maintains its own set of shadow variable + management structures and thus, shadow variables are not sharable between + livepatch modules. + This behaviour is different from the upstream implementation and, as + pointed out by Miroslav Benes, it also opens up an opportunity for a small + window where the system might become vulnerable again during transition as + we stack new livepatches on top. + Let all KGraft patches share the shadow data. + Sharing is implemented by moving the management structures from a KGraft + module's .data to dynamically allocated memory. Each KGraft module will + have specifically named pointers, 'kgr_shadow_hash12' and + 'kgr_shadow_lock12', referencing them. + Upon initialization, a KGraft module will discover already existing such + shadow data by kallsyms-searching all loaded modules for these pointer + symbols. If none is found, a new instance is allocated. The newly + introduced kgr_shadow_init() implementing this is idempotent and can thus + be called from the bsc# subpatches' initializers if needed. + Upon KGraft module removal, the new kgr_shadow_cleanup() will conduct + another kallsyms search and deallocate the shadow data in case there are + no more users. kgr_shadow_cleanup() is also idempotent. + Initialization and teardown of the common shadow data is serialized with + the module_mutex which has to be taken for the kallsyms search anyway. +- commit 8e1e705 + +------------------------------------------------------------------- +Thu Oct 5 12:12:27 CEST 2017 - nstange@suse.de + +- shadow variables: drop EXPORT_SYMBOL()s + The shadow variable API will only ever get used by the KGraft module itself + and thus, there's no need for exporting it. + Drop all EXPORT_SYMBOL annotations. +- commit ac6cfeb + +------------------------------------------------------------------- +Thu Oct 5 12:12:26 CEST 2017 - nstange@suse.de + +- shadow variables: introduce upstream patch + Joe Lawrence posted the sixth version of his shadow variable patch [1] + implementing the association of additional out-of-band data members to + existing structure instances from livepatches. + Jiri Kosina has applied this to his + git://git.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching.git for-4.15/shadow-variables + tree and thus, it's queued up and close to getting merged. + The plan is to eventually backport this shadow variable support to SLE + kernels, but we also want to have it usable from KGraft modules by now. + Port the implementation to the kraft-patches module. + Namely, + - dump shadow.c in it's current upstream state as it is after commits + 439e7271dc2b ("livepatch: introduce shadow variable API") + 5d9da759f758 ("livepatch: __klp_shadow_get_or_alloc() is local to + shadow.c") + 19205da6a0da ("livepatch: Small shadow variable documentation fixes") + - add a shadow.h header and declare the newly introduced functions there + - and incorporate the new files into the KGraft module's build system. + [1] 1504211861-19899-2-git-send-email-joe.lawrence@redhat.com + ("[PATCH v6] livepatch: introduce shadow variable API") +- commit e899c4f + +------------------------------------------------------------------- +Wed Jul 12 11:14:40 CEST 2017 - lpechacek@suse.com + +- kGraft to livepatch migration. API change. + Change from kGraft API to livepatch API. + Note: error handling in _init() function is broken and fixed later. + Automatic generation of klp_objects is not present at all. Added later. + References: fate#323682 + [ mb: changelog, patch split, whitespace errors ] +- commit 7e20201 + +------------------------------------------------------------------- +Wed Jul 12 11:08:57 CEST 2017 - lpechacek@suse.com + +- kGraft to livepatch migration. Internal rename. + Internal rename in preparation for kGraft -> upstream livepatch + migration. External module naming stays the same. API is not touched + yet. + References: fate#323682 + [ mb: changelog edit ] +- commit 28a04a2 + +------------------------------------------------------------------- +Tue Jun 13 15:54:27 CEST 2017 - nstange@suse.de + +- scripts/register-patches.sh: register subpatch sources in rpm spec + In order to reduce the manual merging work upon addition of new + (sub)patches, commit 4e8dc885be22 ("scripts: create kgr_patch_main.c + dynamically") introduced the register-patches.sh helper. It discovers + those and tweaks the main entry point, kgr_patch_main.c, as needed. + However, a remaining manual merging task is to list a (sub)patch's source + archive in rpm/kgraft-patch.spec and to %setup it. + Make scripts/register-patches.sh do this. + Namely, +- introduce the @@KGR_PATCHES_SOURCES@@ and @@KGR_PATCHES_SETUP_SOURCES@@ + placeholders in rpm/kgraft-patch.spec +- and make scripts/register-patches.sh expand those within a spec file + to be given as an additional command line argument. + Finally, adjust scripts/tar-up.sh accordingly. +- commit 9eafc8a + +------------------------------------------------------------------- +Tue Jun 13 15:51:42 CEST 2017 - nstange@suse.de + +- scripts/register-patches.sh: don't add ','s to @@KGR_PATCHES_FUNCS@@ + register-patches.sh expands kgr_patch_main.c's @@KGR_PATCHES_FUNCS@@ + placeholder by concatenating all available patches' KGR_PATCH__FUNCS + together, separating them by commas. + The KGR_PATCH__FUNCS are CPP macros supposed to be provided by each + patch. If one of these happens to be empty, the preprocessed expansion + will contain two consecutive commas which gcc doesn't like in array + initializers. + Do not add any commas to the @@KGR_PATCHES_FUNCS@@ expansion but require + the individual KGR_PATCH__FUNCS macros to already contain trailing + ones as needed. + Fixes: 4e8dc885be22 ("scripts: create kgr_patch_main.c dynamically") +- commit ba41416 + +------------------------------------------------------------------- +Wed Jun 7 12:05:41 CEST 2017 - nstange@suse.de + +- scripts: create kgr_patch_main.c dynamically + The kgraft-patches repository has got many branches, each corresponding + to a supported codestream. Each of those carries a potentially different + set of live (sub)patches which are controlled through the entry points in + kgr_patch_main.c. According to Miroslav, merging of a new (sub)patch + based on the pristine master is a pita due to conflicts. + Since all (sub)patches stick to certain conventions already, the required + modifications of the merging-hotspot kgr_patch_main.c are quite mechanic. + Let a script do the work. + Namely, +- insert some special @@-embraced placeholders at the few places depending + on the actual set of (sub)patches, +- let register-patches.sh discover the available (sub)patches by searching + for directories +- and let register-patches.sh replace those placeholders in + kgr_patch_main.c + Finally, add a register-patches.sh invocation to tar-up.sh. + This procedure requires that a SUBPATCH located in directory SUBPATCH/ + adheres to the following conventions: +- It must provide a provide a SUBPATCH/kgr_patch_SUBPATCH.h header. +- This header must provide declarations for kgr_patch_SUBPATCH_init() + and kgr_patch_SUBPATCH_cleanup(). +- This header must also #define a KGR_PATCH_SUBPATCH_FUNCS macro. + It should expand to a comma separated list of KGR_PATCH*() entries, + each corresponding to a function the subpatch wants to replace. + [mbenes: fixed typos, empty line removed] +- commit 4e8dc88 + +------------------------------------------------------------------- +Mon Apr 24 16:00:54 CEST 2017 - mbenes@suse.cz + +- Replace $(PWD) with $(CURDIR) in Makefile + CURDIR is an internal variable of make and more suitable. +- commit 03bf1d5 + +------------------------------------------------------------------- +Wed Apr 19 14:02:27 CEST 2017 - mbenes@suse.cz + +- Create Makefile automatically + Introduce scripts/create-makefile.sh script to automatically create a + makefile. The scripts is called from tar-up.sh or could be called + manually. +- commit 1af6c29 + +------------------------------------------------------------------- +Mon Oct 24 13:26:09 CEST 2016 - mbenes@suse.cz + +- Better to use SUSE:SLE-12:Update than Devel:kGraft:SLE12 project +- commit bdc7598 + +------------------------------------------------------------------- +Tue May 10 15:43:59 CEST 2016 - mbenes@suse.cz + +- Add compat.h to deal with changes of KGR_PATCH macro + Sympos patch set for kGraft redefined KGR_PATCH macro and added two new + ones. Add new compat.h which contains macro magic so that all kGraft + patches would work on both old and new kernels with the patch set + merged. +- commit 4186bef + +------------------------------------------------------------------- +Fri May 6 17:01:17 CEST 2016 - mbenes@suse.cz + +- Fix the number of parameters of KGR_PATCH macro + New kernels contain kGraft's sympos patch set which changed number of + paramaters of KGR_PATCH macro and introduced new macros. Fix it in + master so it will be ok for new branches. +- commit 78cf676 + +------------------------------------------------------------------- +Tue Sep 1 13:00:23 CEST 2015 - mmarek@suse.com + +- Include the RPM version number in the module name +- commit 8fa02c6 + +------------------------------------------------------------------- +Wed Aug 26 11:29:44 CEST 2015 - mbenes@suse.cz + +- Remove forgotten debug option in the Makefile +- commit 9c24ab8 + +------------------------------------------------------------------- +Mon Aug 17 13:42:04 CEST 2015 - mbenes@suse.cz + +- Add license and copyright notices +- commit d42d3aa + +------------------------------------------------------------------- +Wed Jul 15 15:58:35 CEST 2015 - mbenes@suse.cz + +- Remove immediate flag + Fake signal was merged to kGraft and immediate feature removed. Remove + it in kGraft patches from now on too. +- commit c767ad2 + +------------------------------------------------------------------- +Wed May 20 16:32:17 CEST 2015 - mbenes@suse.cz + +- Set immediate flag to false + Using immediate set to true can lead to BUGs and oopses when + downgrading, reverting or applying replace_all patches. There is no way + how to find out if there is a process in the old code which is being + removed. The module would be put, removed and the process will crash. + The consistency model guarantees that there is no one in the old code + when the finalization ends. Thus use it for all case to be safe. +- commit 830e1a3 + +------------------------------------------------------------------- +Tue May 12 15:48:07 CEST 2015 - mbenes@suse.cz + +- Fix description in rpm spec file + Spec file description mentions initial kGraft patch which is only true + for real initial patch. Make it more neutral. + References: bsc#930408 +- commit a55e023 + +------------------------------------------------------------------- +Wed Apr 1 15:36:24 CEST 2015 - mbenes@suse.cz + +- Generate archives names automatically in tar-up.sh +- commit 1f34f18 + +------------------------------------------------------------------- +Wed Apr 1 13:39:26 CEST 2015 - mbenes@suse.cz + +- Automatically generate .changes file from git log + Also add comments to tar-up.sh script to distinguish between sections. +- commit 212a7ae + +------------------------------------------------------------------- +Thu Mar 26 14:24:21 CET 2015 - mmarek@suse.cz + +- Revert "Require exact kernel version in the patch" + This needs to be done differently, so that modprobe --force works as + expected. + References: bnc#920615 + This reverts commit c62c11aecd4e3f8822e1b835fea403acc3148c5a. +- commit bc88dd7 + +------------------------------------------------------------------- +Wed Mar 25 13:10:24 CET 2015 - mmarek@suse.cz + +- Require exact kernel version in the patch + References: bnc#920615 +- commit c62c11a + +------------------------------------------------------------------- +Tue Mar 24 12:15:41 CET 2015 - mmarek@suse.cz + +- Add the git commit and branch to the package description + References: bnc#920633 +- commit 1ff4e48 + +------------------------------------------------------------------- +Wed Nov 26 10:09:14 CET 2014 - mbenes@suse.cz + +- Set immediate flag for the initial patch + Setting immediate to true will simplify installation of the initial patch and + possibly also of the further updates. + References: bnc#907150 +- commit 391b810 + +------------------------------------------------------------------- +Tue Nov 25 16:26:40 CET 2014 - mbenes@suse.cz + +- Add .replace_all set to true + Add .replace_all flag set to true even to the initial patch. Thus we will not + forget to add that later. Also .immediate is there as a comment. +- commit 933e15e + +------------------------------------------------------------------- +Mon Nov 24 15:02:33 CET 2014 - mmarek@suse.cz + +- Drop the hardcoded kernel release string + The updated kgraft-devel macros set this during build time, so we do not + need to know the kernel release string beforehand. As a name suffix for + the source packages, let's use SLE12_Test in the master branch and + SLE12_Update_ in the update branches. +- commit 65f7a25 + +------------------------------------------------------------------- +Fri Nov 21 15:48:48 CET 2014 - mmarek@suse.cz + +- Check that we are building against the set kernel version +- commit 689e44a + +------------------------------------------------------------------- +Wed Nov 12 04:11:14 CET 2014 - mmarek@suse.cz + +- Mark the module as supported + References: bnc#904970 +- commit 6249314 + +------------------------------------------------------------------- +Tue Nov 11 17:11:28 CET 2014 - mmarek@suse.cz + +- Build the test packages against Devel:kGraft:SLE12 +- commit c952fbb + +------------------------------------------------------------------- +Thu Nov 6 13:55:43 CET 2014 - mbenes@suse.cz + +- Add top git commit hash to uname -v + Add top git commit hash to version part of uname. This makes the identification + of current patch level easy (even in crash: p kgr_tag). + References: fate#317769 +- commit 54c9595 + +------------------------------------------------------------------- +Tue Nov 4 16:23:50 CET 2014 - mbenes@suse.cz + +- Replace @@RELEASE@@ in kgr_patch->name with @@RPMRELEASE@@ + We need to replace @@RELEASE@@ in kgr_patch->name with @@RPMRELEASE@@ due to + sysfs tree. @@RELEASE@@ changes with each new version of package. +- commit 51fd9dd + +------------------------------------------------------------------- +Mon Nov 3 17:27:24 CET 2014 - mmarek@suse.cz + +- Add a source-timestamp file with the git commit hash and branch + This is required by the bs-upload-kernel script to upload packages to + the BS. It can also be used by the specfile in the future. +- commit feab4f1 + +------------------------------------------------------------------- +Mon Nov 3 16:56:31 CET 2014 - mbenes@suse.cz + +- Initial commit +- commit 600de9d + +------------------------------------------------------------------- +Mon Nov 3 14:59:46 CET 2014 - mmarek@suse.cz + +- Add config.sh script + This tells the automatic builder which IBS project to use. +- commit aa7f1cb + diff --git a/kernel-livepatch-MICRO-6-0_Update_3.spec b/kernel-livepatch-MICRO-6-0_Update_3.spec new file mode 100644 index 0000000..542b0f2 --- /dev/null +++ b/kernel-livepatch-MICRO-6-0_Update_3.spec @@ -0,0 +1,101 @@ +# +# spec file for package Kernel live patch module +# +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# + +# needssslcertforbuild + +%define variant %{nil} + + +Name: kernel-livepatch-MICRO-6-0_Update_3 +Version: 1 +Release: 1 +%define module_num %(echo %version-%release | sed 'y/\./_/') +License: GPL-2.0 +Summary: Kernel live patch module +Group: System/Kernel +Source0: uname_patch.tar.bz2 +Source1: Makefile +Source2: livepatch_main.c +Source3: config.sh +Source4: source-timestamp +Source5: shadow.h +Source6: kallsyms_relocs.h +Source7: kallsyms_relocs.c +Source8: klp_convert.h +Source9: klp_syscalls.h +Source10: klp_trace.h +# Auto expanded KLP_PATCHES_SOURCES: + +BuildRequires: kernel-syms%{variant} kernel-livepatch-tools-devel libelf-devel +%if 0%{?use_klp_convert} +%if "%{?variant}" +BuildRequires: kernel%{variant}-livepatch-devel +%else +BuildRequires: kernel-default-livepatch-devel +%endif +%endif +ExclusiveArch: x86_64 s390x +%klp_module_package + +%description +This is a live patch for SUSE Linux Enterprise Server kernel. + +Source timestamp: 2024-09-30 17:57:42 +0200 +GIT Revision: f95a323f762f7473c999e35e7104ddccdc398462 +GIT Branch: MICRO-6-0_Update_3 + +%prep +%setup -c +# Auto expanded KLP_PATCHES_SETUP_SOURCES: + +cp %_sourcedir/livepatch_main.c . +cp %_sourcedir/shadow.h . +cp %_sourcedir/kallsyms_relocs.h . +cp %_sourcedir/kallsyms_relocs.c . +cp %_sourcedir/Makefile . +cp %_sourcedir/klp_convert.h . +cp %_sourcedir/klp_syscalls.h . +cp %_sourcedir/klp_trace.h . + +%build +sed -i 's/@@RPMRELEASE@@/%module_num/g' Makefile +sed -i 's/@@RPMRELEASE@@/%module_num/g' livepatch_main.c +echo 'livepatch-%module_num' >Module.supported +set -- * + +for flavor in %flavors_to_build; do + mkdir -p "obj/$flavor" + cp -r "$@" "obj/$flavor" + make -C %{kernel_source $flavor} M="$PWD/obj/$flavor" modules + + %if 0%{?use_klp_convert} + module=$(find "obj/$flavor" -name 'livepatch*.ko' -printf '%f') + klp-convert /usr/src/linux-obj/%_target_cpu/$flavor/Symbols.list \ + obj/$flavor/$module obj/$flavor/${module}_converted + mv obj/$flavor/${module}_converted obj/$flavor/$module + %endif +done + +%install +export INSTALL_MOD_DIR=livepatch +export INSTALL_MOD_PATH=%buildroot +for flavor in %flavors_to_build; do + make -C %{kernel_source $flavor} M="$PWD/obj/$flavor" modules_install +done + +%changelog + diff --git a/klp_convert.h b/klp_convert.h new file mode 100644 index 0000000..587c775 --- /dev/null +++ b/klp_convert.h @@ -0,0 +1,16 @@ +#ifndef _KLP_KLPCONVERT_H +#define _KLP_KLPCONVERT_H + +#ifdef USE_KLP_CONVERT + +#define KLP_SYM_LINKAGE extern +#define KLP_SYM(sym) sym + +#else + +#define KLP_SYM_LINKAGE static +#define KLP_SYM(sym) (*klp_##sym) + +#endif + +#endif diff --git a/klp_syscalls.h b/klp_syscalls.h new file mode 100644 index 0000000..d8cfbbf --- /dev/null +++ b/klp_syscalls.h @@ -0,0 +1,111 @@ +#ifndef _KLP_SYSCALLS_H +#define _KLP_SYSCALLS_H + +#include +#include + +/* + * For kernels after 4.17.0, syscalls' symbol names as constructed by + * the kernel's __SYSCALL_DEFINEx macro depend on kernel version and + * architecture. +*/ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) +/* C.f. include/linux/syscalls.h */ +#define KLP_SYSCALL_SYM(name) SyS_ ## name + +#ifdef CONFIG_COMPAT +/* What comes out of COMPAT_SYSCALL_DEFINEx(). */ +#define KLP_COMPAT_SYSCALL_SYM(name) compat_SyS_ ## name + +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + asmlinkage long sym(__MAP(x,__SC_LONG,__VA_ARGS__)) + +#endif /* CONFIG_COMPAT */ + + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) */ + + +#if defined(CONFIG_X86_64) +/* C.f. arch/x86/include/asm/syscall_wrapper.h */ +#define KLP_SYSCALL_SYM(name) __x64_sys_ ## name + +#ifdef CONFIG_IA32_EMULATION +#define KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS 1 +/* Compat stub for common syscalls. */ +#define KLP_SYSCALL_COMPAT_STUB_SYM(name) __ia32_sys_ ## name +#endif /* CONFIG_IA32_EMULATION */ + +#ifdef CONFIG_COMPAT +/* What comes out of COMPAT_SYSCALL_DEFINEx(). */ +#define KLP_COMPAT_SYSCALL_SYM(name) __ia32_compat_sys_ ## name +#endif /* CONFIG_COMPAT */ + +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + asmlinkage long sym(const struct pt_regs *) + + +#elif defined(CONFIG_S390) +/* C.f. arch/s390/include/asm/syscall_wrapper.h */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0) +#define KLP_SYSCALL_SYM(name) __se_sys_ ## name + +#ifdef CONFIG_COMPAT +#define KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS 1 +/* Compat stub for common syscalls. */ +#define KLP_SYSCALL_COMPAT_STUB_SYM(name) __s390_sys_ ## name +#define KLP_COMPAT_SYSCALL_SYM(name) __se_compat_sys_ ## name +#endif /* CONFIG_COMPAT */ + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0) */ +#define KLP_SYSCALL_SYM(name) __s390x_sys_ ## name + +#ifdef CONFIG_COMPAT +#define KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS 1 +/* Compat stub for common syscalls. */ +#define KLP_SYSCALL_COMPAT_STUB_SYM(name) __s390_sys_ ## name +#define KLP_COMPAT_SYSCALL_SYM(name) __s390_compat_sys_ ## name +#endif /* CONFIG_COMPAT */ + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + asmlinkage long sym(__MAP(x,__SC_LONG,__VA_ARGS__)) +#else +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + long sym(struct pt_regs *regs) +#endif + +#elif defined(CONFIG_PPC64) +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) +/* C.f. include/linux/syscalls.h */ +#define KLP_SYSCALL_SYM(name) __se_sys_ ## name + +#ifdef CONFIG_COMPAT +#define KLP_COMPAT_SYSCALL_SYM(name) __se_compat_sys_ ## name +#endif /* CONFIG_COMPAT */ + +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + asmlinkage long sym(__MAP(x,__SC_LONG,__VA_ARGS__)) + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) */ +/* C.f. arch/powerpc/include/asm/syscalls_wrapper.h */ +#define KLP_SYSCALL_SYM(name) sys_ ## name + +#ifdef CONFIG_COMPAT +/* C.f. include/linux/compat.h */ +#define KLP_COMPAT_SYSCALL_SYM(name) __se_compat_sys_ ## name +#endif /* CONFIG_COMPAT */ + +#define KLP_SYSCALL_DECLx(x, sym, ...) \ + long sym(const struct pt_regs *regs) + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) */ + +#else +#error "Architecture not supported." +#endif + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) */ +#endif /* _KLP_SYSCALLS_H */ diff --git a/klp_trace.h b/klp_trace.h new file mode 100644 index 0000000..53828cd --- /dev/null +++ b/klp_trace.h @@ -0,0 +1,101 @@ +#ifndef _KLP_TRACE_H +#define _KLP_TRACE_H + +#include +#include + +/* + * Since kernel 5.12, the data_args was removed from __DECLARE_TRACE. + * Since kernel 5.10, the __tracepoint_iter_ symbols were renamed to + * __traceiter_ in order to have shorter symbol names. + * As we currently support kernels from 5.3 and then 5.14, we don't need special + * ifdefery for kernel 5.10. +*/ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) +#define KLPR___DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ + static struct tracepoint (*klpe___tracepoint_##name); \ + static inline void klpr_trace_##name(proto) \ + { \ + if (unlikely(static_key_enabled(&(*klpe___tracepoint_##name).key))) \ + __DO_TRACE(&(*klpe___tracepoint_##name), \ + TP_PROTO(data_proto), \ + TP_ARGS(data_args), \ + TP_CONDITION(cond), 0); \ + if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \ + rcu_read_lock_sched_notrace(); \ + rcu_dereference_sched((*klpe___tracepoint_##name).funcs); \ + rcu_read_unlock_sched_notrace(); \ + } \ + } \ + +#define KLPR_DECLARE_TRACE(name, proto, args) \ + KLPR___DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \ + cpu_online(raw_smp_processor_id()), \ + PARAMS(void *__data, proto), \ + PARAMS(__data, args)) + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) */ + +#define KLPR___DO_TRACE_CALL(name, args) (*klpe___traceiter_##name)(NULL, args) + +#define KLPR___DO_TRACE(name, args, cond, rcuidle) \ + do { \ + int __maybe_unused __idx = 0; \ + \ + if (!(cond)) \ + return; \ + \ + /* srcu can't be used from NMI */ \ + WARN_ON_ONCE(rcuidle && in_nmi()); \ + \ + /* keep srcu and sched-rcu usage consistent */ \ + preempt_disable_notrace(); \ + \ + /* \ + * For rcuidle callers, use srcu since sched-rcu \ + * doesn't work from the idle path. \ + */ \ + if (rcuidle) { \ + __idx = srcu_read_lock_notrace(&tracepoint_srcu);\ + rcu_irq_enter_irqson(); \ + } \ + \ + KLPR___DO_TRACE_CALL(name, TP_ARGS(args)); \ + \ + if (rcuidle) { \ + rcu_irq_exit_irqson(); \ + srcu_read_unlock_notrace(&tracepoint_srcu, __idx);\ + } \ + \ + preempt_enable_notrace(); \ + } while (0) + +#define KLPR___DECLARE_TRACE(name, proto, args, cond, data_proto) \ + static int (*klpe___traceiter_##name)(data_proto); \ + static struct tracepoint (*klpe___tracepoint_##name); \ + static inline void klpr_trace_##name(proto) \ + { \ + if (static_key_enabled(&(*klpe___tracepoint_##name).key)) \ + KLPR___DO_TRACE(name, \ + TP_ARGS(args), \ + TP_CONDITION(cond), 0); \ + if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \ + rcu_read_lock_sched_notrace(); \ + rcu_dereference_sched((*klpe___tracepoint_##name).funcs);\ + rcu_read_unlock_sched_notrace(); \ + } \ + } \ + + +#define KLPR_DECLARE_TRACE(name, proto, args) \ + KLPR___DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \ + cpu_online(raw_smp_processor_id()), \ + PARAMS(void *__data, proto)) + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) */ + +#define KLPR_TRACE_EVENT(name, proto, args) \ + KLPR_DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) + +#endif /* _KLP_TRACE_H */ diff --git a/livepatch_main.c b/livepatch_main.c new file mode 100644 index 0000000..e2328fe --- /dev/null +++ b/livepatch_main.c @@ -0,0 +1,92 @@ +/* + * livepatch_main.c - kernel live patch main infrastructure + * + * Copyright (c) 2014 SUSE + * Author: Miroslav Benes + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include +#include + +#include "uname_patch/livepatch_uname.h" + +/* Auto expanded KLP_PATCHES_INCLUDES: */ + + +static struct klp_object objs[] = { + /* Auto expanded KLP_PATCHES_OBJS: */ + { + .name = NULL, + .funcs = (struct klp_func[]) { + { + .old_name = __stringify(KLP_SYSCALL_SYM(newuname)), + .new_func = KLP_SYSCALL_SYM(klp_newuname), + }, +#ifdef KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS + { + .old_name = __stringify(KLP_SYSCALL_COMPAT_STUB_SYM(newuname)), + .new_func = KLP_SYSCALL_COMPAT_STUB_SYM(klp_newuname), + }, +#endif + { } + } + }, + { } +}; + +static struct klp_patch patch = { + .mod = THIS_MODULE, + .objs = objs, + .replace = true, +}; + +static int __init klp_patch_init(void) +{ + int retval; + + pr_info("livepatch: initializing\n"); + + retval = klp_patch_uname_init(); + if (retval) + return retval; + + /* Auto expanded KLP_PATCHES_INIT_CALLS: */ + + + retval = klp_enable_patch(&patch); + if (!retval) + return retval; + + /* Auto expanded KLP_PATCHES_INIT_ERR_HANDLERS: */ + + return retval; +} + +static void __exit klp_patch_cleanup(void) +{ + pr_info("livepatch: removed\n"); + + /* Auto expanded KLP_PATCHES_CLEANUP_CALLS: */ + +} + +module_init(klp_patch_init); +module_exit(klp_patch_cleanup); + +MODULE_LICENSE("GPL"); +MODULE_INFO(livepatch, "Y"); +MODULE_INFO(klpgitrev, "f95a323f762f7473c999e35e7104ddccdc398462"); diff --git a/shadow.h b/shadow.h new file mode 100644 index 0000000..1625fc2 --- /dev/null +++ b/shadow.h @@ -0,0 +1,6 @@ +#ifndef _KLP_SHADOW_H +#define _KLP_SHADOW_H + +#define KLP_SHADOW_ID(bsc, id) (((unsigned long)(bsc) << 6) | id) + +#endif diff --git a/source-timestamp b/source-timestamp new file mode 100644 index 0000000..fdf8ae4 --- /dev/null +++ b/source-timestamp @@ -0,0 +1,3 @@ +2024-09-30 17:57:42 +0200 +GIT Revision: f95a323f762f7473c999e35e7104ddccdc398462 +GIT Branch: MICRO-6-0_Update_3 diff --git a/uname_patch.tar.bz2 b/uname_patch.tar.bz2 new file mode 100644 index 0000000..5f8a7ff --- /dev/null +++ b/uname_patch.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06304233dffa47689fa0ffa873439e99d679c0a698f343908ccbe032aa0669c1 +size 2243