diff options
Diffstat (limited to 'arch/x86/kernel/alternative.c')
-rw-r--r-- | arch/x86/kernel/alternative.c | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 4817d743c263..a481763a3776 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
@@ -46,17 +46,6 @@ static int __init setup_noreplace_smp(char *str) | |||
46 | } | 46 | } |
47 | __setup("noreplace-smp", setup_noreplace_smp); | 47 | __setup("noreplace-smp", setup_noreplace_smp); |
48 | 48 | ||
49 | #ifdef CONFIG_PARAVIRT | ||
50 | static int __initdata_or_module noreplace_paravirt = 0; | ||
51 | |||
52 | static int __init setup_noreplace_paravirt(char *str) | ||
53 | { | ||
54 | noreplace_paravirt = 1; | ||
55 | return 1; | ||
56 | } | ||
57 | __setup("noreplace-paravirt", setup_noreplace_paravirt); | ||
58 | #endif | ||
59 | |||
60 | #define DPRINTK(fmt, args...) \ | 49 | #define DPRINTK(fmt, args...) \ |
61 | do { \ | 50 | do { \ |
62 | if (debug_alternative) \ | 51 | if (debug_alternative) \ |
@@ -298,7 +287,7 @@ recompute_jump(struct alt_instr *a, u8 *orig_insn, u8 *repl_insn, u8 *insnbuf) | |||
298 | tgt_rip = next_rip + o_dspl; | 287 | tgt_rip = next_rip + o_dspl; |
299 | n_dspl = tgt_rip - orig_insn; | 288 | n_dspl = tgt_rip - orig_insn; |
300 | 289 | ||
301 | DPRINTK("target RIP: %p, new_displ: 0x%x", tgt_rip, n_dspl); | 290 | DPRINTK("target RIP: %px, new_displ: 0x%x", tgt_rip, n_dspl); |
302 | 291 | ||
303 | if (tgt_rip - orig_insn >= 0) { | 292 | if (tgt_rip - orig_insn >= 0) { |
304 | if (n_dspl - 2 <= 127) | 293 | if (n_dspl - 2 <= 127) |
@@ -355,7 +344,7 @@ static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *ins | |||
355 | add_nops(instr + (a->instrlen - a->padlen), a->padlen); | 344 | add_nops(instr + (a->instrlen - a->padlen), a->padlen); |
356 | local_irq_restore(flags); | 345 | local_irq_restore(flags); |
357 | 346 | ||
358 | DUMP_BYTES(instr, a->instrlen, "%p: [%d:%d) optimized NOPs: ", | 347 | DUMP_BYTES(instr, a->instrlen, "%px: [%d:%d) optimized NOPs: ", |
359 | instr, a->instrlen - a->padlen, a->padlen); | 348 | instr, a->instrlen - a->padlen, a->padlen); |
360 | } | 349 | } |
361 | 350 | ||
@@ -376,7 +365,7 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, | |||
376 | u8 *instr, *replacement; | 365 | u8 *instr, *replacement; |
377 | u8 insnbuf[MAX_PATCH_LEN]; | 366 | u8 insnbuf[MAX_PATCH_LEN]; |
378 | 367 | ||
379 | DPRINTK("alt table %p -> %p", start, end); | 368 | DPRINTK("alt table %px, -> %px", start, end); |
380 | /* | 369 | /* |
381 | * The scan order should be from start to end. A later scanned | 370 | * The scan order should be from start to end. A later scanned |
382 | * alternative code can overwrite previously scanned alternative code. | 371 | * alternative code can overwrite previously scanned alternative code. |
@@ -400,14 +389,14 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, | |||
400 | continue; | 389 | continue; |
401 | } | 390 | } |
402 | 391 | ||
403 | DPRINTK("feat: %d*32+%d, old: (%p, len: %d), repl: (%p, len: %d), pad: %d", | 392 | DPRINTK("feat: %d*32+%d, old: (%px len: %d), repl: (%px, len: %d), pad: %d", |
404 | a->cpuid >> 5, | 393 | a->cpuid >> 5, |
405 | a->cpuid & 0x1f, | 394 | a->cpuid & 0x1f, |
406 | instr, a->instrlen, | 395 | instr, a->instrlen, |
407 | replacement, a->replacementlen, a->padlen); | 396 | replacement, a->replacementlen, a->padlen); |
408 | 397 | ||
409 | DUMP_BYTES(instr, a->instrlen, "%p: old_insn: ", instr); | 398 | DUMP_BYTES(instr, a->instrlen, "%px: old_insn: ", instr); |
410 | DUMP_BYTES(replacement, a->replacementlen, "%p: rpl_insn: ", replacement); | 399 | DUMP_BYTES(replacement, a->replacementlen, "%px: rpl_insn: ", replacement); |
411 | 400 | ||
412 | memcpy(insnbuf, replacement, a->replacementlen); | 401 | memcpy(insnbuf, replacement, a->replacementlen); |
413 | insnbuf_sz = a->replacementlen; | 402 | insnbuf_sz = a->replacementlen; |
@@ -433,7 +422,7 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start, | |||
433 | a->instrlen - a->replacementlen); | 422 | a->instrlen - a->replacementlen); |
434 | insnbuf_sz += a->instrlen - a->replacementlen; | 423 | insnbuf_sz += a->instrlen - a->replacementlen; |
435 | } | 424 | } |
436 | DUMP_BYTES(insnbuf, insnbuf_sz, "%p: final_insn: ", instr); | 425 | DUMP_BYTES(insnbuf, insnbuf_sz, "%px: final_insn: ", instr); |
437 | 426 | ||
438 | text_poke_early(instr, insnbuf, insnbuf_sz); | 427 | text_poke_early(instr, insnbuf, insnbuf_sz); |
439 | } | 428 | } |
@@ -599,9 +588,6 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start, | |||
599 | struct paravirt_patch_site *p; | 588 | struct paravirt_patch_site *p; |
600 | char insnbuf[MAX_PATCH_LEN]; | 589 | char insnbuf[MAX_PATCH_LEN]; |
601 | 590 | ||
602 | if (noreplace_paravirt) | ||
603 | return; | ||
604 | |||
605 | for (p = start; p < end; p++) { | 591 | for (p = start; p < end; p++) { |
606 | unsigned int used; | 592 | unsigned int used; |
607 | 593 | ||