forked from Minki/linux
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: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8de8af7e08
commit
d058fa7e98
@ -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);
|
|||||||
|
|
||||||
#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 @@
|
|||||||
*/
|
*/
|
||||||
#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 @@
|
|||||||
*/
|
*/
|
||||||
#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 @@
|
|||||||
*/
|
*/
|
||||||
#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;
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user