aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-06-25 00:19:14 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-08 07:11:03 -0400
commit97349135fea7f0ba8464534433df3bfd1dc0e9a6 (patch)
tree7eb615f8c4b83a8327da92b96d95a44f8f54f101
parentd8d5900ef8afc562088f8470feeaf17c4747790f (diff)
x86/paravirt: add debugging for missing operations
Rather than just jumping to 0 when there's a missing operation, raise a BUG. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: xen-devel <xen-devel@lists.xensource.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/Kconfig7
-rw-r--r--include/asm-x86/paravirt.h8
2 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 9441e46cb49b..67e5275f03c8 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -435,6 +435,13 @@ config PARAVIRT_CLOCK
435 435
436endif 436endif
437 437
438config PARAVIRT_DEBUG
439 bool "paravirt-ops debugging"
440 depends on PARAVIRT && DEBUG_KERNEL
441 help
442 Enable to debug paravirt_ops internals. Specifically, BUG if
443 a paravirt_op is missing when it is called.
444
438config MEMTEST 445config MEMTEST
439 bool "Memtest" 446 bool "Memtest"
440 depends on X86_64 447 depends on X86_64
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
index 5467e2cff4bc..198293bed46f 100644
--- a/include/asm-x86/paravirt.h
+++ b/include/asm-x86/paravirt.h
@@ -459,10 +459,17 @@ int paravirt_disable_iospace(void);
459#define VEXTRA_CLOBBERS , "rax", "r8", "r9", "r10", "r11" 459#define VEXTRA_CLOBBERS , "rax", "r8", "r9", "r10", "r11"
460#endif 460#endif
461 461
462#ifdef CONFIG_PARAVIRT_DEBUG
463#define PVOP_TEST_NULL(op) BUG_ON(op == NULL)
464#else
465#define PVOP_TEST_NULL(op) ((void)op)
466#endif
467
462#define __PVOP_CALL(rettype, op, pre, post, ...) \ 468#define __PVOP_CALL(rettype, op, pre, post, ...) \
463 ({ \ 469 ({ \
464 rettype __ret; \ 470 rettype __ret; \
465 PVOP_CALL_ARGS; \ 471 PVOP_CALL_ARGS; \
472 PVOP_TEST_NULL(op); \
466 /* This is 32-bit specific, but is okay in 64-bit */ \ 473 /* This is 32-bit specific, but is okay in 64-bit */ \
467 /* since this condition will never hold */ \ 474 /* since this condition will never hold */ \
468 if (sizeof(rettype) > sizeof(unsigned long)) { \ 475 if (sizeof(rettype) > sizeof(unsigned long)) { \
@@ -491,6 +498,7 @@ int paravirt_disable_iospace(void);
491#define __PVOP_VCALL(op, pre, post, ...) \ 498#define __PVOP_VCALL(op, pre, post, ...) \
492 ({ \ 499 ({ \
493 PVOP_VCALL_ARGS; \ 500 PVOP_VCALL_ARGS; \
501 PVOP_TEST_NULL(op); \
494 asm volatile(pre \ 502 asm volatile(pre \
495 paravirt_alt(PARAVIRT_CALL) \ 503 paravirt_alt(PARAVIRT_CALL) \
496 post \ 504 post \