aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorNick Meier <nmeier@microsoft.com>2015-02-28 14:39:01 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-01 22:31:47 -0500
commit96c1d0581d00f7abe033350edb021a9d947d8d81 (patch)
treed39c7c394d2a3b0b677038062b6be4e7a7d0c7cd /drivers/hv
parent530d15b907038735d4cb008dc5caae7ce4dfc985 (diff)
Drivers: hv: vmbus: Add support for VMBus panic notifier handler
Hyper-V allows a guest to notify the Hyper-V host that a panic condition occured. This notification can include up to five 64 bit values. These 64 bit values are written into crash MSRs. Once the data has been written into the crash MSRs, the host is then notified by writing into a Crash Control MSR. On the Hyper-V host, the panic notification data is captured in the Windows Event log as a 18590 event. Crash MSRs are defined in appendix H of the Hypervisor Top Level Functional Specification. At the time of this patch, v4.0 is the current functional spec. The URL for the v4.0 document is: http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor Top Level Functional Specification v4.0.docx Signed-off-by: Nick Meier <nmeier@microsoft.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r--drivers/hv/hyperv_vmbus.h11
-rw-r--r--drivers/hv/vmbus_drv.c36
2 files changed, 47 insertions, 0 deletions
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index b055e53bbc6e..88af4ec559c4 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -49,6 +49,17 @@ enum hv_cpuid_function {
49 HVCPUID_IMPLEMENTATION_LIMITS = 0x40000005, 49 HVCPUID_IMPLEMENTATION_LIMITS = 0x40000005,
50}; 50};
51 51
52#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE 0x400
53
54#define HV_X64_MSR_CRASH_P0 0x40000100
55#define HV_X64_MSR_CRASH_P1 0x40000101
56#define HV_X64_MSR_CRASH_P2 0x40000102
57#define HV_X64_MSR_CRASH_P3 0x40000103
58#define HV_X64_MSR_CRASH_P4 0x40000104
59#define HV_X64_MSR_CRASH_CTL 0x40000105
60
61#define HV_CRASH_CTL_CRASH_NOTIFY 0x8000000000000000
62
52/* Define version of the synthetic interrupt controller. */ 63/* Define version of the synthetic interrupt controller. */
53#define HV_SYNIC_VERSION (1) 64#define HV_SYNIC_VERSION (1)
54 65
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 2b7b51d264f1..526fa8b19cda 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -37,6 +37,8 @@
37#include <asm/hyperv.h> 37#include <asm/hyperv.h>
38#include <asm/hypervisor.h> 38#include <asm/hypervisor.h>
39#include <asm/mshyperv.h> 39#include <asm/mshyperv.h>
40#include <linux/notifier.h>
41#include <linux/ptrace.h>
40#include "hyperv_vmbus.h" 42#include "hyperv_vmbus.h"
41 43
42static struct acpi_device *hv_acpi_dev; 44static struct acpi_device *hv_acpi_dev;
@@ -45,6 +47,31 @@ static struct tasklet_struct msg_dpc;
45static struct completion probe_event; 47static struct completion probe_event;
46static int irq; 48static int irq;
47 49
50
51int hyperv_panic_event(struct notifier_block *nb,
52 unsigned long event, void *ptr)
53{
54 struct pt_regs *regs;
55
56 regs = current_pt_regs();
57
58 wrmsrl(HV_X64_MSR_CRASH_P0, regs->ip);
59 wrmsrl(HV_X64_MSR_CRASH_P1, regs->ax);
60 wrmsrl(HV_X64_MSR_CRASH_P2, regs->bx);
61 wrmsrl(HV_X64_MSR_CRASH_P3, regs->cx);
62 wrmsrl(HV_X64_MSR_CRASH_P4, regs->dx);
63
64 /*
65 * Let Hyper-V know there is crash data available
66 */
67 wrmsrl(HV_X64_MSR_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
68 return NOTIFY_DONE;
69}
70
71static struct notifier_block hyperv_panic_block = {
72 .notifier_call = hyperv_panic_event,
73};
74
48struct resource hyperv_mmio = { 75struct resource hyperv_mmio = {
49 .name = "hyperv mmio", 76 .name = "hyperv mmio",
50 .flags = IORESOURCE_MEM, 77 .flags = IORESOURCE_MEM,
@@ -795,6 +822,15 @@ static int vmbus_bus_init(int irq)
795 goto err_alloc; 822 goto err_alloc;
796 823
797 hv_cpu_hotplug_quirk(true); 824 hv_cpu_hotplug_quirk(true);
825
826 /*
827 * Only register if the crash MSRs are available
828 */
829 if (ms_hyperv.features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) {
830 atomic_notifier_chain_register(&panic_notifier_list,
831 &hyperv_panic_block);
832 }
833
798 vmbus_request_offers(); 834 vmbus_request_offers();
799 835
800 return 0; 836 return 0;