Merge tag 'jfs-5.8' of git://github.com/kleikamp/linux-shaggy
[linux-2.6-microblaze.git] / arch / x86 / kernel / livepatch.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * livepatch.c - x86-specific Kernel Live Patching Core
4  */
5
6 #include <linux/module.h>
7 #include <linux/kallsyms.h>
8 #include <linux/livepatch.h>
9 #include <asm/text-patching.h>
10
11 /* Apply per-object alternatives. Based on x86 module_finalize() */
12 void arch_klp_init_object_loaded(struct klp_patch *patch,
13                                  struct klp_object *obj)
14 {
15         int cnt;
16         struct klp_modinfo *info;
17         Elf_Shdr *s, *alt = NULL, *para = NULL;
18         void *aseg, *pseg;
19         const char *objname;
20         char sec_objname[MODULE_NAME_LEN];
21         char secname[KSYM_NAME_LEN];
22
23         info = patch->mod->klp_info;
24         objname = obj->name ? obj->name : "vmlinux";
25
26         /* See livepatch core code for BUILD_BUG_ON() explanation */
27         BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 128);
28
29         for (s = info->sechdrs; s < info->sechdrs + info->hdr.e_shnum; s++) {
30                 /* Apply per-object .klp.arch sections */
31                 cnt = sscanf(info->secstrings + s->sh_name,
32                              ".klp.arch.%55[^.].%127s",
33                              sec_objname, secname);
34                 if (cnt != 2)
35                         continue;
36                 if (strcmp(sec_objname, objname))
37                         continue;
38                 if (!strcmp(".altinstructions", secname))
39                         alt = s;
40                 if (!strcmp(".parainstructions", secname))
41                         para = s;
42         }
43
44         if (alt) {
45                 aseg = (void *) alt->sh_addr;
46                 apply_alternatives(aseg, aseg + alt->sh_size);
47         }
48
49         if (para) {
50                 pseg = (void *) para->sh_addr;
51                 apply_paravirt(pseg, pseg + para->sh_size);
52         }
53 }