Messages in this thread Patch in this message | | | From | Masami Hiramatsu <> | Subject | [BUGFIX PATCH -tip] x86: Fix fixmap page order in text_poke() | Date | Wed, 01 Jul 2009 17:02:46 -0400 |
| |
Since the fixmap pages are assigned higher address to lower, text_poke() has to use it with inverted order (FIX_TEXT_POKE1 to FIX_TEXT_POKE0).
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Cc: Ingo Molnar <mingo@elte.hu> ---
arch/x86/kernel/alternative.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index f576587..4d8b40b 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -527,14 +527,18 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len) } BUG_ON(!pages[0]); local_irq_save(flags); - set_fixmap(FIX_TEXT_POKE0, page_to_phys(pages[0])); + /* + * Since the fixmaps are assinged from higher address to lower, + * we use FIX_TEXT_POKE1 first, and FIX_TEXT_POKE0 second. + */ + set_fixmap(FIX_TEXT_POKE1, page_to_phys(pages[0])); if (pages[1]) - set_fixmap(FIX_TEXT_POKE1, page_to_phys(pages[1])); - vaddr = (char *)fix_to_virt(FIX_TEXT_POKE0); + set_fixmap(FIX_TEXT_POKE0, page_to_phys(pages[1])); + vaddr = (char *)fix_to_virt(FIX_TEXT_POKE1); memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len); - clear_fixmap(FIX_TEXT_POKE0); + clear_fixmap(FIX_TEXT_POKE1); if (pages[1]) - clear_fixmap(FIX_TEXT_POKE1); + clear_fixmap(FIX_TEXT_POKE0); local_flush_tlb(); sync_core(); /* Could also do a CLFLUSH here to speed up CPU recovery; but
-- Masami Hiramatsu
Software Engineer Hitachi Computer Products (America), Inc. Software Solutions Division
e-mail: mhiramat@redhat.com
| |