Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -209,3 +209,29 @@ u64 hv_do_hypercall(u64 control, void *input, void *output)
#endif /* !x86_64 */
}
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);
+1 −0
Original line number Diff line number Diff line
@@ -114,5 +114,6 @@ void hv_remove_crash_handler(void);

#if IS_ENABLED(CONFIG_HYPERV)
void hyperv_init(void);
void hyperv_report_panic(struct pt_regs *regs);
#endif
#endif
+8 −0
Original line number Diff line number Diff line
@@ -73,6 +73,9 @@
  */
#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
 * partition creation. The format is the same as the partition creation
@@ -144,6 +147,11 @@
 */
#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. */
#define HV_X64_MSR_GUEST_OS_ID			0x40000000

+0 −10
Original line number Diff line number Diff line
@@ -40,16 +40,6 @@
 */
#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 HV_SYNIC_VERSION		(1)
+0 −25
Original line number Diff line number Diff line
@@ -56,31 +56,6 @@ static struct completion probe_event;

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,
			      void *args)
{