From dc117ba0b6da38cfe56643d627794e62da5cd977 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Thu, 27 Feb 2020 17:15:29 -0500 Subject: [PATCH] rebase from upstream v0.9.0 Signed-off-by: Zhipeng Xie --- ..._addressable_-to-maybe_discarded_sym.patch | 35 - ...01-support-compile-kpatch-on-aarch64.patch | 59 +- ...od-patch-fix-patch-linking-with-4.20.patch | 36 - ...uild-support-build-patch-for-aarch64.patch | 684 +++++++++++++++ ...ct-new-static-var-should-be-included.patch | 29 +- 0003-kmod-patch-more-linking-fixes.patch | 42 - ...ff-object-allow-changing-subsections.patch | 75 -- ...e-THIS-modname-as-the-name-of-ddebug.patch | 20 +- ...ct-fix-correlate-static-local-variab.patch | 14 +- ...ct-don-t-create-dynamic-reloc-for-sy.patch | 16 +- ...ct-create-dynamic-relocs-for-changed.patch | 18 +- ...patch => 0008-fix-rodata.str-problem.patch | 14 +- ...-hook-don-t-active-patch-when-insmod.patch | 52 ++ ...build-enhance-for-out-of-tree-module.patch | 133 +++ 0011-support-c-plus-kernel-module.patch | 193 ++++ 0012-symbol-lookup-enhancement.patch | 454 ++++++++++ ...el-symbol-table-to-help-symbol-looku.patch | 171 ++++ ...ch-hook-support-force-enable-disable.patch | 46 +- ...atch-build-ignore-debuginfo-in-patch.patch | 64 ++ ...h.patch => 0016-add-object-in-kpatch.patch | 14 +- ...diff-object-fix-.orc_unwind_ip-error.patch | 42 + ...-hook-don-t-active-patch-when-insmod.patch | 34 - ...port-third-party-module-make-hotpatc.patch | 208 ----- ...port-makefile-not-in-third-party-mod.patch | 92 -- ...d-support-build-patch-for-old-kernel.patch | 349 -------- ...d-support-cross-compile-hotpatch-for.patch | 480 ---------- ...-use-.klp.rela-in-euleros-7.5-kernel.patch | 48 - ...d-fix-duplicate-symbol-relocation-fo.patch | 365 -------- ...ct-add-dynamic-reloction-for-functio.patch | 31 - ...ct-exclude-line-only-change-for-arm6.patch | 106 --- ...lude-secsym-in-kpatch_mark_ignored_s.patch | 31 - 9018-support-c-plus-kernel-module.patch | 828 ------------------ ...ild-adapt-for-ksymtab-in-4.19-kernel.patch | 28 - ...force-enable-disable-for-kernel-4.19.patch | 91 -- ...h-build-adapt-for-native-compile_env.patch | 118 --- ...special_section_data_arm64-for-arm64.patch | 96 -- ...tic-local-symbol-for-longname-symbol.patch | 31 - ...mpilation-with-CONFIG_HAVE_ARCH_PREL.patch | 34 - kpatch-0.6.1.tar.gz | Bin 147195 -> 0 bytes kpatch-0.9.0.tar.gz | Bin 0 -> 197824 bytes kpatch.spec | 60 +- livepatch | 73 +- make_hotpatch | 465 +++++----- os_hotpatch | 439 +++++----- 44 files changed, 2424 insertions(+), 3794 deletions(-) delete mode 100644 0001-Add-__addressable_-to-maybe_discarded_sym.patch rename 9017-support-compile-kpatch-on-aarch64.patch => 0001-support-compile-kpatch-on-aarch64.patch (56%) delete mode 100644 0002-kmod-patch-fix-patch-linking-with-4.20.patch create mode 100644 0002-kpatch-build-support-build-patch-for-aarch64.patch rename 9004-create-diff-object-new-static-var-should-be-included.patch => 0003-create-diff-object-new-static-var-should-be-included.patch (66%) delete mode 100644 0003-kmod-patch-more-linking-fixes.patch delete mode 100644 0004-create-diff-object-allow-changing-subsections.patch rename 9005-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch => 0004-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch (65%) rename 9006-create-diff-object-fix-correlate-static-local-variab.patch => 0005-create-diff-object-fix-correlate-static-local-variab.patch (83%) rename 9007-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch => 0006-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch (61%) rename 9012-create-diff-object-create-dynamic-relocs-for-changed.patch => 0007-create-diff-object-create-dynamic-relocs-for-changed.patch (82%) rename 9019-fix-rodata.str-problem.patch => 0008-fix-rodata.str-problem.patch (67%) create mode 100644 0009-livepatch-patch-hook-don-t-active-patch-when-insmod.patch create mode 100644 0010-kpatch-build-enhance-for-out-of-tree-module.patch create mode 100644 0011-support-c-plus-kernel-module.patch create mode 100644 0012-symbol-lookup-enhancement.patch create mode 100644 0013-Add-running-kernel-symbol-table-to-help-symbol-looku.patch rename 9008-livepatch-patch-hook-support-force-enable-disable-fu.patch => 0014-livepatch-patch-hook-support-force-enable-disable.patch (50%) create mode 100644 0015-kpatch-build-ignore-debuginfo-in-patch.patch rename 9028-add-object-in-kpatch.patch => 0016-add-object-in-kpatch.patch (64%) create mode 100644 0017-create-diff-object-fix-.orc_unwind_ip-error.patch delete mode 100644 9001-livepatch-patch-hook-don-t-active-patch-when-insmod.patch delete mode 100644 9002-kpatch-build-support-third-party-module-make-hotpatc.patch delete mode 100644 9003-kpatch-build-support-makefile-not-in-third-party-mod.patch delete mode 100644 9009-kmod-kpatch-build-support-build-patch-for-old-kernel.patch delete mode 100644 9010-kmod-kpatch-build-support-cross-compile-hotpatch-for.patch delete mode 100644 9011-kpatch-build-use-.klp.rela-in-euleros-7.5-kernel.patch delete mode 100644 9013-kmod-kpatch-build-fix-duplicate-symbol-relocation-fo.patch delete mode 100644 9014-create-diff-object-add-dynamic-reloction-for-functio.patch delete mode 100644 9015-create-diff-object-exclude-line-only-change-for-arm6.patch delete mode 100644 9016-kpatch-build-include-secsym-in-kpatch_mark_ignored_s.patch delete mode 100644 9018-support-c-plus-kernel-module.patch delete mode 100644 9023-kpatch-build-adapt-for-ksymtab-in-4.19-kernel.patch delete mode 100644 9024-support-force-enable-disable-for-kernel-4.19.patch delete mode 100644 9025-kpatch-build-adapt-for-native-compile_env.patch delete mode 100644 9026-add-find_special_section_data_arm64-for-arm64.patch delete mode 100644 9027-fix-ref-static-local-symbol-for-longname-symbol.patch delete mode 100644 9030-kmod-core-fix-compilation-with-CONFIG_HAVE_ARCH_PREL.patch delete mode 100644 kpatch-0.6.1.tar.gz create mode 100644 kpatch-0.9.0.tar.gz diff --git a/0001-Add-__addressable_-to-maybe_discarded_sym.patch b/0001-Add-__addressable_-to-maybe_discarded_sym.patch deleted file mode 100644 index 8e9d463..0000000 --- a/0001-Add-__addressable_-to-maybe_discarded_sym.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 722d27f6bdd4fa012e08db784bf9bb93bb75be2c Mon Sep 17 00:00:00 2001 -From: Artem Savkov -Date: Tue, 16 Oct 2018 16:05:01 +0200 -Subject: [PATCH] Add "__addressable_" to maybe_discarded_sym(). - -Starting with 1b1eeca7e4c1 "init: allow initcall tables to be emitted using -relative references" [1] __init functions are generating an "__addressable_" -symbol in a ".discarded.addressable" section so it does not show up in final -vmlinux triggering find_local_syms failures. Add "_addressable_" to the list -in maybe_discarded_sym(). - -[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1b1eeca7e4c19fa76d409d4c7b338dba21f2df45 - -Signed-off-by: Artem Savkov ---- - kpatch-build/lookup.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c -index b88dc59..7c8e635 100644 ---- a/kpatch-build/lookup.c -+++ b/kpatch-build/lookup.c -@@ -80,7 +80,8 @@ static int maybe_discarded_sym(const char *name) - */ - if (!strncmp(name, "__exitcall_", 11) || - !strncmp(name, "__brk_reservation_fn_", 21) || -- !strncmp(name, "__func_stack_frame_non_standard_", 32)) -+ !strncmp(name, "__func_stack_frame_non_standard_", 32) || -+ !strncmp(name, "__addressable_", 14)) - return 1; - - return 0; --- -1.7.12.4 - diff --git a/9017-support-compile-kpatch-on-aarch64.patch b/0001-support-compile-kpatch-on-aarch64.patch similarity index 56% rename from 9017-support-compile-kpatch-on-aarch64.patch rename to 0001-support-compile-kpatch-on-aarch64.patch index fd80a2f..603b86c 100644 --- a/9017-support-compile-kpatch-on-aarch64.patch +++ b/0001-support-compile-kpatch-on-aarch64.patch @@ -1,15 +1,15 @@ -From 50782f658313574a530f80d2f4b78fe23488c6c2 Mon Sep 17 00:00:00 2001 +From 33c4d7a2a31ca10ce943d7ab0603bd814f4ac530 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Thu, 20 Dec 2018 04:55:38 +0000 -Subject: [PATCH] support compile kpatch on aarch64 +Subject: [PATCH 01/17] support compile kpatch on aarch64 delete __x86_64__ to support compile kpatch on aarch64. Signed-off-by: Zhipeng Xie --- kpatch-build/Makefile | 3 +++ - kpatch-build/create-diff-object.c | 16 +--------------- - 2 files changed, 4 insertions(+), 15 deletions(-) + kpatch-build/create-diff-object.c | 14 +------------- + 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/kpatch-build/Makefile b/kpatch-build/Makefile index 232b336..974e0f2 100644 @@ -26,10 +26,10 @@ index 232b336..974e0f2 100644 SOURCES += gcc-plugins/ppc64le-plugin.c PLUGIN = gcc-plugins/ppc64le-plugin.so diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 97ae0d4..80a76a9 100644 +index c9d2cc6..7b1deb0 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -426,7 +426,6 @@ out: +@@ -470,7 +470,6 @@ out: log_debug("section %s has changed\n", sec->name); } @@ -37,7 +37,7 @@ index 97ae0d4..80a76a9 100644 /* * Determine if a section has changed only due to a WARN* or might_sleep * macro call's embedding of the line number into an instruction operand. -@@ -537,7 +536,7 @@ static int kpatch_line_macro_change_only(struct section *sec) +@@ -581,7 +580,7 @@ static int kpatch_line_macro_change_only(struct section *sec) return 1; } @@ -46,7 +46,7 @@ index 97ae0d4..80a76a9 100644 #define PPC_INSTR_LEN 4 #define PPC_RA_OFFSET 16 -@@ -603,11 +602,6 @@ static int kpatch_line_macro_change_only(struct section *sec) +@@ -647,11 +646,6 @@ static int kpatch_line_macro_change_only(struct section *sec) return 1; } @@ -56,25 +56,25 @@ index 97ae0d4..80a76a9 100644 - return 0; -} #endif - #define ARM64_INSTR_LEN 4 - static int arm64_kpatch_line_macro_change_only(struct section *sec) -@@ -1248,7 +1242,6 @@ static void kpatch_compare_correlated_elements(struct kpatch_elf *kelf) + + static void kpatch_compare_sections(struct list_head *seclist) +@@ -1202,7 +1196,6 @@ static void kpatch_compare_correlated_elements(struct kpatch_elf *kelf) kpatch_compare_symbols(&kelf->symbols); } -#ifdef __x86_64__ - static void rela_insn(struct section *sec, struct rela *rela, struct insn *insn) + static void rela_insn(const struct section *sec, const struct rela *rela, + struct insn *insn) { - unsigned long insn_addr, start, end, rela_addr; -@@ -1267,7 +1260,6 @@ static void rela_insn(struct section *sec, struct rela *rela, struct insn *insn) +@@ -1226,7 +1219,6 @@ static void rela_insn(const struct section *sec, const struct rela *rela, return; } } -#endif - /* - * Mangle the relas a little. The compiler will sometimes use section symbols -@@ -1810,7 +1802,6 @@ static int ex_table_group_size(struct kpatch_elf *kelf, int offset) + static bool is_callback_section(struct section *sec) { + +@@ -1771,7 +1763,6 @@ static int jump_table_group_size(struct kpatch_elf *kelf, int offset) return size; } @@ -82,7 +82,7 @@ index 97ae0d4..80a76a9 100644 static int parainstructions_group_size(struct kpatch_elf *kelf, int offset) { static int size = 0; -@@ -1845,7 +1836,6 @@ static int smp_locks_group_size(struct kpatch_elf *kelf, int offset) +@@ -1806,7 +1797,6 @@ static int smp_locks_group_size(struct kpatch_elf *kelf, int offset) { return 4; } @@ -90,28 +90,15 @@ index 97ae0d4..80a76a9 100644 #ifdef __powerpc64__ static int fixup_entry_group_size(struct kpatch_elf *kelf, int offset) { -@@ -1921,7 +1911,6 @@ static struct special_section special_sections[] = { - .name = "__bug_table", - .group_size = bug_table_group_size, +@@ -1901,7 +1891,6 @@ static struct special_section special_sections[] = { + .name = "__jump_table", + .group_size = jump_table_group_size, }, -#ifdef __x86_64__ { .name = ".smp_locks", .group_size = smp_locks_group_size, -@@ -1930,7 +1919,6 @@ static struct special_section special_sections[] = { - .name = ".parainstructions", - .group_size = parainstructions_group_size, - }, --#endif - { - .name = ".fixup", - .group_size = fixup_group_size, -@@ -1939,12 +1927,10 @@ static struct special_section special_sections[] = { - .name = "__ex_table", /* must come after .fixup */ - .group_size = ex_table_group_size, - }, --#ifdef __x86_64__ - { +@@ -1914,7 +1903,6 @@ static struct special_section special_sections[] = { .name = ".altinstructions", .group_size = altinstructions_group_size, }, @@ -120,5 +107,5 @@ index 97ae0d4..80a76a9 100644 { .name = "__ftr_fixup", -- -2.19.1 +2.18.1 diff --git a/0002-kmod-patch-fix-patch-linking-with-4.20.patch b/0002-kmod-patch-fix-patch-linking-with-4.20.patch deleted file mode 100644 index 4fa997e..0000000 --- a/0002-kmod-patch-fix-patch-linking-with-4.20.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 17a97b48bcf0d486007b746c48321bab6dedb2d8 Mon Sep 17 00:00:00 2001 -From: Artem Savkov -Date: Wed, 14 Nov 2018 15:09:34 +0100 -Subject: [PATCH] kmod/patch: fix patch linking with 4.20 - -4.20 includes commit 69ea912fda74 "kbuild: remove unneeded link_multi_deps" -which changes kbuild so that only '.o' files are given to ld as targets -for linking, leaving out our linker script. Even before this commit we -were still doing this wrong and were succeeding just because ld is smart -enough to detect the script, it even throws a warning: - -ld: warning: kpatch.lds contains output sections; did you forget -T? - -The right thing to do is to add the script to ldflags either through -kbuilds 'ldflags-y' or by adding it to LDFLAGS/KPATCH_LDFLAGS directly. - -Signed-off-by: Artem Savkov ---- - kmod/patch/Makefile | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/kmod/patch/Makefile b/kmod/patch/Makefile -index 96d1fca..7ba0820 100644 ---- a/kmod/patch/Makefile -+++ b/kmod/patch/Makefile -@@ -11,6 +11,7 @@ KBUILD_CFLAGS_MODULE += -mcmodel=large - endif - - obj-m += $(KPATCH_NAME).o -+ldflags-y += -T $(src)/kpatch.lds - - $(KPATCH_NAME)-objs += patch-hook.o kpatch.lds output.o - --- -1.7.12.4 - diff --git a/0002-kpatch-build-support-build-patch-for-aarch64.patch b/0002-kpatch-build-support-build-patch-for-aarch64.patch new file mode 100644 index 0000000..033602e --- /dev/null +++ b/0002-kpatch-build-support-build-patch-for-aarch64.patch @@ -0,0 +1,684 @@ +From 6dd77e9f5bc044a1f80ad89bb9d7f60756b39755 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 07:09:50 -0500 +Subject: [PATCH 02/17] kpatch-build: support build patch for aarch64 + +use R_AARCH64_ABS64 for aarch64 + +exclude line only change for arm64 by compare mov instruction +except immediate part. + +add find_special_section_data_arm64 for arm64: +arm64 kernel have no paravirt_patch_site or orc_entry structure +in vmlinux, we don't need to check these two struct for arm64. + +support cross compile for aarch64 + +Signed-off-by: Zhipeng Xie +--- + kpatch-build/create-diff-object.c | 216 ++++++++++++++++++++++++---- + kpatch-build/create-kpatch-module.c | 24 +++- + kpatch-build/kpatch-build | 116 ++++++++++++++- + kpatch-build/kpatch-gcc | 4 +- + 4 files changed, 319 insertions(+), 41 deletions(-) + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index 7b1deb0..58789f1 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -76,6 +76,31 @@ enum subsection { + + enum loglevel loglevel = NORMAL; + ++#ifndef EM_X86_64 ++#define EM_X86_64 62 ++#endif ++ ++#ifndef EM_AARCH64 ++#define EM_AARCH64 183 ++#endif ++ ++#ifndef R_AARCH64_ABS64 ++#define R_AARCH64_NONE 0 ++#define R_AARCH64_ABS64 257 ++#define R_AARCH64_CALL26 283 ++#endif ++ ++static unsigned int arch; ++static unsigned int absolute_rela_type; ++ ++static unsigned int arch_of_elf(Elf *elf) ++{ ++ GElf_Ehdr eh; ++ if (!gelf_getehdr(elf, &eh)) ++ ERROR("gelf_getehdr"); ++ return eh.e_machine; ++} ++ + /******************* + * Data structures + * ****************/ +@@ -647,6 +672,67 @@ static int kpatch_line_macro_change_only(struct section *sec) + return 1; + } + #endif ++#define ARM64_INSTR_LEN 4 ++static int arm64_kpatch_line_macro_change_only(struct section *sec) ++{ ++ unsigned long start1, start2, size, offset; ++ struct rela *rela; ++ int lineonly = 0, found; ++ unsigned int mov_imm_mask = ((1<<16) - 1)<<5; ++ ++ if (sec->status != CHANGED || ++ is_rela_section(sec) || ++ !is_text_section(sec) || ++ sec->sh.sh_size != sec->twin->sh.sh_size || ++ !sec->rela || ++ sec->rela->status != SAME) ++ return 0; ++ ++ start1 = (unsigned long)sec->twin->data->d_buf; ++ start2 = (unsigned long)sec->data->d_buf; ++ size = sec->sh.sh_size; ++ for (offset = 0; offset < size; offset += ARM64_INSTR_LEN) { ++ if (!memcmp((void *)start1 + offset, (void *)start2 + offset, ++ ARM64_INSTR_LEN)) ++ continue; ++ ++ /* verify it's a mov immediate to w1 */ ++ if ((*(int *)(start1 + offset) & ~mov_imm_mask) != ++ (*(int *)(start2 + offset) & ~mov_imm_mask)) ++ return 0; ++ ++ found = 0; ++ list_for_each_entry(rela, &sec->rela->relas, list) { ++ if (rela->offset < offset + ARM64_INSTR_LEN) ++ continue; ++ if (rela->string) ++ continue; ++ if (!strncmp(rela->sym->name, "__warned.", 9)) ++ continue; ++ if (!strncmp(rela->sym->name, "warn_slowpath_", 14) || ++ (!strcmp(rela->sym->name, "__warn_printk")) || ++ (!strcmp(rela->sym->name, "__might_sleep")) || ++ (!strcmp(rela->sym->name, "___might_sleep")) || ++ (!strcmp(rela->sym->name, "__might_fault")) || ++ (!strcmp(rela->sym->name, "printk")) || ++ (!strcmp(rela->sym->name, "lockdep_rcu_suspicious"))) { ++ found = 1; ++ break; ++ } ++ return 0; ++ } ++ if (!found) ++ return 0; ++ ++ lineonly = 1; ++ } ++ ++ if (!lineonly) ++ ERROR("no instruction changes detected for changed section %s", ++ sec->name); ++ ++ return 1; ++} + + static void kpatch_compare_sections(struct list_head *seclist) + { +@@ -662,7 +748,16 @@ static void kpatch_compare_sections(struct list_head *seclist) + + /* exclude WARN-only, might_sleep changes */ + list_for_each_entry(sec, seclist, list) { +- if (kpatch_line_macro_change_only(sec)) { ++ int line_only; ++ ++ if (arch == EM_X86_64) ++ line_only = kpatch_line_macro_change_only(sec); ++ else if (arch == EM_AARCH64) ++ line_only = arm64_kpatch_line_macro_change_only(sec); ++ else ++ line_only = 0; ++ ++ if (line_only) { + log_debug("reverting macro / line number section %s status to SAME\n", + sec->name); + sec->status = SAME; +@@ -722,6 +817,8 @@ static void kpatch_compare_correlated_symbol(struct symbol *sym) + if ((sym2->sec->twin && sym2->sec->twin->ignore) || + kpatch_subsection_changed(sym1->sec, sym2->sec)) + sym->status = CHANGED; ++ else if (sym1->name[0] == '$') /* reserved symbols in aarch64 */ ++ log_debug("maping symbols: %s", sym1->name); /* do nothing just ignogre */ + else + DIFF_FATAL("symbol changed sections: %s", sym1->name); + } +@@ -1289,22 +1386,22 @@ static void kpatch_replace_sections_syms(struct kpatch_elf *kelf) + continue; + } + +-#ifdef __powerpc64__ + add_off = 0; +-#else +- if (rela->type == R_X86_64_PC32 || +- rela->type == R_X86_64_PLT32) { +- struct insn insn; +- rela_insn(sec, rela, &insn); +- add_off = (long)insn.next_byte - +- (long)sec->base->data->d_buf - +- rela->offset; +- } else if (rela->type == R_X86_64_64 || +- rela->type == R_X86_64_32S) +- add_off = 0; +- else +- continue; +-#endif ++ if (arch == EM_X86_64) { ++ if (rela->type == R_X86_64_PC32 || ++ rela->type == R_X86_64_PLT32) { ++ struct insn insn; ++ rela_insn(sec, rela, &insn); ++ add_off = (long)insn.next_byte - ++ (long)sec->base->data->d_buf - ++ rela->offset; ++ } else if (rela->type == R_X86_64_64 || ++ rela->type == R_X86_64_32S) ++ add_off = 0; ++ else ++ continue; ++ } ++ /* add_off is always equal to 0 on arm64 */ + + /* + * Attempt to replace references to unbundled sections +@@ -2401,7 +2498,7 @@ static void kpatch_create_kpatch_arch_section(struct kpatch_elf *kelf, char *obj + /* entries[index].sec */ + ALLOC_LINK(rela, &karch_sec->rela->relas); + rela->sym = sec->secsym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = 0; + rela->offset = index * sizeof(struct kpatch_arch) + \ + offsetof(struct kpatch_arch, sec); +@@ -2409,7 +2506,7 @@ static void kpatch_create_kpatch_arch_section(struct kpatch_elf *kelf, char *obj + /* entries[index].objname */ + ALLOC_LINK(rela, &karch_sec->rela->relas); + rela->sym = strsym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = offset_of_string(&kelf->strings, objname); + rela->offset = index * sizeof(struct kpatch_arch) + \ + offsetof(struct kpatch_arch, objname); +@@ -2607,7 +2704,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, + */ + ALLOC_LINK(rela, &relasec->relas); + rela->sym = sym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = 0; + rela->offset = index * sizeof(*funcs); + +@@ -2617,7 +2714,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, + */ + ALLOC_LINK(rela, &relasec->relas); + rela->sym = strsym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = offset_of_string(&kelf->strings, sym->name); + rela->offset = index * sizeof(*funcs) + + offsetof(struct kpatch_patch_func, name); +@@ -2628,7 +2725,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, + */ + ALLOC_LINK(rela, &relasec->relas); + rela->sym = strsym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = objname_offset; + rela->offset = index * sizeof(*funcs) + + offsetof(struct kpatch_patch_func,objname); +@@ -2686,7 +2783,10 @@ static int function_ptr_rela(const struct rela *rela) + rela_toc->addend == (int)rela_toc->sym->sym.st_value && + (rela->type == R_X86_64_32S || + rela->type == R_PPC64_TOC16_HA || +- rela->type == R_PPC64_TOC16_LO_DS)); ++ rela->type == R_PPC64_TOC16_LO_DS || ++ rela->type == R_AARCH64_ADR_PREL_PG_HI21 || ++ rela->type == R_AARCH64_ADD_ABS_LO12_NC)); ++ + } + + static int may_need_dynrela(const struct rela *rela) +@@ -2940,7 +3040,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + /* add rela to fill in ksyms[index].name field */ + ALLOC_LINK(rela2, &ksym_sec->rela->relas); + rela2->sym = strsym; +- rela2->type = ABSOLUTE_RELA_TYPE; ++ rela2->type = absolute_rela_type; + rela2->addend = offset_of_string(&kelf->strings, rela->sym->name); + rela2->offset = index * sizeof(*ksyms) + \ + offsetof(struct kpatch_symbol, name); +@@ -2948,7 +3048,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + /* add rela to fill in ksyms[index].objname field */ + ALLOC_LINK(rela2, &ksym_sec->rela->relas); + rela2->sym = strsym; +- rela2->type = ABSOLUTE_RELA_TYPE; ++ rela2->type = absolute_rela_type; + rela2->addend = offset_of_string(&kelf->strings, sym_objname); + rela2->offset = index * sizeof(*ksyms) + \ + offsetof(struct kpatch_symbol, objname); +@@ -2969,7 +3069,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + ERROR("can't create dynrela for section %s (symbol %s): no bundled or section symbol", + sec->name, rela->sym->name); + +- rela2->type = ABSOLUTE_RELA_TYPE; ++ rela2->type = absolute_rela_type; + rela2->addend = rela->offset; + rela2->offset = index * sizeof(*krelas) + \ + offsetof(struct kpatch_relocation, dest); +@@ -2977,7 +3077,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + /* add rela to fill in krelas[index].objname field */ + ALLOC_LINK(rela2, &krela_sec->rela->relas); + rela2->sym = strsym; +- rela2->type = ABSOLUTE_RELA_TYPE; ++ rela2->type = absolute_rela_type; + rela2->addend = offset_of_string(&kelf->strings, objname); + rela2->offset = index * sizeof(*krelas) + \ + offsetof(struct kpatch_relocation, objname); +@@ -2985,7 +3085,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + /* add rela to fill in krelas[index].ksym field */ + ALLOC_LINK(rela2, &krela_sec->rela->relas); + rela2->sym = ksym_sec_sym; +- rela2->type = ABSOLUTE_RELA_TYPE; ++ rela2->type = absolute_rela_type; + rela2->addend = index * sizeof(*ksyms); + rela2->offset = index * sizeof(*krelas) + \ + offsetof(struct kpatch_relocation, ksym); +@@ -3048,7 +3148,7 @@ static void kpatch_create_callbacks_objname_rela(struct kpatch_elf *kelf, char * + if (!strcmp(callbackp->name, sec->name)) { + ALLOC_LINK(rela, &sec->relas); + rela->sym = strsym; +- rela->type = ABSOLUTE_RELA_TYPE; ++ rela->type = absolute_rela_type; + rela->addend = objname_offset; + rela->offset = callbackp->offset; + break; +@@ -3101,6 +3201,7 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) + /* add rela in .rela__mcount_loc to fill in function pointer */ + ALLOC_LINK(rela, &relasec->relas); + rela->sym = sym; ++ if (arch == EM_X86_64) { + rela->type = R_X86_64_64; + rela->addend = 0; + rela->offset = index * sizeof(void*); +@@ -3136,6 +3237,40 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) + + rela->type = R_X86_64_PC32; + } ++ } else if (arch == EM_AARCH64) { ++ unsigned int *insnp; ++ rela->type = R_AARCH64_ABS64; ++ /* bl <__fentry__> is the second insn */ ++ rela->addend = 4; ++ rela->offset = index * sizeof(void*); ++ ++ newdata = malloc(sym->sec->data->d_size); ++ if (!newdata) ++ ERROR("malloc"); ++ ++ memcpy(newdata, sym->sec->data->d_buf, sym->sec->data->d_size); ++ sym->sec->data->d_buf = newdata; ++ insnp = newdata; ++ ++ /* ++ * mov x9, x30 ++ * nop //function in .text., so it be replaced with nop by recordmcount ++ * mov x30, x9 ++ */ ++ if (insnp[0] != 0xaa1e03e9 || insnp[1] != 0xd503201f || insnp[2] != 0xaa0903fe) ++ ERROR("%s: unexpected instruction at the start of the function", ++ sym->name); ++ ++ /* change the nop to bl __fentry__ */ ++ insnp[1] = 0x94000000; ++ rela = list_first_entry(&sym->sec->rela->relas, struct rela, ++ list); ++ rela->type = R_AARCH64_CALL26; ++ rela->offset = 4; ++ ++ } else { ++ ERROR("unsupport arch %d\n", arch); ++ } + + index++; + } +@@ -3334,6 +3469,8 @@ int main(int argc, char *argv[]) + char *hint = NULL, *orig_obj, *patched_obj, *parent_name; + char *parent_symtab, *mod_symvers, *patch_name, *output_obj; + struct sym_compare_type *base_locals, *sym_comp; ++ char *no_profiling_calls = NULL; ++ char *gcc_add_option = NULL, *mlongcall = NULL; + + arguments.debug = 0; + argp_parse (&argp, argc, argv, 0, NULL, &arguments); +@@ -3354,6 +3491,13 @@ int main(int argc, char *argv[]) + + kelf_base = kpatch_elf_open(orig_obj); + kelf_patched = kpatch_elf_open(patched_obj); ++ arch = arch_of_elf(kelf_base->elf); ++ if (arch == EM_X86_64) ++ absolute_rela_type = R_X86_64_64; ++ else if (arch == EM_AARCH64) ++ absolute_rela_type = R_AARCH64_ABS64; ++ else ++ ERROR("only arch x86_64 and arm64 be supported\n"); + + kpatch_compare_elf_headers(kelf_base->elf, kelf_patched->elf); + kpatch_check_program_headers(kelf_base->elf); +@@ -3392,7 +3536,12 @@ int main(int argc, char *argv[]) + */ + kpatch_mark_ignored_sections(kelf_patched); + kpatch_compare_correlated_elements(kelf_patched); +- kpatch_check_func_profiling_calls(kelf_patched); ++ no_profiling_calls = getenv("NO_PROFILING_CALLS"); ++ if (!no_profiling_calls) ++ kpatch_check_func_profiling_calls(kelf_patched); ++ else ++ log_debug("NO_PROFILING_CALLS set\n"); ++ + kpatch_elf_teardown(kelf_base); + kpatch_elf_free(kelf_base); + +@@ -3452,7 +3601,14 @@ int main(int argc, char *argv[]) + kpatch_create_callbacks_objname_rela(kelf_out, parent_name); + kpatch_build_strings_section_data(kelf_out); + +- kpatch_create_mcount_sections(kelf_out); ++ gcc_add_option = getenv("GCC_ADD_OPTION"); ++ if (gcc_add_option) ++ mlongcall = strstr(gcc_add_option, "-mlong-calls"); ++ if (arch == EM_AARCH64 && mlongcall) { ++ printf("-mlong-calls found, no need to create mcount section\n"); ++ } else { ++ kpatch_create_mcount_sections(kelf_out); ++ } + + /* + * At this point, the set of output sections and symbols is +diff --git a/kpatch-build/create-kpatch-module.c b/kpatch-build/create-kpatch-module.c +index 43d6809..6f80831 100644 +--- a/kpatch-build/create-kpatch-module.c ++++ b/kpatch-build/create-kpatch-module.c +@@ -31,6 +31,17 @@ + char *childobj; + enum loglevel loglevel = NORMAL; + ++static unsigned int arch; ++static unsigned int absolute_rela_type; ++ ++static unsigned int arch_of_elf(Elf *elf) ++{ ++ GElf_Ehdr eh; ++ if (!gelf_getehdr(elf, &eh)) ++ ERROR("gelf_getehdr"); ++ return eh.e_machine; ++} ++ + /* + * Create .kpatch.dynrelas from .kpatch.relocations and .kpatch.symbols sections + * +@@ -102,14 +113,14 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section + /* dest */ + ALLOC_LINK(rela, &dynsec->rela->relas); + rela->sym = sym; +- rela->type = R_X86_64_64; ++ rela->type = absolute_rela_type; + rela->addend = dest_offset; + rela->offset = index * sizeof(*dynrelas); + + /* name */ + ALLOC_LINK(rela, &dynsec->rela->relas); + rela->sym = strsec->secsym; +- rela->type = R_X86_64_64; ++ rela->type = absolute_rela_type; + rela->addend = name_offset; + rela->offset = index * sizeof(*dynrelas) + \ + offsetof(struct kpatch_patch_dynrela, name); +@@ -117,7 +128,7 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section + /* objname */ + ALLOC_LINK(rela, &dynsec->rela->relas); + rela->sym = strsec->secsym; +- rela->type = R_X86_64_64; ++ rela->type = absolute_rela_type; + rela->addend = objname_offset; + rela->offset = index * sizeof(*dynrelas) + \ + offsetof(struct kpatch_patch_dynrela, objname); +@@ -200,6 +211,13 @@ int main(int argc, char *argv[]) + childobj = basename(arguments.args[0]); + + kelf = kpatch_elf_open(arguments.args[0]); ++ arch = arch_of_elf(kelf->elf); ++ if (arch == EM_X86_64) ++ absolute_rela_type = R_X86_64_64; ++ else if (arch == EM_AARCH64) ++ absolute_rela_type = R_AARCH64_ABS64; ++ else ++ ERROR("only arch x86_64 and arm64 be supported\n"); + + /* + * Sanity checks: +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index ae0733c..17a5e11 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -299,12 +299,72 @@ find_special_section_data_ppc64le() { + return + } + ++find_special_section_data_arm64() { ++ ++ [[ "$CONFIG_JUMP_LABEL" -eq 0 ]] && AWK_OPTIONS="$AWK_OPTIONS -vskip_j=1" ++ ++ # If $AWK_OPTIONS are blank gawk would treat "" as a blank script ++ # shellcheck disable=SC2086 ++ SPECIAL_VARS="$(readelf -wi "$VMLINUX" | ++ gawk --non-decimal-data $AWK_OPTIONS ' ++ BEGIN { a = b = e = j = c = f = s = i = r = t = h = 0 } ++ ++ # Set state if name matches ++ a == 0 && /DW_AT_name.* alt_instr[[:space:]]*$/ {a = 1; next} ++ b == 0 && /DW_AT_name.* bug_entry[[:space:]]*$/ {b = 1; next} ++ e == 0 && /DW_AT_name.* exception_table_entry[[:space:]]*$/ {e = 1; next} ++ j == 0 && /DW_AT_name.* jump_entry[[:space:]]*$/ {j = 1; next} ++ c == 0 && /DW_AT_name.* klp_func[[:space:]]*$/ {c = 1; next} ++ t == 0 && /DW_AT_name.* klp_object[[:space:]]*$/ {t = 1; next} ++ ++ # Reset state unless this abbrev describes the struct size ++ a == 1 && !/DW_AT_byte_size/ { a = 0; next } ++ b == 1 && !/DW_AT_byte_size/ { b = 0; next } ++ e == 1 && !/DW_AT_byte_size/ { e = 0; next } ++ j == 1 && !/DW_AT_byte_size/ { j = 0; next } ++ c == 1 && /DW_TAG_structure_type/ { c = 3; next } ++ t == 1 && /DW_TAG_structure_type/ { t = 3; next } ++ c == 1 && /DW_AT_name.* force[[:space:]]*$/ {f = 2; next} ++ c == 1 && /DW_AT_name.* old_sympos[[:space:]]*$/ {s = 2; next} ++ i == 1 && /DW_AT_name.* immediate[[:space:]]*$/ {i = 2; next} ++ t == 1 && /DW_AT_name.* relocs[[:space:]]*$/ {r = 2; next} ++ t == 1 && /DW_AT_name.* hooks_load[[:space:]]*$/ {h = 2; next} ++ ++ # Now that we know the size, stop parsing for it ++ a == 1 {printf("export ALT_STRUCT_SIZE=%d\n", $4); a = 2} ++ b == 1 {printf("export BUG_STRUCT_SIZE=%d\n", $4); b = 2} ++ e == 1 {printf("export EX_STRUCT_SIZE=%d\n", $4); e = 2} ++ j == 1 {printf("export JUMP_STRUCT_SIZE=%d\n", $4); j = 2} ++ f == 2 {printf("export KLP_SUPPORT_FORCE=y\n"); f = 3} ++ s == 2 {printf("export KLP_SUPPORT_OLD_SYMPOS=y\n"); s = 3} ++ i == 2 {printf("export KLP_SUPPORT_IMMEDIATE=y\n"); i = 3} ++ r == 2 {printf("export KLP_SUPPORT_RELOCS=y\n"); r = 3} ++ h == 2 {printf("export KLP_SUPPORT_LOADHOOKS=y\n"); h = 3} ++ ++ # Bail out once we have everything ++ a == 2 && b == 2 && e == 2 && (j == 2 || skip_j) && c == 3 && t == 3 {exit}')" ++ ++ [[ -n "$SPECIAL_VARS" ]] && eval "$SPECIAL_VARS" ++ ++ [[ -z "$ALT_STRUCT_SIZE" ]] && die "can't find special struct alt_instr size" ++ [[ -z "$BUG_STRUCT_SIZE" ]] && die "can't find special struct bug_entry size" ++ [[ -z "$EX_STRUCT_SIZE" ]] && die "can't find special struct exception_table_entry size" ++ [[ -z "$JUMP_STRUCT_SIZE" && "$CONFIG_JUMP_LABEL" -ne 0 ]] && die "can't find special struct jump_entry size" ++ ++ return ++} ++ + find_special_section_data() { + if [[ "$ARCH" = "ppc64le" ]]; then + find_special_section_data_ppc64le + return + fi + ++ if [[ "$ARCH" = "arm64" ]]; then ++ find_special_section_data_arm64 ++ return ++ fi ++ + [[ "$CONFIG_PARAVIRT" -eq 0 ]] && AWK_OPTIONS="-vskip_p=1" + [[ "$CONFIG_UNWINDER_ORC" -eq 0 ]] && AWK_OPTIONS="$AWK_OPTIONS -vskip_o=1" + [[ "$CONFIG_JUMP_LABEL" -eq 0 ]] && AWK_OPTIONS="$AWK_OPTIONS -vskip_j=1" +@@ -428,6 +488,29 @@ find_kobj() { + done + } + ++arch_export() { ++ E_MACHINE=$(od -An -j18 -N2 -d $VMLINUX) ++ if [[ $E_MACHINE -eq 62 ]]; then ++ export ARCH=x86_64 ++ export ARCH_COMPILE= ++ export ENDIAN=little ++ export GCC_ADD_OPTION= ++ elif [[ $E_MACHINE -eq 183 ]]; then ++ export ARCH=arm64 ++ if [ $(arch) != "aarch64" ]; then ++ export ARCH_COMPILE=aarch64-linux-gnu- ++ fi ++ export ENDIAN=little ++ if grep "\-mlong-calls" /lib/modules/$ARCHVERSION/build//Makefile > /dev/null; then ++ export GCC_ADD_OPTION="-fno-section-anchors -mlong-calls" ++ else ++ export GCC_ADD_OPTION="-fno-section-anchors" ++ fi ++ else ++ die "only support arm64 or x86_64 architecture" ++ fi ++} ++ + # Only allow alphanumerics and '_' and '-' in the module name. Everything else + # is replaced with '-'. Also truncate to 48 chars so the full name fits in the + # kernel's 56-byte module name array. +@@ -786,13 +869,13 @@ apply_patches + remove_patches + + cp -LR "$DATADIR/patch" "$TEMPDIR" || die +- ++arch_export + if [[ "$ARCH" = "ppc64le" ]]; then + ARCH_KCFLAGS="-mcmodel=large -fplugin=$PLUGINDIR/ppc64le-plugin.so" + fi + + export KCFLAGS="-I$DATADIR/patch -ffunction-sections -fdata-sections \ +- $ARCH_KCFLAGS $DEBUG_KCFLAGS" ++ $ARCH_KCFLAGS $DEBUG_KCFLAGS ${GCC_ADD_OPTION}" + + echo "Reading special section data" + find_special_section_data +@@ -806,7 +889,7 @@ echo "Building original source" + unset KPATCH_GCC_TEMPDIR + # $TARGETS used as list, no quotes. + # shellcheck disable=SC2086 +-CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make "-j$CPUS" $TARGETS 2>&1 | logger || die ++CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make "-j$CPUS" $TARGETS 2>&1 | logger || die + + echo "Building patched source" + apply_patches +@@ -817,7 +900,7 @@ KPATCH_GCC_SRCDIR="$SRCDIR" + export KPATCH_GCC_SRCDIR + # $TARGETS used as list, no quotes. + # shellcheck disable=SC2086 +-CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ ++CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ + KBUILD_MODPOST_WARN=1 \ + make "-j$CPUS" $TARGETS 2>&1 | logger || die + +@@ -950,6 +1033,26 @@ if "$KPATCH_MODULE"; then + export KCPPFLAGS="-D__KPATCH_MODULE__" + fi + ++if [[ -n "$KLP_SUPPORT_FORCE" ]];then ++ export KCPPFLAGS="-D__KLP_SUPPORT_FORCE__ $KCPPFLAGS" ++fi ++ ++if [[ -n "$KLP_SUPPORT_OLD_SYMPOS" ]];then ++ export KCPPFLAGS="-DHAVE_SYMPOS $KCPPFLAGS" ++fi ++ ++if [[ -n "$KLP_SUPPORT_IMMEDIATE" ]];then ++ export KCPPFLAGS="-DHAVE_IMMEDIATE $KCPPFLAGS" ++fi ++ ++if [[ -n "$KLP_SUPPORT_RELOCS" ]];then ++ export KCPPFLAGS="-DHAVE_ELF_RELOCS $KCPPFLAGS" ++fi ++ ++if [[ -n "$KLP_SUPPORT_LOADHOOKS" ]];then ++ export KCPPFLAGS="-DHAVE_LOADHOOKS $KCPPFLAGS" ++fi ++ + echo "Building patch module: $MODNAME.ko" + + if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then +@@ -962,12 +1065,12 @@ fi + cd "$TEMPDIR/output" || die + # $KPATCH_LDFLAGS and result of find used as list, no quotes. + # shellcheck disable=SC2086,SC2046 +-ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die ++${ARCH_COMPILE}ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die + + if "$KPATCH_MODULE"; then + # Add .kpatch.checksum for kpatch script + md5sum ../patch/tmp_output.o | awk '{printf "%s\0", $1}' > checksum.tmp || die +- objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die ++ ${ARCH_COMPILE}objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die + rm -f checksum.tmp + "$TOOLSDIR"/create-kpatch-module "$TEMPDIR"/patch/tmp_output.o "$TEMPDIR"/patch/output.o 2>&1 | logger 1 + check_pipe_status create-kpatch-module +@@ -984,6 +1087,7 @@ fi + KPATCH_BUILD="$KPATCH_BUILD" KPATCH_NAME="$MODNAME" \ + KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \ + KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \ ++CROSS_COMPILE="$ARCH_COMPILE" \ + make 2>&1 | logger || die + + if ! "$KPATCH_MODULE"; then +diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc +index 9663290..35d7c1c 100755 +--- a/kpatch-build/kpatch-gcc ++++ b/kpatch-build/kpatch-gcc +@@ -13,7 +13,7 @@ fi + + declare -a args=("$@") + +-if [[ "$TOOLCHAINCMD" =~ "gcc" ]] ; then ++if [[ "$TOOLCHAINCMD" =~ "${ARCH_COMPILE}gcc" ]] ; then + while [ "$#" -gt 0 ]; do + if [ "$1" = "-o" ]; then + obj="$2" +@@ -60,7 +60,7 @@ if [[ "$TOOLCHAINCMD" =~ "gcc" ]] ; then + fi + shift + done +-elif [[ "$TOOLCHAINCMD" = "ld" ]] ; then ++elif [[ "$TOOLCHAINCMD" = "${ARCH_COMPILE}ld" ]] ; then + while [ "$#" -gt 0 ]; do + if [ "$1" = "-o" ]; then + obj="$2" +-- +2.18.1 + diff --git a/9004-create-diff-object-new-static-var-should-be-included.patch b/0003-create-diff-object-new-static-var-should-be-included.patch similarity index 66% rename from 9004-create-diff-object-new-static-var-should-be-included.patch rename to 0003-create-diff-object-new-static-var-should-be-included.patch index 55e5bb0..5e50783 100644 --- a/9004-create-diff-object-new-static-var-should-be-included.patch +++ b/0003-create-diff-object-new-static-var-should-be-included.patch @@ -1,8 +1,7 @@ -From fc6b9c5b1b3eb5d59186fe35cc90d3c06b07c537 Mon Sep 17 00:00:00 2001 +From 3af07fd0f178a4c6e2ae68207c3fedfd10672e65 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:24:36 +0000 -Subject: [PATCH 1004/1015] create-diff-object: new static var should be - included +Date: Tue, 25 Feb 2020 22:44:50 -0500 +Subject: [PATCH 03/17] create-diff-object: new static var should be included Before this patch, only global variables(no referenced) will be included by kpatch-build. But some macros put some static varibles @@ -15,14 +14,14 @@ cause a problem even the new static variables are in unbundled section. Signed-off-by: Zhou Chengming Signed-off-by: Zhipeng Xie --- - kpatch-build/create-diff-object.c | 15 +++++++++++++++ - 1 files changed, 15 insertions(+), 0 deletions(-) + kpatch-build/create-diff-object.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index d242d01..6e23295 100644 +index 58789f1..93570df 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -1536,6 +1536,20 @@ static void kpatch_include_force_elements(struct kpatch_elf *kelf) +@@ -1689,6 +1689,20 @@ static void kpatch_include_force_elements(struct kpatch_elf *kelf) sym->include = 0; } @@ -32,8 +31,8 @@ index d242d01..6e23295 100644 + + list_for_each_entry(sym, &kelf->symbols, list) { + if (sym->status == NEW && -+ sym->type == STT_OBJECT && -+ sym->bind == STB_LOCAL) ++ sym->bind == STB_LOCAL && ++ (sym->type == STT_OBJECT || (sym->type == STT_NOTYPE && sym->name[0] != '$'))) + kpatch_include_symbol(sym); + } + @@ -43,14 +42,14 @@ index d242d01..6e23295 100644 static int kpatch_include_new_globals(struct kpatch_elf *kelf) { struct symbol *sym; -@@ -3211,6 +3225,7 @@ int main(int argc, char *argv[]) +@@ -3554,6 +3568,7 @@ int main(int argc, char *argv[]) callbacks_exist = kpatch_include_callback_elements(kelf_patched); kpatch_include_force_elements(kelf_patched); new_globals_exist = kpatch_include_new_globals(kelf_patched); -+ kpatch_include_new_static_var(kelf_patched); ++ kpatch_include_new_static_var(kelf_patched); + + kpatch_process_special_sections(kelf_patched); - kpatch_print_changes(kelf_patched); - kpatch_dump_kelf(kelf_patched); -- -1.7.5.4 +2.18.1 diff --git a/0003-kmod-patch-more-linking-fixes.patch b/0003-kmod-patch-more-linking-fixes.patch deleted file mode 100644 index ab4b8bc..0000000 --- a/0003-kmod-patch-more-linking-fixes.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b2f40b03ce1778c7e97586e4111d22d3b28b3330 Mon Sep 17 00:00:00 2001 -From: Artem Savkov -Date: Fri, 7 Dec 2018 16:46:08 +0100 -Subject: [PATCH] kmod/patch: more linking fixes - -While adding proper linker script option my previous patch left the -linker script in the list of source files (on pre-4.20 kernels) for -ld somehow breaking kpatch callback sections. For this to work -properly kpatch.lds needs to be added to 'extra-y' instead of objs. And -for kbuild to process this option properly we need to call make without -the .ko target, i.e. let kbuild decide what to build. - -Fixes: 17a97b4 ("kmod/patch: fix patch linking with 4.20") -Signed-off-by: Artem Savkov ---- - kmod/patch/Makefile | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/kmod/patch/Makefile b/kmod/patch/Makefile -index 7ba0820..e017b17 100644 ---- a/kmod/patch/Makefile -+++ b/kmod/patch/Makefile -@@ -12,13 +12,14 @@ endif - - obj-m += $(KPATCH_NAME).o - ldflags-y += -T $(src)/kpatch.lds -+extra-y := kpatch.lds - --$(KPATCH_NAME)-objs += patch-hook.o kpatch.lds output.o -+$(KPATCH_NAME)-objs += patch-hook.o output.o - - all: $(KPATCH_NAME).ko - - $(KPATCH_NAME).ko: -- $(KPATCH_MAKE) $(KPATCH_NAME).ko -+ $(KPATCH_MAKE) - - patch-hook.o: patch-hook.c kpatch-patch-hook.c livepatch-patch-hook.c - $(KPATCH_MAKE) patch-hook.o --- -1.7.12.4 - diff --git a/0004-create-diff-object-allow-changing-subsections.patch b/0004-create-diff-object-allow-changing-subsections.patch deleted file mode 100644 index e573d43..0000000 --- a/0004-create-diff-object-allow-changing-subsections.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 942cc3ace7edb7c15f40f931dd6f47a934b9fc77 Mon Sep 17 00:00:00 2001 -From: Artem Savkov -Date: Tue, 12 Jun 2018 17:33:17 +0200 -Subject: [PATCH] create-diff-object: allow changing subsections - -gcc8 can place functions to .text.unlikely and .text.hot subsections -during optimizations. Allow symbols to change subsections instead of -failing. - -Signed-off-by: Artem Savkov - -backport from: -https://github.com/jpoimboe/kpatch/commit/35cc6ff0162fc8008c4c639fdfcabd61b38a982f ---- - kpatch-build/create-diff-object.c | 28 ++++++++++++++++++++++++++-- - 1 file changed, 26 insertions(+), 2 deletions(-) - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 2ddd00d..61ce74f 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -68,6 +68,12 @@ - - char *childobj; - -+enum subsection { -+ SUBSECTION_NORMAL, -+ SUBSECTION_HOT, -+ SUBSECTION_UNLIKELY -+}; -+ - enum loglevel loglevel = NORMAL; - - #ifndef EM_X86_64 -@@ -708,6 +714,22 @@ static void kpatch_compare_sections(struct list_head *seclist) - } - } - -+static enum subsection kpatch_subsection_type(struct section *sec) -+{ -+ if (!strncmp(sec->name, ".text.unlikely.", 15)) -+ return SUBSECTION_UNLIKELY; -+ -+ if (!strncmp(sec->name, ".text.hot.", 10)) -+ return SUBSECTION_HOT; -+ -+ return SUBSECTION_NORMAL; -+} -+ -+static int kpatch_subsection_changed(struct section *sec1, struct section *sec2) -+{ -+ return kpatch_subsection_type(sec1) != kpatch_subsection_type(sec2); -+} -+ - static void kpatch_compare_correlated_symbol(struct symbol *sym) - { - struct symbol *sym1 = sym, *sym2 = sym->twin; -@@ -720,10 +742,12 @@ static void kpatch_compare_correlated_symbol(struct symbol *sym) - /* - * If two symbols are correlated but their sections are not, then the - * symbol has changed sections. This is only allowed if the symbol is -- * moving out of an ignored section. -++ * moving out of an ignored section, or moving between normal/hot/unlikely -++ * subsections. - */ - if (sym1->sec && sym2->sec && sym1->sec->twin != sym2->sec) { -- if (sym2->sec->twin && sym2->sec->twin->ignore) -+ if ((sym2->sec->twin && sym2->sec->twin->ignore) || -+ kpatch_subsection_changed(sym1->sec, sym2->sec)) - sym->status = CHANGED; - else if (sym1->name[0] == '$') /* reserved symbols in aarch64 */ - log_debug("maping symbols: %s", sym1->name); /* do nothing just ignogre */ --- -2.19.1 - diff --git a/9005-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch b/0004-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch similarity index 65% rename from 9005-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch rename to 0004-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch index ea84d33..1a5d168 100644 --- a/9005-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch +++ b/0004-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch @@ -1,7 +1,7 @@ -From 858cc1f1ef2565d6ffa539550fc13af7e62863e4 Mon Sep 17 00:00:00 2001 +From c03772c4e29473eae68009c12efc182238d103c7 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:24:42 +0000 -Subject: [PATCH 1005/1015] livepatch, fix: use THIS modname as the name of +Subject: [PATCH 04/17] livepatch, fix: use THIS modname as the name of ddebug_table We just want a unique name for every module, so put a _ddebug in @@ -12,21 +12,21 @@ Suggested-by: Li Bin Signed-off-by: Zhou Chengming Signed-off-by: Zhipeng Xie --- - kmod/patch/livepatch-patch-hook.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) + kmod/patch/livepatch-patch-hook.c | 1 + + 1 file changed, 1 insertion(+) diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index e59a377..2c0cadd 100644 +index e12fd50..613d037 100644 --- a/kmod/patch/livepatch-patch-hook.c +++ b/kmod/patch/livepatch-patch-hook.c -@@ -452,6 +452,7 @@ out: +@@ -473,6 +473,7 @@ out: static void __exit patch_exit(void) { -+ pr_debug("make THIS modname first\n"); ++ pr_debug("make THIS modname first\n"); + #ifndef HAVE_SIMPLE_ENABLE WARN_ON(klp_unregister_patch(lpatch)); - } - + #endif -- -1.7.5.4 +2.18.1 diff --git a/9006-create-diff-object-fix-correlate-static-local-variab.patch b/0005-create-diff-object-fix-correlate-static-local-variab.patch similarity index 83% rename from 9006-create-diff-object-fix-correlate-static-local-variab.patch rename to 0005-create-diff-object-fix-correlate-static-local-variab.patch index 83526e1..1d8c46a 100644 --- a/9006-create-diff-object-fix-correlate-static-local-variab.patch +++ b/0005-create-diff-object-fix-correlate-static-local-variab.patch @@ -1,7 +1,7 @@ -From 2f95a0fa6214a97f60a0d5ba4dc0cda152d5c7d4 Mon Sep 17 00:00:00 2001 +From 5504f36c6de3abae8a4f7ba11f7a2838ddbc5b58 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:24:51 +0000 -Subject: [PATCH 1006/1015] create-diff-object: fix correlate static local +Subject: [PATCH 05/17] create-diff-object: fix correlate static local variables for __param section kpatch-build correlate fail when no sections reference @@ -27,14 +27,14 @@ copy_module_from_fd.isra.43+0x53/0x150 Signed-off-by: Zhipeng Xie --- - kpatch-build/create-diff-object.c | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) + kpatch-build/create-diff-object.c | 4 ++++ + 1 file changed, 4 insertions(+) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 6e23295..bd7dd37 100644 +index 93570df..9f1abc0 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -925,6 +925,10 @@ static int kpatch_is_normal_static_local(struct symbol *sym) +@@ -1094,6 +1094,10 @@ static int kpatch_is_normal_static_local(struct symbol *sym) if (is_special_static(sym)) return 0; @@ -46,5 +46,5 @@ index 6e23295..bd7dd37 100644 } -- -1.7.5.4 +2.18.1 diff --git a/9007-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch b/0006-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch similarity index 61% rename from 9007-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch rename to 0006-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch index 298afbc..6528070 100644 --- a/9007-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch +++ b/0006-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch @@ -1,7 +1,7 @@ -From 0a92ec9f158340501151bf350050597414affece Mon Sep 17 00:00:00 2001 +From 16aa1e59851c29ce63b18f8ef5c570052c6a95af Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:24:58 +0000 -Subject: [PATCH 1007/1015] create-diff-object: don't create dynamic reloc for +Subject: [PATCH 06/17] create-diff-object: don't create dynamic reloc for symbol exported by patch itself when a patch export a new function, ___kcrctab+xxx has a reloc, @@ -9,23 +9,23 @@ use origin reloc to get right symbol version. Signed-off-by: Zhipeng Xie --- - kpatch-build/create-diff-object.c | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) + kpatch-build/create-diff-object.c | 3 +++ + 1 file changed, 3 insertions(+) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index bd7dd37..349e483 100644 +index 9f1abc0..18ed1f7 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -2808,6 +2808,9 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, +@@ -3039,6 +3039,9 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, if (!strcmp(sym_objname, "vmlinux")) continue; -+ if (!strcmp(sym_objname, pmod_name)) ++ if (!strcmp(sym_objname, objname)) + continue; + external = 1; } } -- -1.7.5.4 +2.18.1 diff --git a/9012-create-diff-object-create-dynamic-relocs-for-changed.patch b/0007-create-diff-object-create-dynamic-relocs-for-changed.patch similarity index 82% rename from 9012-create-diff-object-create-dynamic-relocs-for-changed.patch rename to 0007-create-diff-object-create-dynamic-relocs-for-changed.patch index 7b27cd4..684967a 100644 --- a/9012-create-diff-object-create-dynamic-relocs-for-changed.patch +++ b/0007-create-diff-object-create-dynamic-relocs-for-changed.patch @@ -1,8 +1,8 @@ -From 78a13a6091a0d4b1a45fe8f378892a64dece7202 Mon Sep 17 00:00:00 2001 +From a743990bb6d871fb8cd5ffe6f78ffaa8d5ee7c0a Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:25:38 +0000 -Subject: [PATCH 1012/1015] create-diff-object: create dynamic relocs for - changed functions in this object +Subject: [PATCH 07/17] create-diff-object: create dynamic relocs for changed + functions in this object Currently, we only create dynamic relocs for changed functions of other objects, but not this object. It will cause a problem like: @@ -22,14 +22,14 @@ Signed-off-by: Zhou Chengming Signed-off-by: Li Bin Signed-off-by: Zhipeng Xie --- - kpatch-build/create-diff-object.c | 20 ++++++++++++++++---- - 1 files changed, 16 insertions(+), 4 deletions(-) + kpatch-build/create-diff-object.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index b8d3bb4..4fb27da 100644 +index 18ed1f7..5cdb97b 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -2684,6 +2684,14 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, +@@ -2883,6 +2883,14 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, */ if (may_need_dynrela(rela)) toc_rela(rela)->need_dynrela = 1; @@ -44,7 +44,7 @@ index b8d3bb4..4fb27da 100644 } } -@@ -2765,10 +2773,14 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, +@@ -2965,10 +2973,14 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, /* An unchanged local symbol */ ret = lookup_local_symbol(table, rela->sym->name, &result); @@ -64,5 +64,5 @@ index b8d3bb4..4fb27da 100644 else if (vmlinux) { /* -- -1.7.5.4 +2.18.1 diff --git a/9019-fix-rodata.str-problem.patch b/0008-fix-rodata.str-problem.patch similarity index 67% rename from 9019-fix-rodata.str-problem.patch rename to 0008-fix-rodata.str-problem.patch index f356ed3..535dc8e 100644 --- a/9019-fix-rodata.str-problem.patch +++ b/0008-fix-rodata.str-problem.patch @@ -1,20 +1,20 @@ -From e617351fafaf7504a531fd00a49994653e59a737 Mon Sep 17 00:00:00 2001 +From b356b59eb0f4c21ae927b036a45e573899a59378 Mon Sep 17 00:00:00 2001 From: Zhiyu Hu Date: Fri, 28 Dec 2018 07:06:38 +0000 -Subject: [PATCH] fix rodata.str problem +Subject: [PATCH 08/17] fix rodata.str problem - fix some rodata.str problem +fix some rodata.str problem - Signed-off-by: Zhiyu Hu +Signed-off-by: Zhiyu Hu --- kpatch-build/create-diff-object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index d2e6aee..f075671 100644 +index 5cdb97b..643ae3e 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c -@@ -1552,7 +1552,7 @@ static void kpatch_include_standard_elements(struct kpatch_elf *kelf) +@@ -1620,7 +1620,7 @@ static void kpatch_include_standard_elements(struct kpatch_elf *kelf) !strcmp(sec->name, ".toc") || !strcmp(sec->name, ".rodata") || (!strncmp(sec->name, ".rodata.", 8) && @@ -24,5 +24,5 @@ index d2e6aee..f075671 100644 } } -- -1.8.3.1 +2.18.1 diff --git a/0009-livepatch-patch-hook-don-t-active-patch-when-insmod.patch b/0009-livepatch-patch-hook-don-t-active-patch-when-insmod.patch new file mode 100644 index 0000000..2c76e8a --- /dev/null +++ b/0009-livepatch-patch-hook-don-t-active-patch-when-insmod.patch @@ -0,0 +1,52 @@ +From c14444fc4049048abd445462676576cd8b043ea3 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Tue, 25 Feb 2020 23:40:37 -0500 +Subject: [PATCH 09/17] livepatch-patch-hook: don't active patch when insmod + +Don't active patch after loading the patch when +DISABLE_AFTER_LOAD is set. + +Signed-off-by: Zhipeng Xie +--- + kmod/patch/livepatch-patch-hook.c | 2 ++ + kpatch-build/kpatch-build | 4 ++++ + 2 files changed, 6 insertions(+) + +diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c +index 613d037..163ae1d 100644 +--- a/kmod/patch/livepatch-patch-hook.c ++++ b/kmod/patch/livepatch-patch-hook.c +@@ -455,6 +455,7 @@ static int __init patch_init(void) + } + #endif + ++#if !defined(DISABLE_AFTER_LOAD) + ret = klp_enable_patch(lpatch); + if (ret) { + #ifndef HAVE_SIMPLE_ENABLE +@@ -463,6 +464,7 @@ static int __init patch_init(void) + patch_free_livepatch(lpatch); + return ret; + } ++#endif + + return 0; + out: +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 17a5e11..894f0ab 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -1053,6 +1053,10 @@ if [[ -n "$KLP_SUPPORT_LOADHOOKS" ]];then + export KCPPFLAGS="-DHAVE_LOADHOOKS $KCPPFLAGS" + fi + ++if [[ -n "$DISABLE_AFTER_LOAD" ]];then ++ export KCPPFLAGS="-DDISABLE_AFTER_LOAD $KCPPFLAGS" ++fi ++ + echo "Building patch module: $MODNAME.ko" + + if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then +-- +2.18.1 + diff --git a/0010-kpatch-build-enhance-for-out-of-tree-module.patch b/0010-kpatch-build-enhance-for-out-of-tree-module.patch new file mode 100644 index 0000000..f1ab2a1 --- /dev/null +++ b/0010-kpatch-build-enhance-for-out-of-tree-module.patch @@ -0,0 +1,133 @@ +From a8cf8f9bd90e0e7fde437a59715aa21622fad7b6 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 06:44:06 -0500 +Subject: [PATCH 10/17] kpatch-build: enhance for out of tree module + +support set USERMODBUILDDIR to build patch for out +of tree module. + +Signed-off-by: Zhipeng Xie +--- + kpatch-build/kpatch-build | 50 ++++++++++++++++++++++++++++++++------- + 1 file changed, 42 insertions(+), 8 deletions(-) + +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 894f0ab..4e38412 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -419,7 +419,11 @@ filter_parent_obj() + local dir="${1}" + local file="${2}" + +- grep -v "\.mod\.cmd$" | grep -Fv "${dir}/.${file}.cmd" ++ grep -v "\.mod\.cmd$" | grep -Fv "${dir}/.${file}.cmd" | while read input; do ++ if [ "$(readlink -f $input)" != "$(readlink -f ${dir}/.${file}.cmd)" ];then ++ echo $input; ++ fi ++ done + } + + find_parent_obj() { +@@ -441,6 +445,11 @@ find_parent_obj() { + num="$(find . -name ".*.cmd" -print0 | xargs -0 grep -lw "$grepname" | filter_parent_obj "${pdir}" "${file}" | wc -l)" + [[ "$num" -eq 1 ]] && last_deep_find="$(dirname "$parent")" + fi ++ if [[ "$num" -eq 0 ]]; then ++ parent="$(find $USERMODBUILDDIR -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fv "$pdir/.${file}.cmd" | head -n1)" ++ num="$(find $USERMODBUILDDIR -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fvc "$pdir/.${file}.cmd")" ++ [[ "$num" -eq 1 ]] && last_deep_find="$(dirname "$parent")" ++ fi + else + parent="$(grep -lw "$grepname" "$dir"/.*.cmd | filter_parent_obj "${dir}" "${file}" | head -n1)" + num="$(grep -lw "$grepname" "$dir"/.*.cmd | filter_parent_obj "${dir}" "${file}" | wc -l)" +@@ -646,6 +655,10 @@ if [[ -n "$SRCRPM" ]]; then + ARCHVERSION="${ARCHVERSION#alt-}" + fi + ++if [[ -n "$USERMODBUILDDIR" ]]; then ++ OOT_MODULE="yes" ++fi ++ + if [[ -n "$OOT_MODULE" ]] && [[ -z "$USERSRCDIR" ]]; then + warn "--oot-module requires --sourcedir" + exit 1 +@@ -663,7 +676,7 @@ if [[ -n "$USERSRCDIR" ]]; then + fi + SRCDIR="$USERSRCDIR" + +- if [[ -z "$OOT_MODULE" ]]; then ++ if [[ -z "$OOT_MODULE" || "$OOT_MODULE" == "yes" ]]; then + [[ -z "$VMLINUX" ]] && VMLINUX="$SRCDIR"/vmlinux + [[ ! -e "$VMLINUX" ]] && die "can't find vmlinux" + +@@ -685,7 +698,7 @@ if [[ "$ARCHVERSION" =~ - ]]; then + fi + [[ "$ARCHVERSION" =~ .el7a. ]] && ALT="-alt" + +-[[ -z "$TARGETS" ]] && TARGETS="vmlinux modules" ++[[ -z "$OOT_MODULE" ]] && [[ -z "$TARGETS" ]] && TARGETS="vmlinux modules" + + # Don't check external file. + # shellcheck disable=SC1090 +@@ -889,7 +902,11 @@ echo "Building original source" + unset KPATCH_GCC_TEMPDIR + # $TARGETS used as list, no quotes. + # shellcheck disable=SC2086 +-CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make "-j$CPUS" $TARGETS 2>&1 | logger || die ++if [[ -z "$USERMODBUILDDIR" ]]; then ++ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make "-j$CPUS" $TARGETS 2>&1 | logger || die ++else ++ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die ++fi + + echo "Building patched source" + apply_patches +@@ -900,9 +917,15 @@ KPATCH_GCC_SRCDIR="$SRCDIR" + export KPATCH_GCC_SRCDIR + # $TARGETS used as list, no quotes. + # shellcheck disable=SC2086 +-CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ +- KBUILD_MODPOST_WARN=1 \ +- make "-j$CPUS" $TARGETS 2>&1 | logger || die ++if [[ -z "$USERMODBUILDDIR" ]]; then ++ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ ++ KBUILD_MODPOST_WARN=1 \ ++ make "-j$CPUS" $TARGETS 2>&1 | logger || die ++else ++ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ ++ KBUILD_MODPOST_WARN=1 \ ++ make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die ++fi + + # source.c:(.section+0xFF): undefined reference to `symbol' + grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\\1/" \ +@@ -922,7 +945,11 @@ fi + for i in $(cat "$TEMPDIR/changed_objs") + do + mkdir -p "$TEMPDIR/patched/$(dirname "$i")" || die +- cp -f "$SRCDIR/$i" "$TEMPDIR/patched/$i" || die ++ if [ -z "$USERMODBUILDDIR" ];then ++ cp -f "$SRCDIR/$i" "$TEMPDIR/patched/$i" || die ++ else ++ cp -f "$i" "$TEMPDIR/patched/$i" || die ++ fi + done + + echo "Extracting new and modified ELF sections" +@@ -987,6 +1014,13 @@ for i in $FILES; do + KOBJFILE_PATH="${TEMPDIR}/module/$KOBJFILE" + SYMTAB="${KOBJFILE_PATH}.symtab" + SYMVERS_FILE="$SRCDIR/Module.symvers" ++ ++ if [ "$OOT_MODULE" == "yes" ];then ++ BUILDDIR="/lib/modules/$ARCHVERSION/build/" ++ SYMVERS_FILE="$TEMPDIR/Module.symvers" ++ [[ -e $SRCDIR/Module.symvers ]] && cp "$SRCDIR/Module.symvers" "$SYMVERS_FILE" ++ awk '{ print $1 "\t" $2 "\t" $3 "\t" $4}' "${BUILDDIR}/Module.symvers" >> "$SYMVERS_FILE" ++ fi + fi + + readelf -s --wide "$KOBJFILE_PATH" > "$SYMTAB" +-- +2.18.1 + diff --git a/0011-support-c-plus-kernel-module.patch b/0011-support-c-plus-kernel-module.patch new file mode 100644 index 0000000..7b4106c --- /dev/null +++ b/0011-support-c-plus-kernel-module.patch @@ -0,0 +1,193 @@ +From 20de56a8393e6be3b556156124aa4b2139b10733 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 07:36:59 -0500 +Subject: [PATCH 11/17] support c plus kernel module + +support GNU_UNIQUE type symbols. +support .group section corelation. +ignore compile warning for third party modules. + +Signed-off-by: Zhipeng Xie +--- + kpatch-build/create-diff-object.c | 62 ++++++++++++++++++++----------- + kpatch-build/kpatch-build | 2 +- + kpatch-build/kpatch-elf.c | 8 +++- + kpatch-build/kpatch-gcc | 3 +- + kpatch-build/lookup.c | 5 ++- + 5 files changed, 55 insertions(+), 25 deletions(-) + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index 643ae3e..190753a 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -454,7 +454,7 @@ static void kpatch_compare_correlated_nonrela_section(struct section *sec) + { + struct section *sec1 = sec, *sec2 = sec->twin; + +- if (sec1->sh.sh_type != SHT_NOBITS && ++ if (sec1->sh.sh_type != SHT_NOBITS && sec1->sh.sh_type != SHT_GROUP && + memcmp(sec1->data->d_buf, sec2->data->d_buf, sec1->data->d_size)) + sec->status = CHANGED; + else +@@ -470,7 +470,7 @@ static void kpatch_compare_correlated_section(struct section *sec) + sec1->sh.sh_flags != sec2->sh.sh_flags || + sec1->sh.sh_entsize != sec2->sh.sh_entsize || + (sec1->sh.sh_addralign != sec2->sh.sh_addralign && +- !is_text_section(sec1))) ++ !is_text_section(sec1) && strcmp(sec1->name, ".rodata"))) + DIFF_FATAL("%s section header details differ from %s", sec1->name, sec2->name); + + /* Short circuit for mcount sections, we rebuild regardless */ +@@ -907,6 +907,33 @@ static void kpatch_correlate_section(struct section *sec1, struct section *sec2) + kpatch_correlate_symbol(sec1->sym, sec2->sym); + } + ++static int kpatch_correlate_group_section(struct list_head *seclist1, struct list_head *seclist2, struct section *sec1, struct section *sec2) ++{ ++ unsigned int *data1, *end1, *data2; ++ struct section *isec1, *isec2; ++ ++ if (sec1->data->d_size != sec2->data->d_size) ++ return 1; ++ data1 = sec1->data->d_buf; ++ data2 = sec2->data->d_buf; ++ end1 = sec1->data->d_buf + sec1->data->d_size; ++ data1++; ++ data2++; ++ while (data1 < end1) { ++ isec1 = find_section_by_index(seclist1, *data1); ++ if (!isec1) ++ ERROR("group section not found"); ++ isec2 = find_section_by_index(seclist2, *data2); ++ if (!isec2) ++ ERROR("group section not found"); ++ if (strcmp(isec1->name, isec2->name)) ++ return 1; ++ data1++; ++ data2++; ++ } ++ return 0; ++} ++ + static void kpatch_correlate_sections(struct list_head *seclist1, struct list_head *seclist2) + { + struct section *sec1, *sec2; +@@ -924,15 +951,19 @@ static void kpatch_correlate_sections(struct list_head *seclist1, struct list_he + sec1->secsym)) + continue; + +- /* +- * Group sections must match exactly to be correlated. +- * Changed group sections are currently not supported. +- */ ++ /* Group section的格式为: ++ * flag ++ * section index ++ * section index ++ * ... ++ * ++ * 当C++代码发生修改时,section index可能会发生变化 ++ * 这时候我们就比对一下section index所对应的section的 ++ * name,如果相同,我们就认为这两个group是SAME ++ * */ ++ + if (sec1->sh.sh_type == SHT_GROUP) { +- if (sec1->data->d_size != sec2->data->d_size) +- continue; +- if (memcmp(sec1->data->d_buf, sec2->data->d_buf, +- sec1->data->d_size)) ++ if(kpatch_correlate_group_section(seclist1, seclist2, sec1, sec2)) + continue; + } + +@@ -1507,17 +1538,6 @@ static void kpatch_verify_patchability(struct kpatch_elf *kelf) + errs++; + } + +- if (sec->status != SAME && sec->grouped) { +- log_normal("changed section %s is part of a section group\n", +- sec->name); +- errs++; +- } +- +- if (sec->sh.sh_type == SHT_GROUP && sec->status == NEW) { +- log_normal("new/changed group sections are not supported\n"); +- errs++; +- } +- + /* + * ensure we aren't including .data.* or .bss.* + * (.data.unlikely and .data.once is ok b/c it only has __warned vars) +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 4e38412..4896136 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -1157,7 +1157,7 @@ fi + # column containing lines unique to first file. + UNDEFINED=$(comm -23 <(sort -u "${TEMPDIR}"/undefined_references) \ + <(sort -u "${TEMPDIR}"/new_symbols) | tr '\n' ' ') +-[[ -n "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" ++[[ -z "$USERMODBUILDDIR" ]] && [[ -n "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" + + cp -f "$TEMPDIR/patch/$MODNAME.ko" "$BASE" || die + +diff --git a/kpatch-build/kpatch-elf.c b/kpatch-build/kpatch-elf.c +index 1c0e099..debf028 100644 +--- a/kpatch-build/kpatch-elf.c ++++ b/kpatch-build/kpatch-elf.c +@@ -708,8 +708,14 @@ void kpatch_reindex_elements(struct kpatch_elf *kelf) + unsigned int index; + + index = 1; /* elf write function handles NULL section 0 */ +- list_for_each_entry(sec, &kelf->sections, list) ++ list_for_each_entry(sec, &kelf->sections, list) { + sec->index = index++; ++ /* ++ * since we exclude .group section, we clear SHF_GROUP ++ * for every section in case of link error. ++ * */ ++ sec->sh.sh_flags &= (~SHF_GROUP); ++ } + + index = 0; + list_for_each_entry(sym, &kelf->symbols, list) { +diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc +index 35d7c1c..6ad6ebc 100755 +--- a/kpatch-build/kpatch-gcc ++++ b/kpatch-build/kpatch-gcc +@@ -13,7 +13,8 @@ fi + + declare -a args=("$@") + +-if [[ "$TOOLCHAINCMD" =~ "${ARCH_COMPILE}gcc" ]] ; then ++if [[ "$TOOLCHAINCMD" =~ "${ARCH_COMPILE}gcc" || ++ "$TOOLCHAINCMD" =~ "${ARCH_COMPILE}g++" ]] ; then + while [ "$#" -gt 0 ]; do + if [ "$1" = "-o" ]; then + obj="$2" +diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c +index 8387e8b..4e2fcb9 100644 +--- a/kpatch-build/lookup.c ++++ b/kpatch-build/lookup.c +@@ -255,6 +255,8 @@ static void symtab_read(struct lookup_table *table, char *path) + table->obj_syms[i].bind = STB_GLOBAL; + } else if (!strcmp(bind, "WEAK")) { + table->obj_syms[i].bind = STB_WEAK; ++ } else if (!strcmp(bind, "UNIQUE")) { ++ table->obj_syms[i].bind = STB_GNU_UNIQUE; + } else { + ERROR("unknown symbol bind %s", bind); + } +@@ -431,7 +433,8 @@ int lookup_global_symbol(struct lookup_table *table, char *name, + + memset(result, 0, sizeof(*result)); + for_each_obj_symbol(i, sym, table) { +- if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) && ++ if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK ++ || sym->bind == STB_GNU_UNIQUE) && + !strcmp(sym->name, name)) { + result->value = sym->value; + result->size = sym->size; +-- +2.18.1 + diff --git a/0012-symbol-lookup-enhancement.patch b/0012-symbol-lookup-enhancement.patch new file mode 100644 index 0000000..c8aa13e --- /dev/null +++ b/0012-symbol-lookup-enhancement.patch @@ -0,0 +1,454 @@ +From 56ec8b76667fb6c7fbc018a8fe7a77f144232f3f Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 22:03:55 -0500 +Subject: [PATCH 12/17] symbol lookup enhancement + +For symbols which have same name in one module or have +length longger than KSYM_NAME_LEN(128 bytes). we add +some work around to lookup another unique symbol and add +relative offset to get the actual symbol. This patch +depend on a kernel patch to deal with new relocation +style. + +Signed-off-by: Zhipeng Xie +--- + kmod/patch/kpatch-patch.h | 4 + + kpatch-build/create-diff-object.c | 46 ++++++++++- + kpatch-build/create-klp-module.c | 25 +++++- + kpatch-build/kpatch-build | 12 +++ + kpatch-build/kpatch-intermediate.h | 2 + + kpatch-build/lookup.c | 123 ++++++++++++++++++++++++++++- + kpatch-build/lookup.h | 13 +++ + 7 files changed, 217 insertions(+), 8 deletions(-) + +diff --git a/kmod/patch/kpatch-patch.h b/kmod/patch/kpatch-patch.h +index 917ea32..7cd6dae 100644 +--- a/kmod/patch/kpatch-patch.h ++++ b/kmod/patch/kpatch-patch.h +@@ -30,6 +30,8 @@ struct kpatch_patch_func { + unsigned long sympos; + char *name; + char *objname; ++ char *ref_name; ++ long ref_offset; + }; + + struct kpatch_patch_dynrela { +@@ -41,6 +43,8 @@ struct kpatch_patch_dynrela { + char *objname; + int external; + int addend; ++ char *ref_name; ++ long ref_offset; + }; + + struct kpatch_pre_patch_callback { +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index 190753a..55db18c 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -2734,6 +2734,28 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, + funcs[index].old_size = result.size; + funcs[index].new_size = sym->sym.st_size; + funcs[index].sympos = result.pos; ++ if (lookup_is_duplicate_symbol(table, sym->name, objname, result.pos)) { ++ struct lookup_refsym refsym; ++ long offset; ++ ++ if (lookup_ref_symbol_offset(table, sym->name, &refsym, objname, &offset)) ++ ERROR("unresolvable ambiguity on symbol %s\n", sym->name); ++ ++ funcs[index].ref_offset = offset; ++ ++ /* ++ * Add a relocation that will populate ++ * the funcs[index].ref_name field. ++ */ ++ ALLOC_LINK(rela, &relasec->relas); ++ rela->sym = strsym; ++ rela->type = absolute_rela_type; ++ rela->addend = offset_of_string(&kelf->strings, refsym.name); ++ rela->offset = index * sizeof(*funcs) + ++ offsetof(struct kpatch_patch_func, ref_name); ++ ++ } ++ + + /* + * Add a relocation that will populate +@@ -2753,7 +2775,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, + ALLOC_LINK(rela, &relasec->relas); + rela->sym = strsym; + rela->type = absolute_rela_type; +- rela->addend = offset_of_string(&kelf->strings, sym->name); ++ rela->addend = offset_of_string(&kelf->strings, strndup(sym->name, KSYM_NAME_LEN-1)); + rela->offset = index * sizeof(*funcs) + + offsetof(struct kpatch_patch_func, name); + +@@ -2872,6 +2894,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + struct lookup_result result; + char *sym_objname; + int ret, vmlinux, external; ++ long ref_offset; + + vmlinux = !strcmp(objname, "vmlinux"); + +@@ -3080,12 +3103,28 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + log_debug("lookup for %s @ 0x%016lx len %lu\n", + rela->sym->name, result.value, result.size); + ++ ref_offset = 0; + /* Fill in ksyms[index] */ + if (vmlinux) + ksyms[index].src = result.value; +- else ++ else { + /* for modules, src is discovered at runtime */ + ksyms[index].src = 0; ++ if (lookup_is_duplicate_symbol(table, rela->sym->name, objname, result.pos)) { ++ struct lookup_refsym refsym; ++ ++ if (lookup_ref_symbol_offset(table, rela->sym->name, &refsym, objname, &ref_offset)) ++ ERROR("unresolvable ambiguity on symbol %s\n", rela->sym->name); ++ ++ /* add rela to fill in ref_name field */ ++ ALLOC_LINK(rela2, &krela_sec->rela->relas); ++ rela2->sym = strsym; ++ rela2->type = absolute_rela_type; ++ rela2->addend = offset_of_string(&kelf->strings, refsym.name); ++ rela2->offset = index * sizeof(*krelas) + ++ offsetof(struct kpatch_relocation, ref_name); ++ } ++ } + ksyms[index].pos = result.pos; + ksyms[index].type = rela->sym->type; + ksyms[index].bind = rela->sym->bind; +@@ -3094,7 +3133,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + ALLOC_LINK(rela2, &ksym_sec->rela->relas); + rela2->sym = strsym; + rela2->type = absolute_rela_type; +- rela2->addend = offset_of_string(&kelf->strings, rela->sym->name); ++ rela2->addend = offset_of_string(&kelf->strings, strndup(rela->sym->name, KSYM_NAME_LEN-1)); + rela2->offset = index * sizeof(*ksyms) + \ + offsetof(struct kpatch_symbol, name); + +@@ -3113,6 +3152,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, + krelas[index].addend = rela->addend; + krelas[index].type = rela->type; + krelas[index].external = external; ++ krelas[index].ref_offset = ref_offset; + + /* add rela to fill in krelas[index].dest field */ + ALLOC_LINK(rela2, &krela_sec->rela->relas); +diff --git a/kpatch-build/create-klp-module.c b/kpatch-build/create-klp-module.c +index d995525..5073a04 100644 +--- a/kpatch-build/create-klp-module.c ++++ b/kpatch-build/create-klp-module.c +@@ -38,7 +38,9 @@ enum loglevel loglevel = NORMAL; + */ + static struct symbol *find_or_add_ksym_to_symbols(struct kpatch_elf *kelf, + struct section *ksymsec, +- char *strings, int offset) ++ char *strings, int offset, ++ char *ref_name, ++ long ref_offset) + { + struct kpatch_symbol *ksyms, *ksym; + struct symbol *sym; +@@ -67,9 +69,14 @@ static struct symbol *find_or_add_ksym_to_symbols(struct kpatch_elf *kelf, + + objname = strings + rela->addend; + +- snprintf(pos, 32, "%lu", ksym->pos); + /* .klp.sym.objname.name,pos */ +- snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, pos); ++ if (!ref_name) { ++ snprintf(pos, 32, "%lu", ksym->pos); ++ snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, pos); ++ } else { ++ snprintf(pos, 32, "%ld", ref_offset); ++ snprintf(buf, 256, KLP_SYM_PREFIX "%s-%s,%s", objname, ref_name, pos); ++ } + + /* Look for an already allocated symbol */ + list_for_each_entry(sym, &kelf->symbols, list) { +@@ -176,6 +183,7 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section + struct rela *rela; + char *objname; + int nr, index, offset, dest_off; ++ char *ref_name; + + krelas = krelasec->data->d_buf; + nr = krelasec->data->d_size / sizeof(*krelas); +@@ -200,6 +208,15 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section + + objname = strings + rela->addend; + ++ /* Get the unique ref_name */ ++ rela = find_rela_by_offset(krelasec->rela, ++ offset + offsetof(struct kpatch_relocation, ref_name)); ++ if (!rela) ++ ref_name = NULL; ++ else { ++ ref_name = strings + rela->addend; ++ } ++ + /* Get the .kpatch.symbol entry for the rela src */ + rela = find_rela_by_offset(krelasec->rela, + offset + offsetof(struct kpatch_relocation, ksym)); +@@ -207,7 +224,7 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section + ERROR("find_rela_by_offset"); + + /* Create (or find) a klp symbol from the rela src entry */ +- sym = find_or_add_ksym_to_symbols(kelf, ksymsec, strings, rela->addend); ++ sym = find_or_add_ksym_to_symbols(kelf, ksymsec, strings, rela->addend, ref_name, krelas[index].ref_offset); + if (!sym) + ERROR("error finding or adding ksym to symtab"); + +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 4896136..8bef7fb 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -1015,6 +1015,18 @@ for i in $FILES; do + SYMTAB="${KOBJFILE_PATH}.symtab" + SYMVERS_FILE="$SRCDIR/Module.symvers" + ++ unset KCFLAGS ++ remove_patches ++ cd "$SRCDIR" || die ++ if [ -z "$USERMODBUILDDIR" ];then ++ CROSS_COMPILE="$ARCH_COMPILE" make "-j$CPUS" ${KOBJFILE} 2>&1 | logger || die ++ else ++ CROSS_COMPILE="$ARCH_COMPILE" make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die ++ fi ++ cp ${KOBJFILE} ${KOBJFILE_PATH} ++ apply_patches ++ cd "$TEMPDIR" || die ++ + if [ "$OOT_MODULE" == "yes" ];then + BUILDDIR="/lib/modules/$ARCHVERSION/build/" + SYMVERS_FILE="$TEMPDIR/Module.symvers" +diff --git a/kpatch-build/kpatch-intermediate.h b/kpatch-build/kpatch-intermediate.h +index 3dea775..59deed0 100644 +--- a/kpatch-build/kpatch-intermediate.h ++++ b/kpatch-build/kpatch-intermediate.h +@@ -39,6 +39,8 @@ struct kpatch_relocation { + int external; + char *objname; /* object to which this rela applies to */ + struct kpatch_symbol *ksym; ++ char *ref_name; ++ long ref_offset; + }; + + struct kpatch_arch { +diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c +index 4e2fcb9..190a7d8 100644 +--- a/kpatch-build/lookup.c ++++ b/kpatch-build/lookup.c +@@ -44,6 +44,7 @@ struct object_symbol { + unsigned long size; + char *name; + int type, bind; ++ int sec_index; + }; + + struct export_symbol { +@@ -248,6 +249,7 @@ static void symtab_read(struct lookup_table *table, char *path) + + table->obj_syms[i].value = value; + table->obj_syms[i].size = strtoul(size, NULL, 0); ++ table->obj_syms[i].sec_index = atoi(ndx); + + if (!strcmp(bind, "LOCAL")) { + table->obj_syms[i].bind = STB_LOCAL; +@@ -398,6 +400,15 @@ int lookup_local_symbol(struct lookup_table *table, char *name, + for_each_obj_symbol(i, sym, table) { + if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) + pos++; ++ else { ++ /* symbol name longer than KSYM_NAME_LEN will be truncated ++ * by kernel, so we can not find it using its original ++ * name. we need to add pos for symbols which have same ++ * KSYM_NAME_LEN-1 long prefix.*/ ++ if (strlen(name) >= KSYM_NAME_LEN-1 && ++ !strncmp(sym->name, name, KSYM_NAME_LEN-1)) ++ pos++; ++ } + + if (table->local_syms == sym) { + in_file = 1; +@@ -429,16 +440,25 @@ int lookup_global_symbol(struct lookup_table *table, char *name, + struct lookup_result *result) + { + struct object_symbol *sym; ++ unsigned long pos = 0; + int i; + + memset(result, 0, sizeof(*result)); + for_each_obj_symbol(i, sym, table) { ++ /* symbol name longer than KSYM_NAME_LEN will be truncated ++ * by kernel, so we can not find it using its original ++ * name. we need to add pos for symbols which have same ++ * KSYM_NAME_LEN-1 long prefix.*/ ++ if (strlen(name) >= KSYM_NAME_LEN-1 && ++ !strncmp(sym->name, name, KSYM_NAME_LEN-1)) ++ pos++; ++ + if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK + || sym->bind == STB_GNU_UNIQUE) && + !strcmp(sym->name, name)) { + result->value = sym->value; + result->size = sym->size; +- result->pos = 0; /* always 0 for global symbols */ ++ result->pos = pos; + return 0; + } + } +@@ -485,6 +505,107 @@ char *lookup_exported_symbol_objname(struct lookup_table *table, char *name) + return NULL; + } + ++int lookup_is_duplicate_symbol(struct lookup_table *table, char *name, ++ char *objname, unsigned long pos) ++{ ++ struct object_symbol *sym; ++ int i, count = 0; ++ char posstr[32], buf[256]; ++ ++ for_each_obj_symbol(i, sym, table) ++ if (!strcmp(sym->name, name)) { ++ count++; ++ if (count > 1) ++ return 1; ++ } ++ ++ /* symbol name longer than KSYM_NAME_LEN will be truncated ++ * by kernel, so we can not find it using its original ++ * name. Here, we consider these long name symbol as duplicated ++ * symbols. since create_klp_module will create symbol name ++ * format like .klp.sym.objname.symbol,pos, so we consider name ++ * length longer than KSYM_NAME_LEN-1 bytes as duplicated symbol*/ ++ snprintf(posstr, 32, "%lu", pos); ++ snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, posstr); ++ if (strlen(buf) >= KSYM_NAME_LEN-1) ++ return 1; ++ ++ return 0; ++} ++ ++struct object_symbol *lookup_find_symbol_by_name(struct lookup_table *table, char *name) ++{ ++ struct object_symbol *sym; ++ unsigned long pos = 0; ++ int i, match = 0, in_file = 0; ++ ++ if (!table->local_syms) ++ return NULL; ++ ++ for_each_obj_symbol(i, sym, table) { ++ if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) ++ pos++; ++ ++ if (table->local_syms == sym) { ++ in_file = 1; ++ continue; ++ } ++ ++ if (!in_file) ++ continue; ++ ++ if (sym->type == STT_FILE) ++ break; ++ ++ if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) { ++ match = 1; ++ break; ++ } ++ } ++ ++ if (!match) { ++ for_each_obj_symbol(i, sym, table) { ++ if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) && ++ !strcmp(sym->name, name)) { ++ return sym; ++ } ++ } ++ return NULL; ++ } ++ ++ return sym; ++} ++ ++int lookup_ref_symbol_offset(struct lookup_table *table, char *name, ++ struct lookup_refsym *refsym, ++ char *objname, long *offset) ++{ ++ struct object_symbol *orig_sym, *sym; ++ int i; ++ ++ orig_sym = lookup_find_symbol_by_name(table, name); ++ if (!orig_sym) ++ ERROR("lookup_ref_symbol_offset"); ++ memset(refsym, 0, sizeof(*refsym)); ++ ++ /*find a unique symbol in the same section first*/ ++ for_each_obj_symbol(i, sym, table) { ++ if (!strcmp(sym->name, name) || sym->type == STT_FILE || ++ sym->sec_index != orig_sym->sec_index || ++ strchr(sym->name, '.')) ++ continue; ++ ++ if (!lookup_is_duplicate_symbol(table, sym->name, objname, 1)) { ++ refsym->name = sym->name; ++ refsym->value = sym->value; ++ *offset = (long)orig_sym->value - (long)sym->value; ++ return 0; ++ } ++ } ++ ++ return 1; ++} ++ + #if 0 /* for local testing */ + static void find_this(struct lookup_table *table, char *sym, char *hint) + { +diff --git a/kpatch-build/lookup.h b/kpatch-build/lookup.h +index 420d0f0..fed3fe9 100644 +--- a/kpatch-build/lookup.h ++++ b/kpatch-build/lookup.h +@@ -1,6 +1,9 @@ + #ifndef _LOOKUP_H_ + #define _LOOKUP_H_ + ++#include "kpatch-elf.h" ++#define KSYM_NAME_LEN 128 ++ + struct lookup_table; + + struct lookup_result { +@@ -14,6 +17,11 @@ struct sym_compare_type { + int type; + }; + ++struct lookup_refsym { ++ char *name; ++ unsigned long value; ++}; ++ + struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, + char *hint, struct sym_compare_type *locals); + void lookup_close(struct lookup_table *table); +@@ -23,5 +31,10 @@ int lookup_global_symbol(struct lookup_table *table, char *name, + struct lookup_result *result); + int lookup_is_exported_symbol(struct lookup_table *table, char *name); + char *lookup_exported_symbol_objname(struct lookup_table *table, char *name); ++int lookup_is_duplicate_symbol(struct lookup_table *table, char *name, ++ char *objname, unsigned long pos); ++int lookup_ref_symbol_offset(struct lookup_table *table, char *name, ++ struct lookup_refsym *refsym, char *objname, ++ long *offset); + + #endif /* _LOOKUP_H_ */ +-- +2.18.1 + diff --git a/0013-Add-running-kernel-symbol-table-to-help-symbol-looku.patch b/0013-Add-running-kernel-symbol-table-to-help-symbol-looku.patch new file mode 100644 index 0000000..6a47a34 --- /dev/null +++ b/0013-Add-running-kernel-symbol-table-to-help-symbol-looku.patch @@ -0,0 +1,171 @@ +From 05051ffc7abcb953fb1ec51b0826b41f160ce191 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 20:28:13 -0500 +Subject: [PATCH 13/17] Add running kernel symbol table to help symbol lookup + +For some duplicate symbols whose section have no other +symbols, we need running kernel symbol table to help +symbol lookup. + +Signed-off-by: Zhipeng Xie +--- + kpatch-build/create-diff-object.c | 7 ++- + kpatch-build/lookup.c | 73 ++++++++++++++++++++++++++++++- + kpatch-build/lookup.h | 3 +- + 3 files changed, 80 insertions(+), 3 deletions(-) + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index 55db18c..4589ba4 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -3564,6 +3564,7 @@ int main(int argc, char *argv[]) + struct sym_compare_type *base_locals, *sym_comp; + char *no_profiling_calls = NULL; + char *gcc_add_option = NULL, *mlongcall = NULL; ++ char *kallsyms; + + arguments.debug = 0; + argp_parse (&argp, argc, argv, 0, NULL, &arguments); +@@ -3677,8 +3678,12 @@ int main(int argc, char *argv[]) + */ + kpatch_elf_teardown(kelf_patched); + ++ kallsyms = getenv("KALLSYMS"); ++ if (kallsyms) ++ log_debug("kallsyms file:%s\n", kallsyms); ++ + /* create symbol lookup table */ +- lookup = lookup_open(parent_symtab, mod_symvers, hint, base_locals); ++ lookup = lookup_open(parent_symtab, mod_symvers, hint, base_locals, kallsyms); + for (sym_comp = base_locals; sym_comp && sym_comp->name; sym_comp++) { + free(sym_comp->name); + } +diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c +index 190a7d8..8f53567 100644 +--- a/kpatch-build/lookup.c ++++ b/kpatch-build/lookup.c +@@ -45,6 +45,7 @@ struct object_symbol { + char *name; + int type, bind; + int sec_index; ++ unsigned long kaddr; + }; + + struct export_symbol { +@@ -284,6 +285,56 @@ static void symtab_read(struct lookup_table *table, char *path) + fclose(file); + } + ++static void ksymtab_read(struct lookup_table *table, char *path) ++{ ++ FILE *file; ++ struct object_symbol *sym, *sym1, *sym2; ++ unsigned long value; ++ int i, j, idx; ++ char line[256], name[256], type[256], mod[256]; ++ idx = 0; ++ ++ if ((file = fopen(path, "r")) == NULL) ++ ERROR("fopen"); ++ ++ while (fgets(line, 256, file)) { ++ if (sscanf(line, "%lx %s %s [%s]\n", ++ &value, type, name, mod) != 4) ++ continue; ++ ++ if (name[0] == '$') ++ continue; ++ ++ i = idx; ++ for_each_obj_symbol_continue(i, sym, table) { ++ if (!strncmp(sym->name, name, KSYM_NAME_LEN-1)) { ++ sym->kaddr = value; ++ idx = i + 1; ++ break; ++ } ++ } ++ } ++ ++ for_each_obj_symbol(i, sym1, table) { ++ if (sym1->kaddr == 0) ++ continue; ++ for_each_obj_symbol(j, sym2, table) { ++ if (sym2->kaddr == 0) ++ continue; ++ if (sym1 == sym2) ++ continue; ++ if (sym1->sec_index != sym2->sec_index) ++ continue; ++ if ((long)sym1->value - (long)sym2->value == ++ (long)sym1->kaddr - (long)sym2->kaddr) ++ continue; ++ ++ ERROR("base mismatch(symbol offset)"); ++ } ++ } ++ fclose(file); ++} ++ + /* + * Symvers file format is the following for kernels v5.3 and newer: + * +@@ -352,7 +403,8 @@ static void symvers_read(struct lookup_table *table, char *path) + } + + struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, +- char *hint, struct sym_compare_type *locals) ++ char *hint, struct sym_compare_type *locals, ++ char *kallsyms) + { + struct lookup_table *table; + +@@ -363,6 +415,8 @@ struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, + + symtab_read(table, symtab_path); + symvers_read(table, symvers_path); ++ if (kallsyms) ++ ksymtab_read(table, kallsyms); + find_local_syms(table, hint, locals); + + return table; +@@ -603,6 +657,23 @@ int lookup_ref_symbol_offset(struct lookup_table *table, char *name, + } + } + ++ if (orig_sym->kaddr == 0) ++ return 1; ++ ++ /*find a unique symbol has kaddr*/ ++ for_each_obj_symbol(i, sym, table) { ++ if (!strcmp(sym->name, name) || sym->type == STT_FILE || ++ sym->kaddr == 0 || strchr(sym->name, '.')) ++ continue; ++ ++ if (!lookup_is_duplicate_symbol(table, sym->name, objname, 1)) { ++ refsym->name = sym->name; ++ refsym->value = 0; ++ *offset = (long)orig_sym->kaddr - (long)sym->kaddr; ++ return 0; ++ } ++ } ++ + return 1; + } + +diff --git a/kpatch-build/lookup.h b/kpatch-build/lookup.h +index fed3fe9..00b6ccc 100644 +--- a/kpatch-build/lookup.h ++++ b/kpatch-build/lookup.h +@@ -23,7 +23,8 @@ struct lookup_refsym { + }; + + struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, +- char *hint, struct sym_compare_type *locals); ++ char *hint, struct sym_compare_type *locals, ++ char *kallsyms); + void lookup_close(struct lookup_table *table); + int lookup_local_symbol(struct lookup_table *table, char *name, + struct lookup_result *result); +-- +2.18.1 + diff --git a/9008-livepatch-patch-hook-support-force-enable-disable-fu.patch b/0014-livepatch-patch-hook-support-force-enable-disable.patch similarity index 50% rename from 9008-livepatch-patch-hook-support-force-enable-disable-fu.patch rename to 0014-livepatch-patch-hook-support-force-enable-disable.patch index 33a47a0..e277e9e 100644 --- a/9008-livepatch-patch-hook-support-force-enable-disable-fu.patch +++ b/0014-livepatch-patch-hook-support-force-enable-disable.patch @@ -1,21 +1,21 @@ -From aaaec2d292b7e1d07c35e07ba92917ee05a4a141 Mon Sep 17 00:00:00 2001 +From b63c72375420cb098a81167c48d822d596e770a9 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:03 +0000 -Subject: [PATCH 1008/1015] livepatch-patch-hook: support force enable/disable - function +Date: Wed, 26 Feb 2020 20:43:34 -0500 +Subject: [PATCH 14/17] livepatch-patch-hook: support force enable/disable -we use immediate to indicate patch which bypass stack check. +we use force to indicate function which bypass stack check Signed-off-by: Zhipeng Xie --- - kmod/patch/livepatch-patch-hook.c | 11 +++++++++++ - 1 files changed, 11 insertions(+), 0 deletions(-) + kmod/patch/livepatch-patch-hook.c | 18 ++++++++++++++++++ + kpatch-build/kpatch-build | 4 ++++ + 2 files changed, 22 insertions(+) diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index 2c0cadd..625ffbd 100644 +index 163ae1d..7e848a7 100644 --- a/kmod/patch/livepatch-patch-hook.c +++ b/kmod/patch/livepatch-patch-hook.c -@@ -228,6 +228,16 @@ extern struct kpatch_pre_patch_callback __kpatch_callbacks_pre_patch[], __kpatch +@@ -238,6 +238,17 @@ extern struct kpatch_pre_patch_callback __kpatch_callbacks_pre_patch[], __kpatch extern struct kpatch_post_patch_callback __kpatch_callbacks_post_patch[], __kpatch_callbacks_post_patch_end[]; extern struct kpatch_pre_unpatch_callback __kpatch_callbacks_pre_unpatch[], __kpatch_callbacks_pre_unpatch_end[]; extern struct kpatch_post_unpatch_callback __kpatch_callbacks_post_unpatch[], __kpatch_callbacks_post_unpatch_end[]; @@ -29,17 +29,39 @@ index 2c0cadd..625ffbd 100644 + return 1; + return 0; +} ++ #ifdef HAVE_CALLBACKS static int add_callbacks_to_patch_objects(void) -@@ -393,6 +403,7 @@ static int __init patch_init(void) +@@ -403,6 +414,13 @@ static int __init patch_init(void) lfunc = &lfuncs[j]; lfunc->old_name = func->kfunc->name; lfunc->new_func = (void *)func->kfunc->new_addr; -+ lfunc->immediate = patch_is_func_forced(lfunc->new_func); ++#if defined(__KLP_SUPPORT_FORCE__) ++#ifdef __ALL_FORCE__ ++ lfunc->force = 1; ++#else ++ lfunc->force = patch_is_func_forced(func->kfunc->new_addr); ++#endif ++#endif #ifdef HAVE_SYMPOS lfunc->old_sympos = func->kfunc->sympos; #else +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 8bef7fb..57487b1 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -1079,6 +1079,10 @@ if "$KPATCH_MODULE"; then + export KCPPFLAGS="-D__KPATCH_MODULE__" + fi + ++if [[ -n "$NO_STACK_CHECK" ]];then ++ export KCPPFLAGS="-D__ALL_FORCE__ $KCPPFLAGS" ++fi ++ + if [[ -n "$KLP_SUPPORT_FORCE" ]];then + export KCPPFLAGS="-D__KLP_SUPPORT_FORCE__ $KCPPFLAGS" + fi -- -1.7.5.4 +2.18.1 diff --git a/0015-kpatch-build-ignore-debuginfo-in-patch.patch b/0015-kpatch-build-ignore-debuginfo-in-patch.patch new file mode 100644 index 0000000..36caea5 --- /dev/null +++ b/0015-kpatch-build-ignore-debuginfo-in-patch.patch @@ -0,0 +1,64 @@ +From 720769ca54d446baf9cbc986fd2a8832da45ce71 Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Wed, 26 Feb 2020 21:01:02 -0500 +Subject: [PATCH 15/17] kpatch-build: ignore debuginfo in patch + +Just ignore all .debug_* sections + +Signed-off-by: Zhipeng Xie +--- + kpatch-build/create-diff-object.c | 18 ++++++++++++++++++ + kpatch-build/kpatch-build | 1 + + 2 files changed, 19 insertions(+) + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index 4589ba4..c466eb0 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -2396,6 +2396,23 @@ static void kpatch_include_debug_sections(struct kpatch_elf *kelf) + } + } + ++static void kpatch_ignore_debug_sections(struct kpatch_elf *kelf) ++{ ++ struct section *sec; ++ ++ /* include all .debug_* sections */ ++ list_for_each_entry(sec, &kelf->sections, list) { ++ if (is_debug_section(sec)) { ++ sec->include = 0; ++ sec->status = SAME; ++ if (!is_rela_section(sec)) { ++ sec->secsym->include = 0; ++ sec->secsym->status = SAME; ++ } ++ } ++ } ++} ++ + static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf) + { + struct section *sec, *strsec, *ignoresec; +@@ -3645,6 +3662,7 @@ int main(int argc, char *argv[]) + kpatch_include_standard_elements(kelf_patched); + num_changed = kpatch_include_changed_functions(kelf_patched); + kpatch_include_debug_sections(kelf_patched); ++ kpatch_ignore_debug_sections(kelf_patched); + callbacks_exist = kpatch_include_callback_elements(kelf_patched); + kpatch_include_force_elements(kelf_patched); + new_globals_exist = kpatch_include_new_globals(kelf_patched); +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 57487b1..c109ee3 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -1143,6 +1143,7 @@ KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \ + KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \ + CROSS_COMPILE="$ARCH_COMPILE" \ + make 2>&1 | logger || die ++${ARCH_COMPILE}strip -g "$TEMPDIR/patch/$MODNAME.ko" + + if ! "$KPATCH_MODULE"; then + if [[ -z "$KPATCH_LDFLAGS" ]]; then +-- +2.18.1 + diff --git a/9028-add-object-in-kpatch.patch b/0016-add-object-in-kpatch.patch similarity index 64% rename from 9028-add-object-in-kpatch.patch rename to 0016-add-object-in-kpatch.patch index b103ed6..8af8963 100644 --- a/9028-add-object-in-kpatch.patch +++ b/0016-add-object-in-kpatch.patch @@ -1,17 +1,17 @@ -From d6304fcd36edd4e9df48687517f30965d9a790e9 Mon Sep 17 00:00:00 2001 +From dd03a70462783a9e8426ff76e42c41a7eaab644f Mon Sep 17 00:00:00 2001 From: Bin Yang Date: Tue, 16 Jul 2019 14:39:27 +0800 -Subject: [PATCH] add object in kpatch +Subject: [PATCH 16/17] add object in kpatch --- kpatch-build/kpatch-build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index 59af250..f685654 100644 +index c109ee3..de448dc 100755 --- a/kpatch-build/kpatch-build +++ b/kpatch-build/kpatch-build -@@ -1011,6 +1011,8 @@ echo -n "Patched objects:" +@@ -1071,6 +1071,8 @@ echo -n "Patched objects:" for i in $(echo "${objnames[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ') do echo -n " $i" @@ -20,8 +20,8 @@ index 59af250..f685654 100644 done echo -@@ -1113,6 +1115,7 @@ UNDEFINED=$(comm -23 <(sort -u "${TEMPDIR}"/undefined_references) \ - [[ -z "$USERMODDIR" ]] && [[ ! -z "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" +@@ -1177,6 +1179,7 @@ UNDEFINED=$(comm -23 <(sort -u "${TEMPDIR}"/undefined_references) \ + [[ -z "$USERMODBUILDDIR" ]] && [[ -n "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" cp -f "$TEMPDIR/patch/$MODNAME.ko" "$BASE" || die +cp -f "$TEMPDIR/patch/object" "$BASE" || die @@ -29,5 +29,5 @@ index 59af250..f685654 100644 [[ "$DEBUG" -eq 0 ]] && rm -f "$LOGFILE" -- -2.17.1 +2.18.1 diff --git a/0017-create-diff-object-fix-.orc_unwind_ip-error.patch b/0017-create-diff-object-fix-.orc_unwind_ip-error.patch new file mode 100644 index 0000000..ab28f7c --- /dev/null +++ b/0017-create-diff-object-fix-.orc_unwind_ip-error.patch @@ -0,0 +1,42 @@ +From 96e3ca2fbed32589510c800e9efe31bab2f5e58a Mon Sep 17 00:00:00 2001 +From: Zhipeng Xie +Date: Thu, 27 Feb 2020 15:36:55 -0500 +Subject: [PATCH 17/17] create-diff-object: fix .orc_unwind_ip error + +error: .orc_unwind_ip section header details +differ from .orc_unwind_ip + +Don't correlate .orc_unwind sections and symbols + +Signed-off-by: root +--- + kpatch-build/create-diff-object.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index c466eb0..320b239 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -967,6 +967,9 @@ static void kpatch_correlate_sections(struct list_head *seclist1, struct list_he + continue; + } + ++ if (strstr(sec1->name, ".orc_unwind")) ++ continue; ++ + kpatch_correlate_section(sec1, sec2); + break; + } +@@ -1012,6 +1015,9 @@ static void kpatch_correlate_symbols(struct list_head *symlist1, struct list_hea + sym1->sec->twin != sym2->sec) + continue; + ++ if (strstr(sym1->name, ".orc_unwind")) ++ continue; ++ + kpatch_correlate_symbol(sym1, sym2); + break; + } +-- +2.18.1 + diff --git a/9001-livepatch-patch-hook-don-t-active-patch-when-insmod.patch b/9001-livepatch-patch-hook-don-t-active-patch-when-insmod.patch deleted file mode 100644 index 5eb830e..0000000 --- a/9001-livepatch-patch-hook-don-t-active-patch-when-insmod.patch +++ /dev/null @@ -1,34 +0,0 @@ -From ee167e43252bdb9e84cbefcd8b6fe767c9dc768f Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:24:15 +0000 -Subject: [PATCH 1001/1015] livepatch-patch-hook: don't active patch when - insmod - -we want to active patch after loading the patch. - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/livepatch-patch-hook.c | 7 ------- - 1 files changed, 0 insertions(+), 7 deletions(-) - -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index 7a587a3..e59a377 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -443,13 +443,6 @@ static int __init patch_init(void) - return ret; - } - -- ret = klp_enable_patch(lpatch); -- if (ret) { -- WARN_ON(klp_unregister_patch(lpatch)); -- patch_free_livepatch(lpatch); -- return ret; -- } -- - return 0; - out: - patch_free_livepatch(lpatch); --- -1.7.5.4 - diff --git a/9002-kpatch-build-support-third-party-module-make-hotpatc.patch b/9002-kpatch-build-support-third-party-module-make-hotpatc.patch deleted file mode 100644 index aca7798..0000000 --- a/9002-kpatch-build-support-third-party-module-make-hotpatc.patch +++ /dev/null @@ -1,208 +0,0 @@ -From c27f1093cd47c48e2f403c4ffb29bf066ce0bea5 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:24:24 +0000 -Subject: [PATCH 1002/1015] kpatch-build: support third party module make - hotpatch - -support out of tree module to make hotpatch. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/kpatch-build | 76 ++++++++++++++++++++++++++++++++++++--------- - kpatch-build/kpatch-gcc | 5 +++ - 2 files changed, 66 insertions(+), 15 deletions(-) - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index a76913f..ccef86d 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -102,7 +102,11 @@ remove_patches() { - for (( ; APPLIED_PATCHES>0; APPLIED_PATCHES-- )); do - idx=$(( APPLIED_PATCHES - 1)) - patch="${PATCH_LIST[$idx]}" -- patch -p1 -R -d "$SRCDIR" < "$patch" &> /dev/null -+ if [ -n "$USERMODDIR" ];then -+ patch -p1 -R -d "$USERMODDIR" < "$patch" &> /dev/null -+ else -+ patch -p1 -R -d "$SRCDIR" < "$patch" &> /dev/null -+ fi - done - - # If $SRCDIR was a git repo, make sure git actually sees that -@@ -318,8 +322,8 @@ find_parent_obj() { - num="$(grep -l "$grepname" "$last_deep_find"/.*.cmd | grep -Fvc "$pdir/.${file}.cmd")" - fi - if [[ "$num" -eq 0 ]]; then -- parent="$(find ./* -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fv "$pdir/.${file}.cmd" | cut -c3- | head -n1)" -- num="$(find ./* -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fvc "$pdir/.${file}.cmd")" -+ parent="$(find . -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fv "$pdir/.${file}.cmd" | cut -c3- | head -n1)" -+ num="$(find . -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fvc "$pdir/.${file}.cmd")" - [[ "$num" -eq 1 ]] && last_deep_find="$(dirname "$parent")" - fi - else -@@ -335,6 +339,9 @@ find_parent_obj() { - PARENT="${PARENT#.}" - PARENT="${PARENT%.cmd}" - PARENT="$dir/$PARENT" -+ if [ -n "$USERMODDIR" ];then -+ PARENT="$(readlink -f "$PARENT")" -+ fi - [[ ! -e "$PARENT" ]] && die "ERROR: can't find parent $PARENT for $1" - } - -@@ -397,7 +404,7 @@ usage() { - echo " (not recommended)" >&2 - } - --options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,skip-gcc-check,skip-cleanup" -- "$@")" || die "getopt failed" -+options="$(getopt -o ha:r:s:c:v:j:t:n:o:dm:b: -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,skip-gcc-check,skip-cleanup,moduledir,builddir" -- "$@")" || die "getopt failed" - - eval set -- "$options" - -@@ -463,6 +470,16 @@ while [[ $# -gt 0 ]]; do - echo "WARNING: Skipping gcc version matching check (not recommended)" - SKIPGCCCHECK=1 - ;; -+ -m|--moduledir) -+ USERMODDIR=$(readlink -f "$2") -+ shift -+ [[ ! -d "$USERMODDIR" ]] && die "module dir $USERMODDIR not found" -+ ;; -+ -b|--builddir) -+ BUILDDIR=$(readlink -f "$2") -+ shift -+ [[ ! -d "$BUILDDIR" ]] && die "kernel develop dir $BUILDDIR not found" -+ ;; - *) - [[ "$1" = "--" ]] && shift && continue - [[ ! -f "$1" ]] && die "patch file '$1' not found" -@@ -528,7 +545,7 @@ if [[ "$ARCHVERSION" =~ - ]]; then - fi - [[ "$ARCHVERSION" =~ .el7a. ]] && ALT="-alt" - --[[ -z "$TARGETS" ]] && TARGETS="vmlinux modules" -+[[ -z "$USERMODDIR" ]] && [[ -z "$TARGETS" ]] && TARGETS="vmlinux modules" - - # Don't check external file. - # shellcheck disable=SC1091 -@@ -691,7 +708,11 @@ fi - grep -q "CONFIG_DEBUG_INFO_SPLIT=y" "$CONFIGFILE" && die "kernel option 'CONFIG_DEBUG_INFO_SPLIT' not supported" - - echo "Testing patch file(s)" --cd "$SRCDIR" || die -+if [ -z "$USERMODDIR" ];then -+ cd "$SRCDIR" || die -+else -+ cd $USERMODDIR || die -+fi - apply_patches - remove_patches - -@@ -709,15 +730,23 @@ find_special_section_data - if [[ $DEBUG -ge 4 ]]; then - export KPATCH_GCC_DEBUG=1 - fi -- --echo "Building original kernel" --./scripts/setlocalversion --save-scmversion || die -+if [ -z "$USERMODDIR" ];then -+ echo "Building original kernel" -+ ./scripts/setlocalversion --save-scmversion || die -+else -+ echo "Building original module" -+fi - unset KPATCH_GCC_TEMPDIR - # $TARGETS used as list, no quotes. - # shellcheck disable=SC2086 - CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make "-j$CPUS" $TARGETS 2>&1 | logger || die - --echo "Building patched kernel" -+sleep 1 -+if [ -z "$USERMODDIR" ];then -+ echo "Building patched kernel" -+else -+ echo "Building patched module" -+fi - apply_patches - mkdir -p "$TEMPDIR/orig" "$TEMPDIR/patched" - KPATCH_GCC_TEMPDIR="$TEMPDIR" -@@ -739,14 +768,22 @@ if [[ ! -e "$TEMPDIR/changed_objs" ]]; then - die "no changed objects found" - fi - --grep -q vmlinux "$SRCDIR/Module.symvers" || die "truncated $SRCDIR/Module.symvers file" -+SYMVERS="$SRCDIR/Module.symvers" -+if [ ! -f "$SYMVERS" -a -n "$BUILDDIR" ];then -+ SYMVERS="$BUILDDIR/Module.symvers" -+fi -+grep -q vmlinux "$SYMVERS" || die "truncated $SYMVERS file" - - # Read as words, no quotes. - # shellcheck disable=SC2013 - for i in $(cat "$TEMPDIR/changed_objs") - do - mkdir -p "$TEMPDIR/patched/$(dirname "$i")" || die -- cp -f "$SRCDIR/$i" "$TEMPDIR/patched/$i" || die -+ if [ -z "$USERMODDIR" ];then -+ cp -f "$SRCDIR/$i" "$TEMPDIR/patched/$i" || die -+ else -+ cp -f "$i" "$TEMPDIR/patched/$i" || die -+ fi - done - - echo "Extracting new and modified ELF sections" -@@ -788,7 +825,11 @@ for i in $FILES; do - [[ "$i" = usr/initramfs_data.o ]] && continue - - mkdir -p "output/$(dirname "$i")" -- cd "$SRCDIR" || die -+ if [ -z "$USERMODDIR" ];then -+ cd "$SRCDIR" || die -+ else -+ cd $USERMODDIR || die -+ fi - find_kobj "$i" - cd "$TEMPDIR" || die - if [[ -e "orig/$i" ]]; then -@@ -808,7 +849,7 @@ for i in $FILES; do - # create-diff-object orig.o patched.o parent-name parent-symtab - # Module.symvers patch-mod-name output.o - "$TOOLSDIR"/create-diff-object "orig/$i" "patched/$i" "$KOBJFILE_NAME" \ -- "$SYMTAB" "$SRCDIR/Module.symvers" "${MODNAME//-/_}" \ -+ "$SYMTAB" "$SYMVERS" "${MODNAME//-/_}" \ - "output/$i" 2>&1 | logger 1 - check_pipe_status create-diff-object - # create-diff-object returns 3 if no functional change is found -@@ -871,7 +912,12 @@ fi - - cd "$TEMPDIR/patch" || die - --KPATCH_BUILD="$SRCDIR" KPATCH_NAME="$MODNAME" \ -+if [ -z "$BUILDDIR" ];then -+ KPATCH_BUILDIR="$SRCDIR" -+else -+ KPATCH_BUILDIR="$BUILDDIR" -+fi -+KPATCH_BUILD="$KPATCH_BUILDIR" KPATCH_NAME="$MODNAME" \ - KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \ - KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \ - make 2>&1 | logger || die -diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc -index 2d56da1..21f7e2e 100755 ---- a/kpatch-build/kpatch-gcc -+++ b/kpatch-build/kpatch-gcc -@@ -23,6 +23,11 @@ if [[ "$TOOLCHAINCMD" = "gcc" ]] ; then - [[ "$obj" = */.tmp_mc_*.o ]] && break; - - [[ "$obj" = */.tmp_*.o ]] && obj="${obj/.tmp_/}" -+ -+ if [[ $obj =~ \/\.[0-9]+\.o ]]; then -+ break; -+ fi -+ - case "$obj" in - *.mod.o|\ - *built-in.o|\ --- -1.7.5.4 - diff --git a/9003-kpatch-build-support-makefile-not-in-third-party-mod.patch b/9003-kpatch-build-support-makefile-not-in-third-party-mod.patch deleted file mode 100644 index 544b6d0..0000000 --- a/9003-kpatch-build-support-makefile-not-in-third-party-mod.patch +++ /dev/null @@ -1,92 +0,0 @@ -From 214de7459555f3f0461cf4127c55f727ccf473d1 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:24:30 +0000 -Subject: [PATCH 1003/1015] kpatch-build: support makefile not in third party - module source directory - -support makefile not in third party module source directory. -for example: - testmod/build/Makefile - testmod/src/test.c - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/kpatch-build | 32 +++++++++++++++++++++++++++----- - 1 files changed, 27 insertions(+), 5 deletions(-) - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index ccef86d..93a0589 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -311,7 +311,10 @@ find_parent_obj() { - dir="$(dirname "$1")" - absdir="$(readlink -f "$dir")" - pwddir="$(readlink -f .)" -- pdir="${absdir#$pwddir/}" -+ pdir="." -+ if [ "$absdir" != "$pwddir" ];then -+ pdir="${absdir#$pwddir/}" -+ fi - file="$(basename "$1")" - grepname="${1%.o}" - grepname="$grepname\\.o" -@@ -326,6 +329,11 @@ find_parent_obj() { - num="$(find . -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fvc "$pdir/.${file}.cmd")" - [[ "$num" -eq 1 ]] && last_deep_find="$(dirname "$parent")" - fi -+ if [[ "$num" -eq 0 ]]; then -+ parent="$(find $USERMODBUILDDIR -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fv "$pdir/.${file}.cmd" | head -n1)" -+ num="$(find $USERMODBUILDDIR -name ".*.cmd" -print0 | xargs -0 grep -l "$grepname" | grep -Fvc "$pdir/.${file}.cmd")" -+ [[ "$num" -eq 1 ]] && last_deep_find="$(dirname "$parent")" -+ fi - else - parent="$(grep -l "$grepname" "$dir"/.*.cmd | grep -Fv "$dir/.${file}.cmd" | head -n1)" - num="$(grep -l "$grepname" "$dir"/.*.cmd | grep -Fvc "$dir/.${file}.cmd")" -@@ -730,16 +738,24 @@ find_special_section_data - if [[ $DEBUG -ge 4 ]]; then - export KPATCH_GCC_DEBUG=1 - fi -+if [ -z "$USERMODBUILDDIR" ];then -+ USERMODBUILDDIR=$USERMODDIR; -+fi - if [ -z "$USERMODDIR" ];then - echo "Building original kernel" - ./scripts/setlocalversion --save-scmversion || die - else - echo "Building original module" -+ [[ -e $USERMODDIR/Module.symvers ]] && cp -f $USERMODDIR/Module.symvers $TEMPDIR/patch/ - fi - unset KPATCH_GCC_TEMPDIR - # $TARGETS used as list, no quotes. - # shellcheck disable=SC2086 --CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make "-j$CPUS" $TARGETS 2>&1 | logger || die -+if [ -z "$USERMODDIR" ];then -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make "-j$CPUS" $TARGETS 2>&1 | logger || die -+else -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die -+fi - - sleep 1 - if [ -z "$USERMODDIR" ];then -@@ -753,9 +769,15 @@ KPATCH_GCC_TEMPDIR="$TEMPDIR" - export KPATCH_GCC_TEMPDIR - # $TARGETS used as list, no quotes. - # shellcheck disable=SC2086 --CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ -- KBUILD_MODPOST_WARN=1 \ -- make "-j$CPUS" $TARGETS 2>&1 | logger || die -+if [ -z "$USERMODDIR" ];then -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ -+ KBUILD_MODPOST_WARN=1 \ -+ make "-j$CPUS" $TARGETS 2>&1 | logger || die -+else -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ -+ KBUILD_MODPOST_WARN=1 \ -+ make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die -+fi - - # source.c:(.section+0xFF): undefined reference to `symbol' - grep "undefined reference" "$LOGFILE" | sed -r "s/^.*\`(.*)'$/\\1/" \ --- -1.7.5.4 - diff --git a/9009-kmod-kpatch-build-support-build-patch-for-old-kernel.patch b/9009-kmod-kpatch-build-support-build-patch-for-old-kernel.patch deleted file mode 100644 index beecafa..0000000 --- a/9009-kmod-kpatch-build-support-build-patch-for-old-kernel.patch +++ /dev/null @@ -1,349 +0,0 @@ -From e91d2d2c6778275b16249f7e9d7439018fed70fe Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:08 +0000 -Subject: [PATCH 1009/1015] kmod/kpatch-build: support build patch for - old kernels - -Forward compatible for old kernels - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/kpatch-macros.h | 48 ++++++++++++++ - kmod/patch/kpatch-patch.h | 4 + - kmod/patch/kpatch.lds.S | 12 ++++ - kmod/patch/livepatch-patch-hook.c | 124 +++++++++++++++++++++++++++++++++++++ - kpatch-build/create-diff-object.c | 8 +++ - 5 files changed, 196 insertions(+), 0 deletions(-) - -diff --git a/kmod/patch/kpatch-macros.h b/kmod/patch/kpatch-macros.h -index a60a267..569a18d 100644 ---- a/kmod/patch/kpatch-macros.h -+++ b/kmod/patch/kpatch-macros.h -@@ -133,4 +133,52 @@ struct kpatch_post_unpatch_callback { - printk(_fmt, ## __VA_ARGS__); \ - }) - -+typedef void (*kpatch_loadcall_t)(void); -+typedef void (*kpatch_unloadcall_t)(void); -+ -+struct kpatch_load { -+ kpatch_loadcall_t fn; -+ char *objname; /* filled in by create-diff-object */ -+}; -+ -+struct kpatch_unload { -+ kpatch_unloadcall_t fn; -+ char *objname; /* filled in by create-diff-object */ -+}; -+ -+/* -+ * KPATCH_LOAD_HOOK macro -+ * -+ * The first line only ensures that the hook being registered has the required -+ * function signature. If not, there is compile error on this line. -+ * -+ * The section line declares a struct kpatch_load to be allocated in a new -+ * .kpatch.hook.load section. This kpatch_load_data symbol is later stripped -+ * by create-diff-object so that it can be declared in multiple objects that -+ * are later linked together, avoiding global symbol collision. Since multiple -+ * hooks can be registered, the .kpatch.hook.load section is a table of struct -+ * kpatch_load elements that will be executed in series by the kpatch core -+ * module at load time, assuming the kernel object (module) is currently -+ * loaded; otherwise, the hook is called when module to be patched is loaded -+ * via the module load notifier. -+ */ -+#define KPATCH_LOAD_HOOK(_fn) \ -+ static inline kpatch_loadcall_t __loadtest(void) { return _fn; } \ -+ struct kpatch_load kpatch_load_data __section(.kpatch.hooks.load) = { \ -+ .fn = _fn, \ -+ .objname = NULL \ -+ }; -+ -+/* -+ * KPATCH_UNLOAD_HOOK macro -+ * -+ * Same as LOAD hook with s/load/unload/ -+ */ -+#define KPATCH_UNLOAD_HOOK(_fn) \ -+ static inline kpatch_unloadcall_t __unloadtest(void) { return _fn; } \ -+ struct kpatch_unload kpatch_unload_data __section(.kpatch.hooks.unload) = { \ -+ .fn = _fn, \ -+ .objname = NULL \ -+ }; -+ - #endif /* __KPATCH_MACROS_H_ */ -diff --git a/kmod/patch/kpatch-patch.h b/kmod/patch/kpatch-patch.h -index 917ea32..4d47d30 100644 ---- a/kmod/patch/kpatch-patch.h -+++ b/kmod/patch/kpatch-patch.h -@@ -59,5 +59,9 @@ struct kpatch_post_unpatch_callback { - void (*callback)(void *obj); - char *objname; - }; -+struct kpatch_patch_hook { -+ void (*hook)(void); -+ char *objname; -+}; - - #endif /* _KPATCH_PATCH_H_ */ -diff --git a/kmod/patch/kpatch.lds.S b/kmod/patch/kpatch.lds.S -index bc5de82..e3c4e97 100644 ---- a/kmod/patch/kpatch.lds.S -+++ b/kmod/patch/kpatch.lds.S -@@ -47,4 +47,16 @@ SECTIONS - __kpatch_force_funcs_end = . ; - QUAD(0); - } -+ .kpatch.hooks.load : { -+ __kpatch_hooks_load = . ; -+ *(.kpatch.hooks.load) -+ __kpatch_hooks_load_end = . ; -+ QUAD(0); -+ } -+ .kpatch.hooks.unload : { -+ __kpatch_hooks_unload = . ; -+ *(.kpatch.hooks.unload) -+ __kpatch_hooks_unload_end = . ; -+ QUAD(0); -+ } - } -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index 625ffbd..8f7d044 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -64,6 +64,15 @@ - # define HAVE_CALLBACKS - #endif - -+#ifdef EULER_RELEASE_CODE -+# if EULER_RELEASE_CODE <= EULER_RELEASE_VERSION(2, 3) -+# undef HAVE_SYMPOS -+# undef HAVE_IMMEDIATE -+# undef HAVE_ELF_RELOCS -+# define HAVE_LOADHOOKS -+# endif -+#endif -+ - /* - * There are quite a few similar structures at play in this file: - * - livepatch.h structs prefixed with klp_* -@@ -95,6 +104,11 @@ struct patch_object { - #endif - const char *name; - int funcs_nr, relocs_nr; -+#ifdef HAVE_LOADHOOKS -+ struct list_head hooks_load; -+ struct list_head hooks_unload; -+ int hooks_load_nr, hooks_unload_nr; -+#endif - }; - - struct patch_func { -@@ -107,6 +121,13 @@ struct patch_reloc { - struct kpatch_patch_dynrela *kdynrela; - }; - -+#ifdef HAVE_LOADHOOKS -+struct patch_hook { -+ struct list_head list; -+ struct kpatch_patch_hook *khook; -+}; -+#endif -+ - static struct patch_object *patch_alloc_new_object(const char *name) - { - struct patch_object *object; -@@ -118,6 +139,10 @@ static struct patch_object *patch_alloc_new_object(const char *name) - #ifndef HAVE_ELF_RELOCS - INIT_LIST_HEAD(&object->relocs); - #endif -+#ifdef HAVE_LOADHOOKS -+ INIT_LIST_HEAD(&object->hooks_load); -+ INIT_LIST_HEAD(&object->hooks_unload); -+#endif - if (strcmp(name, "vmlinux")) - object->name = name; - list_add(&object->list, &patch_objects); -@@ -180,6 +205,37 @@ static int patch_add_reloc_to_object(struct kpatch_patch_dynrela *kdynrela) - } - #endif - -+#ifdef HAVE_LOADHOOKS -+static int patch_add_hook_to_object(struct kpatch_patch_hook *khook, bool load) -+{ -+ struct patch_hook *hook; -+ struct patch_object *object; -+ -+ hook = kzalloc(sizeof(*hook), GFP_KERNEL); -+ if (!hook) -+ return -ENOMEM; -+ INIT_LIST_HEAD(&hook->list); -+ hook->khook = khook; -+ -+ object = patch_find_object_by_name(khook->objname); -+ if (!object) { -+ kfree(hook); -+ return -ENOMEM; -+ } -+ -+ if (load) { -+ list_add(&hook->list, &object->hooks_load); -+ object->hooks_load_nr++; -+ } -+ else { -+ list_add(&hook->list, &object->hooks_unload); -+ object->hooks_unload_nr++; -+ } -+ -+ return 0; -+} -+#endif -+ - static void patch_free_scaffold(void) { - struct patch_func *func, *safefunc; - struct patch_object *object, *safeobject; -@@ -217,6 +273,12 @@ static void patch_free_livepatch(struct klp_patch *patch) - if (object->relocs) - kfree(object->relocs); - #endif -+#ifdef HAVE_LOADHOOKS -+ if (object->hooks_load) -+ kfree(object->hooks_load); -+ if (object->hooks_unload) -+ kfree(object->hooks_unload); -+#endif - } - if (patch->objs) - kfree(patch->objs); -@@ -228,6 +290,10 @@ extern struct kpatch_pre_patch_callback __kpatch_callbacks_pre_patch[], __kpatch - extern struct kpatch_post_patch_callback __kpatch_callbacks_post_patch[], __kpatch_callbacks_post_patch_end[]; - extern struct kpatch_pre_unpatch_callback __kpatch_callbacks_pre_unpatch[], __kpatch_callbacks_pre_unpatch_end[]; - extern struct kpatch_post_unpatch_callback __kpatch_callbacks_post_unpatch[], __kpatch_callbacks_post_unpatch_end[]; -+#ifdef HAVE_LOADHOOKS -+extern struct kpatch_patch_hook __kpatch_hooks_load[], __kpatch_hooks_load_end[]; -+extern struct kpatch_patch_hook __kpatch_hooks_unload[], __kpatch_hooks_unload_end[]; -+#endif - extern unsigned long __kpatch_force_funcs[], __kpatch_force_funcs_end[]; - - static int patch_is_func_forced(unsigned long addr) -@@ -347,6 +413,11 @@ static int __init patch_init(void) - struct patch_reloc *reloc; - struct klp_reloc *lrelocs, *lreloc; - #endif -+#ifdef HAVE_LOADHOOKS -+ struct patch_hook *hook; -+ struct kpatch_patch_hook *khook_load, *khook_unload; -+ struct klp_hook *lhooks_load, *lhooks_unload, *lhook; -+#endif - - /* organize functions and relocs by object in scaffold */ - for (kfunc = __kpatch_funcs; -@@ -371,6 +442,24 @@ static int __init patch_init(void) - if (ret) - goto out; - -+#ifdef HAVE_LOADHOOKS -+ for (khook_load = __kpatch_hooks_load; -+ khook_load != __kpatch_hooks_load_end; -+ khook_load++) { -+ ret = patch_add_hook_to_object(khook_load, true); -+ if (ret) -+ goto out; -+ } -+ -+ for (khook_unload = __kpatch_hooks_unload; -+ khook_unload != __kpatch_hooks_unload_end; -+ khook_unload++) { -+ ret = patch_add_hook_to_object(khook_unload, false); -+ if (ret) -+ goto out; -+ } -+#endif -+ - /* past this point, only possible return code is -ENOMEM */ - ret = -ENOMEM; - -@@ -403,12 +492,21 @@ static int __init patch_init(void) - lfunc = &lfuncs[j]; - lfunc->old_name = func->kfunc->name; - lfunc->new_func = (void *)func->kfunc->new_addr; -+#if defined(HAVE_IMMEDIATE) - lfunc->immediate = patch_is_func_forced(lfunc->new_func); -+#endif - #ifdef HAVE_SYMPOS - lfunc->old_sympos = func->kfunc->sympos; - #else - lfunc->old_addr = func->kfunc->old_addr; - #endif -+#ifdef EULER_RELEASE_CODE -+# if EULER_RELEASE_CODE <= EULER_RELEASE_VERSION(2, 3) -+ lfunc->old_size = func->kfunc->old_size; -+ lfunc->new_size = func->kfunc->new_size; -+ lfunc->force = patch_is_func_forced(func->kfunc->new_addr); -+# endif -+#endif - j++; - } - -@@ -439,6 +537,32 @@ static int __init patch_init(void) - lobject->callbacks = object->callbacks; - #endif - -+#ifdef HAVE_LOADHOOKS -+ lhooks_load = kzalloc(sizeof(struct klp_hook) * -+ (object->hooks_load_nr+1), GFP_KERNEL); -+ if (!lhooks_load) -+ goto out; -+ lobject->hooks_load = lhooks_load; -+ j = 0; -+ list_for_each_entry(hook, &object->hooks_load, list) { -+ lhook = &lhooks_load[j]; -+ lhook->hook = hook->khook->hook; -+ j++; -+ } -+ -+ lhooks_unload = kzalloc(sizeof(struct klp_hook) * -+ (object->hooks_unload_nr+1), GFP_KERNEL); -+ if (!lhooks_unload) -+ goto out; -+ lobject->hooks_unload = lhooks_unload; -+ j = 0; -+ list_for_each_entry(hook, &object->hooks_unload, list) { -+ lhook = &lhooks_unload[j]; -+ lhook->hook = hook->khook->hook; -+ j++; -+ } -+#endif -+ - i++; - } - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 349e483..ed96758 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -1463,6 +1463,10 @@ static int kpatch_include_callback_elements(struct kpatch_elf *kelf) - ".rela.kpatch.callbacks.post_patch", - ".rela.kpatch.callbacks.pre_unpatch", - ".rela.kpatch.callbacks.post_unpatch", -+ ".kpatch.hooks.load", -+ ".kpatch.hooks.unload", -+ ".rela.kpatch.hooks.load", -+ ".rela.kpatch.hooks.unload", - NULL, - }; - char **callback_section; -@@ -2921,6 +2925,10 @@ static void kpatch_create_callbacks_objname_rela(struct kpatch_elf *kelf, char * - .offset = offsetof(struct kpatch_pre_unpatch_callback, objname) }, - { .name = ".rela.kpatch.callbacks.post_unpatch", - .offset = offsetof(struct kpatch_post_patch_callback, objname) }, -+ { .name = ".rela.kpatch.hooks.load", -+ .offset = offsetof(struct kpatch_patch_hook, objname) }, -+ { .name = ".rela.kpatch.hooks.unload", -+ .offset = offsetof(struct kpatch_patch_hook, objname) }, - { .name = NULL, .offset = 0 }, - }; - struct callback *callbackp; --- -1.7.5.4 - diff --git a/9010-kmod-kpatch-build-support-cross-compile-hotpatch-for.patch b/9010-kmod-kpatch-build-support-cross-compile-hotpatch-for.patch deleted file mode 100644 index 8c71670..0000000 --- a/9010-kmod-kpatch-build-support-cross-compile-hotpatch-for.patch +++ /dev/null @@ -1,480 +0,0 @@ -From be8e5ce9541fc230131be230bd0646c473427895 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:20 +0000 -Subject: [PATCH 1010/1015] kmod/kpatch-build: support cross compile hotpatch - for aarch64 - -use R_AARCH64_ABS64 for aarch64, function_ptr_rela and -kpatch_line_macro_change_only are left to implement later. - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/livepatch-patch-hook.c | 16 +++--- - kpatch-build/create-diff-object.c | 98 ++++++++++++++++++++++++++++++---- - kpatch-build/create-kpatch-module.c | 24 ++++++++- - kpatch-build/kpatch-build | 42 ++++++++++++--- - kpatch-build/kpatch-gcc | 4 +- - 5 files changed, 152 insertions(+), 32 deletions(-) - -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index 8f7d044..ee3b2b9 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -66,13 +66,17 @@ - - #ifdef EULER_RELEASE_CODE - # if EULER_RELEASE_CODE <= EULER_RELEASE_VERSION(2, 3) --# undef HAVE_SYMPOS --# undef HAVE_IMMEDIATE --# undef HAVE_ELF_RELOCS --# define HAVE_LOADHOOKS -+# define __HULK__ - # endif - #endif - -+#ifdef __HULK__ -+# undef HAVE_SYMPOS -+# undef HAVE_IMMEDIATE -+# undef HAVE_ELF_RELOCS -+# define HAVE_LOADHOOKS -+#endif -+ - /* - * There are quite a few similar structures at play in this file: - * - livepatch.h structs prefixed with klp_* -@@ -500,12 +504,10 @@ static int __init patch_init(void) - #else - lfunc->old_addr = func->kfunc->old_addr; - #endif --#ifdef EULER_RELEASE_CODE --# if EULER_RELEASE_CODE <= EULER_RELEASE_VERSION(2, 3) -+#ifdef __HULK__ - lfunc->old_size = func->kfunc->old_size; - lfunc->new_size = func->kfunc->new_size; - lfunc->force = patch_is_func_forced(func->kfunc->new_addr); --# endif - #endif - j++; - } -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index ed96758..b8d3bb4 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -70,6 +70,31 @@ char *childobj; - - enum loglevel loglevel = NORMAL; - -+#ifndef EM_X86_64 -+#define EM_X86_64 62 -+#endif -+ -+#ifndef EM_AARCH64 -+#define EM_AARCH64 183 -+#endif -+ -+#ifndef R_AARCH64_ABS64 -+#define R_AARCH64_NONE 0 -+#define R_AARCH64_ABS64 257 -+#define R_AARCH64_CALL26 283 -+#endif -+ -+static unsigned int arch; -+static unsigned int absolute_rela_type; -+ -+static unsigned int arch_of_elf(Elf *elf) -+{ -+ GElf_Ehdr eh; -+ if (!gelf_getehdr(elf, &eh)) -+ ERROR("gelf_getehdr"); -+ return eh.e_machine; -+} -+ - /******************* - * Data structures - * ****************/ -@@ -635,6 +660,8 @@ static void kpatch_compare_correlated_symbol(struct symbol *sym) - if (sym1->sec && sym2->sec && sym1->sec->twin != sym2->sec) { - if (sym2->sec->twin && sym2->sec->twin->ignore) - sym->status = CHANGED; -+ else if (sym1->name[0] == '$') /* reserved symbols in aarch64 */ -+ log_debug("maping symbols: %s", sym1->name); /* do nothing just ignogre */ - else - DIFF_FATAL("symbol changed sections: %s", sym1->name); - } -@@ -2294,7 +2321,7 @@ static void kpatch_create_kpatch_arch_section(struct kpatch_elf *kelf, char *obj - /* entries[index].sec */ - ALLOC_LINK(rela, &karch_sec->rela->relas); - rela->sym = sec->secsym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = 0; - rela->offset = index * sizeof(*entries) + \ - offsetof(struct kpatch_arch, sec); -@@ -2302,7 +2329,7 @@ static void kpatch_create_kpatch_arch_section(struct kpatch_elf *kelf, char *obj - /* entries[index].objname */ - ALLOC_LINK(rela, &karch_sec->rela->relas); - rela->sym = strsym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = offset_of_string(&kelf->strings, objname); - rela->offset = index * sizeof(*entries) + \ - offsetof(struct kpatch_arch, objname); -@@ -2500,7 +2527,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - */ - ALLOC_LINK(rela, &relasec->relas); - rela->sym = sym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = 0; - rela->offset = index * sizeof(*funcs); - -@@ -2510,7 +2537,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - */ - ALLOC_LINK(rela, &relasec->relas); - rela->sym = strsym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = offset_of_string(&kelf->strings, sym->name); - rela->offset = index * sizeof(*funcs) + - offsetof(struct kpatch_patch_func, name); -@@ -2521,7 +2548,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - */ - ALLOC_LINK(rela, &relasec->relas); - rela->sym = strsym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = objname_offset; - rela->offset = index * sizeof(*funcs) + - offsetof(struct kpatch_patch_func,objname); -@@ -2834,7 +2861,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - /* add rela to fill in ksyms[index].name field */ - ALLOC_LINK(rela2, &ksym_sec->rela->relas); - rela2->sym = strsym; -- rela2->type = ABSOLUTE_RELA_TYPE; -+ rela2->type = absolute_rela_type; - rela2->addend = offset_of_string(&kelf->strings, rela->sym->name); - rela2->offset = index * sizeof(*ksyms) + \ - offsetof(struct kpatch_symbol, name); -@@ -2842,7 +2869,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - /* add rela to fill in ksyms[index].objname field */ - ALLOC_LINK(rela2, &ksym_sec->rela->relas); - rela2->sym = strsym; -- rela2->type = ABSOLUTE_RELA_TYPE; -+ rela2->type = absolute_rela_type; - rela2->addend = offset_of_string(&kelf->strings, sym_objname); - rela2->offset = index * sizeof(*ksyms) + \ - offsetof(struct kpatch_symbol, objname); -@@ -2863,7 +2890,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - ERROR("can't create dynrela for section %s (symbol %s): no bundled or section symbol", - sec->name, rela->sym->name); - -- rela2->type = ABSOLUTE_RELA_TYPE; -+ rela2->type = absolute_rela_type; - rela2->addend = rela->offset; - rela2->offset = index * sizeof(*krelas) + \ - offsetof(struct kpatch_relocation, dest); -@@ -2871,7 +2898,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - /* add rela to fill in krelas[index].objname field */ - ALLOC_LINK(rela2, &krela_sec->rela->relas); - rela2->sym = strsym; -- rela2->type = ABSOLUTE_RELA_TYPE; -+ rela2->type = absolute_rela_type; - rela2->addend = offset_of_string(&kelf->strings, objname); - rela2->offset = index * sizeof(*krelas) + \ - offsetof(struct kpatch_relocation, objname); -@@ -2879,7 +2906,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - /* add rela to fill in krelas[index].ksym field */ - ALLOC_LINK(rela2, &krela_sec->rela->relas); - rela2->sym = ksym_sec_sym; -- rela2->type = ABSOLUTE_RELA_TYPE; -+ rela2->type = absolute_rela_type; - rela2->addend = index * sizeof(*ksyms); - rela2->offset = index * sizeof(*krelas) + \ - offsetof(struct kpatch_relocation, ksym); -@@ -2946,7 +2973,7 @@ static void kpatch_create_callbacks_objname_rela(struct kpatch_elf *kelf, char * - if (!strcmp(callbackp->name, sec->name)) { - ALLOC_LINK(rela, &sec->relas); - rela->sym = strsym; -- rela->type = ABSOLUTE_RELA_TYPE; -+ rela->type = absolute_rela_type; - rela->addend = objname_offset; - rela->offset = callbackp->offset; - break; -@@ -3000,6 +3027,7 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) - /* add rela in .rela__mcount_loc to fill in function pointer */ - ALLOC_LINK(rela, &relasec->relas); - rela->sym = sym; -+ if (arch == EM_X86_64) { - rela->type = R_X86_64_64; - rela->addend = 0; - rela->offset = index * sizeof(*funcs); -@@ -3024,6 +3052,37 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) - rela = list_first_entry(&sym->sec->rela->relas, struct rela, - list); - rela->type = R_X86_64_PC32; -+ } else if (arch == EM_AARCH64) { -+ unsigned int *insnp; -+ rela->type = R_AARCH64_ABS64; -+ /* bl <__fentry__> is the second insn */ -+ rela->addend = 4; -+ rela->offset = index * sizeof(*funcs); -+ -+ newdata = malloc(sym->sec->data->d_size); -+ memcpy(newdata, sym->sec->data->d_buf, sym->sec->data->d_size); -+ sym->sec->data->d_buf = newdata; -+ insnp = newdata; -+ -+ /* -+ * mov x9, x30 -+ * nop //function in .text., so it be replaced with nop by recordmcount -+ * mov x30, x9 -+ */ -+ if (insnp[0] != 0xaa1e03e9 || insnp[1] != 0xd503201f || insnp[2] != 0xaa0903fe) -+ ERROR("%s: unexpected instruction at the start of the function", -+ sym->name); -+ -+ /* change the nop to bl __fentry__ */ -+ insnp[1] = 0x94000000; -+ rela = list_first_entry(&sym->sec->rela->relas, struct rela, -+ list); -+ rela->type = R_AARCH64_CALL26; -+ rela->offset = 4; -+ -+ } else { -+ ERROR("unsupport arch %d\n", arch); -+ } - - index++; - } -@@ -3168,6 +3227,7 @@ int main(int argc, char *argv[]) - char *hint = NULL, *orig_obj, *patched_obj, *parent_name; - char *parent_symtab, *mod_symvers, *patch_name, *output_obj; - struct sym_compare_type *base_locals; -+ char *gcc_add_option, *mlongcall; - - arguments.debug = 0; - argp_parse (&argp, argc, argv, 0, NULL, &arguments); -@@ -3188,6 +3248,13 @@ int main(int argc, char *argv[]) - - kelf_base = kpatch_elf_open(orig_obj); - kelf_patched = kpatch_elf_open(patched_obj); -+ arch = arch_of_elf(kelf_base->elf); -+ if (arch == EM_X86_64) -+ absolute_rela_type = R_X86_64_64; -+ else if (arch == EM_AARCH64) -+ absolute_rela_type = R_AARCH64_ABS64; -+ else -+ ERROR("only arch x86_64 and arm64 be supported\n"); - - kpatch_bundle_symbols(kelf_base); - kpatch_bundle_symbols(kelf_patched); -@@ -3276,7 +3343,14 @@ int main(int argc, char *argv[]) - kpatch_create_callbacks_objname_rela(kelf_out, parent_name); - kpatch_build_strings_section_data(kelf_out); - -- kpatch_create_mcount_sections(kelf_out); -+ gcc_add_option = getenv("GCC_ADD_OPTION"); -+ printf("gcc add option :%s\n", gcc_add_option); -+ mlongcall = strstr(gcc_add_option, "-mlong-calls"); -+ if (arch == EM_AARCH64 && mlongcall) { -+ printf("-mlong-calls found, no need to create mcount section\n"); -+ } else { -+ kpatch_create_mcount_sections(kelf_out); -+ } - - /* - * At this point, the set of output sections and symbols is -diff --git a/kpatch-build/create-kpatch-module.c b/kpatch-build/create-kpatch-module.c -index 67b16b0..9f1c3b9 100644 ---- a/kpatch-build/create-kpatch-module.c -+++ b/kpatch-build/create-kpatch-module.c -@@ -31,6 +31,17 @@ - char *childobj; - enum loglevel loglevel = NORMAL; - -+static unsigned int arch; -+static unsigned int absolute_rela_type; -+ -+static unsigned int arch_of_elf(Elf *elf) -+{ -+ GElf_Ehdr eh; -+ if (!gelf_getehdr(elf, &eh)) -+ ERROR("gelf_getehdr"); -+ return eh.e_machine; -+} -+ - /* - * Create .kpatch.dynrelas from .kpatch.relocations and .kpatch.symbols sections - * -@@ -102,14 +113,14 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - /* dest */ - ALLOC_LINK(rela, &dynsec->rela->relas); - rela->sym = sym; -- rela->type = R_X86_64_64; -+ rela->type = absolute_rela_type; - rela->addend = dest_offset; - rela->offset = index * sizeof(*dynrelas); - - /* name */ - ALLOC_LINK(rela, &dynsec->rela->relas); - rela->sym = strsec->secsym; -- rela->type = R_X86_64_64; -+ rela->type = absolute_rela_type; - rela->addend = name_offset; - rela->offset = index * sizeof(*dynrelas) + \ - offsetof(struct kpatch_patch_dynrela, name); -@@ -117,7 +128,7 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - /* objname */ - ALLOC_LINK(rela, &dynsec->rela->relas); - rela->sym = strsec->secsym; -- rela->type = R_X86_64_64; -+ rela->type = absolute_rela_type; - rela->addend = objname_offset; - rela->offset = index * sizeof(*dynrelas) + \ - offsetof(struct kpatch_patch_dynrela, objname); -@@ -200,6 +211,13 @@ int main(int argc, char *argv[]) - childobj = basename(arguments.args[0]); - - kelf = kpatch_elf_open(arguments.args[0]); -+ arch = arch_of_elf(kelf->elf); -+ if (arch == EM_X86_64) -+ absolute_rela_type = R_X86_64_64; -+ else if (arch == EM_AARCH64) -+ absolute_rela_type = R_AARCH64_ABS64; -+ else -+ ERROR("only arch x86_64 and arm64 be supported\n"); - - /* - * Sanity checks: -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index 93a0589..017604c 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -384,6 +384,27 @@ find_kobj() { - done - } - -+arch_export() { -+ E_MACHINE=$(od -An -j18 -N2 -d $VMLINUX) -+ if [[ $E_MACHINE -eq 62 ]]; then -+ export ARCH=x86_64 -+ export ARCH_COMPILE= -+ export ENDIAN=little -+ export GCC_ADD_OPTION= -+ elif [[ $E_MACHINE -eq 183 ]]; then -+ export ARCH=arm64 -+ export ARCH_COMPILE=aarch64-linux-gnu- -+ export ENDIAN=little -+ if grep "\-mlong-calls" $SRCDIR/Makefile > /dev/null; then -+ export GCC_ADD_OPTION="-fno-section-anchors -mlong-calls" -+ else -+ export GCC_ADD_OPTION="-fno-section-anchors" -+ fi -+ else -+ die "only support arm64 or x86_64 architecture" -+ fi -+} -+ - # Only allow alphanumerics and '_' and '-' in the module name. Everything else - # is replaced with '-'. Also truncate to 48 chars so the full name fits in the - # kernel's 56-byte module name array. -@@ -725,12 +746,12 @@ apply_patches - remove_patches - - cp -LR "$DATADIR/patch" "$TEMPDIR" || die -- -+arch_export - if [[ "$ARCH" = "ppc64le" ]]; then - ARCH_KCFLAGS="-mcmodel=large -fplugin=$PLUGINDIR/ppc64le-plugin.so" - fi - --export KCFLAGS="-I$DATADIR/patch -ffunction-sections -fdata-sections $ARCH_KCFLAGS" -+export KCFLAGS="-I$DATADIR/patch -ffunction-sections -fdata-sections $ARCH_KCFLAGS ${GCC_ADD_OPTION}" - - echo "Reading special section data" - find_special_section_data -@@ -752,9 +773,9 @@ unset KPATCH_GCC_TEMPDIR - # $TARGETS used as list, no quotes. - # shellcheck disable=SC2086 - if [ -z "$USERMODDIR" ];then -- CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make "-j$CPUS" $TARGETS 2>&1 | logger || die -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make "-j$CPUS" $TARGETS 2>&1 | logger || die - else -- CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die - fi - - sleep 1 -@@ -770,11 +791,11 @@ export KPATCH_GCC_TEMPDIR - # $TARGETS used as list, no quotes. - # shellcheck disable=SC2086 - if [ -z "$USERMODDIR" ];then -- CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ - KBUILD_MODPOST_WARN=1 \ - make "-j$CPUS" $TARGETS 2>&1 | logger || die - else -- CROSS_COMPILE="$TOOLSDIR/kpatch-gcc " \ -+ CROSS_COMPILE="$TOOLSDIR/kpatch-gcc $ARCH_COMPILE" \ - KBUILD_MODPOST_WARN=1 \ - make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die - fi -@@ -907,6 +928,10 @@ if "$KPATCH_MODULE"; then - export KCPPFLAGS="-D__KPATCH_MODULE__" - fi - -+if grep "hulk" $SRCDIR/Makefile > /dev/null; then -+ export KCPPFLAGS="-D__HULK__ $KCPPFLAGS" -+fi -+ - echo "Building patch module: $MODNAME.ko" - - if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then -@@ -919,12 +944,12 @@ fi - cd "$TEMPDIR/output" || die - # $KPATCH_LDFLAGS and result of find used as list, no quotes. - # shellcheck disable=SC2086,SC2046 --ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die -+${ARCH_COMPILE}ld -r $KPATCH_LDFLAGS -o ../patch/tmp_output.o $(find . -name "*.o") 2>&1 | logger || die - - if "$KPATCH_MODULE"; then - # Add .kpatch.checksum for kpatch script - md5sum ../patch/tmp_output.o | awk '{printf "%s\0", $1}' > checksum.tmp || die -- objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die -+ ${ARCH_COMPILE}objcopy --add-section .kpatch.checksum=checksum.tmp --set-section-flags .kpatch.checksum=alloc,load,contents,readonly ../patch/tmp_output.o || die - rm -f checksum.tmp - "$TOOLSDIR"/create-kpatch-module "$TEMPDIR"/patch/tmp_output.o "$TEMPDIR"/patch/output.o 2>&1 | logger 1 - check_pipe_status create-kpatch-module -@@ -942,6 +967,7 @@ fi - KPATCH_BUILD="$KPATCH_BUILDIR" KPATCH_NAME="$MODNAME" \ - KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \ - KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \ -+CROSS_COMPILE="$ARCH_COMPILE" \ - make 2>&1 | logger || die - - if ! "$KPATCH_MODULE"; then -diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc -index 21f7e2e..be18847 100755 ---- a/kpatch-build/kpatch-gcc -+++ b/kpatch-build/kpatch-gcc -@@ -13,7 +13,7 @@ fi - - declare -a args=("$@") - --if [[ "$TOOLCHAINCMD" = "gcc" ]] ; then -+if [[ "$TOOLCHAINCMD" = ${ARCH_COMPILE}gcc ]] ; then - while [ "$#" -gt 0 ]; do - if [ "$1" = "-o" ]; then - obj="$2" -@@ -64,7 +64,7 @@ if [[ "$TOOLCHAINCMD" = "gcc" ]] ; then - fi - shift - done --elif [[ "$TOOLCHAINCMD" = "ld" ]] ; then -+elif [[ "$TOOLCHAINCMD" = ${ARCH_COMPILE}ld ]] ; then - while [ "$#" -gt 0 ]; do - if [ "$1" = "-o" ]; then - obj="$2" --- -1.7.5.4 - diff --git a/9011-kpatch-build-use-.klp.rela-in-euleros-7.5-kernel.patch b/9011-kpatch-build-use-.klp.rela-in-euleros-7.5-kernel.patch deleted file mode 100644 index 58562a4..0000000 --- a/9011-kpatch-build-use-.klp.rela-in-euleros-7.5-kernel.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 868a6e4462bebcffa4bf6beea02262823e7dc3a3 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:33 +0000 -Subject: [PATCH] kpatch-build: use .klp.rela in euleros 7.5 kernel - -use .klp.rela in euleros 7.5 kernel - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/kpatch-build | 13 +++++++++++-- - 1 files changed, 11 insertions(+), 2 deletions(-) - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index fb14850..5a70a44 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -157,6 +157,15 @@ is_rhel() { - [[ $1 =~ \.el[78]\. ]] - } - -+is_euleros_klp() { -+ if [[ "$1" =~ ^3.10.0-862 ]] ;then -+ if [ $ID == "euleros" ];then -+ return 0; -+ fi -+ fi -+ return 1; -+} -+ - find_dirs() { - if [[ -e "$SCRIPTDIR/create-diff-object" ]]; then - # git repo -@@ -708,10 +717,10 @@ KPATCH_MODULE=true - grep -q "CONFIG_DEBUG_INFO=y" "$CONFIGFILE" || die "kernel doesn't have 'CONFIG_DEBUG_INFO' enabled" - if grep -q "CONFIG_LIVEPATCH=y" "$CONFIGFILE"; then - # The kernel supports livepatch. -- if version_gte "${ARCHVERSION//-*/}" 4.7.0 || is_rhel "$ARCHVERSION"; then -+ if version_gte "${ARCHVERSION//-*/}" 4.7.0 || is_rhel "$ARCHVERSION" || is_euleros_klp "$ARCHVERSION"; then - # Use new .klp.rela. sections - KPATCH_MODULE=false -- if version_gte "${ARCHVERSION//-*/}" 4.9.0 || is_rhel "$ARCHVERSION"; then -+ if version_gte "${ARCHVERSION//-*/}" 4.9.0 || is_rhel "$ARCHVERSION" || is_euleros_klp "$ARCHVERSION"; then - KPATCH_LDFLAGS="--unique=.parainstructions --unique=.altinstructions" - fi - fi --- -1.7.5.4 - diff --git a/9013-kmod-kpatch-build-fix-duplicate-symbol-relocation-fo.patch b/9013-kmod-kpatch-build-fix-duplicate-symbol-relocation-fo.patch deleted file mode 100644 index 4e2f5b2..0000000 --- a/9013-kmod-kpatch-build-fix-duplicate-symbol-relocation-fo.patch +++ /dev/null @@ -1,365 +0,0 @@ -From 1eaabfe01cfae870abd45bfa470caa144f34e74c Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:45 +0000 -Subject: [PATCH 1013/1015] kmod/kpatch-build: fix duplicate symbol relocation - for hulk kernel - -hulk kernel fix it by find a uniq symbol(ref_name) and -use ref_offset to find the duplicate symbol - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/kpatch-patch.h | 4 ++ - kmod/patch/livepatch-patch-hook.c | 6 ++ - kpatch-build/create-diff-object.c | 44 +++++++++++++++++- - kpatch-build/create-kpatch-module.c | 23 +++++++++- - kpatch-build/kpatch-build | 12 +++++ - kpatch-build/kpatch-intermediate.h | 2 + - kpatch-build/lookup.c | 87 ++++++++++++++++++++++++++++++++++- - kpatch-build/lookup.h | 8 +++ - 8 files changed, 183 insertions(+), 3 deletions(-) - -diff --git a/kmod/patch/kpatch-patch.h b/kmod/patch/kpatch-patch.h -index 4d47d30..2eacb37 100644 ---- a/kmod/patch/kpatch-patch.h -+++ b/kmod/patch/kpatch-patch.h -@@ -30,6 +30,8 @@ struct kpatch_patch_func { - unsigned long sympos; - char *name; - char *objname; -+ char *ref_name; -+ long ref_offset; - }; - - struct kpatch_patch_dynrela { -@@ -41,6 +43,8 @@ struct kpatch_patch_dynrela { - char *objname; - int external; - int addend; -+ char *ref_name; -+ long ref_offset; - }; - - struct kpatch_pre_patch_callback { -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index ee3b2b9..fefc068 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -508,6 +508,8 @@ static int __init patch_init(void) - lfunc->old_size = func->kfunc->old_size; - lfunc->new_size = func->kfunc->new_size; - lfunc->force = patch_is_func_forced(func->kfunc->new_addr); -+ lfunc->ref_name= func->kfunc->ref_name; -+ lfunc->ref_offset = func->kfunc->ref_offset; - #endif - j++; - } -@@ -531,6 +533,10 @@ static int __init patch_init(void) - lreloc->name = reloc->kdynrela->name; - lreloc->addend = reloc->kdynrela->addend; - lreloc->external = reloc->kdynrela->external; -+#ifdef __HULK__ -+ lreloc->ref_name = reloc->kdynrela->ref_name; -+ lreloc->ref_offset = reloc->kdynrela->ref_offset; -+#endif - j++; - } - #endif /* HAVE_ELF_RELOCS */ -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 4fb27da..e72f6dd 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -2519,6 +2519,29 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - funcs[index].old_size = result.size; - funcs[index].new_size = sym->sym.st_size; - funcs[index].sympos = result.pos; -+ if (lookup_is_duplicate_symbol(table, sym->name)) { -+ struct lookup_refsym refsym; -+ long offset; -+ -+ if (lookup_ref_symbol(table, sym->name, &refsym)) -+ ERROR("unresolvable ambiguity on symbol %s\n", sym->name); -+ -+ offset = (long)result.value - (long)refsym.value; -+ funcs[index].ref_offset = offset; -+ -+ /* -+ * Add a relocation that will populate -+ * the funcs[index].ref_name field. -+ */ -+ ALLOC_LINK(rela, &relasec->relas); -+ rela->sym = strsym; -+ rela->type = absolute_rela_type; -+ rela->addend = offset_of_string(&kelf->strings, refsym.name); -+ rela->offset = index * sizeof(*funcs) + -+ offsetof(struct kpatch_patch_func, ref_name); -+ -+ } -+ - - /* - * Add a relocation that will populate -@@ -2653,6 +2676,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - struct lookup_result result; - char *sym_objname; - int ret, vmlinux, external; -+ long ref_offset; - - vmlinux = !strcmp(objname, "vmlinux"); - -@@ -2860,12 +2884,29 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - log_debug("lookup for %s @ 0x%016lx len %lu\n", - rela->sym->name, result.value, result.size); - -+ ref_offset = 0; - /* Fill in ksyms[index] */ - if (vmlinux) - ksyms[index].src = result.value; -- else -+ else { - /* for modules, src is discovered at runtime */ - ksyms[index].src = 0; -+ if (lookup_is_duplicate_symbol(table, rela->sym->name)) { -+ struct lookup_refsym refsym; -+ -+ if (lookup_ref_symbol(table, rela->sym->name, &refsym)) -+ ERROR("unresolvable ambiguity on symbol %s\n", rela->sym->name); -+ -+ ref_offset = (long)result.value - (long)refsym.value; -+ /* add rela to fill in ref_name field */ -+ ALLOC_LINK(rela2, &krela_sec->rela->relas); -+ rela2->sym = strsym; -+ rela2->type = absolute_rela_type; -+ rela2->addend = offset_of_string(&kelf->strings, refsym.name); -+ rela2->offset = index * sizeof(*krelas) + -+ offsetof(struct kpatch_relocation, ref_name); -+ } -+ } - ksyms[index].pos = result.pos; - ksyms[index].type = rela->sym->type; - ksyms[index].bind = rela->sym->bind; -@@ -2893,6 +2934,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - krelas[index].addend = rela->addend; - krelas[index].type = rela->type; - krelas[index].external = external; -+ krelas[index].ref_offset = ref_offset; - - /* add rela to fill in krelas[index].dest field */ - ALLOC_LINK(rela2, &krela_sec->rela->relas); -diff --git a/kpatch-build/create-kpatch-module.c b/kpatch-build/create-kpatch-module.c -index 9f1c3b9..8292dc8 100644 ---- a/kpatch-build/create-kpatch-module.c -+++ b/kpatch-build/create-kpatch-module.c -@@ -57,7 +57,7 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - struct section *dynsec; - struct symbol *sym; - struct rela *rela; -- int index, nr, offset, dest_offset, objname_offset, name_offset; -+ int index, nr, offset, dest_offset, objname_offset, name_offset, ref_name_offset; - - ksyms = ksymsec->data->d_buf; - krelas = krelasec->data->d_buf; -@@ -109,6 +109,27 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - dynrelas[index].type = krelas[index].type; - dynrelas[index].external = krelas[index].external; - dynrelas[index].sympos = ksym->pos; -+ dynrelas[index].ref_name = krelas[index].ref_name; -+ dynrelas[index].ref_offset = krelas[index].ref_offset; -+ -+ if (dynrelas[index].ref_offset) -+ { -+ /* Get objname offset */ -+ rela = find_rela_by_offset(krelasec->rela, -+ index * sizeof(*krelas) + offsetof(struct kpatch_relocation, ref_name)); -+ if (!rela) { -+ ERROR("find_rela_by_offset"); -+ } -+ ref_name_offset = rela->addend; -+ /* ref_name */ -+ ALLOC_LINK(rela, &dynsec->rela->relas); -+ rela->sym = strsec->secsym; -+ rela->type = absolute_rela_type; -+ rela->addend = ref_name_offset; -+ rela->offset = index * sizeof(*dynrelas) + \ -+ offsetof(struct kpatch_patch_dynrela, ref_name); -+ -+ } - - /* dest */ - ALLOC_LINK(rela, &dynsec->rela->relas); -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index 9c40612..80b9607 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -894,6 +894,18 @@ for i in $FILES; do - KOBJFILE_NAME="${KOBJFILE_NAME/-/_}" - KOBJFILE_PATH="${TEMPDIR}/module/$KOBJFILE" - SYMTAB="${KOBJFILE_PATH}.symtab" -+ unset KCFLAGS -+ remove_patches -+ if [ -z "$USERMODDIR" ];then -+ cd "$SRCDIR" || die -+ CROSS_COMPILE="$ARCH_COMPILE" make "-j$CPUS" ${KOBJFILE} 2>&1 | logger || die -+ else -+ cd "$USERMODDIR" -+ CROSS_COMPILE="$ARCH_COMPILE" make -C "$USERMODBUILDDIR" M="$USERMODBUILDDIR" "-j$CPUS" $USERMODFLAGS $TARGETS 2>&1 | logger || die -+ fi -+ cp ${KOBJFILE} ${KOBJFILE_PATH} -+ apply_patches -+ cd "$TEMPDIR" || die - fi - - eu-readelf -s "$KOBJFILE_PATH" > "$SYMTAB" -diff --git a/kpatch-build/kpatch-intermediate.h b/kpatch-build/kpatch-intermediate.h -index 3dea775..59deed0 100644 ---- a/kpatch-build/kpatch-intermediate.h -+++ b/kpatch-build/kpatch-intermediate.h -@@ -39,6 +39,8 @@ struct kpatch_relocation { - int external; - char *objname; /* object to which this rela applies to */ - struct kpatch_symbol *ksym; -+ char *ref_name; -+ long ref_offset; - }; - - struct kpatch_arch { -diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c -index d08c10b..e4677db 100644 ---- a/kpatch-build/lookup.c -+++ b/kpatch-build/lookup.c -@@ -44,6 +44,7 @@ struct object_symbol { - unsigned long size; - char *name; - int type, bind; -+ int sec_index; - }; - - struct export_symbol { -@@ -229,6 +230,7 @@ static void symtab_read(struct lookup_table *table, char *path) - table->obj_syms[i].value = value; - table->obj_syms[i].size = size; - table->obj_syms[i].name = strdup(name); -+ table->obj_syms[i].sec_index = atoi(ndx); - - if (!strcmp(bind, "LOCAL")) { - table->obj_syms[i].bind = STB_LOCAL; -@@ -425,7 +427,90 @@ char *lookup_exported_symbol_objname(struct lookup_table *table, char *name) - return match->objname; - - return NULL; -- } -+} -+ -+int lookup_is_duplicate_symbol(struct lookup_table *table, char *name) -+{ -+ struct object_symbol *sym; -+ int i, count = 0; -+ -+ for_each_obj_symbol(i, sym, table) -+ if (!strcmp(sym->name, name)) { -+ count++; -+ if (count > 1) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+struct object_symbol *lookup_find_symbol_by_name(struct lookup_table *table, char *name) -+{ -+ struct object_symbol *sym; -+ unsigned long pos = 0; -+ int i, match = 0, in_file = 0; -+ -+ if (!table->local_syms) -+ return NULL; -+ -+ for_each_obj_symbol(i, sym, table) { -+ if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) -+ pos++; -+ -+ if (table->local_syms == sym) { -+ in_file = 1; -+ continue; -+ } -+ -+ if (!in_file) -+ continue; -+ -+ if (sym->type == STT_FILE) -+ break; -+ -+ if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) { -+ match = 1; -+ break; -+ } -+ } -+ -+ if (!match) { -+ for_each_obj_symbol(i, sym, table) { -+ if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) && -+ !strcmp(sym->name, name)) { -+ return sym; -+ } -+ } -+ return NULL; -+ } -+ -+ return sym; -+} -+ -+int lookup_ref_symbol(struct lookup_table *table, char *name, -+ struct lookup_refsym *refsym) -+{ -+ struct object_symbol *orig_sym, *sym; -+ int i; -+ -+ orig_sym = lookup_find_symbol_by_name(table, name); -+ if (!orig_sym) -+ ERROR("lookup_ref_symbol"); -+ memset(refsym, 0, sizeof(*refsym)); -+ for_each_obj_symbol(i, sym, table) { -+ if (!strcmp(sym->name, name) || sym->type == STT_FILE || -+ sym->sec_index != orig_sym->sec_index) -+ continue; -+ -+ if (!lookup_is_duplicate_symbol(table, sym->name)) { -+ refsym->name = sym->name; -+ refsym->value = sym->value; -+ return 0; -+ } -+ } -+ -+ return 1; -+} - - #if 0 /* for local testing */ - static void find_this(struct lookup_table *table, char *sym, char *hint) -diff --git a/kpatch-build/lookup.h b/kpatch-build/lookup.h -index 420d0f0..5ad9241 100644 ---- a/kpatch-build/lookup.h -+++ b/kpatch-build/lookup.h -@@ -14,6 +14,11 @@ struct sym_compare_type { - int type; - }; - -+struct lookup_refsym { -+ char *name; -+ unsigned long value; -+}; -+ - struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, - char *hint, struct sym_compare_type *locals); - void lookup_close(struct lookup_table *table); -@@ -23,5 +28,8 @@ int lookup_global_symbol(struct lookup_table *table, char *name, - struct lookup_result *result); - int lookup_is_exported_symbol(struct lookup_table *table, char *name); - char *lookup_exported_symbol_objname(struct lookup_table *table, char *name); -+int lookup_is_duplicate_symbol(struct lookup_table *table, char *name); -+int lookup_ref_symbol(struct lookup_table *table, char *name, -+ struct lookup_refsym *refsym); - - #endif /* _LOOKUP_H_ */ --- -1.7.5.4 - diff --git a/9014-create-diff-object-add-dynamic-reloction-for-functio.patch b/9014-create-diff-object-add-dynamic-reloction-for-functio.patch deleted file mode 100644 index 692a415..0000000 --- a/9014-create-diff-object-add-dynamic-reloction-for-functio.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 83ecafcda5326baceeb68fba90dc13083ff48fe6 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:25:50 +0000 -Subject: [PATCH 1014/1015] create-diff-object: add dynamic reloction for - function pointer on aarch64 - -implement function_ptr_rela for aarch64. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/create-diff-object.c | 4 +++- - 1 files changed, 3 insertions(+), 1 deletions(-) - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index e72f6dd..f8f3e15 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -2628,7 +2628,9 @@ static int function_ptr_rela(const struct rela *rela) - rela_toc->addend == (int)rela_toc->sym->sym.st_value && - (rela->type == R_X86_64_32S || - rela->type == R_PPC64_TOC16_HA || -- rela->type == R_PPC64_TOC16_LO_DS)); -+ rela->type == R_PPC64_TOC16_LO_DS || -+ rela->type == R_AARCH64_ADR_PREL_PG_HI21 || -+ rela->type == R_AARCH64_ADD_ABS_LO12_NC)); - } - - static int may_need_dynrela(const struct rela *rela) --- -1.7.5.4 - diff --git a/9015-create-diff-object-exclude-line-only-change-for-arm6.patch b/9015-create-diff-object-exclude-line-only-change-for-arm6.patch deleted file mode 100644 index 6ed7af1..0000000 --- a/9015-create-diff-object-exclude-line-only-change-for-arm6.patch +++ /dev/null @@ -1,106 +0,0 @@ -From d1bbff5da464148e5d277b601a31d7872b4e376b Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 2 Nov 2018 17:26:00 +0000 -Subject: [PATCH 1015/1015] create-diff-object: exclude line only change for - arm64 - -exclude line only change for arm64 by compare mov instruction -except immediate part. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/create-diff-object.c | 71 ++++++++++++++++++++++++++++++++++++- - 1 files changed, 70 insertions(+), 1 deletions(-) - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index f8f3e15..12d8bd6 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -609,6 +609,68 @@ static int kpatch_line_macro_change_only(struct section *sec) - return 0; - } - #endif -+#define ARM64_INSTR_LEN 4 -+static int arm64_kpatch_line_macro_change_only(struct section *sec) -+{ -+ unsigned long start1, start2, size, offset; -+ struct rela *rela; -+ int lineonly = 0, found; -+ unsigned int mov_imm_mask = ((1<<16) - 1)<<5; -+ -+ if (sec->status != CHANGED || -+ is_rela_section(sec) || -+ !is_text_section(sec) || -+ sec->sh.sh_size != sec->twin->sh.sh_size || -+ !sec->rela || -+ sec->rela->status != SAME) -+ return 0; -+ -+ start1 = (unsigned long)sec->twin->data->d_buf; -+ start2 = (unsigned long)sec->data->d_buf; -+ size = sec->sh.sh_size; -+ for (offset = 0; offset < size; offset += ARM64_INSTR_LEN) { -+ if (!memcmp((void *)start1 + offset, (void *)start2 + offset, -+ ARM64_INSTR_LEN)) -+ continue; -+ -+ /* verify it's a mov immediate to w1 */ -+ if ((*(int *)(start1 + offset) & ~mov_imm_mask) != -+ (*(int *)(start2 + offset) & ~mov_imm_mask)) -+ return 0; -+ -+ found = 0; -+ list_for_each_entry(rela, &sec->rela->relas, list) { -+ if (rela->offset < offset + ARM64_INSTR_LEN) -+ continue; -+ if (rela->string) -+ continue; -+ if (!strncmp(rela->sym->name, "__warned.", 9)) -+ continue; -+ if (!strncmp(rela->sym->name, "warn_slowpath_", 14) || -+ (!strcmp(rela->sym->name, "__warn_printk")) || -+ (!strcmp(rela->sym->name, "__might_sleep")) || -+ (!strcmp(rela->sym->name, "___might_sleep")) || -+ (!strcmp(rela->sym->name, "__might_fault")) || -+ (!strcmp(rela->sym->name, "printk")) || -+ (!strcmp(rela->sym->name, "lockdep_rcu_suspicious"))) { -+ found = 1; -+ break; -+ } -+ return 0; -+ } -+ if (!found) -+ return 0; -+ -+ lineonly = 1; -+ } -+ -+ if (!lineonly) -+ ERROR("no instruction changes detected for changed section %s", -+ sec->name); -+ -+ return 1; -+} -+ - - static void kpatch_compare_sections(struct list_head *seclist) - { -@@ -624,7 +686,14 @@ static void kpatch_compare_sections(struct list_head *seclist) - - /* exclude WARN-only, might_sleep changes */ - list_for_each_entry(sec, seclist, list) { -- if (kpatch_line_macro_change_only(sec)) { -+ int line_only; -+ if (arch == EM_X86_64) -+ line_only = kpatch_line_macro_change_only(sec); -+ else if (arch == EM_AARCH64) -+ line_only = arm64_kpatch_line_macro_change_only(sec); -+ else -+ line_only = 0; -+ if (line_only) { - log_debug("reverting macro / line number section %s status to SAME\n", - sec->name); - sec->status = SAME; --- -1.7.5.4 - diff --git a/9016-kpatch-build-include-secsym-in-kpatch_mark_ignored_s.patch b/9016-kpatch-build-include-secsym-in-kpatch_mark_ignored_s.patch deleted file mode 100644 index b64f46d..0000000 --- a/9016-kpatch-build-include-secsym-in-kpatch_mark_ignored_s.patch +++ /dev/null @@ -1,31 +0,0 @@ -From dc771a1789ea3769777228f792f0902f8b0566ba Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Thu, 22 Nov 2018 21:06:32 +0000 -Subject: [PATCH] kpatch-build: include secsym in kpatch_mark_ignored_sections - -kpatch_mark_ignored_sections include .rodata.str1.1 section but does -not include its section symbol, causing its section symbol can not be -included any more in kpatch_include_standard_elements. After the -section symbol is freed in kpatch_elf_teardown, we got a segmentation -fault in kpatch_create_intermediate_sections. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/create-diff-object.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 2e54960..97ae0d4 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -2285,6 +2285,7 @@ static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf) - * from the section data comparison, but this is a simpler way. - */ - strsec->include = 1; -+ strsec->secsym->include = 1; - name = strsec->data->d_buf + rela->addend; - ignoresec = find_section_by_name(&kelf->sections, name); - if (!ignoresec) --- -1.7.5.4 - diff --git a/9018-support-c-plus-kernel-module.patch b/9018-support-c-plus-kernel-module.patch deleted file mode 100644 index 209cf49..0000000 --- a/9018-support-c-plus-kernel-module.patch +++ /dev/null @@ -1,828 +0,0 @@ -From 9d590b5b9fb59c1cd52221feeef2794eb3333571 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Thu, 8 Nov 2018 15:12:06 +0000 -Subject: [PATCH] support c plus kernel module - -support GNU_UNIQUE type symbols. -support .group section corelation. -support symbol name longger than 128 bytes. -fix object size changed error for __FUNCTION__.xxx. -ignore compile warning for third party modules. -support functions have no fentry call. -support all function force enable/disable -fix sym replacing error for aarch64 - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/livepatch-patch-hook.c | 8 ++ - kpatch-build/create-diff-object.c | 161 ++++++++++++++++++++++++----------- - kpatch-build/create-klp-module.c | 27 +++++- - kpatch-build/create-kpatch-module.c | 15 +-- - kpatch-build/kpatch-build | 7 ++- - kpatch-build/kpatch-elf.c | 8 ++- - kpatch-build/kpatch-gcc | 2 +- - kpatch-build/lookup.c | 125 +++++++++++++++++++++++++-- - kpatch-build/lookup.h | 14 ++- - 9 files changed, 287 insertions(+), 80 deletions(-) - -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index fefc068..ce1c955 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -497,8 +497,12 @@ static int __init patch_init(void) - lfunc->old_name = func->kfunc->name; - lfunc->new_func = (void *)func->kfunc->new_addr; - #if defined(HAVE_IMMEDIATE) -+#ifdef __ALL_FORCE__ -+ lfunc->immediate = 1; -+#else - lfunc->immediate = patch_is_func_forced(lfunc->new_func); - #endif -+#endif - #ifdef HAVE_SYMPOS - lfunc->old_sympos = func->kfunc->sympos; - #else -@@ -507,7 +511,11 @@ static int __init patch_init(void) - #ifdef __HULK__ - lfunc->old_size = func->kfunc->old_size; - lfunc->new_size = func->kfunc->new_size; -+#ifdef __ALL_FORCE__ -+ lfunc->force = 1; -+#else - lfunc->force = patch_is_func_forced(func->kfunc->new_addr); -+#endif - lfunc->ref_name= func->kfunc->ref_name; - lfunc->ref_offset = func->kfunc->ref_offset; - #endif -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index 97ae0d4..8bb650d 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -224,6 +224,7 @@ static int is_special_static(struct symbol *sym) - "__func__.", - "_rs.", - "CSWTCH.", -+ "__FUNCTION__.", - NULL, - }; - char **prefix; -@@ -386,7 +387,7 @@ static void kpatch_compare_correlated_nonrela_section(struct section *sec) - { - struct section *sec1 = sec, *sec2 = sec->twin; - -- if (sec1->sh.sh_type != SHT_NOBITS && -+ if (sec1->sh.sh_type != SHT_NOBITS && sec1->sh.sh_type != SHT_GROUP && - memcmp(sec1->data->d_buf, sec2->data->d_buf, sec1->data->d_size)) - sec->status = CHANGED; - else -@@ -400,8 +401,9 @@ static void kpatch_compare_correlated_section(struct section *sec) - /* Compare section headers (must match or fatal) */ - if (sec1->sh.sh_type != sec2->sh.sh_type || - sec1->sh.sh_flags != sec2->sh.sh_flags || -- sec1->sh.sh_addralign != sec2->sh.sh_addralign || -- sec1->sh.sh_entsize != sec2->sh.sh_entsize) -+ sec1->sh.sh_entsize != sec2->sh.sh_entsize || -+ (sec1->sh.sh_addralign != sec2->sh.sh_addralign && -+ strcmp(sec1->name, ".rodata"))) - DIFF_FATAL("%s section header details differ", sec1->name); - - /* Short circuit for mcount sections, we rebuild regardless */ -@@ -763,6 +765,33 @@ static void kpatch_compare_symbols(struct list_head *symlist) - } - } - -+static int kpatch_correlate_group_section(struct list_head *seclist1, struct list_head *seclist2, struct section *sec1, struct section *sec2) -+{ -+ unsigned int *data1, *end1, *data2; -+ struct section *isec1, *isec2; -+ -+ if (sec1->data->d_size != sec2->data->d_size) -+ return 1; -+ data1 = sec1->data->d_buf; -+ data2 = sec2->data->d_buf; -+ end1 = sec1->data->d_buf + sec1->data->d_size; -+ data1++; -+ data2++; -+ while (data1 < end1) { -+ isec1 = find_section_by_index(seclist1, *data1); -+ if (!isec1) -+ ERROR("group section not found"); -+ isec2 = find_section_by_index(seclist2, *data2); -+ if (!isec2) -+ ERROR("group section not found"); -+ if (strcmp(isec1->name, isec2->name)) -+ return 1; -+ data1++; -+ data2++; -+ } -+ return 0; -+} -+ - static void kpatch_correlate_sections(struct list_head *seclist1, struct list_head *seclist2) - { - struct section *sec1, *sec2; -@@ -777,15 +806,18 @@ static void kpatch_correlate_sections(struct list_head *seclist1, struct list_he - sec1->secsym)) - continue; - -- /* -- * Group sections must match exactly to be correlated. -- * Changed group sections are currently not supported. -- */ -+ /* Group section的格式为: -+ * flag -+ * section index -+ * section index -+ * ... -+ * -+ * 当C++代码发生修改时,section index可能会发生变化 -+ * 这时候我们就比对一下section index所对应的section的 -+ * name,如果相同,我们就认为这两个group是SAME -+ * */ - if (sec1->sh.sh_type == SHT_GROUP) { -- if (sec1->data->d_size != sec2->data->d_size) -- continue; -- if (memcmp(sec1->data->d_buf, sec2->data->d_buf, -- sec1->data->d_size)) -+ if(kpatch_correlate_group_section(seclist1, seclist2, sec1, sec2)) - continue; - } - sec1->twin = sec2; -@@ -1308,17 +1340,21 @@ static void kpatch_replace_sections_syms(struct kpatch_elf *kelf) - #ifdef __powerpc64__ - add_off = 0; - #else -- if (rela->type == R_X86_64_PC32) { -- struct insn insn; -- rela_insn(sec, rela, &insn); -- add_off = (long)insn.next_byte - -- (long)sec->base->data->d_buf - -- rela->offset; -- } else if (rela->type == R_X86_64_64 || -- rela->type == R_X86_64_32S) -- add_off = 0; -- else -- continue; -+ add_off = 0; -+ if (arch == EM_X86_64) { -+ if (rela->type == R_X86_64_PC32) { -+ struct insn insn; -+ rela_insn(sec, rela, &insn); -+ add_off = (long)insn.next_byte - -+ (long)sec->base->data->d_buf - -+ rela->offset; -+ } else if (rela->type == R_X86_64_64 || -+ rela->type == R_X86_64_32S) -+ add_off = 0; -+ else -+ continue; -+ } -+ /* add_off is always equal to 0 on arm64 */ - #endif - - /* -@@ -1421,17 +1457,6 @@ static void kpatch_verify_patchability(struct kpatch_elf *kelf) - errs++; - } - -- if (sec->status != SAME && sec->grouped) { -- log_normal("changed section %s is part of a section group\n", -- sec->name); -- errs++; -- } -- -- if (sec->sh.sh_type == SHT_GROUP && sec->status == NEW) { -- log_normal("new/changed group sections are not supported\n"); -- errs++; -- } -- - /* - * ensure we aren't including .data.* or .bss.* - * (.data.unlikely and .data.once is ok b/c it only has __warned vars) -@@ -1458,6 +1483,7 @@ static void kpatch_include_section(struct section *sec) - /* Include the section and its section symbol */ - if (sec->include) - return; -+ - sec->include = 1; - if (sec->secsym) - sec->secsym->include = 1; -@@ -1640,7 +1666,7 @@ static void kpatch_include_force_elements(struct kpatch_elf *kelf) - sym->include = 0; - } - --int kpatch_include_new_static_var(struct kpatch_elf *kelf) -+static int kpatch_include_new_static_var(struct kpatch_elf *kelf) - { - struct symbol *sym; - -@@ -2253,6 +2279,23 @@ static void kpatch_include_debug_sections(struct kpatch_elf *kelf) - } - } - -+static void kpatch_ignore_debug_sections(struct kpatch_elf *kelf) -+{ -+ struct section *sec; -+ -+ /* include all .debug_* sections */ -+ list_for_each_entry(sec, &kelf->sections, list) { -+ if (is_debug_section(sec)) { -+ sec->include = 0; -+ sec->status = SAME; -+ if (!is_rela_section(sec)) { -+ sec->secsym->include = 0; -+ sec->secsym->status = SAME; -+ } -+ } -+ } -+} -+ - static void kpatch_mark_ignored_sections(struct kpatch_elf *kelf) - { - struct section *sec, *strsec, *ignoresec; -@@ -2589,14 +2632,13 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - funcs[index].old_size = result.size; - funcs[index].new_size = sym->sym.st_size; - funcs[index].sympos = result.pos; -- if (lookup_is_duplicate_symbol(table, sym->name)) { -+ if (lookup_is_duplicate_symbol(table, sym->name, objname, result.pos)) { - struct lookup_refsym refsym; - long offset; - -- if (lookup_ref_symbol(table, sym->name, &refsym)) -+ if (lookup_ref_symbol_offset(table, sym->name, &refsym, objname, &offset)) - ERROR("unresolvable ambiguity on symbol %s\n", sym->name); - -- offset = (long)result.value - (long)refsym.value; - funcs[index].ref_offset = offset; - - /* -@@ -2631,7 +2673,7 @@ static void kpatch_create_patches_sections(struct kpatch_elf *kelf, - ALLOC_LINK(rela, &relasec->relas); - rela->sym = strsym; - rela->type = absolute_rela_type; -- rela->addend = offset_of_string(&kelf->strings, sym->name); -+ rela->addend = offset_of_string(&kelf->strings, strndup(sym->name, KSYM_NAME_LEN-1)); - rela->offset = index * sizeof(*funcs) + - offsetof(struct kpatch_patch_func, name); - -@@ -2780,13 +2822,14 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - */ - if (may_need_dynrela(rela)) - toc_rela(rela)->need_dynrela = 1; -+ - if (rela->sym->sec) { - if (rela->sym->type == STT_FUNC && -- rela->sym->status == CHANGED && -- rela->sym->sec != sec->base && -- sec->base->sym && -- sec->base->sym->type == STT_FUNC) -- toc_rela(rela)->need_dynrela = 1; -+ rela->sym->status == CHANGED && -+ rela->sym->sec != sec->base && -+ sec->base->sym && -+ sec->base->sym->type == STT_FUNC) -+ toc_rela(rela)->need_dynrela = 1; - } - } - } -@@ -2820,6 +2863,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - if (!strcmp(sec->name, ".rela.kpatch.funcs") || - !strcmp(sec->name, ".rela.kpatch.dynrelas")) - continue; -+ - list_for_each_entry_safe(rela, safe, &sec->relas, list) { - if (!rela->need_dynrela) - continue; -@@ -2963,13 +3007,12 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - else { - /* for modules, src is discovered at runtime */ - ksyms[index].src = 0; -- if (lookup_is_duplicate_symbol(table, rela->sym->name)) { -+ if (lookup_is_duplicate_symbol(table, rela->sym->name, objname, result.pos)) { - struct lookup_refsym refsym; - -- if (lookup_ref_symbol(table, rela->sym->name, &refsym)) -+ if (lookup_ref_symbol_offset(table, rela->sym->name, &refsym, objname, &ref_offset)) - ERROR("unresolvable ambiguity on symbol %s\n", rela->sym->name); - -- ref_offset = (long)result.value - (long)refsym.value; - /* add rela to fill in ref_name field */ - ALLOC_LINK(rela2, &krela_sec->rela->relas); - rela2->sym = strsym; -@@ -2987,7 +3030,7 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, - ALLOC_LINK(rela2, &ksym_sec->rela->relas); - rela2->sym = strsym; - rela2->type = absolute_rela_type; -- rela2->addend = offset_of_string(&kelf->strings, rela->sym->name); -+ rela2->addend = offset_of_string(&kelf->strings, strndup(rela->sym->name, KSYM_NAME_LEN-1)); - rela2->offset = index * sizeof(*ksyms) + \ - offsetof(struct kpatch_symbol, name); - -@@ -3163,6 +3206,9 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) - * __fentry__" so that ftrace will be happy. - */ - newdata = malloc(sym->sec->data->d_size); -+ if (!newdata) -+ ERROR("malloc"); -+ - memcpy(newdata, sym->sec->data->d_buf, sym->sec->data->d_size); - sym->sec->data->d_buf = newdata; - insn = newdata; -@@ -3186,6 +3232,8 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) - rela->offset = index * sizeof(*funcs); - - newdata = malloc(sym->sec->data->d_size); -+ if (!newdata) -+ ERROR("malloc"); - memcpy(newdata, sym->sec->data->d_buf, sym->sec->data->d_size); - sym->sec->data->d_buf = newdata; - insnp = newdata; -@@ -3354,6 +3402,8 @@ int main(int argc, char *argv[]) - char *parent_symtab, *mod_symvers, *patch_name, *output_obj; - struct sym_compare_type *base_locals; - char *gcc_add_option, *mlongcall; -+ char *no_profiling_calls; -+ char *kallsyms; - - arguments.debug = 0; - argp_parse (&argp, argc, argv, 0, NULL, &arguments); -@@ -3400,9 +3450,12 @@ int main(int argc, char *argv[]) - return EXIT_STATUS_NO_CHANGE; - } - -+ kallsyms = getenv("KALLSYMS"); -+ if (kallsyms) -+ log_debug("kallsyms file:%s\n", kallsyms); - /* create symbol lookup table */ - base_locals = kpatch_elf_locals(kelf_base); -- lookup = lookup_open(parent_symtab, mod_symvers, hint, base_locals); -+ lookup = lookup_open(parent_symtab, mod_symvers, hint, base_locals, kallsyms); - free(base_locals); - - kpatch_mark_grouped_sections(kelf_patched); -@@ -3420,7 +3473,12 @@ int main(int argc, char *argv[]) - */ - kpatch_mark_ignored_sections(kelf_patched); - kpatch_compare_correlated_elements(kelf_patched); -- kpatch_check_func_profiling_calls(kelf_patched); -+ -+ no_profiling_calls = getenv("NO_PROFILING_CALLS"); -+ if (!no_profiling_calls) -+ kpatch_check_func_profiling_calls(kelf_patched); -+ else -+ log_debug("NO_PROFILING_CALLS set\n"); - kpatch_elf_teardown(kelf_base); - kpatch_elf_free(kelf_base); - -@@ -3430,6 +3488,7 @@ int main(int argc, char *argv[]) - kpatch_include_standard_elements(kelf_patched); - num_changed = kpatch_include_changed_functions(kelf_patched); - kpatch_include_debug_sections(kelf_patched); -+ kpatch_ignore_debug_sections(kelf_patched); - callbacks_exist = kpatch_include_callback_elements(kelf_patched); - kpatch_include_force_elements(kelf_patched); - new_globals_exist = kpatch_include_new_globals(kelf_patched); -@@ -3470,10 +3529,10 @@ int main(int argc, char *argv[]) - kpatch_build_strings_section_data(kelf_out); - - gcc_add_option = getenv("GCC_ADD_OPTION"); -- printf("gcc add option :%s\n", gcc_add_option); -+ log_debug("gcc add option :%s\n", gcc_add_option); - mlongcall = strstr(gcc_add_option, "-mlong-calls"); - if (arch == EM_AARCH64 && mlongcall) { -- printf("-mlong-calls found, no need to create mcount section\n"); -+ log_debug("-mlong-calls found, no need to create mcount section\n"); - } else { - kpatch_create_mcount_sections(kelf_out); - } -diff --git a/kpatch-build/create-klp-module.c b/kpatch-build/create-klp-module.c -index 253704b..7a72afd 100644 ---- a/kpatch-build/create-klp-module.c -+++ b/kpatch-build/create-klp-module.c -@@ -38,7 +38,9 @@ enum loglevel loglevel = NORMAL; - */ - static struct symbol *find_or_add_ksym_to_symbols(struct kpatch_elf *kelf, - struct section *ksymsec, -- char *strings, int offset) -+ char *strings, int offset, -+ char *ref_name, -+ long ref_offset) - { - struct kpatch_symbol *ksyms, *ksym; - struct symbol *sym; -@@ -71,9 +73,14 @@ static struct symbol *find_or_add_ksym_to_symbols(struct kpatch_elf *kelf, - if (!objname) - ERROR("strdup"); - -- snprintf(pos, 32, "%lu", ksym->pos); - /* .klp.sym.objname.name,pos */ -- snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, pos); -+ if (!ref_name) { -+ snprintf(pos, 32, "%lu", ksym->pos); -+ snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, pos); -+ } else { -+ snprintf(pos, 32, "%ld", ref_offset); -+ snprintf(buf, 256, KLP_SYM_PREFIX "%s-%s,%s", objname, ref_name, pos); -+ } - - /* Look for an already allocated symbol */ - list_for_each_entry(sym, &kelf->symbols, list) { -@@ -180,6 +187,7 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section - struct rela *rela; - char *objname; - int nr, index, offset, dest_off; -+ char *ref_name; - - krelas = krelasec->data->d_buf; - nr = krelasec->data->d_size / sizeof(*krelas); -@@ -206,6 +214,17 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section - if (!objname) - ERROR("strdup"); - -+ /* Get the unique ref_name */ -+ rela = find_rela_by_offset(krelasec->rela, -+ offset + offsetof(struct kpatch_relocation, ref_name)); -+ if (!rela) -+ ref_name = NULL; -+ else { -+ ref_name = strdup(strings + rela->addend); -+ if (!ref_name) -+ ERROR("strdup"); -+ } -+ - /* Get the .kpatch.symbol entry for the rela src */ - rela = find_rela_by_offset(krelasec->rela, - offset + offsetof(struct kpatch_relocation, ksym)); -@@ -213,7 +232,7 @@ static void create_klp_relasecs_and_syms(struct kpatch_elf *kelf, struct section - ERROR("find_rela_by_offset"); - - /* Create (or find) a klp symbol from the rela src entry */ -- sym = find_or_add_ksym_to_symbols(kelf, ksymsec, strings, rela->addend); -+ sym = find_or_add_ksym_to_symbols(kelf, ksymsec, strings, rela->addend, ref_name, krelas[index].ref_offset); - if (!sym) - ERROR("error finding or adding ksym to symtab"); - -diff --git a/kpatch-build/create-kpatch-module.c b/kpatch-build/create-kpatch-module.c -index 8292dc8..3e24b3a 100644 ---- a/kpatch-build/create-kpatch-module.c -+++ b/kpatch-build/create-kpatch-module.c -@@ -112,14 +112,10 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - dynrelas[index].ref_name = krelas[index].ref_name; - dynrelas[index].ref_offset = krelas[index].ref_offset; - -- if (dynrelas[index].ref_offset) -- { -- /* Get objname offset */ -- rela = find_rela_by_offset(krelasec->rela, -- index * sizeof(*krelas) + offsetof(struct kpatch_relocation, ref_name)); -- if (!rela) { -- ERROR("find_rela_by_offset"); -- } -+ /* Get ref_name offset */ -+ rela = find_rela_by_offset(krelasec->rela, -+ index * sizeof(*krelas) + offsetof(struct kpatch_relocation, ref_name)); -+ if (rela) { - ref_name_offset = rela->addend; - /* ref_name */ - ALLOC_LINK(rela, &dynsec->rela->relas); -@@ -128,9 +124,8 @@ static void create_dynamic_rela_sections(struct kpatch_elf *kelf, struct section - rela->addend = ref_name_offset; - rela->offset = index * sizeof(*dynrelas) + \ - offsetof(struct kpatch_patch_dynrela, ref_name); -- - } -- -+ - /* dest */ - ALLOC_LINK(rela, &dynsec->rela->relas); - rela->sym = sym; -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index 81a6a44..a860f12 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -953,6 +953,10 @@ if grep "hulk" $SRCDIR/Makefile > /dev/null; then - export KCPPFLAGS="-D__HULK__ $KCPPFLAGS" - fi - -+if [[ -n "$NO_STACK_CHECK" ]];then -+ export KCPPFLAGS="-D__ALL_FORCE__ $KCPPFLAGS" -+fi -+ - echo "Building patch module: $MODNAME.ko" - - if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then -@@ -990,6 +994,7 @@ KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \ - KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \ - CROSS_COMPILE="$ARCH_COMPILE" \ - make 2>&1 | logger || die -+${ARCH_COMPILE}strip -g "$TEMPDIR/patch/$MODNAME.ko" - - if ! "$KPATCH_MODULE"; then - if [[ -z "$KPATCH_LDFLAGS" ]]; then -@@ -1019,7 +1024,7 @@ fi - # column containing lines unique to first file. - UNDEFINED=$(comm -23 <(sort -u "${TEMPDIR}"/undefined_references) \ - <(sort -u "${TEMPDIR}"/new_symbols) | tr '\n' ' ') --[[ ! -z "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" -+[[ -z "$USERMODDIR" ]] && [[ ! -z "$UNDEFINED" ]] && die "Undefined symbols: $UNDEFINED" - - cp -f "$TEMPDIR/patch/$MODNAME.ko" "$BASE" || die - -diff --git a/kpatch-build/kpatch-elf.c b/kpatch-build/kpatch-elf.c -index fcb7161..0794031 100644 ---- a/kpatch-build/kpatch-elf.c -+++ b/kpatch-build/kpatch-elf.c -@@ -700,8 +700,14 @@ void kpatch_reindex_elements(struct kpatch_elf *kelf) - unsigned int index; - - index = 1; /* elf write function handles NULL section 0 */ -- list_for_each_entry(sec, &kelf->sections, list) -+ list_for_each_entry(sec, &kelf->sections, list) { - sec->index = index++; -+ /* -+ * since we exclude .group section, we clear SHF_GROUP -+ * for every section in case of link error. -+ * */ -+ sec->sh.sh_flags &= (~SHF_GROUP); -+ } - - index = 0; - list_for_each_entry(sym, &kelf->symbols, list) { -diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc -index be18847..d36e67b 100755 ---- a/kpatch-build/kpatch-gcc -+++ b/kpatch-build/kpatch-gcc -@@ -13,7 +13,7 @@ fi - - declare -a args=("$@") - --if [[ "$TOOLCHAINCMD" = ${ARCH_COMPILE}gcc ]] ; then -+if [[ "$TOOLCHAINCMD" = ${ARCH_COMPILE}gcc || "$TOOLCHAINCMD" = ${ARCH_COMPILE}g++ ]] ; then - while [ "$#" -gt 0 ]; do - if [ "$1" = "-o" ]; then - obj="$2" -diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c -index e4677db..2a728f6 100644 ---- a/kpatch-build/lookup.c -+++ b/kpatch-build/lookup.c -@@ -45,6 +45,7 @@ struct object_symbol { - char *name; - int type, bind; - int sec_index; -+ unsigned long kaddr; - }; - - struct export_symbol { -@@ -238,6 +239,8 @@ static void symtab_read(struct lookup_table *table, char *path) - table->obj_syms[i].bind = STB_GLOBAL; - } else if (!strcmp(bind, "WEAK")) { - table->obj_syms[i].bind = STB_WEAK; -+ } else if (!strcmp(bind, "GNU_UNIQUE")) { -+ table->obj_syms[i].bind = STB_GNU_UNIQUE; - } else { - ERROR("unknown symbol bind %s", bind); - } -@@ -263,6 +266,56 @@ static void symtab_read(struct lookup_table *table, char *path) - fclose(file); - } - -+static void ksymtab_read(struct lookup_table *table, char *path) -+{ -+ FILE *file; -+ struct object_symbol *sym, *sym1, *sym2; -+ unsigned long value; -+ int i, j, idx; -+ char line[256], name[256], type[256], mod[256]; -+ idx = 0; -+ -+ if ((file = fopen(path, "r")) == NULL) -+ ERROR("fopen"); -+ -+ while (fgets(line, 256, file)) { -+ if (sscanf(line, "%lx %s %s [%s]\n", -+ &value, type, name, mod) != 4) -+ continue; -+ -+ if (name[0] == '$') -+ continue; -+ -+ i = idx; -+ for_each_obj_symbol_continue(i, sym, table) { -+ if (!strncmp(sym->name, name, KSYM_NAME_LEN-1)) { -+ sym->kaddr = value; -+ idx = i + 1; -+ break; -+ } -+ } -+ } -+ -+ for_each_obj_symbol(i, sym1, table) { -+ if (sym1->kaddr == 0) -+ continue; -+ for_each_obj_symbol(j, sym2, table) { -+ if (sym2->kaddr == 0) -+ continue; -+ if (sym1 == sym2) -+ continue; -+ if (sym1->sec_index != sym2->sec_index) -+ continue; -+ if ((long)sym1->value - (long)sym2->value == -+ (long)sym1->kaddr - (long)sym2->kaddr) -+ continue; -+ -+ ERROR("base mismatch(symbol offset)"); -+ } -+ } -+ fclose(file); -+} -+ - static void symvers_read(struct lookup_table *table, char *path) - { - FILE *file; -@@ -306,7 +359,8 @@ static void symvers_read(struct lookup_table *table, char *path) - } - - struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, -- char *hint, struct sym_compare_type *locals) -+ char *hint, struct sym_compare_type *locals, -+ char *kallsyms) - { - struct lookup_table *table; - -@@ -317,6 +371,8 @@ struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, - - symtab_read(table, symtab_path); - symvers_read(table, symvers_path); -+ if (kallsyms) -+ ksymtab_read(table, kallsyms); - find_local_syms(table, hint, locals); - - return table; -@@ -343,6 +399,15 @@ int lookup_local_symbol(struct lookup_table *table, char *name, - for_each_obj_symbol(i, sym, table) { - if (sym->bind == STB_LOCAL && !strcmp(sym->name, name)) - pos++; -+ else { -+ /* symbol name longer than KSYM_NAME_LEN will be truncated -+ * by kernel, so we can not find it using its original -+ * name. we need to add pos for symbols which have same -+ * KSYM_NAME_LEN-1 long prefix.*/ -+ if (strlen(name) >= KSYM_NAME_LEN-1 && -+ !strncmp(sym->name, name, KSYM_NAME_LEN-1)) -+ pos++; -+ } - - if (table->local_syms == sym) { - in_file = 1; -@@ -374,15 +439,25 @@ int lookup_global_symbol(struct lookup_table *table, char *name, - struct lookup_result *result) - { - struct object_symbol *sym; -+ unsigned long pos = 0; - int i; - - memset(result, 0, sizeof(*result)); - for_each_obj_symbol(i, sym, table) { -- if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK) && -+ /* symbol name longer than KSYM_NAME_LEN will be truncated -+ * by kernel, so we can not find it using its original -+ * name. we need to add pos for symbols which have same -+ * KSYM_NAME_LEN-1 long prefix.*/ -+ if (strlen(name) >= KSYM_NAME_LEN-1 && -+ !strncmp(sym->name, name, KSYM_NAME_LEN-1)) -+ pos++; -+ -+ if ((sym->bind == STB_GLOBAL || sym->bind == STB_WEAK -+ || sym->bind == STB_GNU_UNIQUE) && - !strcmp(sym->name, name)) { - result->value = sym->value; - result->size = sym->size; -- result->pos = 0; /* always 0 for global symbols */ -+ result->pos = pos; - return 0; - } - } -@@ -429,10 +504,12 @@ char *lookup_exported_symbol_objname(struct lookup_table *table, char *name) - return NULL; - } - --int lookup_is_duplicate_symbol(struct lookup_table *table, char *name) -+int lookup_is_duplicate_symbol(struct lookup_table *table, char *name, -+ char *objname, unsigned long pos) - { - struct object_symbol *sym; - int i, count = 0; -+ char posstr[32], buf[256]; - - for_each_obj_symbol(i, sym, table) - if (!strcmp(sym->name, name)) { -@@ -441,6 +518,17 @@ int lookup_is_duplicate_symbol(struct lookup_table *table, char *name) - return 1; - } - -+ /* symbol name longer than KSYM_NAME_LEN will be truncated -+ * by kernel, so we can not find it using its original -+ * name. Here, we consider these long name symbol as duplicated -+ * symbols. since create_klp_module will create symbol name -+ * format like .klp.sym.objname.symbol,pos, so we consider name -+ * length longer than KSYM_NAME_LEN-1 bytes as duplicated symbol*/ -+ snprintf(posstr, 32, "%lu", pos); -+ snprintf(buf, 256, KLP_SYM_PREFIX "%s.%s,%s", objname, name, posstr); -+ if (strlen(buf) >= KSYM_NAME_LEN-1) -+ return 1; -+ - return 0; - } - -@@ -487,24 +575,45 @@ struct object_symbol *lookup_find_symbol_by_name(struct lookup_table *table, cha - return sym; - } - --int lookup_ref_symbol(struct lookup_table *table, char *name, -- struct lookup_refsym *refsym) -+int lookup_ref_symbol_offset(struct lookup_table *table, char *name, -+ struct lookup_refsym *refsym, -+ char *objname, long *offset) - { - struct object_symbol *orig_sym, *sym; - int i; - - orig_sym = lookup_find_symbol_by_name(table, name); - if (!orig_sym) -- ERROR("lookup_ref_symbol"); -+ ERROR("lookup_ref_symbol_offset"); - memset(refsym, 0, sizeof(*refsym)); -+ -+ /*find a unique symbol in the same section first*/ - for_each_obj_symbol(i, sym, table) { - if (!strcmp(sym->name, name) || sym->type == STT_FILE || - sym->sec_index != orig_sym->sec_index) - continue; - -- if (!lookup_is_duplicate_symbol(table, sym->name)) { -+ if (!lookup_is_duplicate_symbol(table, sym->name, objname, 1)) { - refsym->name = sym->name; - refsym->value = sym->value; -+ *offset = (long)orig_sym->value - (long)sym->value; -+ return 0; -+ } -+ } -+ -+ if (orig_sym->kaddr == 0) -+ return 1; -+ -+ /*find a unique symbol has kaddr*/ -+ for_each_obj_symbol(i, sym, table) { -+ if (!strcmp(sym->name, name) || sym->type == STT_FILE || -+ sym->kaddr == 0) -+ continue; -+ -+ if (!lookup_is_duplicate_symbol(table, sym->name, objname, 1)) { -+ refsym->name = sym->name; -+ refsym->value = 0; -+ *offset = (long)orig_sym->kaddr - (long)sym->kaddr; - return 0; - } - } -diff --git a/kpatch-build/lookup.h b/kpatch-build/lookup.h -index 5ad9241..00b6ccc 100644 ---- a/kpatch-build/lookup.h -+++ b/kpatch-build/lookup.h -@@ -1,6 +1,9 @@ - #ifndef _LOOKUP_H_ - #define _LOOKUP_H_ - -+#include "kpatch-elf.h" -+#define KSYM_NAME_LEN 128 -+ - struct lookup_table; - - struct lookup_result { -@@ -20,7 +23,8 @@ struct lookup_refsym { - }; - - struct lookup_table *lookup_open(char *symtab_path, char *symvers_path, -- char *hint, struct sym_compare_type *locals); -+ char *hint, struct sym_compare_type *locals, -+ char *kallsyms); - void lookup_close(struct lookup_table *table); - int lookup_local_symbol(struct lookup_table *table, char *name, - struct lookup_result *result); -@@ -28,8 +32,10 @@ int lookup_global_symbol(struct lookup_table *table, char *name, - struct lookup_result *result); - int lookup_is_exported_symbol(struct lookup_table *table, char *name); - char *lookup_exported_symbol_objname(struct lookup_table *table, char *name); --int lookup_is_duplicate_symbol(struct lookup_table *table, char *name); --int lookup_ref_symbol(struct lookup_table *table, char *name, -- struct lookup_refsym *refsym); -+int lookup_is_duplicate_symbol(struct lookup_table *table, char *name, -+ char *objname, unsigned long pos); -+int lookup_ref_symbol_offset(struct lookup_table *table, char *name, -+ struct lookup_refsym *refsym, char *objname, -+ long *offset); - - #endif /* _LOOKUP_H_ */ --- -1.7.5.4 - diff --git a/9023-kpatch-build-adapt-for-ksymtab-in-4.19-kernel.patch b/9023-kpatch-build-adapt-for-ksymtab-in-4.19-kernel.patch deleted file mode 100644 index e655cf5..0000000 --- a/9023-kpatch-build-adapt-for-ksymtab-in-4.19-kernel.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f221fbe8ff0c22b61aaf42687f5ece04f10ec403 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Thu, 17 Jan 2019 20:50:25 +0000 -Subject: [PATCH] kpatch-build: adapt for ksymtab in 4.19 kernel - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/create-diff-object.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c -index f075671..2ddd00d 100644 ---- a/kpatch-build/create-diff-object.c -+++ b/kpatch-build/create-diff-object.c -@@ -1664,8 +1664,8 @@ static int kpatch_include_new_static_var(struct kpatch_elf *kelf) - - list_for_each_entry(sym, &kelf->symbols, list) { - if (sym->status == NEW && -- sym->type == STT_OBJECT && -- sym->bind == STB_LOCAL) -+ sym->bind == STB_LOCAL && -+ (sym->type == STT_OBJECT || (sym->type == STT_NOTYPE && sym->name[0] != '$'))) - kpatch_include_symbol(sym); - } - --- -1.7.5.4 - diff --git a/9024-support-force-enable-disable-for-kernel-4.19.patch b/9024-support-force-enable-disable-for-kernel-4.19.patch deleted file mode 100644 index 35727aa..0000000 --- a/9024-support-force-enable-disable-for-kernel-4.19.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 6b7ff79bb40a7dbb28e6aba320e4ac075e4c182d Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Fri, 18 Jan 2019 00:07:02 +0000 -Subject: [PATCH] support force enable/disable for kernel 4.19 - -Signed-off-by: Zhipeng Xie ---- - kmod/patch/livepatch-patch-hook.c | 7 +++++-- - kpatch-build/kpatch-build | 12 ++++++++++-- - 2 files changed, 15 insertions(+), 4 deletions(-) - -diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c -index ce1c955..919dfc7 100644 ---- a/kmod/patch/livepatch-patch-hook.c -+++ b/kmod/patch/livepatch-patch-hook.c -@@ -511,14 +511,17 @@ static int __init patch_init(void) - #ifdef __HULK__ - lfunc->old_size = func->kfunc->old_size; - lfunc->new_size = func->kfunc->new_size; -+ lfunc->ref_name= func->kfunc->ref_name; -+ lfunc->ref_offset = func->kfunc->ref_offset; -+#endif -+#if defined(__HULK__) || defined(__KLP_SUPPORT_FORCE__) - #ifdef __ALL_FORCE__ - lfunc->force = 1; - #else - lfunc->force = patch_is_func_forced(func->kfunc->new_addr); - #endif -- lfunc->ref_name= func->kfunc->ref_name; -- lfunc->ref_offset = func->kfunc->ref_offset; - #endif -+ - j++; - } - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index a860f12..c227b44 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -279,7 +279,7 @@ find_special_section_data() { - # shellcheck disable=SC2086 - SPECIAL_VARS="$(readelf -wi "$VMLINUX" | - gawk --non-decimal-data $AWK_OPTIONS ' -- BEGIN { a = b = p = e = o = 0 } -+ BEGIN { a = b = p = e = o = f = 0 } - - # Set state if name matches - a == 0 && /DW_AT_name.* alt_instr[[:space:]]*$/ {a = 1; next} -@@ -287,6 +287,7 @@ find_special_section_data() { - p == 0 && /DW_AT_name.* paravirt_patch_site[[:space:]]*$/ {p = 1; next} - e == 0 && /DW_AT_name.* exception_table_entry[[:space:]]*$/ {e = 1; next} - o == 0 && /DW_AT_name.* orc_entry[[:space:]]*$/ {o = 1; next} -+ f == 0 && /DW_AT_name.* klp_func[[:space:]]*$/ {f = 1; next} - - # Reset state unless this abbrev describes the struct size - a == 1 && !/DW_AT_byte_size/ { a = 0; next } -@@ -294,6 +295,8 @@ find_special_section_data() { - p == 1 && !/DW_AT_byte_size/ { p = 0; next } - e == 1 && !/DW_AT_byte_size/ { e = 0; next } - o == 1 && !/DW_AT_byte_size/ { o = 0; next } -+ f == 1 && /DW_TAG_structure_type/ { f = 3; next } -+ f == 1 && /DW_AT_name.* force[[:space:]]*$/ {f = 2; next} - - # Now that we know the size, stop parsing for it - a == 1 {printf("export ALT_STRUCT_SIZE=%d\n", $4); a = 2} -@@ -301,9 +304,10 @@ find_special_section_data() { - p == 1 {printf("export PARA_STRUCT_SIZE=%d\n", $4); p = 2} - e == 1 {printf("export EX_STRUCT_SIZE=%d\n", $4); e = 2} - o == 1 {printf("export ORC_STRUCT_SIZE=%d\n", $4); o = 2} -+ f == 2 {printf("export KLP_SUPPORT_FORCE=y\n"); f = 3} - - # Bail out once we have everything -- a == 2 && b == 2 && (p == 2 || skip_p) && e == 2 && (o == 2 || skip_o) {exit}')" -+ a == 2 && b == 2 && (p == 2 || skip_p) && e == 2 && (o == 2 || skip_o) && f == 3 {exit}')" - - [[ -n "$SPECIAL_VARS" ]] && eval "$SPECIAL_VARS" - -@@ -957,6 +961,10 @@ if [[ -n "$NO_STACK_CHECK" ]];then - export KCPPFLAGS="-D__ALL_FORCE__ $KCPPFLAGS" - fi - -+if [[ -n "$KLP_SUPPORT_FORCE" ]];then -+ export KCPPFLAGS="-D__KLP_SUPPORT_FORCE__ $KCPPFLAGS" -+fi -+ - echo "Building patch module: $MODNAME.ko" - - if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then --- -1.7.5.4 - diff --git a/9025-kpatch-build-adapt-for-native-compile_env.patch b/9025-kpatch-build-adapt-for-native-compile_env.patch deleted file mode 100644 index e2f5857..0000000 --- a/9025-kpatch-build-adapt-for-native-compile_env.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 87203483495fec8ad1394def83fa884a96b711ec Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Thu, 14 Feb 2019 14:21:20 +0000 -Subject: [PATCH] kpatch-build: adapt for native compile_env - -we check vmlinux to determine if klp_func and klp_object -have some members and set flag for livepatch-patch-hook.c. -support arm64 native compile enviroment. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/kpatch-build | 46 ++++++++++++++++++++++++++++++++++---------- - 1 files changed, 35 insertions(+), 11 deletions(-) - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index c227b44..18f79d4 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -279,7 +279,7 @@ find_special_section_data() { - # shellcheck disable=SC2086 - SPECIAL_VARS="$(readelf -wi "$VMLINUX" | - gawk --non-decimal-data $AWK_OPTIONS ' -- BEGIN { a = b = p = e = o = f = 0 } -+ BEGIN { a = b = p = e = o = c = f = s = i = r = j = h = 0 } - - # Set state if name matches - a == 0 && /DW_AT_name.* alt_instr[[:space:]]*$/ {a = 1; next} -@@ -287,7 +287,8 @@ find_special_section_data() { - p == 0 && /DW_AT_name.* paravirt_patch_site[[:space:]]*$/ {p = 1; next} - e == 0 && /DW_AT_name.* exception_table_entry[[:space:]]*$/ {e = 1; next} - o == 0 && /DW_AT_name.* orc_entry[[:space:]]*$/ {o = 1; next} -- f == 0 && /DW_AT_name.* klp_func[[:space:]]*$/ {f = 1; next} -+ c == 0 && /DW_AT_name.* klp_func[[:space:]]*$/ {c = 1; next} -+ j == 0 && /DW_AT_name.* klp_object[[:space:]]*$/ {j = 1; next} - - # Reset state unless this abbrev describes the struct size - a == 1 && !/DW_AT_byte_size/ { a = 0; next } -@@ -295,8 +296,13 @@ find_special_section_data() { - p == 1 && !/DW_AT_byte_size/ { p = 0; next } - e == 1 && !/DW_AT_byte_size/ { e = 0; next } - o == 1 && !/DW_AT_byte_size/ { o = 0; next } -- f == 1 && /DW_TAG_structure_type/ { f = 3; next } -- f == 1 && /DW_AT_name.* force[[:space:]]*$/ {f = 2; next} -+ c == 1 && /DW_TAG_structure_type/ { c = 3; next } -+ j == 1 && /DW_TAG_structure_type/ { j = 3; next } -+ c == 1 && /DW_AT_name.* force[[:space:]]*$/ {f = 2; next} -+ c == 1 && /DW_AT_name.* old_sympos[[:space:]]*$/ {s = 2; next} -+ i == 1 && /DW_AT_name.* immediate[[:space:]]*$/ {i = 2; next} -+ j == 1 && /DW_AT_name.* relocs[[:space:]]*$/ {r = 2; next} -+ j == 1 && /DW_AT_name.* hooks_load[[:space:]]*$/ {h = 2; next} - - # Now that we know the size, stop parsing for it - a == 1 {printf("export ALT_STRUCT_SIZE=%d\n", $4); a = 2} -@@ -304,10 +310,14 @@ find_special_section_data() { - p == 1 {printf("export PARA_STRUCT_SIZE=%d\n", $4); p = 2} - e == 1 {printf("export EX_STRUCT_SIZE=%d\n", $4); e = 2} - o == 1 {printf("export ORC_STRUCT_SIZE=%d\n", $4); o = 2} -- f == 2 {printf("export KLP_SUPPORT_FORCE=y\n"); f = 3} -+ f == 2 {printf("export KLP_SUPPORT_FORCE=y\n"); f = 3} -+ s == 2 {printf("export KLP_SUPPORT_OLD_SYMPOS=y\n"); s = 3} -+ i == 2 {printf("export KLP_SUPPORT_IMMEDIATE=y\n"); i = 3} -+ r == 2 {printf("export KLP_SUPPORT_RELOCS=y\n"); r = 3} -+ h == 2 {printf("export KLP_SUPPORT_LOADHOOKS=y\n"); h = 3} - - # Bail out once we have everything -- a == 2 && b == 2 && (p == 2 || skip_p) && e == 2 && (o == 2 || skip_o) && f == 3 {exit}')" -+ a == 2 && b == 2 && (p == 2 || skip_p) && e == 2 && (o == 2 || skip_o) && c == 3 && j == 3 {exit}')" - - [[ -n "$SPECIAL_VARS" ]] && eval "$SPECIAL_VARS" - -@@ -406,7 +416,9 @@ arch_export() { - export GCC_ADD_OPTION= - elif [[ $E_MACHINE -eq 183 ]]; then - export ARCH=arm64 -- export ARCH_COMPILE=aarch64-linux-gnu- -+ if [ $(arch) != "aarch64" ]; then -+ export ARCH_COMPILE=aarch64-linux-gnu- -+ fi - export ENDIAN=little - if grep "\-mlong-calls" $SRCDIR/Makefile > /dev/null; then - export GCC_ADD_OPTION="-fno-section-anchors -mlong-calls" -@@ -953,10 +965,6 @@ if "$KPATCH_MODULE"; then - export KCPPFLAGS="-D__KPATCH_MODULE__" - fi - --if grep "hulk" $SRCDIR/Makefile > /dev/null; then -- export KCPPFLAGS="-D__HULK__ $KCPPFLAGS" --fi -- - if [[ -n "$NO_STACK_CHECK" ]];then - export KCPPFLAGS="-D__ALL_FORCE__ $KCPPFLAGS" - fi -@@ -965,6 +973,22 @@ if [[ -n "$KLP_SUPPORT_FORCE" ]];then - export KCPPFLAGS="-D__KLP_SUPPORT_FORCE__ $KCPPFLAGS" - fi - -+if [[ -n "$KLP_SUPPORT_OLD_SYMPOS" ]];then -+ export KCPPFLAGS="-DHAVE_SYMPOS $KCPPFLAGS" -+fi -+ -+if [[ -n "$KLP_SUPPORT_IMMEDIATE" ]];then -+ export KCPPFLAGS="-DHAVE_IMMEDIATE $KCPPFLAGS" -+fi -+ -+if [[ -n "$KLP_SUPPORT_RELOCS" ]];then -+ export KCPPFLAGS="-DHAVE_ELF_RELOCS $KCPPFLAGS" -+fi -+ -+if [[ -n "$KLP_SUPPORT_LOADHOOKS" ]];then -+ export KCPPFLAGS="-DHAVE_LOADHOOKS $KCPPFLAGS" -+fi -+ - echo "Building patch module: $MODNAME.ko" - - if [[ -z "$USERSRCDIR" ]] && [[ "$DISTRO" = ubuntu ]]; then --- -1.7.5.4 - diff --git a/9026-add-find_special_section_data_arm64-for-arm64.patch b/9026-add-find_special_section_data_arm64-for-arm64.patch deleted file mode 100644 index 283cdca..0000000 --- a/9026-add-find_special_section_data_arm64-for-arm64.patch +++ /dev/null @@ -1,96 +0,0 @@ -From d53b2d1f87f5e891ba8f6945765134da9ee2d29d Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Thu, 7 Mar 2019 14:38:15 +0000 -Subject: [PATCH] add find_special_section_data_arm64 for arm64 - -arm64 kernel have no paravirt_patch_site or orc_entry structure -in vmlinux, we don't need to check these two struct for arm64. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/kpatch-build | 56 ++++++++++++++++++++++++++++++++++++++- - 1 file changed, 55 insertions(+), 1 deletion(-) - -diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build -index 18f79d4..59af250 100755 ---- a/kpatch-build/kpatch-build -+++ b/kpatch-build/kpatch-build -@@ -266,12 +266,66 @@ find_special_section_data_ppc64le() { - return - } - -+find_special_section_data_arm64() { -+ -+ # If $AWK_OPTIONS are blank gawk would treat "" as a blank script -+ # shellcheck disable=SC2086 -+ SPECIAL_VARS="$(readelf -wi "$VMLINUX" | -+ gawk --non-decimal-data $AWK_OPTIONS ' -+ BEGIN { a = b = e = c = f = s = i = r = j = h = 0 } -+ -+ # Set state if name matches -+ a == 0 && /DW_AT_name.* alt_instr[[:space:]]*$/ {a = 1; next} -+ b == 0 && /DW_AT_name.* bug_entry[[:space:]]*$/ {b = 1; next} -+ e == 0 && /DW_AT_name.* exception_table_entry[[:space:]]*$/ {e = 1; next} -+ c == 0 && /DW_AT_name.* klp_func[[:space:]]*$/ {c = 1; next} -+ j == 0 && /DW_AT_name.* klp_object[[:space:]]*$/ {j = 1; next} -+ -+ # Reset state unless this abbrev describes the struct size -+ a == 1 && !/DW_AT_byte_size/ { a = 0; next } -+ b == 1 && !/DW_AT_byte_size/ { b = 0; next } -+ e == 1 && !/DW_AT_byte_size/ { e = 0; next } -+ c == 1 && /DW_TAG_structure_type/ { c = 3; next } -+ j == 1 && /DW_TAG_structure_type/ { j = 3; next } -+ c == 1 && /DW_AT_name.* force[[:space:]]*$/ {f = 2; next} -+ c == 1 && /DW_AT_name.* old_sympos[[:space:]]*$/ {s = 2; next} -+ i == 1 && /DW_AT_name.* immediate[[:space:]]*$/ {i = 2; next} -+ j == 1 && /DW_AT_name.* relocs[[:space:]]*$/ {r = 2; next} -+ j == 1 && /DW_AT_name.* hooks_load[[:space:]]*$/ {h = 2; next} -+ -+ # Now that we know the size, stop parsing for it -+ a == 1 {printf("export ALT_STRUCT_SIZE=%d\n", $4); a = 2} -+ b == 1 {printf("export BUG_STRUCT_SIZE=%d\n", $4); b = 2} -+ e == 1 {printf("export EX_STRUCT_SIZE=%d\n", $4); e = 2} -+ f == 2 {printf("export KLP_SUPPORT_FORCE=y\n"); f = 3} -+ s == 2 {printf("export KLP_SUPPORT_OLD_SYMPOS=y\n"); s = 3} -+ i == 2 {printf("export KLP_SUPPORT_IMMEDIATE=y\n"); i = 3} -+ r == 2 {printf("export KLP_SUPPORT_RELOCS=y\n"); r = 3} -+ h == 2 {printf("export KLP_SUPPORT_LOADHOOKS=y\n"); h = 3} -+ -+ # Bail out once we have everything -+ a == 2 && b == 2 && e == 2 && c == 3 && j == 3 {exit}')" -+ -+ [[ -n "$SPECIAL_VARS" ]] && eval "$SPECIAL_VARS" -+ -+ [[ -z "$ALT_STRUCT_SIZE" ]] && die "can't find special struct alt_instr size" -+ [[ -z "$BUG_STRUCT_SIZE" ]] && die "can't find special struct bug_entry size" -+ [[ -z "$EX_STRUCT_SIZE" ]] && die "can't find special struct exception_table_entry size" -+ -+ return -+} -+ - find_special_section_data() { - if [[ "$ARCH" = "ppc64le" ]]; then - find_special_section_data_ppc64le - return - fi - -+ if [[ "$ARCH" = "arm64" ]]; then -+ find_special_section_data_arm64 -+ return -+ fi -+ - [[ "$CONFIG_PARAVIRT" -eq 0 ]] && AWK_OPTIONS="-vskip_p=1" - [[ "$CONFIG_UNWINDER_ORC" -eq 0 ]] && AWK_OPTIONS="$AWK_OPTIONS -vskip_o=1" - -@@ -323,7 +377,7 @@ find_special_section_data() { - - [[ -z "$ALT_STRUCT_SIZE" ]] && die "can't find special struct alt_instr size" - [[ -z "$BUG_STRUCT_SIZE" ]] && die "can't find special struct bug_entry size" -- [[ -z "$EX_STRUCT_SIZE" ]] && die "can't find special struct paravirt_patch_site size" -+ [[ -z "$EX_STRUCT_SIZE" ]] && die "can't find special struct exception_table_entry size" - [[ -z "$PARA_STRUCT_SIZE" && "$CONFIG_PARAVIRT" -ne 0 ]] && die "can't find special struct paravirt_patch_site size" - [[ -z "$ORC_STRUCT_SIZE" && "$CONFIG_UNWINDER_ORC" -ne 0 ]] && die "can't find special struct orc_entry size" - --- -2.19.1 - diff --git a/9027-fix-ref-static-local-symbol-for-longname-symbol.patch b/9027-fix-ref-static-local-symbol-for-longname-symbol.patch deleted file mode 100644 index 88be441..0000000 --- a/9027-fix-ref-static-local-symbol-for-longname-symbol.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 1069d212fd848f1f1e2425dffe8e9aea188c6150 Mon Sep 17 00:00:00 2001 -From: Zhipeng Xie -Date: Tue, 21 Dec 2083 12:18:38 +0800 -Subject: [PATCH] fix ref static local symbol for longname symbol - -static local symbol have a "." which will confuse -the kernel livepatch klp_resolve_symbols. So, pass -static local symbols in lookup_ref_symbol_offset. - -Signed-off-by: Zhipeng Xie ---- - kpatch-build/lookup.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c -index 2e55862..01abc41 100644 ---- a/kpatch-build/lookup.c -+++ b/kpatch-build/lookup.c -@@ -591,7 +591,8 @@ int lookup_ref_symbol_offset(struct lookup_table *table, char *name, - /*find a unique symbol in the same section first*/ - for_each_obj_symbol(i, sym, table) { - if (!strcmp(sym->name, name) || sym->type == STT_FILE || -- sym->sec_index != orig_sym->sec_index) -+ sym->sec_index != orig_sym->sec_index || -+ strchr(sym->name, '.')) - continue; - - if (!lookup_is_duplicate_symbol(table, sym->name, objname, 1)) { --- -2.19.1 - diff --git a/9030-kmod-core-fix-compilation-with-CONFIG_HAVE_ARCH_PREL.patch b/9030-kmod-core-fix-compilation-with-CONFIG_HAVE_ARCH_PREL.patch deleted file mode 100644 index 58c2278..0000000 --- a/9030-kmod-core-fix-compilation-with-CONFIG_HAVE_ARCH_PREL.patch +++ /dev/null @@ -1,34 +0,0 @@ -From da3eed612df1d26e19b0678763e116f666da13b2 Mon Sep 17 00:00:00 2001 -From: Artem Savkov -Date: Wed, 14 Nov 2018 12:33:13 +0100 -Subject: [PATCH] kmod/core: fix compilation with - CONFIG_HAVE_ARCH_PREL32_RELOCATIONS - -Kernel commit 7290d5809571 "module: use relative references for -__ksymtab entries" changed kernel_symbol structure on some -architectures. Adjust kmod/core/core.c accordingly. - -Signed-off-by: Artem Savkov ---- - kmod/core/core.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/kmod/core/core.c b/kmod/core/core.c -index 4a73a47..a91d417 100644 ---- a/kmod/core/core.c -+++ b/kmod/core/core.c -@@ -651,7 +651,11 @@ static int kpatch_find_external_symbol(const char *objname, const char *name, - sym = find_symbol(name, NULL, NULL, true, true); - preempt_enable(); - if (sym) { -+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS -+ *addr = (unsigned long)offset_to_ptr(&sym->value_offset); -+#else - *addr = sym->value; -+#endif - return 0; - } - --- -2.19.1 - diff --git a/kpatch-0.6.1.tar.gz b/kpatch-0.6.1.tar.gz deleted file mode 100644 index 1be0f4a14e1005da8570ce9ceec88eb43f99ea40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147195 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�J2~Gw3r_d{zvjG!4>}s!u}GPM;(0XU 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 z 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 Y8q$!4G^8O7X;@$QFZ3jc#{kF*0LXO{8UO$Q diff --git a/kpatch-0.9.0.tar.gz b/kpatch-0.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..343d51866c7f96de8c2bcd9009627d4379046480 GIT binary patch literal 197824 zcmV(wKXkyz3^y6atERTo#$=bsl@Ig7HNmnKR~ z_1(AsoZ|EJ=~MoR&*o3ueEi+nqo-%*Po6z~{Olap&mKQHfAZbpH=t$f)7Uzyuw_-2 z^_QOe+Wk%D{-1oFoa?yEb5qoRo+m$?pFWSG(^Ck4{>VH%eSU7DIG)9i9?ze}=Il}Y z*v#VR>R(OsAD?gcxm!hbygWV~J|CW*{6>3_KRkQ(WWWF8_YMDl1S9ICI;TtO4zHZVu%eS;9K}mB%3bkqNzoYC{&l8Aku-?{()r)_4Ua(z%6Tc0#V zTA#oH?ZJPkKfySb`p>$5L;b0#GF)BO^~%0DIf2nEo7oUB@+4Uo&C0tNy>Lvgl0RFr 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 literal 0 HcmV?d00001 diff --git a/kpatch.spec b/kpatch.spec index d988e24..a87dde2 100644 --- a/kpatch.spec +++ b/kpatch.spec @@ -1,8 +1,8 @@ -%global raw_version 0.6.1 +%global raw_version 0.9.0 Name: kpatch Version: 2.0 -Release: 3.1.23 +Release: 3.1.24 Summary: A Linux dynamic kernel patching infrastructure License: GPLv2 @@ -13,36 +13,23 @@ Source1: os_hotpatch Source2: livepatch Source3: make_hotpatch -Patch9001: 9001-livepatch-patch-hook-don-t-active-patch-when-insmod.patch -Patch9002: 9002-kpatch-build-support-third-party-module-make-hotpatc.patch -Patch9003: 9003-kpatch-build-support-makefile-not-in-third-party-mod.patch -Patch9004: 9004-create-diff-object-new-static-var-should-be-included.patch -Patch9005: 9005-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch -Patch9006: 9006-create-diff-object-fix-correlate-static-local-variab.patch -Patch9007: 9007-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch -Patch9008: 9008-livepatch-patch-hook-support-force-enable-disable-fu.patch -Patch9009: 9009-kmod-kpatch-build-support-build-patch-for-old-kernel.patch -Patch9010: 9010-kmod-kpatch-build-support-cross-compile-hotpatch-for.patch -Patch9011: 9011-kpatch-build-use-.klp.rela-in-euleros-7.5-kernel.patch -Patch9012: 9012-create-diff-object-create-dynamic-relocs-for-changed.patch -Patch9013: 9013-kmod-kpatch-build-fix-duplicate-symbol-relocation-fo.patch -Patch9014: 9014-create-diff-object-add-dynamic-reloction-for-functio.patch -Patch9015: 9015-create-diff-object-exclude-line-only-change-for-arm6.patch -Patch9016: 9016-kpatch-build-include-secsym-in-kpatch_mark_ignored_s.patch -Patch9017: 9017-support-compile-kpatch-on-aarch64.patch -Patch9018: 9018-support-c-plus-kernel-module.patch -Patch9019: 9019-fix-rodata.str-problem.patch -Patch9020: 0001-Add-__addressable_-to-maybe_discarded_sym.patch -Patch9021: 0002-kmod-patch-fix-patch-linking-with-4.20.patch -Patch9022: 0003-kmod-patch-more-linking-fixes.patch -Patch9023: 9023-kpatch-build-adapt-for-ksymtab-in-4.19-kernel.patch -Patch9024: 9024-support-force-enable-disable-for-kernel-4.19.patch -Patch9025: 9025-kpatch-build-adapt-for-native-compile_env.patch -Patch9026: 9026-add-find_special_section_data_arm64-for-arm64.patch -Patch9027: 9027-fix-ref-static-local-symbol-for-longname-symbol.patch -Patch9028: 9028-add-object-in-kpatch.patch -Patch9029: 0004-create-diff-object-allow-changing-subsections.patch -Patch9030: 9030-kmod-core-fix-compilation-with-CONFIG_HAVE_ARCH_PREL.patch +Patch0001:0001-support-compile-kpatch-on-aarch64.patch +Patch0002:0002-kpatch-build-support-build-patch-for-aarch64.patch +Patch0003:0003-create-diff-object-new-static-var-should-be-included.patch +Patch0004:0004-livepatch-fix-use-THIS-modname-as-the-name-of-ddebug.patch +Patch0005:0005-create-diff-object-fix-correlate-static-local-variab.patch +Patch0006:0006-create-diff-object-don-t-create-dynamic-reloc-for-sy.patch +Patch0007:0007-create-diff-object-create-dynamic-relocs-for-changed.patch +Patch0008:0008-fix-rodata.str-problem.patch +Patch0009:0009-livepatch-patch-hook-don-t-active-patch-when-insmod.patch +Patch0010:0010-kpatch-build-enhance-for-out-of-tree-module.patch +Patch0011:0011-support-c-plus-kernel-module.patch +Patch0012:0012-symbol-lookup-enhancement.patch +Patch0013:0013-Add-running-kernel-symbol-table-to-help-symbol-looku.patch +Patch0014:0014-livepatch-patch-hook-support-force-enable-disable.patch +Patch0015:0015-kpatch-build-ignore-debuginfo-in-patch.patch +Patch0016:0016-add-object-in-kpatch.patch +Patch0017:0017-create-diff-object-fix-.orc_unwind_ip-error.patch BuildRequires: gcc elfutils-libelf-devel uname-build-checks kernel kernel-devel Requires: bc @@ -89,9 +76,6 @@ popd %{_datadir}/%{name}/* %{_sysconfdir}/init/* /opt/patch_workspace/* -%ifarch x86_64 -%{_prefix}/lib/kpatch -%endif %files runtime %defattr(-,root,root) @@ -102,6 +86,12 @@ popd %{_mandir}/man1/*.1.gz %changelog +* Wed Feb 26 2020 Zhipeng Xie -2.0-3.1.24 +- Type:enhancement +- ID:NA +- SUG:NA +- DESC:rebase from upstream version v0.9.0 + * Mon Feb 17 2020 openEuler Buildteam -2.0-3.1.23 - Type:enhancement - ID:NA diff --git a/livepatch b/livepatch index e6e1093..a6f362d 100644 --- a/livepatch +++ b/livepatch @@ -1,19 +1,8 @@ #!/bin/bash -# Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 and -# only version 2 as published by the Free Software Foundation. -# -# 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. - exe_tool=`which os_hotpatch` fn_help() { -cat < -q[patch]/--query[=patch] -h/--help -v/--version @@ -28,38 +17,38 @@ input_args=`getopt -a -o l:a:r:d:q:v -l load:,activate:,remove:,deactivate:,quer eval set -- "${input_args}" while true; do - case "$1" in - -l|--load) + case "$1" in + -l|--load) $exe_tool -l "$2" - exit $? - ;; - -a|--activate) - $exe_tool -a "klp_${2#klp_}" - exit $? - ;; - -d|--deactivate) - $exe_tool -r "klp_${2#klp_}" - exit $? - ;; - -r|--remove) - $exe_tool -d "klp_${2#klp_}" - exit $? - ;; - -q|--query) - $exe_tool -q "klp_${2#klp_}" - exit $? - ;; - -h|--help) - fn_help - exit 0 - ;; - -v|--version) + exit $? + ;; + -a|--activate) + $exe_tool -a "klp_${2#klp_}" + exit $? + ;; + -d|--deactivate) + $exe_tool -r "klp_${2#klp_}" + exit $? + ;; + -r|--remove) + $exe_tool -d "klp_${2#klp_}" + exit $? + ;; + -q|--query) + $exe_tool -q "klp_${2#klp_}" + exit $? + ;; + -h|--help) + fn_help + exit 0 + ;; + -v|--version) echo "LKP:livepatch version 2.0-00000" exit 0 ;; - *) - fn_help - exit 1 - ;; - esac + *) + fn_help + exit 1 + ;; + esac done diff --git a/make_hotpatch b/make_hotpatch index 3057146..a773944 100644 --- a/make_hotpatch +++ b/make_hotpatch @@ -1,14 +1,18 @@ -#!/bin/bash -# Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 and -# only version 2 as published by the Free Software Foundation. -# -# 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. +#!/usr/bin/bash +#******************************************************************** +# Copyright (C) Huawei Technologies, 2015-11 +# +# #FileName : make_hotpatch +# #Description : make hotpatch +# #Author : +# #Language : shell +# #Environment : Euler compile env +# #Created : 2015-11 +# #History +# 1.Date: +# Author: +# Modification: +#******************************************************************** SHELL_DIR=$(dirname $0) SHELL_DIR=$(cd $SHELL_DIR; pwd) @@ -72,12 +76,12 @@ Options: -p,--patch Specifies the patch file --kallsyms - Specifies module kallsyms in running system(cat /proc/kallsyms|grep mod) + Specifies module kallsyms in running system(cat /proc/kallsyms|grep mod) -h,--help help info EOF - return 0 +return 0 } @@ -94,7 +98,7 @@ function fn_do_clean() unset NO_STACK_CHECK unset KALLSYMS rm -rf $G_TMP_DIR - + } ######################################################### @@ -109,7 +113,7 @@ function fn_check_reg_char() local l_str_maxlen=$2 local l_str_ex=$3 local len_str=${#l_str} - + if [ -z "$l_str" ];then echo "error: the string is empty, check string failed" return 1 @@ -139,10 +143,10 @@ function fn_check_reg_char() else echo "error: string $l_str can only contain characters included by ('0-9', 'a-z', 'A-Z', '-', '_')." fi - + return 1 fi - + } ######################################################### @@ -159,7 +163,7 @@ function fn_check_id() echo "error: check hotpatch id failed" return 1 fi - + G_HOTPATCH_ID=$l_id G_HOTPATCH=${G_PREFIX}_${G_HOTPATCH_ID}.ko G_HOTPATCH_TAR=${G_PREFIX}_${G_HOTPATCH_ID}.tar.gz @@ -197,8 +201,8 @@ function fn_check_jobs() function fn_check_patch(){ local l_patch=$1 if [ ! -f $1 ];then - echo "error:patch file $1 not exit" - return 1 + echo "error:patch file $1 not exist" + return 1 fi G_PATCHFILE=$l_patch } @@ -324,136 +328,136 @@ function fn_verify_input() fi if [ -z "`echo "$input_param" | grep -w "\-i"`" \ - -a -z "`echo $input_param | grep -w "\-\-id"`" \ - -a $# -gt 1 ];then - echo "error: missing param -i or --id" - fn_do_clean - fn_usage - exit 1 - fi - if [ -z "`echo "$input_param" | grep -w "\-d"`" \ - -a -z "`echo $input_param | grep -w "\-\-diffext"`" \ - -a -z "`echo $input_param | grep -w "\-p"`" \ - -a -z "`echo $input_param | grep -w "\-\-patch"`" \ - -a $# -gt 1 ];then - echo "error: missing param -d,--diffext or -p,--patch" - fn_do_clean - fn_usage - exit 1 + -a -z "`echo $input_param | grep -w "\-\-id"`" \ + -a $# -gt 1 ];then + echo "error: missing param -i or --id" + fn_do_clean + fn_usage + exit 1 +fi +if [ -z "`echo "$input_param" | grep -w "\-d"`" \ + -a -z "`echo $input_param | grep -w "\-\-diffext"`" \ + -a -z "`echo $input_param | grep -w "\-p"`" \ + -a -z "`echo $input_param | grep -w "\-\-patch"`" \ + -a $# -gt 1 ];then +echo "error: missing param -d,--diffext or -p,--patch" +fn_do_clean +fn_usage +exit 1 fi while [ $# -ge 1 ]; do case "$1" in - -h|--help) - fn_usage - fn_do_clean - exit 0 - ;; - -j|--jobs) - fn_check_jobs $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean + -h|--help) fn_usage - exit 1 - fi - ;; - -i|--id) - fn_check_id $2 - if [ $? -eq 0 ]; then - shift 2 - else fn_do_clean - fn_usage - exit 1 - fi - ;; - -d|--diffext) - fn_check_diffext $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - -p|--patch) - fn_check_patch $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - -k|--kernelsrc) - fn_check_kernelsrc $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - -m|--modulesrc) - fn_check_modulesrc $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - -f|--makefile) - fn_check_makefile $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - --extra_flags) - fn_check_extra_flags $2 - if [ $? -eq 0 ]; then - shift 2 - else - fn_do_clean - fn_usage - exit 1 - fi - ;; - --no_stack_check) + exit 0 + ;; + -j|--jobs) + fn_check_jobs $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -i|--id) + fn_check_id $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -d|--diffext) + fn_check_diffext $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -p|--patch) + fn_check_patch $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -k|--kernelsrc) + fn_check_kernelsrc $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -m|--modulesrc) + fn_check_modulesrc $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + -f|--makefile) + fn_check_makefile $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + --extra_flags) + fn_check_extra_flags $2 + if [ $? -eq 0 ]; then + shift 2 + else + fn_do_clean + fn_usage + exit 1 + fi + ;; + --no_stack_check) export NO_STACK_CHECK="yes" shift 1 - ;; - --debug_info) + ;; + --debug_info) G_DEBUG_INFO="-d" shift 1 - ;; - --kallsyms) - export KALLSYMS=$(readlink -f $2) - if [ $? -eq 0 ]; then + ;; + --kallsyms) + if [ "$2" == "" ];then + echo "error: param --kallsyms need file parameter" + fn_do_clean + fn_usage + exit 1 + fi + export KALLSYMS=$(readlink -f $2) shift 2 - else + ;; + + *) + echo "error: params is invalid,please check it." fn_do_clean fn_usage exit 1 - fi - ;; - - *) - echo "error: params is invalid,please check it." - fn_do_clean - fn_usage - exit 1 - ;; + ;; esac done @@ -474,11 +478,11 @@ function fn_init_module_build() local module= module=`basename $l_modulesrc` - + if [ ! -e $G_PRIVATE_MODULE ];then mkdir -p $G_PRIVATE_MODULE fi - + rm -rf $G_PRIVATE_MODULE/* if [ $? -ne 0 ];then echo "error: remove $G_PRIVATE_MODULE/$module or Makefile failed" @@ -534,14 +538,15 @@ function fn_makepatch() G_PATCH_SRC=`readlink -f $G_KERNEL_SRC` if [ -d "$G_MODULE_SRC" ];then - echo "make out of tree module hotpath" - G_PATCH_SRC=$G_MODULE_SRC + echo "make out of tree module hotpath" + G_PATCH_SRC=$G_MODULE_SRC #fn_init_module_build $G_MODULE_SRC $G_MODULE_MAKEFILE #if [ $? -ne 0 ];then # echo "error: init module build failed" # return 1 #fi l_extra_module="-m $G_MODULE_SRC" + USERMODBUILDDIR=$G_MODULE_SRC fi if [ -n "$G_JOBS" ];then @@ -551,63 +556,61 @@ function fn_makepatch() mkdir -p $G_TMP_DIR if [ -z "$G_PATCHFILE" ];then - #generate src patch file from G_DIFFEXT - G_PATCHFILE=$G_TMP_DIR/$G_HOTPATCH_ID.patch - rm -rf $G_PATCHFILE - cd $G_PATCH_SRC &>/dev/null - l_change_file=($(find -L -name "*$G_DIFFEXT" | xargs readlink -f 2>/dev/null| sort | uniq)) - echo "detect change files:${l_change_file[@]}" - for file in ${l_change_file[@]}; - do - file="./${file#$(readlink -f $G_PATCH_SRC)}" - orig_file=${file%$G_DIFFEXT} - if [ "${orig_file##*.}" == "h" ]; then - existflag=1 && break - fi - diff -u $orig_file $file >> $G_PATCHFILE - done - cd - &>/dev/null - if [ ${existflag} -eq 1 ]; then - echo "error: do not modify the header file" - return 1 - fi - if [ -f $G_PATCHFILE ];then - echo "make patch $G_PATCHFILE" - else - echo "no change detected" - return 1 - fi + #generate src patch file from G_DIFFEXT + G_PATCHFILE=$G_TMP_DIR/$G_HOTPATCH_ID.patch + rm -rf $G_PATCHFILE + cd $G_PATCH_SRC &>/dev/null + l_change_file=($(find -L -name "*$G_DIFFEXT" | xargs readlink -f 2>/dev/null| sort | uniq)) + echo "detect change files:${l_change_file[@]}" + for file in ${l_change_file[@]}; + do + file="./${file#$(readlink -f $G_PATCH_SRC)}" + orig_file=${file%$G_DIFFEXT} + if [ "${orig_file##*.}" == "h" ]; then + existflag=1 && break + fi + diff -u $orig_file $file >> $G_PATCHFILE + done + cd - &>/dev/null + if [ ${existflag} -eq 1 ]; then + echo "error: do not modify the header file" + return 1 + fi + if [ -f $G_PATCHFILE ];then + echo "make patch $G_PATCHFILE" + else + echo "no change detected" + return 1 + fi else - cp $G_PATCHFILE $G_TMP_DIR/${G_HOTPATCH_ID}.patch - G_PATCHFILE=$G_TMP_DIR/${G_HOTPATCH_ID}.patch + cp $G_PATCHFILE $G_TMP_DIR/${G_HOTPATCH_ID}.patch + G_PATCHFILE=$G_TMP_DIR/${G_HOTPATCH_ID}.patch fi cd $G_TMP_DIR &>/dev/null if [ -n "$G_MODULE_MAKEFILE" ];then - USERMODBUILDDIR=$(dirname $G_MODULE_MAKEFILE) + USERMODBUILDDIR=$(dirname $G_MODULE_MAKEFILE) fi export USERMODBUILDDIR export USERMODFLAGS=`cat $G_KPATCH_FLAGS` - export NO_PROFILING_CALLS=yes - kpatch-build -s $G_KERNEL_SRC $l_extra_module -c $G_KERNEL_CONFIG -v $G_VMLINUX --skip-gcc-check -n "${G_PREFIX}_${G_HOTPATCH_ID}" -b /lib/modules/`uname -r`/build $G_DEBUG_INFO $G_PATCHFILE + export NO_PROFILING_CALLS="yes" + export DISABLE_AFTER_LOAD="yes" + kpatch-build -s $G_PATCH_SRC -c $G_KERNEL_CONFIG -v $G_VMLINUX --skip-gcc-check -n "${G_PREFIX}_${G_HOTPATCH_ID}" $G_DEBUG_INFO $G_PATCHFILE l_ret=$? cd - &>/dev/null if [ $l_ret -eq 0 ] && [ -f "$G_TMP_DIR/$G_HOTPATCH" ];then - if grep -q "CONFIG_MODULE_SIG=y" .config ;then - echo "kernel compile with CONFIG_MODULE_SIG=y,please sign the patch module" - fi - cd /tmp &>/dev/null + cd /tmp &>/dev/null l_env_file=$G_TMP_DIR/toolenv if [ -n "`which rpm 2>/dev/null`" ]; then - echo "------------------------------------------------------------------------ " > "${l_env_file}" - echo >> "${l_env_file}" - echo "The kpatch tool version info and release date:" >> "${l_env_file}" - rpm -qi kpatch >> "${l_env_file}" - echo >> "${l_env_file}" - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo "------------------------------------------------------------------------ " > "${l_env_file}" + echo >> "${l_env_file}" + echo "The kpatch tool version info and release date:" >> "${l_env_file}" + rpm -qi kpatch >> "${l_env_file}" + echo >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" else - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" fi echo >> "${l_env_file}" @@ -617,41 +620,41 @@ function fn_makepatch() echo "------------------------------------------------------------------------ " >> "${l_env_file}" if [ -f "/etc/EulerLinux.conf" ]; then - echo >> "${l_env_file}" - echo "The euler compile env version info:" >> "${l_env_file}" - cat /etc/EulerLinux.conf >> "${l_env_file}" - echo >> "${l_env_file}" - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo >> "${l_env_file}" + echo "The euler compile env version info:" >> "${l_env_file}" + cat /etc/EulerLinux.conf >> "${l_env_file}" + echo >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" fi if [ -n "${G_MODULE_SRC}" ]; then - echo >> "${l_env_file}" - echo "The module hotpatch compile path info:" >> "${l_env_file}" - echo "MODULE_SRC=${G_MODULE_SRC}" >> "${l_env_file}" - echo "MODULE_MAKEFILE=${G_MODULE_MAKEFILE}" >> "${l_env_file}" - echo >> "${l_env_file}" - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo >> "${l_env_file}" + echo "The module hotpatch compile path info:" >> "${l_env_file}" + echo "MODULE_SRC=${G_MODULE_SRC}" >> "${l_env_file}" + echo "MODULE_MAKEFILE=${G_MODULE_MAKEFILE}" >> "${l_env_file}" + echo >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" fi if [ -f "${G_EXT_FLAGS}" ]; then - echo >> "${l_env_file}" - echo "The module hotpatch compile flags info:" >> "${l_env_file}" - cat "${G_EXT_FLAGS}" >> "${l_env_file}" - echo >> "${l_env_file}" - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo >> "${l_env_file}" + echo "The module hotpatch compile flags info:" >> "${l_env_file}" + cat "${G_EXT_FLAGS}" >> "${l_env_file}" + echo >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" fi if [ -n "${G_DEBUG_INFO}" ]; then - echo >> "${l_env_file}" - echo "The debug option info:" >> "${l_env_file}" - echo "${G_DEBUG_INFO}" >> "${l_env_file}" - echo >> "${l_env_file}" - echo "------------------------------------------------------------------------ " >> "${l_env_file}" + echo >> "${l_env_file}" + echo "The debug option info:" >> "${l_env_file}" + echo "${G_DEBUG_INFO}" >> "${l_env_file}" + echo >> "${l_env_file}" + echo "------------------------------------------------------------------------ " >> "${l_env_file}" fi - tar -czf $G_HOTPATCH_TAR ${G_PREFIX}_${G_HOTPATCH_ID} + tar -czf $G_HOTPATCH_TAR ${G_PREFIX}_${G_HOTPATCH_ID} mv ${G_HOTPATCH_TAR} ${G_HOTPATCH_DIR} - cd - &>/dev/null + cd - &>/dev/null if [ $? -ne 0 ];then echo "error: move ${G_HOTPATCH} to ${G_KSPLICE_HOTPATCH} failed" return 1 @@ -682,43 +685,43 @@ function fn_main() fn_do_clean return 1 fi - + fn_do_clean return 0 - + } function fn_prepare() { - kerver=`uname -r` - kerver=${kerver%.x86_64} - kerver=${kerver%.aarch64} - echo kernel version:$kerver - if [ ! -L kernel-source ];then - if [ -d /arm/arm_kernel ];then - ln -s /arm/arm_kernel/linux-$kerver kernel-source - else - ln -s /usr/src/kernels/linux-$kerver kernel-source - cp /lib/modules/`uname -r`/build/Makefile /usr/src/kernels/linux-$kerver - fi - fi - if [ ! -L .config ];then - if [ -d /arm/arm_kernel ];then - ln -s /arm/arm_kernel/linux-$kerver/.config .config - else - ln -s /usr/src/kernels/linux-$kerver/.config .config - cp /lib/modules/`uname -r`/build/.config /usr/src/kernels/linux-$kerver - fi - fi - rm -rf $G_KPATCH_FLAGS - touch $G_KPATCH_FLAGS + kerver=`uname -r` + kerver=${kerver%.x86_64} + kerver=${kerver%.aarch64} + echo kernel version:$kerver + if [ ! -L kernel-source ];then + if [ -d /arm/arm_kernel ];then + ln -s /arm/arm_kernel/linux-$kerver kernel-source + else + ln -s /usr/src/kernels/linux-$kerver kernel-source + cp /lib/modules/`uname -r`/build/Makefile /usr/src/kernels/linux-$kerver + fi + fi + if [ ! -L .config ];then + if [ -d /arm/arm_kernel ];then + ln -s /arm/arm_kernel/linux-$kerver/.config .config + else + ln -s /usr/src/kernels/linux-$kerver/.config .config + cp /lib/modules/`uname -r`/build/.config /usr/src/kernels/linux-$kerver + fi + fi + rm -rf $G_KPATCH_FLAGS + touch $G_KPATCH_FLAGS } G_NUM=`pidof -x make_hotpatch | wc -w` if [ $G_NUM -gt 2 ];then - echo "[$0]someone is making, please try again later." - exit 1 + echo "[$0]someone is making, please try again later." + exit 1 fi fn_prepare diff --git a/os_hotpatch b/os_hotpatch index 48b50b7..d56841a 100644 --- a/os_hotpatch +++ b/os_hotpatch @@ -1,17 +1,21 @@ #!/bin/sh -# Copyright (C) 2019. Huawei Technologies Co., Ltd. All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 and -# only version 2 as published by the Free Software Foundation. -# -# 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. +#******************************************************************** +# Copyright (C) Huawei Technologies, 2015-11 +# +# #FileName : make_hotpatch +# #Description : make hotpatch +# #Author : +# #Language : shell +# #Environment : Euler compile env +# #Created : 2015-11 +# #History +# 1.Date: +# Author: +# Modification:2015-12-7 +#******************************************************************** SYS_LIVEPATCH=/sys/kernel/livepatch -G_TMP_DIR=/tmp/hotpatch.$$ +G_TMP_DIR=/lib/modules/hotpatch.$$ G_PATCH_FILE= ######################################################### @@ -21,14 +25,14 @@ G_PATCH_FILE= ######################################################### OS_HP_HELP() { - echo "usage: os_hotpatch" - echo "-w|--check : check hotpatch" - echo "-l|--load : load hotpatch" - echo "-a|--active : active hotpatch" - echo "-r|--rollback : rollback/deactive hotpatch" - echo "-d|--delete : delete/unload hotpatch" - echo "-q|--query /all : query hotpatch" - echo "-h|--help : show this help information" + echo "usage: os_hotpatch" + echo "-w|--check : check hotpatch" + echo "-l|--load : load hotpatch" + echo "-a|--active : active hotpatch" + echo "-r|--rollback : rollback/deactive hotpatch" + echo "-d|--delete : delete/unload hotpatch" + echo "-q|--query /all : query hotpatch" + echo "-h|--help : show this help information" } ######################################################### @@ -39,20 +43,20 @@ OS_HP_HELP() ######################################################### OS_HP_CHECK() { - path=$1 - if [ ! -f "$path" ]; then - echo "The file $path is not exit" - exit 1; - fi - EXTRACT_HP $path - if [ $? -ne 0 -o ! -f "$G_PATCH_FILE" ];then - echo "The file $path is invalid" + path=$1 + if [ ! -f "$path" ]; then + echo "The file $path is not exit" + exit 1; + fi + EXTRACT_HP $path + if [ $? -ne 0 -o ! -f "$G_PATCH_FILE" ];then + echo "The file $path is invalid" + CLEAN_UP + exit 1; + fi CLEAN_UP - exit 1; - fi - CLEAN_UP - echo "The file $path is valid" - exit 0 + echo "The file $path is valid" + exit 0 } ######################################################### @@ -63,30 +67,30 @@ OS_HP_CHECK() ######################################################### OS_HP_ACTIVE() { - file=$1 - patch_name=`echo ${file%.tar.gz}|tr '-' '_'` - patch_install=`lsmod | grep -w $patch_name` + file=$1 + patch_name=`echo ${file%.tar.gz}|tr '-' '_'` + patch_install=`lsmod | grep -w $patch_name` - if [ "$patch_install" == "" ]; then - echo "patch $file not load" - exit 1 - fi + if [ "$patch_install" == "" ]; then + echo "patch $file not load" + exit 1 + fi - is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` - if [ ${is_active} == 1 ]; then - echo "patch already active" - exit 0 - fi + is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` + if [ ${is_active} == 1 ]; then + echo "patch already active" + exit 0 + fi - echo 1 > ${SYS_LIVEPATCH}/${patch_name}/enabled - is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` - if [ ${is_active} == 1 ]; then - echo "active patch $file success" - exit 0 - else - echo "active patch $file fail" - exit 1 - fi + echo 1 > ${SYS_LIVEPATCH}/${patch_name}/enabled + is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` + if [ ${is_active} == 1 ]; then + echo "active patch $file success" + exit 0 + else + echo "active patch $file fail" + exit 1 + fi } ######################################################### @@ -97,30 +101,30 @@ OS_HP_ACTIVE() ######################################################### OS_HP_DEACTIVE() { - file=$1 - patch_name=`echo ${file%.tar.gz}|tr '-' '_'` - patch_install=`lsmod | grep -w $patch_name` + file=$1 + patch_name=`echo ${file%.tar.gz}|tr '-' '_'` + patch_install=`lsmod | grep -w $patch_name` - if [ "$patch_install" == "" ]; then - echo "patch $file not load" - exit 1 - fi + if [ "$patch_install" == "" ]; then + echo "patch $file not load" + exit 1 + fi - is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` - if [ ${is_active} == 0 ]; then - echo "patch $file already deactive" - exit 0 - else - echo 0 > ${SYS_LIVEPATCH}/${patch_name}/enabled - is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` - if [ ${is_active} != 1 ]; then - echo "deactive patch $file success" - exit 0 + is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` + if [ ${is_active} == 0 ]; then + echo "patch $file already deactive" + exit 0 else - echo "deactive patch $file fail" - exit 1 - fi - fi + echo 0 > ${SYS_LIVEPATCH}/${patch_name}/enabled + is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` + if [ ${is_active} != 1 ]; then + echo "deactive patch $file success" + exit 0 + else + echo "deactive patch $file fail" + exit 1 + fi + fi } ######################################################### @@ -131,31 +135,31 @@ OS_HP_DEACTIVE() ######################################################### OS_HP_REMOVE() { - file=$1 - patch_name=`echo ${file%.tar.gz}|tr '-' '_'` - patch_install=`lsmod | grep -w $patch_name` + file=$1 + patch_name=`echo ${file%.tar.gz}|tr '-' '_'` + patch_install=`lsmod | grep -w $patch_name` - if [ "$patch_install" == "" ]; then - echo "patch $file not load" - exit 1 - fi - - is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` - if [ ${is_active} == 0 ]; then - rmmod ${patch_name} - else - echo 0 > ${SYS_LIVEPATCH}/${patch_name}/enabled - rmmod ${patch_name} - fi + if [ "$patch_install" == "" ]; then + echo "patch $file not load" + exit 1 + fi - patch_install=`lsmod | grep -w $patch_name` - if [ "$patch_install" == "" ]; then - echo "remove patch $file success" - exit 0 - else - echo "remove patch $file failed" - exit 1 - fi + is_active=`cat ${SYS_LIVEPATCH}/${patch_name}/enabled` + if [ ${is_active} == 0 ]; then + rmmod ${patch_name} + else + echo 0 > ${SYS_LIVEPATCH}/${patch_name}/enabled + rmmod ${patch_name} + fi + + patch_install=`lsmod | grep -w $patch_name` + if [ "$patch_install" == "" ]; then + echo "remove patch $file success" + exit 0 + else + echo "remove patch $file failed" + exit 1 + fi } ######################################################### @@ -166,61 +170,61 @@ OS_HP_REMOVE() ######################################################### OS_HP_INQUIRY() { - file=$1 - lret=0 - if [ "all" == $file ];then - cd ${SYS_LIVEPATCH} - if [ -z "`ls -d */ 2>/dev/null`" ];then + file=$1 + lret=0 + if [ "all" == $file ];then + cd ${SYS_LIVEPATCH} + if [ -z "`ls -d */ 2>/dev/null`" ];then + exit 0 + fi + for patch in `ls -d */ 2>/dev/null` + do + patch_id=${patch%/} + patch_id=${patch_id#klp_} + echo "Patch Name: ${patch_id}" + lstate=`cat /${SYS_LIVEPATCH}/${patch}/enabled 2>/dev/null` + if [ -z "$lstate" ];then + echo "Patch State: Removing" + echo "-----------------------------------------------------------" + continue + fi + if [ $lstate -eq 1 ];then + echo "Patch State: Active" + else + echo "Patch State: Deactive" + fi + cd ${SYS_LIVEPATCH}/${patch} 2>/dev/null + depends=`ls -d */ 2>/dev/null` + echo "Changes:" + ls -l ${SYS_LIVEPATCH}/${patch}/*/ 2>/dev/null|grep '^d'|awk -F ' ' '{print "\t"$9}' + echo "Denpendency: ${depends%/}" + echo "-----------------------------------------------------------" + done exit 0 fi - for patch in `ls -d */ 2>/dev/null` - do - patch_id=${patch%/} - patch_id=${patch_id#klp_} - echo "Patch Name: ${patch_id}" - lstate=`cat /${SYS_LIVEPATCH}/${patch}/enabled 2>/dev/null` - if [ -z "$lstate" ];then - echo "Patch State: Removing" - echo "-----------------------------------------------------------" - continue - fi - if [ $lstate -eq 1 ];then - echo "Patch State: Active" - else - echo "Patch State: Deactive" - fi - cd ${SYS_LIVEPATCH}/${patch} 2>/dev/null - depends=`ls -d */ 2>/dev/null` - echo "Changes:" - ls -l ${SYS_LIVEPATCH}/${patch}/*/ 2>/dev/null|grep '^d'|awk -F ' ' '{print "\t"$9}' - echo "Denpendency: ${depends%/}" - echo "-----------------------------------------------------------" - done - exit 0 - fi - patch=`echo ${file%.tar.gz}|tr '-' '_'` - patch_install=`lsmod | grep -w $patch` - if [ "$patch_install" == "" ]; then - exit 1 - fi - patch_id=${patch%/} - patch_id=${patch_id#klp_} - echo "Patch Name: ${patch_id}" - if [ `cat /${SYS_LIVEPATCH}/${patch}/enabled` -eq 1 ];then - echo "Patch State: Active" - lret=3 - else - echo "Patch State: Deactive" - lret=2 - fi - cd ${SYS_LIVEPATCH}/${patch} - depends=`ls -d */ 2>/dev/null` - echo "Changes:" - ls -l ${SYS_LIVEPATCH}/${patch}/*/ 2>/dev/null|grep '^d'|awk -F ' ' '{print "\t"$9}' - echo "Denpendency: ${depends%/}" - echo "-----------------------------------------------------------" + patch=`echo ${file%.tar.gz}|tr '-' '_'` + patch_install=`lsmod | grep -w $patch` + if [ "$patch_install" == "" ]; then + exit 1 + fi + patch_id=${patch%/} + patch_id=${patch_id#klp_} + echo "Patch Name: ${patch_id}" + if [ `cat /${SYS_LIVEPATCH}/${patch}/enabled` -eq 1 ];then + echo "Patch State: Active" + lret=3 + else + echo "Patch State: Deactive" + lret=2 + fi + cd ${SYS_LIVEPATCH}/${patch} + depends=`ls -d */ 2>/dev/null` + echo "Changes:" + ls -l ${SYS_LIVEPATCH}/${patch}/*/ 2>/dev/null|grep '^d'|awk -F ' ' '{print "\t"$9}' + echo "Denpendency: ${depends%/}" + echo "-----------------------------------------------------------" - exit $lret + exit $lret } ######################################################### # Description: extract hotpatch tar to tmp dir @@ -230,11 +234,12 @@ OS_HP_INQUIRY() ######################################################### EXTRACT_HP() { - mkdir $G_TMP_DIR + rm -rf $G_TMP_DIR + mkdir -p $G_TMP_DIR tar xzf $1 -C $G_TMP_DIR l_ret=$? if [ $l_ret -eq 0 ];then - #find the hotpatch module + #find the hotpatch module G_PATCH_FILE=$(find $G_TMP_DIR|grep -w "klp.*\.ko") return 0 else @@ -248,7 +253,7 @@ EXTRACT_HP() ######################################################### CLEAN_UP() { - rm -rf $G_TMP_DIR + rm -rf $G_TMP_DIR } ######################################################### # Description: install a hotpatch @@ -258,80 +263,80 @@ CLEAN_UP() ######################################################### OS_HP_INSTALL() { - path=$1 + path=$1 - if [ ! -f "$path" ]; then - echo "The file $path is not exit" - exit 1; - fi - EXTRACT_HP $path - if [ $? -ne 0 -o ! -f "$G_PATCH_FILE" ];then - echo "The file $path is invalid!" + if [ ! -f "$path" ]; then + echo "The file $path is not exit" + exit 1; + fi + EXTRACT_HP $path + if [ $? -ne 0 -o ! -f "$G_PATCH_FILE" ];then + echo "The file $path is invalid!" + CLEAN_UP + exit 1; + fi + patch_name=`echo ${G_PATCH_FILE%.ko}|tr '-' '_'` + patch_name=${patch_name##*/} + patch_install=`lsmod | grep -w $patch_name` + if [ "$patch_install" == "" ]; then + echo "insmod $G_PATCH_FILE" + insmod $G_PATCH_FILE + L_RET=$? + if [ 0 -ne ${L_RET} ]; then + echo "install patch $path fail" + CLEAN_UP + return 1 + else + echo "install patch $path success" + fi + else + echo "patch $path already install" + fi CLEAN_UP - exit 1; - fi - patch_name=`echo ${G_PATCH_FILE%.ko}|tr '-' '_'` - patch_name=${patch_name##*/} - patch_install=`lsmod | grep -w $patch_name` - if [ "$patch_install" == "" ]; then - echo "insmod $G_PATCH_FILE" - insmod $G_PATCH_FILE - L_RET=$? - if [ 0 -ne ${L_RET} ]; then - echo "install patch $path fail" - CLEAN_UP - return 1 - else - echo "install patch $path success" - fi - else - echo "patch $path already install" - fi - CLEAN_UP - return 0 + return 0 } #----------------------------main-------------------------# if [ ! -d ${SYS_LIVEPATCH} ];then - echo "this OS does not support kernel livepatch" - exit 1 + echo "this OS does not support kernel livepatch" + exit 1 fi input_args=`getopt -a -o l:a:r:d:w:q: -l load:,active:,delete:,check:,rollback:,query:,help, -- "$@" 2>&1` eval set -- "${input_args}" while true; do - case "$1" in - -w|--check) - OS_HP_CHECK "$2" - exit $? - ;; - -l|--load) - OS_HP_INSTALL "$2" - exit $? - ;; - -a|--active) - OS_HP_ACTIVE "$2" - exit $? - ;; - -r|--rollback) - OS_HP_DEACTIVE "$2" - exit $? - ;; - -d|--delete) - OS_HP_REMOVE "$2" - exit $? - ;; - -q|--query) - OS_HP_INQUIRY "$2" - exit $? - ;; - -h|--help) - OS_HP_HELP - exit 0 - ;; - *) - OS_HP_HELP - exit 1 - ;; - esac + case "$1" in + -w|--check) + OS_HP_CHECK "$2" + exit $? + ;; + -l|--load) + OS_HP_INSTALL "$2" + exit $? + ;; + -a|--active) + OS_HP_ACTIVE "$2" + exit $? + ;; + -r|--rollback) + OS_HP_DEACTIVE "$2" + exit $? + ;; + -d|--delete) + OS_HP_REMOVE "$2" + exit $? + ;; + -q|--query) + OS_HP_INQUIRY "$2" + exit $? + ;; + -h|--help) + OS_HP_HELP + exit 0 + ;; + *) + OS_HP_HELP + exit 1 + ;; + esac done