diff --git a/0001-kpatch-build-sw64-add-sw64-architecture-support.patch b/0001-kpatch-build-sw64-add-sw64-architecture-support.patch new file mode 100644 index 0000000000000000000000000000000000000000..19cd2416972cdf754b1802c19080033c7f31552c --- /dev/null +++ b/0001-kpatch-build-sw64-add-sw64-architecture-support.patch @@ -0,0 +1,261 @@ +From c2a9f404b63019c6e7c0f962ddb909d0fe803b6f Mon Sep 17 00:00:00 2001 +From: Tai jiajun +Date: Tue, 26 Nov 2024 21:33:10 +0800 +Subject: [PATCH 1/4] kpatch-build/sw64: add sw64 architecture support + +In order to make the kpatch functionality supported by the +sunway cpu, sw64 architecture support has been added for +the first time in the kpatch-build. + +Signed-off-by: Tai jiajun +--- + kpatch-build/Makefile | 2 +- + kpatch-build/create-diff-object.c | 51 ++++++++++++++++++++----------- + kpatch-build/kpatch-build | 1 + + kpatch-build/kpatch-elf.c | 8 +++++ + kpatch-build/kpatch-elf.h | 1 + + 5 files changed, 49 insertions(+), 18 deletions(-) + +diff --git a/kpatch-build/Makefile b/kpatch-build/Makefile +index f042a6a..f20685f 100644 +--- a/kpatch-build/Makefile ++++ b/kpatch-build/Makefile +@@ -27,7 +27,7 @@ PLUGIN_CFLAGS := $(filter-out -Wconversion, $(CFLAGS)) + PLUGIN_CFLAGS += -shared -I$(GCC_PLUGINS_DIR)/include \ + -Igcc-plugins -fPIC -fno-rtti -O2 -Wall + endif +-ifeq ($(filter $(ARCH),s390x x86_64 ppc64le aarch64 riscv64 loongarch64),) ++ifeq ($(filter $(ARCH),s390x x86_64 ppc64le aarch64 riscv64 loongarch64 sw_64),) + $(error Unsupported architecture ${ARCH}, check https://github.com/dynup/kpatch/#supported-architectures) + endif + +diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c +index ca42673..f721ef9 100644 +--- a/kpatch-build/create-diff-object.c ++++ b/kpatch-build/create-diff-object.c +@@ -184,6 +184,8 @@ static bool is_gcc6_localentry_bundled_sym(struct kpatch_elf *kelf, + case ARM64: + case RISCV64: + return false; ++ case SW_64: ++ return false; + default: + ERROR("unsupported arch"); + } +@@ -733,6 +735,9 @@ static bool insn_is_load_immediate(struct kpatch_elf *kelf, void *addr) + /* Not implemented and I think it has less meaning. */ + break; + ++ case SW_64: ++ break; ++ + default: + ERROR("unsupported arch"); + } +@@ -2557,89 +2562,89 @@ static bool static_call_sites_group_filter(struct lookup_table *lookup, + static struct special_section special_sections[] = { + { + .name = "__bug_table", +- .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64, ++ .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64 | SW_64, + .group_size = bug_table_group_size, + }, + { + .name = ".fixup", +- .arch = X86_64 | PPC64 | S390 | ARM64, ++ .arch = X86_64 | PPC64 | S390 | ARM64 | SW_64, + .group_size = fixup_group_size, + }, + { + .name = "__ex_table", /* must come after .fixup */ +- .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64, ++ .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64 | SW_64, + .group_size = ex_table_group_size, + }, + { + .name = "__jump_table", +- .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64, ++ .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64 | SW_64, + .group_size = jump_table_group_size, + .group_filter = jump_table_group_filter, + }, + { + .name = ".printk_index", +- .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64, ++ .arch = X86_64 | PPC64 | S390 | ARM64 | RISCV64 | SW_64, + .group_size = printk_index_group_size, + }, + { + .name = ".smp_locks", +- .arch = X86_64 | ARM64, ++ .arch = X86_64 | ARM64 | SW_64, + .group_size = smp_locks_group_size, + }, + { + .name = ".parainstructions", +- .arch = X86_64 | ARM64, ++ .arch = X86_64 | ARM64 | SW_64, + .group_size = parainstructions_group_size, + }, + { + .name = ".altinstructions", +- .arch = X86_64 | S390 | ARM64, ++ .arch = X86_64 | S390 | ARM64 | SW_64, + .group_size = altinstructions_group_size, + }, + { + .name = ".static_call_sites", +- .arch = X86_64 | ARM64, ++ .arch = X86_64 | ARM64 | SW_64, + .group_size = static_call_sites_group_size, + .group_filter = static_call_sites_group_filter, + }, + { + .name = ".call_sites", +- .arch = X86_64, ++ .arch = X86_64 | SW_64, + .group_size = call_sites_group_size, + }, + { + .name = ".retpoline_sites", +- .arch = X86_64 | ARM64, ++ .arch = X86_64 | ARM64 | SW_64, + .group_size = retpoline_sites_group_size, + }, + { + .name = ".return_sites", +- .arch = X86_64 | ARM64, ++ .arch = X86_64 | ARM64 | SW_64, + .group_size = return_sites_group_size, + }, + { + .name = "__ftr_fixup", +- .arch = PPC64, ++ .arch = PPC64 | SW_64, + .group_size = fixup_entry_group_size, + }, + { + .name = "__mmu_ftr_fixup", +- .arch = PPC64, ++ .arch = PPC64 | SW_64, + .group_size = fixup_entry_group_size, + }, + { + .name = "__fw_ftr_fixup", +- .arch = PPC64, ++ .arch = PPC64 | SW_64, + .group_size = fixup_entry_group_size, + }, + { + .name = "__lwsync_fixup", +- .arch = PPC64, ++ .arch = PPC64 | SW_64, + .group_size = fixup_lwsync_group_size, + }, + { + .name = "__barrier_nospec_fixup", +- .arch = PPC64, ++ .arch = PPC64 | SW_64, + .group_size = fixup_barrier_nospec_group_size, + }, + { +@@ -4014,6 +4019,10 @@ static void kpatch_create_mcount_sections(struct kpatch_elf *kelf) + insn_offset = sym->sym.st_value; + break; + } ++ case SW_64: { ++ insn_offset = sym->sym.st_value; ++ break; ++ } + default: + ERROR("unsupported arch"); + } +@@ -4221,6 +4234,14 @@ static void kpatch_find_func_profiling_calls(struct kpatch_elf *kelf) + insn[4] == 0x00 && insn[5] == 0x00) + sym->has_func_profiling = 1; + break; ++ case SW_64: ++ list_for_each_entry(rela, &sym->sec->rela->relas, list) { ++ if (!strcmp(rela->sym->name, "_mcount")) { ++ sym->has_func_profiling = 1; ++ break; ++ } ++ } ++ break; + default: + ERROR("unsupported arch"); + } +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 5817023..957c1d4 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -359,6 +359,7 @@ find_special_section_data() { + [[ -n "$CONFIG_PRINTK_INDEX" ]] && check[i]=true # pi_entry + [[ -n "$CONFIG_JUMP_LABEL" ]] && check[j]=true # jump_entry + [[ -n "$CONFIG_UNWINDER_ORC" ]] && check[o]=true # orc_entry ++ [[ "$ARCH" == "sw_64" ]] && unset check[b] + + [[ "$ARCH" == "aarch64" ]] && unset check[p] + +diff --git a/kpatch-build/kpatch-elf.c b/kpatch-build/kpatch-elf.c +index d6398b3..88d45be 100644 +--- a/kpatch-build/kpatch-elf.c ++++ b/kpatch-build/kpatch-elf.c +@@ -133,6 +133,7 @@ struct rela *find_rela_by_offset(struct section *relasec, unsigned int offset) + return NULL; + } + ++#define R_SW_64_REFQUAD 2 /* Direct 64 bit */ + unsigned int absolute_rela_type(struct kpatch_elf *kelf) + { + switch(kelf->arch) { +@@ -146,6 +147,8 @@ unsigned int absolute_rela_type(struct kpatch_elf *kelf) + return R_AARCH64_ABS64; + case RISCV64: + return R_RISCV_64; ++ case SW_64: ++ return R_SW_64_REFQUAD; + default: + ERROR("unsupported arch"); + } +@@ -212,6 +215,7 @@ long rela_target_offset(struct kpatch_elf *kelf, struct section *relasec, + case PPC64: + case ARM64: + case RISCV64: ++ case SW_64: + add_off = 0; + break; + case X86_64: +@@ -268,6 +272,7 @@ unsigned int insn_length(struct kpatch_elf *kelf, void *addr) + + case PPC64: + case ARM64: ++ case SW_64: + return 4; + + case S390: +@@ -611,6 +616,9 @@ struct kpatch_elf *kpatch_elf_open(const char *name) + case EM_RISCV: + kelf->arch = RISCV64; + break; ++ case EM_SW_64: ++ kelf->arch = SW_64; ++ break; + default: + ERROR("Unsupported target architecture"); + } +diff --git a/kpatch-build/kpatch-elf.h b/kpatch-build/kpatch-elf.h +index f2cf60a..c56ab0a 100644 +--- a/kpatch-build/kpatch-elf.h ++++ b/kpatch-build/kpatch-elf.h +@@ -117,6 +117,7 @@ enum architecture { + S390 = 0x1 << 2, + ARM64 = 0x1 << 3, + RISCV64= 0x1 << 4, ++ SW_64 = 0x1 << 5, + }; + + struct kpatch_elf { +-- +2.33.0 + diff --git a/0002-kpatch-build-sw64-symtab_read-support-sw64.patch b/0002-kpatch-build-sw64-symtab_read-support-sw64.patch new file mode 100644 index 0000000000000000000000000000000000000000..eae069a9c1339fffd8d00c7aff6b453bc93bbd7a --- /dev/null +++ b/0002-kpatch-build-sw64-symtab_read-support-sw64.patch @@ -0,0 +1,85 @@ +From 6aa4f7af36466b1cf28176fbbf28182697067d5b Mon Sep 17 00:00:00 2001 +From: Tai jiajun +Date: Tue, 26 Nov 2024 21:37:39 +0800 +Subject: [PATCH 2/4] kpatch-build/sw64: symtab_read support sw64 + +Parsing readelf on the sunway platform. +``` +readelf -s fs/proc/cmdline.o +symbol table '.symtab' contains 26 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS cmdline.c + 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text + 3: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data + 4: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss + 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 .rodata.str1.1 + 6: 0000000000000000 0 SECTION LOCAL DEFAULT 6 .init.text + 7: 0000000000000000 92 FUNC LOCAL DEFAULT [STD GPLOAD] 6 proc_cmdline_init + 8: 0000000000000000 116 FUNC LOCAL DEFAULT [STD GPLOAD] 1 cmdline_proc_show +``` + +Signed-off-by: Tai jiajun +--- + kpatch-build/lookup.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c +index 34b3602..27372e6 100644 +--- a/kpatch-build/lookup.c ++++ b/kpatch-build/lookup.c +@@ -295,6 +295,9 @@ static void symtab_read(struct lookup_table *table, char *path) + int matched; + bool skip = false; + char line[256], name[256], size[16], type[16], bind[16], ndx[16]; ++#ifdef __sw_64__ ++ char sw_ndx[16],sw_name[256]; ++#endif + + if ((file = fopen(path, "r")) == NULL) + ERROR("fopen"); +@@ -333,6 +336,21 @@ static void symtab_read(struct lookup_table *table, char *path) + if (skip) + continue; + ++#ifdef __sw_64__ ++ matched = sscanf(line, "%*s %lx %s %s %s %*s %s %s %s %s\n", ++ &addr, size, type, bind, ndx, name, sw_ndx, sw_name); ++ ++ if (matched == 5) { ++ name[0] = '\0'; ++ matched++; ++ } ++ ++ if ( !strcmp(ndx, "UND") || ++ !strcmp(type, "SECTION")) ++ continue; ++ if (matched !=6 && matched != 8) ++ continue; ++#else + matched = sscanf(line, "%*s %lx %s %s %s %*s %s %s\n", + &addr, size, type, bind, ndx, name); + +@@ -345,6 +363,7 @@ static void symtab_read(struct lookup_table *table, char *path) + !strcmp(ndx, "UND") || + !strcmp(type, "SECTION")) + continue; ++#endif + + table->obj_syms[i].addr = addr; + table->obj_syms[i].size = strtoul(size, NULL, 0); +@@ -375,6 +394,11 @@ static void symtab_read(struct lookup_table *table, char *path) + } + + table->obj_syms[i].name = strdup(name); ++#ifdef __sw_64__ ++ if (matched == 8) { ++ table->obj_syms[i].name = strdup(sw_name); ++ } ++#endif + if (!table->obj_syms[i].name) + ERROR("strdup"); + +-- +2.33.0 + diff --git a/0003-kpatch-build-sw64-add-os-support-for-sw64-platform.patch b/0003-kpatch-build-sw64-add-os-support-for-sw64-platform.patch new file mode 100644 index 0000000000000000000000000000000000000000..a0aa46a1b48c7b0496b48e640609458dc81c845d --- /dev/null +++ b/0003-kpatch-build-sw64-add-os-support-for-sw64-platform.patch @@ -0,0 +1,50 @@ +From 4ee5bf33e1276a54365512608289f02eaa13439e Mon Sep 17 00:00:00 2001 +From: Tai jiajun +Date: Wed, 27 Nov 2024 20:49:04 +0800 +Subject: [PATCH 3/4] kpatch-build/sw64: add os support for sw64 platform + +Determine whether the kernel version supports klp by checking the +version of os.If a new specification follows, you can add identifiers +to the kernel version(uname -a). + +``` +OS VERSION +swos 5.10 +uos 4.19.0 +kylin 4.19.180 +``` + +Signed-off-by: Tai jiajun +--- + kpatch-build/kpatch-build | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build +index 957c1d4..7c69cc0 100755 +--- a/kpatch-build/kpatch-build ++++ b/kpatch-build/kpatch-build +@@ -223,10 +223,21 @@ use_klp_arch() + fi + } + ++kernel_is_os() ++{ ++ [[ -f "$RELEASE_FILE" && "$(source "$RELEASE_FILE" && echo "${ID,,}")" == $1 ]] ++} ++ + support_klp_replace() + { + if kernel_is_rhel; then + rhel_kernel_version_gte 4.18.0-193.el8 ++ elif kernel_is_os openeuler; then ++ kernel_version_gte 5.10.0 ++ elif kernel_is_os uos; then ++ kernel_version_gte 4.19.0 ++ elif kernel_is_os kylin; then ++ kernel_version_gte 4.19.180 + else + kernel_version_gte 5.1.0 + fi +-- +2.33.0 + diff --git a/kpatch.spec b/kpatch.spec index c40d02993361ba033da6bf4220b03c52af31f9ab..bec154baa122d0a23431ddf1b8b64f081d24e0ae 100644 --- a/kpatch.spec +++ b/kpatch.spec @@ -1,7 +1,7 @@ Name: kpatch Epoch: 1 Version: 0.9.9 -Release: 16 +Release: 17 Summary: A Linux dynamic kernel patching infrastructure License: GPLv2 @@ -56,6 +56,11 @@ Patch0040:0001-add-loongarch64-support.patch Patch0041:0051-fix-rela.init.text-section-changed-due-to-__BTF_id_-changed.patch Patch0042:0042-CDO-Handle-.data.once-sections.patch +%ifarch sw_64 +Patch8001:0001-kpatch-build-sw64-add-sw64-architecture-support.patch +Patch8002:0002-kpatch-build-sw64-symtab_read-support-sw64.patch +Patch8003:0003-kpatch-build-sw64-add-os-support-for-sw64-platform.patch +%else Patch9001:huawei-fix-function-ptr-relocation.patch Patch9002:huawei-lookup.c-ignore-BTF-ID-when-matching-locals.patch Patch9003:huawei-adapt-kpatch-to-6.6-kernel-and-fix-bundle-symbols-ch.patch @@ -65,6 +70,7 @@ Patch9006:huawei-ignore-initcall5-section-to-adapt-6.6-kernel.patch Patch9007:huawei-remove-.export_symbol-section-to-avoid-compile-error.patch Patch9008:huawei-ignore-the-change-of-the-hibifur-module.patch Patch9009:huawei-check-whether-the-directory-is-user-source-directory.patch +%endif BuildRequires: gcc elfutils-libelf-devel kernel-devel git %ifarch ppc64le @@ -128,6 +134,12 @@ popd %{_mandir}/man1/*.1.gz %changelog +* Tue Aug 19 2025 Gu Zitao - 1:0.9.9-17 +- Type:update +- CVE:NA +- SUG:NA +- DESC:add sw64 support + * Fri Aug 1 2025 jinsaihang - 1:0.9.9-16 - Type:bugfix - CVE:NA