All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Michael Kelley <mikelley@microsoft.com>
Cc: will@kernel.org, ardb@kernel.org, arnd@arndb.de,
	catalin.marinas@arm.com, mark.rutland@arm.com,
	linux-arm-kernel@lists.infradead.org, gregkh@linuxfoundation.org,
	linux-kernel@vger.kernel.org, linux-hyperv@vger.kernel.org,
	linux-efi@vger.kernel.org, linux-arch@vger.kernel.org,
	olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com,
	jasowang@redhat.com, marcelo.cerri@canonical.com,
	kys@microsoft.com, sunilmut@microsoft.com, boqun.feng@gmail.com
Subject: Re: [PATCH v6 06/10] arm64: hyperv: Add kexec and panic handlers
Date: Sun, 15 Mar 2020 18:15:44 +0000	[thread overview]
Message-ID: <86tv2pzdpr.wl-maz@kernel.org> (raw)
In-Reply-To: <1584200119-18594-7-git-send-email-mikelley@microsoft.com>

On Sat, 14 Mar 2020 15:35:15 +0000,
Michael Kelley <mikelley@microsoft.com> wrote:
> 
> Add functions to set up and remove kexec and panic
> handlers, and to inform Hyper-V about a guest panic.
> These functions are called from architecture independent
> code in the VMbus driver.
> 
> This code is built only when CONFIG_HYPERV is enabled.
> 
> Signed-off-by: Michael Kelley <mikelley@microsoft.com>
> ---
>  arch/arm64/hyperv/hv_core.c  | 61 ++++++++++++++++++++++++++++++++++++++++++++
>  arch/arm64/hyperv/mshyperv.c | 26 +++++++++++++++++++
>  2 files changed, 87 insertions(+)
> 
> diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
> index 4aa6b8f..8d6de9f 100644
> --- a/arch/arm64/hyperv/hv_core.c
> +++ b/arch/arm64/hyperv/hv_core.c
> @@ -199,3 +199,64 @@ void hv_get_vpreg_128(u32 msr, struct hv_get_vp_register_output *res)
>  	kfree(output);
>  }
>  EXPORT_SYMBOL_GPL(hv_get_vpreg_128);
> +
> +void hyperv_report_panic(struct pt_regs *regs, long err)
> +{
> +	static bool panic_reported;
> +	u64 guest_id;
> +
> +	/*
> +	 * 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;

How does this work when multiple vcpus are crashing at once? Are you
guaranteed to be single-threaded at this point?

> +
> +	guest_id = hv_get_vpreg(HV_REGISTER_GUEST_OSID);
> +
> +	/*
> +	 * Hyper-V provides the ability to store only 5 values.
> +	 * Pick the passed in error value, the guest_id, and the PC.
> +	 * The first two general registers are added arbitrarily.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_P0, err);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P1, guest_id);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P2, regs->pc);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P3, regs->regs[0]);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P4, regs->regs[1]);

How about reporting useful information, a pointer to some data
structure describing the fault? As it is, the usefulness of this is
pretty dubious.

> +
> +	/*
> +	 * Let Hyper-V know there is crash data available
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
> +}
> +EXPORT_SYMBOL_GPL(hyperv_report_panic);
> +
> +/*
> + * hyperv_report_panic_msg - report panic message to Hyper-V
> + * @pa: physical address of the panic page containing the message
> + * @size: size of the message in the page
> + */
> +void hyperv_report_panic_msg(phys_addr_t pa, size_t size)
> +{
> +	/*
> +	 * P3 to contain the physical address of the panic page & P4 to
> +	 * contain the size of the panic data in that page. Rest of the
> +	 * registers are no-op when the NOTIFY_MSG flag is set.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_P0, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P1, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P2, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P3, pa);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P4, size);
> +
> +	/*
> +	 * Let Hyper-V know there is crash data available along with
> +	 * the panic message.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_CTL,
> +	       (HV_CRASH_CTL_CRASH_NOTIFY | HV_CRASH_CTL_CRASH_NOTIFY_MSG));
> +}
> +EXPORT_SYMBOL_GPL(hyperv_report_panic_msg);
> diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
> index ae6ece6..c58940d 100644
> --- a/arch/arm64/hyperv/mshyperv.c
> +++ b/arch/arm64/hyperv/mshyperv.c
> @@ -23,6 +23,8 @@
>  
>  static void (*vmbus_handler)(void);
>  static void (*hv_stimer0_handler)(void);
> +static void (*hv_kexec_handler)(void);
> +static void (*hv_crash_handler)(struct pt_regs *regs);

Why is this in the arch-specific code? Yes, it lives in the x86 arch
code too, but I don't see what prevents it from being moved to the
vmbus_drv.c code.

>  
>  static int vmbus_irq;
>  static long __percpu *vmbus_evt;
> @@ -137,3 +139,27 @@ void hv_remove_stimer0_irq(int irq)
>  	}
>  }
>  EXPORT_SYMBOL_GPL(hv_remove_stimer0_irq);
> +
> +void hv_setup_kexec_handler(void (*handler)(void))
> +{
> +	hv_kexec_handler = handler;
> +}
> +EXPORT_SYMBOL_GPL(hv_setup_kexec_handler);
> +
> +void hv_remove_kexec_handler(void)
> +{
> +	hv_kexec_handler = NULL;
> +}
> +EXPORT_SYMBOL_GPL(hv_remove_kexec_handler);
> +
> +void hv_setup_crash_handler(void (*handler)(struct pt_regs *regs))
> +{
> +	hv_crash_handler = handler;
> +}
> +EXPORT_SYMBOL_GPL(hv_setup_crash_handler);
> +
> +void hv_remove_crash_handler(void)
> +{
> +	hv_crash_handler = NULL;
> +}
> +EXPORT_SYMBOL_GPL(hv_remove_crash_handler);
> -- 
> 1.8.3.1
> 
> 

Thanks,

	M.

-- 
Jazz is not dead, it just smells funny.

WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Michael Kelley <mikelley@microsoft.com>
Cc: mark.rutland@arm.com, linux-arch@vger.kernel.org,
	linux-hyperv@vger.kernel.org, linux-efi@vger.kernel.org,
	boqun.feng@gmail.com, arnd@arndb.de, catalin.marinas@arm.com,
	jasowang@redhat.com, sunilmut@microsoft.com,
	linux-kernel@vger.kernel.org, marcelo.cerri@canonical.com,
	olaf@aepfle.de, gregkh@linuxfoundation.org, apw@canonical.com,
	vkuznets@redhat.com, kys@microsoft.com, will@kernel.org,
	ardb@kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v6 06/10] arm64: hyperv: Add kexec and panic handlers
Date: Sun, 15 Mar 2020 18:15:44 +0000	[thread overview]
Message-ID: <86tv2pzdpr.wl-maz@kernel.org> (raw)
In-Reply-To: <1584200119-18594-7-git-send-email-mikelley@microsoft.com>

On Sat, 14 Mar 2020 15:35:15 +0000,
Michael Kelley <mikelley@microsoft.com> wrote:
> 
> Add functions to set up and remove kexec and panic
> handlers, and to inform Hyper-V about a guest panic.
> These functions are called from architecture independent
> code in the VMbus driver.
> 
> This code is built only when CONFIG_HYPERV is enabled.
> 
> Signed-off-by: Michael Kelley <mikelley@microsoft.com>
> ---
>  arch/arm64/hyperv/hv_core.c  | 61 ++++++++++++++++++++++++++++++++++++++++++++
>  arch/arm64/hyperv/mshyperv.c | 26 +++++++++++++++++++
>  2 files changed, 87 insertions(+)
> 
> diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
> index 4aa6b8f..8d6de9f 100644
> --- a/arch/arm64/hyperv/hv_core.c
> +++ b/arch/arm64/hyperv/hv_core.c
> @@ -199,3 +199,64 @@ void hv_get_vpreg_128(u32 msr, struct hv_get_vp_register_output *res)
>  	kfree(output);
>  }
>  EXPORT_SYMBOL_GPL(hv_get_vpreg_128);
> +
> +void hyperv_report_panic(struct pt_regs *regs, long err)
> +{
> +	static bool panic_reported;
> +	u64 guest_id;
> +
> +	/*
> +	 * 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;

How does this work when multiple vcpus are crashing at once? Are you
guaranteed to be single-threaded at this point?

> +
> +	guest_id = hv_get_vpreg(HV_REGISTER_GUEST_OSID);
> +
> +	/*
> +	 * Hyper-V provides the ability to store only 5 values.
> +	 * Pick the passed in error value, the guest_id, and the PC.
> +	 * The first two general registers are added arbitrarily.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_P0, err);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P1, guest_id);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P2, regs->pc);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P3, regs->regs[0]);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P4, regs->regs[1]);

How about reporting useful information, a pointer to some data
structure describing the fault? As it is, the usefulness of this is
pretty dubious.

> +
> +	/*
> +	 * Let Hyper-V know there is crash data available
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_CTL, HV_CRASH_CTL_CRASH_NOTIFY);
> +}
> +EXPORT_SYMBOL_GPL(hyperv_report_panic);
> +
> +/*
> + * hyperv_report_panic_msg - report panic message to Hyper-V
> + * @pa: physical address of the panic page containing the message
> + * @size: size of the message in the page
> + */
> +void hyperv_report_panic_msg(phys_addr_t pa, size_t size)
> +{
> +	/*
> +	 * P3 to contain the physical address of the panic page & P4 to
> +	 * contain the size of the panic data in that page. Rest of the
> +	 * registers are no-op when the NOTIFY_MSG flag is set.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_P0, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P1, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P2, 0);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P3, pa);
> +	hv_set_vpreg(HV_REGISTER_CRASH_P4, size);
> +
> +	/*
> +	 * Let Hyper-V know there is crash data available along with
> +	 * the panic message.
> +	 */
> +	hv_set_vpreg(HV_REGISTER_CRASH_CTL,
> +	       (HV_CRASH_CTL_CRASH_NOTIFY | HV_CRASH_CTL_CRASH_NOTIFY_MSG));
> +}
> +EXPORT_SYMBOL_GPL(hyperv_report_panic_msg);
> diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
> index ae6ece6..c58940d 100644
> --- a/arch/arm64/hyperv/mshyperv.c
> +++ b/arch/arm64/hyperv/mshyperv.c
> @@ -23,6 +23,8 @@
>  
>  static void (*vmbus_handler)(void);
>  static void (*hv_stimer0_handler)(void);
> +static void (*hv_kexec_handler)(void);
> +static void (*hv_crash_handler)(struct pt_regs *regs);

Why is this in the arch-specific code? Yes, it lives in the x86 arch
code too, but I don't see what prevents it from being moved to the
vmbus_drv.c code.

>  
>  static int vmbus_irq;
>  static long __percpu *vmbus_evt;
> @@ -137,3 +139,27 @@ void hv_remove_stimer0_irq(int irq)
>  	}
>  }
>  EXPORT_SYMBOL_GPL(hv_remove_stimer0_irq);
> +
> +void hv_setup_kexec_handler(void (*handler)(void))
> +{
> +	hv_kexec_handler = handler;
> +}
> +EXPORT_SYMBOL_GPL(hv_setup_kexec_handler);
> +
> +void hv_remove_kexec_handler(void)
> +{
> +	hv_kexec_handler = NULL;
> +}
> +EXPORT_SYMBOL_GPL(hv_remove_kexec_handler);
> +
> +void hv_setup_crash_handler(void (*handler)(struct pt_regs *regs))
> +{
> +	hv_crash_handler = handler;
> +}
> +EXPORT_SYMBOL_GPL(hv_setup_crash_handler);
> +
> +void hv_remove_crash_handler(void)
> +{
> +	hv_crash_handler = NULL;
> +}
> +EXPORT_SYMBOL_GPL(hv_remove_crash_handler);
> -- 
> 1.8.3.1
> 
> 

Thanks,

	M.

-- 
Jazz is not dead, it just smells funny.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-03-15 18:15 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-14 15:35 [PATCH v6 00/10] Subject: Enable Linux guests on Hyper-V on ARM64 Michael Kelley
2020-03-14 15:35 ` Michael Kelley
2020-03-14 15:35 ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 01/10] arm64: hyperv: Add core Hyper-V include files Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-15 17:31   ` Marc Zyngier
2020-03-15 17:31     ` Marc Zyngier
2020-03-18  0:10     ` Michael Kelley
2020-03-18  0:10       ` Michael Kelley
2020-03-18  0:10       ` Michael Kelley
2020-03-16  8:47   ` Arnd Bergmann
2020-03-16  8:47     ` Arnd Bergmann
2020-03-18  0:12     ` Michael Kelley
2020-03-18  0:12       ` Michael Kelley
2020-03-18  0:12       ` Michael Kelley
2020-03-18 10:10       ` Arnd Bergmann
2020-03-18 10:10         ` Arnd Bergmann
2020-03-18 10:10         ` Arnd Bergmann
2020-03-19 21:31         ` Michael Kelley
2020-03-19 21:31           ` Michael Kelley
2020-03-19 21:31           ` Michael Kelley
2020-03-20 16:38           ` Arnd Bergmann
2020-03-20 16:38             ` Arnd Bergmann
2020-03-20 16:38             ` Arnd Bergmann
2020-03-14 15:35 ` [PATCH v6 02/10] arm/arm64: smccc-1.1: Add vendor specific owner definition Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 03/10] arm64: hyperv: Add hypercall and register access functions Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 04/10] arm64: hyperv: Add memory alloc/free functions for Hyper-V size pages Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-16  8:22   ` Arnd Bergmann
2020-03-16  8:22     ` Arnd Bergmann
2020-03-16  8:30     ` gregkh
2020-03-16  8:30       ` gregkh
2020-03-16  8:30     ` Marc Zyngier
2020-03-16  8:30       ` Marc Zyngier
2020-03-16  8:32       ` Arnd Bergmann
2020-03-16  8:32         ` Arnd Bergmann
2020-03-18  0:15         ` Michael Kelley
2020-03-18  0:15           ` Michael Kelley
2020-03-18  9:57           ` Arnd Bergmann
2020-03-18  9:57             ` Arnd Bergmann
2020-03-18  9:57             ` Arnd Bergmann
2020-03-19 21:43             ` Michael Kelley
2020-03-19 21:43               ` Michael Kelley
2020-03-19 21:43               ` Michael Kelley
2020-03-20 16:28               ` Arnd Bergmann
2020-03-20 16:28                 ` Arnd Bergmann
2020-03-20 16:28                 ` Arnd Bergmann
2020-03-20 17:22                 ` Michael Kelley
2020-03-20 17:22                   ` Michael Kelley
2020-03-20 17:22                   ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 05/10] arm64: hyperv: Add interrupt handlers for VMbus and stimer Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-16  8:25   ` Arnd Bergmann
2020-03-16  8:25     ` Arnd Bergmann
2020-03-18  0:16     ` Michael Kelley
2020-03-18  0:16       ` Michael Kelley
2020-03-18  0:16       ` Michael Kelley
2020-03-18  9:52       ` Arnd Bergmann
2020-03-18  9:52         ` Arnd Bergmann
2020-03-18  9:52         ` Arnd Bergmann
2020-03-14 15:35 ` [PATCH v6 06/10] arm64: hyperv: Add kexec and panic handlers Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-15 18:15   ` Marc Zyngier [this message]
2020-03-15 18:15     ` Marc Zyngier
2020-03-18  0:17     ` Michael Kelley
2020-03-18  0:17       ` Michael Kelley
2020-03-18  0:17       ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 07/10] arm64: hyperv: Initialize hypervisor on boot Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-16  8:29   ` Arnd Bergmann
2020-03-16  8:29     ` Arnd Bergmann
2020-03-16  8:29     ` Arnd Bergmann
2020-03-18  0:17     ` Michael Kelley
2020-03-18  0:17       ` Michael Kelley
2020-03-18  0:17       ` Michael Kelley
2020-03-18  9:44       ` Arnd Bergmann
2020-03-18  9:44         ` Arnd Bergmann
2020-03-18  9:44         ` Arnd Bergmann
2020-03-14 15:35 ` [PATCH v6 08/10] Drivers: hv: vmbus: Add hooks for per-CPU IRQ Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35 ` [PATCH v6 09/10] arm64: efi: Export screen_info Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-16  8:20   ` Arnd Bergmann
2020-03-16  8:20     ` Arnd Bergmann
2020-03-18  0:18     ` Michael Kelley
2020-03-18  0:18       ` Michael Kelley
2020-03-18  0:18       ` Michael Kelley
2020-03-18  9:26       ` Arnd Bergmann
2020-03-18  9:26         ` Arnd Bergmann
2020-03-18  9:26         ` Arnd Bergmann
2020-03-19 21:46         ` Michael Kelley
2020-03-19 21:46           ` Michael Kelley
2020-03-19 21:46           ` Michael Kelley
2020-05-13 14:26           ` Nikhil Mahale
2020-05-13 14:26             ` Nikhil Mahale
2020-05-13 14:26             ` Nikhil Mahale
2020-05-18  4:25             ` Nikhil Mahale
2020-05-18  4:25               ` Nikhil Mahale
2020-05-18  4:25               ` Nikhil Mahale
2020-05-18 12:51               ` Ard Biesheuvel
2020-05-18 12:51                 ` Ard Biesheuvel
2020-05-18 12:51                 ` Ard Biesheuvel
2020-05-22 11:14                 ` Nikhil Mahale
2020-05-22 11:14                   ` Nikhil Mahale
2020-05-22 11:14                   ` Nikhil Mahale
2020-05-22 11:32                   ` Ard Biesheuvel
2020-05-22 11:32                     ` Ard Biesheuvel
2020-05-22 11:32                     ` Ard Biesheuvel
2020-03-14 15:35 ` [PATCH v6 10/10] Drivers: hv: Enable Hyper-V code to be built on ARM64 Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-14 15:35   ` Michael Kelley
2020-03-18  3:11 ` [PATCH v6 03/10] arm64: hyperv: Add hypercall and register access functions Hillf Danton
2020-03-18  3:11   ` Hillf Danton
2020-03-19 21:04   ` Michael Kelley
2020-03-19 21:04     ` Michael Kelley
2020-03-19 21:04     ` Michael Kelley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=86tv2pzdpr.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=apw@canonical.com \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=boqun.feng@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jasowang@redhat.com \
    --cc=kys@microsoft.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcelo.cerri@canonical.com \
    --cc=mark.rutland@arm.com \
    --cc=mikelley@microsoft.com \
    --cc=olaf@aepfle.de \
    --cc=sunilmut@microsoft.com \
    --cc=vkuznets@redhat.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.