From 258a44ad74dbbaf5aa577e0f17405ba32852aa82 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Thu, 25 Feb 2016 13:06:16 +0100 Subject: [PATCH] x86: disable CR0.WP while applying alternatives In preparation for marking .text as read-only, care needs to be taken not to fault while applying alternatives. Swapping back to RW mappings is a possibility, but would require additional TLB management. A temporary disabling of CR0.WP is cleaner. Signed-off-by: Andrew Cooper Acked-by: Jan Beulich --- xen/arch/x86/alternative.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index 9d54df1e52..0a0ce156e7 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -147,11 +147,15 @@ static void __init apply_alternatives(struct alt_instr *start, struct alt_instr struct alt_instr *a; u8 *instr, *replacement; u8 insnbuf[MAX_PATCH_LEN]; + unsigned long cr0 = read_cr0(); ASSERT(!local_irq_is_enabled()); printk(KERN_INFO "alt table %p -> %p\n", start, end); + /* Disable WP to allow application of alternatives to read-only pages. */ + write_cr0(cr0 & ~X86_CR0_WP); + /* * The scan order should be from start to end. A later scanned * alternative code can overwrite a previous scanned alternative code. @@ -181,6 +185,9 @@ static void __init apply_alternatives(struct alt_instr *start, struct alt_instr a->instrlen - a->replacementlen); text_poke_early(instr, insnbuf, a->instrlen); } + + /* Reinstate WP. */ + write_cr0(cr0); } void __init alternative_instructions(void) -- 2.39.5