forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
…/git/jikos/livepatching Pull livepatching updates from Jiri Kosina: - fix for patching modules that contain .altinstructions or .parainstructions sections, from Jessica Yu - make TAINT_LIVEPATCH a per-module flag (so that it's immediately clear which module caused the taint), from Josh Poimboeuf * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching: livepatch/module: make TAINT_LIVEPATCH module-specific Documentation: livepatch: add section about arch-specific code livepatch/x86: apply alternatives and paravirt patches after relocations livepatch: use arch_klp_init_object_loaded() to finish arch-specific tasks
- Loading branch information
Showing
6 changed files
with
107 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
/* | ||
* livepatch.c - x86-specific Kernel Live Patching Core | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version 2 | ||
* of the License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/kallsyms.h> | ||
#include <linux/livepatch.h> | ||
#include <asm/text-patching.h> | ||
|
||
/* Apply per-object alternatives. Based on x86 module_finalize() */ | ||
void arch_klp_init_object_loaded(struct klp_patch *patch, | ||
struct klp_object *obj) | ||
{ | ||
int cnt; | ||
struct klp_modinfo *info; | ||
Elf_Shdr *s, *alt = NULL, *para = NULL; | ||
void *aseg, *pseg; | ||
const char *objname; | ||
char sec_objname[MODULE_NAME_LEN]; | ||
char secname[KSYM_NAME_LEN]; | ||
|
||
info = patch->mod->klp_info; | ||
objname = obj->name ? obj->name : "vmlinux"; | ||
|
||
/* See livepatch core code for BUILD_BUG_ON() explanation */ | ||
BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 128); | ||
|
||
for (s = info->sechdrs; s < info->sechdrs + info->hdr.e_shnum; s++) { | ||
/* Apply per-object .klp.arch sections */ | ||
cnt = sscanf(info->secstrings + s->sh_name, | ||
".klp.arch.%55[^.].%127s", | ||
sec_objname, secname); | ||
if (cnt != 2) | ||
continue; | ||
if (strcmp(sec_objname, objname)) | ||
continue; | ||
if (!strcmp(".altinstructions", secname)) | ||
alt = s; | ||
if (!strcmp(".parainstructions", secname)) | ||
para = s; | ||
} | ||
|
||
if (alt) { | ||
aseg = (void *) alt->sh_addr; | ||
apply_alternatives(aseg, aseg + alt->sh_size); | ||
} | ||
|
||
if (para) { | ||
pseg = (void *) para->sh_addr; | ||
apply_paravirt(pseg, pseg + para->sh_size); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters