diff options
Diffstat (limited to 'arch/x86/kernel/alternative.c')
| -rw-r--r-- | arch/x86/kernel/alternative.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 4a234677e213..1eeeafcb4410 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
| @@ -210,6 +210,15 @@ void __init_or_module apply_alternatives(struct alt_instr *start, | |||
| 210 | u8 insnbuf[MAX_PATCH_LEN]; | 210 | u8 insnbuf[MAX_PATCH_LEN]; |
| 211 | 211 | ||
| 212 | DPRINTK("%s: alt table %p -> %p\n", __func__, start, end); | 212 | DPRINTK("%s: alt table %p -> %p\n", __func__, start, end); |
| 213 | /* | ||
| 214 | * The scan order should be from start to end. A later scanned | ||
| 215 | * alternative code can overwrite a previous scanned alternative code. | ||
| 216 | * Some kernel functions (e.g. memcpy, memset, etc) use this order to | ||
| 217 | * patch code. | ||
| 218 | * | ||
| 219 | * So be careful if you want to change the scan order to any other | ||
| 220 | * order. | ||
| 221 | */ | ||
| 213 | for (a = start; a < end; a++) { | 222 | for (a = start; a < end; a++) { |
| 214 | u8 *instr = a->instr; | 223 | u8 *instr = a->instr; |
| 215 | BUG_ON(a->replacementlen > a->instrlen); | 224 | BUG_ON(a->replacementlen > a->instrlen); |
| @@ -679,7 +688,7 @@ void __kprobes text_poke_smp_batch(struct text_poke_param *params, int n) | |||
| 679 | __stop_machine(stop_machine_text_poke, (void *)&tpp, NULL); | 688 | __stop_machine(stop_machine_text_poke, (void *)&tpp, NULL); |
| 680 | } | 689 | } |
| 681 | 690 | ||
| 682 | #if defined(CONFIG_DYNAMIC_FTRACE) || defined(HAVE_JUMP_LABEL) | 691 | #if defined(CONFIG_DYNAMIC_FTRACE) || defined(CONFIG_JUMP_LABEL) |
| 683 | 692 | ||
| 684 | #ifdef CONFIG_X86_64 | 693 | #ifdef CONFIG_X86_64 |
| 685 | unsigned char ideal_nop5[5] = { 0x66, 0x66, 0x66, 0x66, 0x90 }; | 694 | unsigned char ideal_nop5[5] = { 0x66, 0x66, 0x66, 0x66, 0x90 }; |
