diff options
author | Jan Beulich <JBeulich@novell.com> | 2009-11-27 15:04:58 +0000 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-02 11:39:45 +0100 |
commit | 01be50a308be466e122c3a8b3d535f1b673ecbd2 (patch) | |
tree | 051a50e00ba89d113569379dfc6510090d719583 | |
parent | 8ec6993d9f7d961014af970ded57542961fe9ad9 (diff) | |
download | blackbird-op-linux-01be50a308be466e122c3a8b3d535f1b673ecbd2.tar.gz blackbird-op-linux-01be50a308be466e122c3a8b3d535f1b673ecbd2.zip |
x86/alternatives: Check replacementlen <= instrlen at build time
Having run into the run-(boot-)time check a couple of times lately,
I finally took time to find a build-time check so that one doesn't
need to analyze the register/stack dump and resolve this (through
manual lookup in vmlinux) to the offending construct.
The assembler will emit a message like "Error: value of <num> too
large for field of 1 bytes at <offset>", which while not pointing
out the source location still makes analysis quite a bit easier.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
LKML-Reference: <4B0FF8AA0200007800022703@vpn.id2.novell.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/include/asm/alternative.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h index c240efc74e00..69b74a7b877f 100644 --- a/arch/x86/include/asm/alternative.h +++ b/arch/x86/include/asm/alternative.h @@ -84,6 +84,7 @@ static inline void alternatives_smp_switch(int smp) {} " .byte " __stringify(feature) "\n" /* feature bit */ \ " .byte 662b-661b\n" /* sourcelen */ \ " .byte 664f-663f\n" /* replacementlen */ \ + " .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */ \ ".previous\n" \ ".section .altinstr_replacement, \"ax\"\n" \ "663:\n\t" newinstr "\n664:\n" /* replacement */ \ |