Commit d058fa7e authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman

Drivers: hv: vmbus: Move the crash notification function

As part of the effort to separate out architecture specific code, move the
crash notification function.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8de8af7e
...@@ -209,3 +209,29 @@ u64 hv_do_hypercall(u64 control, void *input, void *output) ...@@ -209,3 +209,29 @@ u64 hv_do_hypercall(u64 control, void *input, void *output)
#endif /* !x86_64 */ #endif /* !x86_64 */
} }
EXPORT_SYMBOL_GPL(hv_do_hypercall); EXPORT_SYMBOL_GPL(hv_do_hypercall);
void hyperv_report_panic(struct pt_regs *regs)
{
static bool panic_reported;
/*
* We prefer to report panic on 'die' chain as we have proper
* registers to report, but if we miss it (e.g. on BUG()) we need
* to report it on 'panic'.
*/
if (panic_reported)
return;
panic_reported = true;
wrmsrl(HV_X64_MSR_CRASH_P0, regs->ip);
wrmsrl(HV_X64_MSR_CRASH_P1, regs->ax);
wrmsrl(HV_X64_MSR_CRASH_P2, regs->bx);
wrmsrl(HV_X64_MSR_CRASH_P3, regs->cx);
wrmsrl(HV_X64_MSR_CRASH_P4, regs->dx);
/*
* Let Hyper-V know there is crash data available
*/
wrmsrl(HV_X64_MSR_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
}
EXPORT_SYMBOL_GPL(hyperv_report_panic);
...@@ -114,5 +114,6 @@ void hv_remove_crash_handler(void); ...@@ -114,5 +114,6 @@ void hv_remove_crash_handler(void);
#if IS_ENABLED(CONFIG_HYPERV) #if IS_ENABLED(CONFIG_HYPERV)
void hyperv_init(void); void hyperv_init(void);
void hyperv_report_panic(struct pt_regs *regs);
#endif #endif
#endif #endif
...@@ -73,6 +73,9 @@ ...@@ -73,6 +73,9 @@
*/ */
#define HV_X64_MSR_STAT_PAGES_AVAILABLE (1 << 8) #define HV_X64_MSR_STAT_PAGES_AVAILABLE (1 << 8)
/* Crash MSR available */
#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE (1 << 10)
/* /*
* Feature identification: EBX indicates which flags were specified at * Feature identification: EBX indicates which flags were specified at
* partition creation. The format is the same as the partition creation * partition creation. The format is the same as the partition creation
...@@ -144,6 +147,11 @@ ...@@ -144,6 +147,11 @@
*/ */
#define HV_X64_RELAXED_TIMING_RECOMMENDED (1 << 5) #define HV_X64_RELAXED_TIMING_RECOMMENDED (1 << 5)
/*
* Crash notification flag.
*/
#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63)
/* MSR used to identify the guest OS. */ /* MSR used to identify the guest OS. */
#define HV_X64_MSR_GUEST_OS_ID 0x40000000 #define HV_X64_MSR_GUEST_OS_ID 0x40000000
......
...@@ -40,16 +40,6 @@ ...@@ -40,16 +40,6 @@
*/ */
#define HV_UTIL_NEGO_TIMEOUT 55 #define HV_UTIL_NEGO_TIMEOUT 55
#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE 0x400
#define HV_X64_MSR_CRASH_P0 0x40000100
#define HV_X64_MSR_CRASH_P1 0x40000101
#define HV_X64_MSR_CRASH_P2 0x40000102
#define HV_X64_MSR_CRASH_P3 0x40000103
#define HV_X64_MSR_CRASH_P4 0x40000104
#define HV_X64_MSR_CRASH_CTL 0x40000105
#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63)
/* Define version of the synthetic interrupt controller. */ /* Define version of the synthetic interrupt controller. */
#define HV_SYNIC_VERSION (1) #define HV_SYNIC_VERSION (1)
......
...@@ -56,31 +56,6 @@ static struct completion probe_event; ...@@ -56,31 +56,6 @@ static struct completion probe_event;
static int hyperv_cpuhp_online; static int hyperv_cpuhp_online;
static void hyperv_report_panic(struct pt_regs *regs)
{
static bool panic_reported;
/*
* We prefer to report panic on 'die' chain as we have proper
* registers to report, but if we miss it (e.g. on BUG()) we need
* to report it on 'panic'.
*/
if (panic_reported)
return;
panic_reported = true;
wrmsrl(HV_X64_MSR_CRASH_P0, regs->ip);
wrmsrl(HV_X64_MSR_CRASH_P1, regs->ax);
wrmsrl(HV_X64_MSR_CRASH_P2, regs->bx);
wrmsrl(HV_X64_MSR_CRASH_P3, regs->cx);
wrmsrl(HV_X64_MSR_CRASH_P4, regs->dx);
/*
* Let Hyper-V know there is crash data available
*/
wrmsrl(HV_X64_MSR_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
}
static int hyperv_panic_event(struct notifier_block *nb, unsigned long val, static int hyperv_panic_event(struct notifier_block *nb, unsigned long val,
void *args) void *args)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment