diff options
| -rw-r--r-- | arch/x86/include/asm/nmi.h | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/nmi_selftest.c | 7 |
2 files changed, 7 insertions, 20 deletions
diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h index dc580c42851c..c0fa356e90de 100644 --- a/arch/x86/include/asm/nmi.h +++ b/arch/x86/include/asm/nmi.h | |||
| @@ -44,28 +44,14 @@ struct nmiaction { | |||
| 44 | const char *name; | 44 | const char *name; |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | #define register_nmi_handler(t, fn, fg, n) \ | 47 | #define register_nmi_handler(t, fn, fg, n, init...) \ |
| 48 | ({ \ | 48 | ({ \ |
| 49 | static struct nmiaction fn##_na = { \ | 49 | static struct nmiaction init fn##_na = { \ |
| 50 | .handler = (fn), \ | 50 | .handler = (fn), \ |
| 51 | .name = (n), \ | 51 | .name = (n), \ |
| 52 | .flags = (fg), \ | 52 | .flags = (fg), \ |
| 53 | }; \ | 53 | }; \ |
| 54 | __register_nmi_handler((t), &fn##_na); \ | 54 | __register_nmi_handler((t), &fn##_na); \ |
| 55 | }) | ||
| 56 | |||
| 57 | /* | ||
| 58 | * For special handlers that register/unregister in the | ||
| 59 | * init section only. This should be considered rare. | ||
| 60 | */ | ||
| 61 | #define register_nmi_handler_initonly(t, fn, fg, n) \ | ||
| 62 | ({ \ | ||
| 63 | static struct nmiaction fn##_na __initdata = { \ | ||
| 64 | .handler = (fn), \ | ||
| 65 | .name = (n), \ | ||
| 66 | .flags = (fg), \ | ||
| 67 | }; \ | ||
| 68 | __register_nmi_handler((t), &fn##_na); \ | ||
| 69 | }) | 55 | }) |
| 70 | 56 | ||
| 71 | int __register_nmi_handler(unsigned int, struct nmiaction *); | 57 | int __register_nmi_handler(unsigned int, struct nmiaction *); |
diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c index 149b8d9c6ad4..6d9582ec0324 100644 --- a/arch/x86/kernel/nmi_selftest.c +++ b/arch/x86/kernel/nmi_selftest.c | |||
| @@ -42,7 +42,8 @@ static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs) | |||
| 42 | static void __init init_nmi_testsuite(void) | 42 | static void __init init_nmi_testsuite(void) |
| 43 | { | 43 | { |
| 44 | /* trap all the unknown NMIs we may generate */ | 44 | /* trap all the unknown NMIs we may generate */ |
| 45 | register_nmi_handler_initonly(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk"); | 45 | register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk", |
| 46 | __initdata); | ||
| 46 | } | 47 | } |
| 47 | 48 | ||
| 48 | static void __init cleanup_nmi_testsuite(void) | 49 | static void __init cleanup_nmi_testsuite(void) |
| @@ -64,8 +65,8 @@ static void __init test_nmi_ipi(struct cpumask *mask) | |||
| 64 | { | 65 | { |
| 65 | unsigned long timeout; | 66 | unsigned long timeout; |
| 66 | 67 | ||
| 67 | if (register_nmi_handler_initonly(NMI_LOCAL, test_nmi_ipi_callback, | 68 | if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback, |
| 68 | NMI_FLAG_FIRST, "nmi_selftest")) { | 69 | NMI_FLAG_FIRST, "nmi_selftest", __initdata)) { |
| 69 | nmi_fail = FAILURE; | 70 | nmi_fail = FAILURE; |
| 70 | return; | 71 | return; |
| 71 | } | 72 | } |
