x86/alternatives: Check replacementlen <= instrlen at build time
Jan Beulich [Fri, 27 Nov 2009 15:04:58 +0000 (15:04 +0000)]
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>

arch/x86/include/asm/alternative.h

index c240efc..69b74a7 100644 (file)
@@ -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     */   \