All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Chen <Wei.Chen@arm.com>
To: xen-devel@lists.xen.org
Cc: sstabellini@kernel.org, wei.chen@arm.com, steve.capper@arm.com,
	Kaly.Xin@arm.com, julien.grall@arm.com, nd@arm.com
Subject: [PATCH 12/18] xen/arm: Introduce new helpers to handle guest/hyp SErrors
Date: Mon, 13 Mar 2017 18:55:57 +0800	[thread overview]
Message-ID: <1489402563-4978-13-git-send-email-Wei.Chen@arm.com> (raw)
In-Reply-To: <1489402563-4978-1-git-send-email-Wei.Chen@arm.com>

Currently, ARM32 and ARM64 has different SError exception handlers.
These handlers include lots of code to check SError handle options
and code to distinguish guest-generated SErrors from hypervisor
SErrors.

The new helpers: do_trap_guest_serror and do_trap_hyp_serror are
wrappers of __do_trap_serror with constant guest/hyp parameters.
__do_trap_serror moves the option checking code and SError checking
code from assembly to C source. This will make the code become more
readable and avoid placing check code in too many places.

These two helpers only handle the following 3 types of SErrors:
1) Guest-generated SError and had been delivered in EL1 and then
   been forwarded to EL2.
2) Guest-generated SError but hadn't been delivered in EL1 before
   trapping to EL2. This SError would be caught in EL2 as soon as
   we just unmasked the PSTATE.A bit.
3) Hypervisor generated native SError, that would be a bug.

In the new helpers, we have used the function "inject_vabt_exception"
which was disabled by "#if 0" before. Now, we can remove the "#if 0"
to make this function to be available.

Signed-off-by: Wei Chen <Wei.Chen@arm.com>
---
 xen/arch/arm/traps.c            | 69 +++++++++++++++++++++++++++++++++++++++--
 xen/include/asm-arm/processor.h |  4 +++
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index 053b7fc..48cfc8e 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -646,7 +646,6 @@ static void inject_dabt_exception(struct cpu_user_regs *regs,
 #endif
 }
 
-#if 0
 /* Inject a virtual Abort/SError into the guest. */
 static void inject_vabt_exception(struct cpu_user_regs *regs)
 {
@@ -676,7 +675,59 @@ static void inject_vabt_exception(struct cpu_user_regs *regs)
 
     current->arch.hcr_el2 |= HCR_VA;
 }
-#endif
+
+/*
+ * SError exception handler. We only handle the following 3 types of SErrors:
+ * 1) Guest-generated SError and had been delivered in EL1 and then
+ *    been forwarded to EL2.
+ * 2) Guest-generated SError but hadn't been delivered in EL1 before
+ *    trapping to EL2. This SError would be caught in EL2 as soon as
+ *    we just unmasked the PSTATE.A bit.
+ * 3) Hypervisor generated native SError, that would be a bug.
+ *
+ * A true parameter "guest" means that the SError is type#1 or type#2.
+ */
+static void __do_trap_serror(struct cpu_user_regs *regs, bool guest)
+{
+    /*
+     * Only "DIVERSE" option needs to distinguish the guest-generated SErrors
+     * from hypervisor SErrors.
+     */
+    if ( serrors_op == SERRORS_DIVERSE )
+    {
+        /* Forward the type#1 and type#2 SErrors to guests. */
+        if ( guest )
+            return inject_vabt_exception(regs);
+
+        /* Type#3 SErrors will panic the whole system */
+        goto crash_system;
+    }
+
+    /*
+     * The "FORWARD" option will forward all SErrors to the guests, except
+     * idle domain generated SErrors.
+     */
+    if ( serrors_op == SERRORS_FORWARD )
+    {
+        /*
+         * Because the idle domain doesn't have the ability to handle the
+         * SErrors, we have to crash the whole system while we get a SError
+         * generated by idle domain.
+         */
+        if ( is_idle_vcpu(current) )
+            goto crash_system;
+
+        return inject_vabt_exception(regs);
+    }
+
+crash_system:
+    /* Three possibilities to crash the whole system:
+     * 1) "DIVERSE" option with Hypervisor generated SErrors.
+     * 2) "FORWARD" option with Idle Domain generated SErrors.
+     * 3) "PANIC" option with all SErrors.
+     */
+    do_unexpected_trap("SError", regs);
+}
 
 struct reg_ctxt {
     /* Guest-side state */
@@ -2863,6 +2914,20 @@ asmlinkage void do_trap_guest_error(struct cpu_user_regs *regs)
     domain_crash_synchronous();
 }
 
+asmlinkage void do_trap_hyp_serror(struct cpu_user_regs *regs)
+{
+    enter_hypervisor_head(regs);
+
+    __do_trap_serror(regs, VABORT_GEN_BY_GUEST(regs));
+}
+
+asmlinkage void do_trap_guest_serror(struct cpu_user_regs *regs)
+{
+    enter_hypervisor_head(regs);
+
+    __do_trap_serror(regs, true);
+}
+
 asmlinkage void do_trap_irq(struct cpu_user_regs *regs)
 {
     enter_hypervisor_head(regs);
diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
index 148cc6f..885dbca 100644
--- a/xen/include/asm-arm/processor.h
+++ b/xen/include/asm-arm/processor.h
@@ -709,6 +709,10 @@ int call_smc(register_t function_id, register_t arg0, register_t arg1,
 
 void do_trap_guest_error(struct cpu_user_regs *regs);
 
+void do_trap_hyp_serror(struct cpu_user_regs *regs);
+
+void do_trap_guest_serror(struct cpu_user_regs *regs);
+
 /* Functions for pending virtual abort checking window. */
 void abort_guest_exit_start(void);
 void abort_guest_exit_end(void);
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2017-03-13 10:55 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-13 10:55 [PATCH 00/18] Provide a command line option to choose how to handle SErrors Wei Chen
2017-03-13 10:55 ` [PATCH 01/18] xen/arm: Introduce a helper to get default HCR_EL2 flags Wei Chen
2017-03-15  0:24   ` Stefano Stabellini
2017-03-15  7:19     ` Wei Chen
2017-03-15 11:01       ` Julien Grall
2017-03-15 22:31         ` Stefano Stabellini
2017-03-16  7:44         ` Wei Chen
2017-03-13 10:55 ` [PATCH 02/18] xen/arm: Restore HCR_EL2 register Wei Chen
2017-03-15  0:25   ` Stefano Stabellini
2017-03-15  8:34     ` Wei Chen
2017-03-15 11:12       ` Julien Grall
2017-03-16  7:51         ` Wei Chen
2017-03-16 22:33         ` Stefano Stabellini
2017-03-16 22:46           ` Julien Grall
2017-03-21  0:31             ` Stefano Stabellini
2017-03-22 12:16               ` Julien Grall
2017-03-22 12:45                 ` Mark Rutland
2017-03-22 13:41                   ` Marc Zyngier
2017-03-22 17:54                     ` Stefano Stabellini
2017-03-22 18:04                       ` Julien Grall
2017-03-22 18:30                       ` Mark Rutland
2017-03-22 22:06                         ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 03/18] xen/arm: Avoid setting/clearing HCR_RW at every context switch Wei Chen
2017-03-15  0:25   ` Stefano Stabellini
2017-03-15  9:08     ` Wei Chen
2017-03-16 22:40       ` Stefano Stabellini
2017-03-16 22:52         ` Julien Grall
2017-03-16 23:17           ` Stefano Stabellini
2017-03-17  6:51             ` Wei Chen
2017-03-17  7:05               ` Julien Grall
2017-03-17 17:46                 ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 04/18] xen/arm: Save HCR_EL2 when a guest took the SError Wei Chen
2017-03-15  0:27   ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 05/18] xen/arm: Save ESR_EL2 to avoid using mismatched value in syndrome check Wei Chen
2017-03-16 13:50   ` Julien Grall
2017-03-16 22:27     ` Stefano Stabellini
2017-03-17  6:37       ` Wei Chen
2017-03-17  6:37     ` Wei Chen
2017-03-13 10:55 ` [PATCH 06/18] xen/arm: Introduce a virtual abort injection helper Wei Chen
2017-03-15  0:31   ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 07/18] xen/arm: Introduce a command line parameter for SErrors/Aborts Wei Chen
2017-03-15  0:45   ` Stefano Stabellini
2017-03-15  9:13     ` Wei Chen
2017-03-13 10:55 ` [PATCH 08/18] xen/arm: Introduce a initcall to update cpu_hwcaps by serror_op Wei Chen
2017-03-16 23:30   ` Stefano Stabellini
2017-03-17  6:56     ` Wei Chen
2017-03-17 17:21       ` Stefano Stabellini
2017-03-20  6:48         ` Wei Chen
2017-03-13 10:55 ` [PATCH 09/18] xen/arm64: Use alternative to skip the check of pending serrors Wei Chen
2017-03-16 23:40   ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 10/18] xen/arm32: Use cpu_hwcaps " Wei Chen
2017-03-16 23:44   ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 11/18] xen/arm: Move macro VABORT_GEN_BY_GUEST to common header Wei Chen
2017-03-16 23:53   ` Stefano Stabellini
2017-03-17  6:57     ` Wei Chen
2017-03-13 10:55 ` Wei Chen [this message]
2017-03-17  0:17   ` [PATCH 12/18] xen/arm: Introduce new helpers to handle guest/hyp SErrors Stefano Stabellini
2017-03-13 10:55 ` [PATCH 13/18] xen/arm: Replace do_trap_guest_serror with new helpers Wei Chen
2017-03-17  0:15   ` Stefano Stabellini
2017-03-13 10:55 ` [PATCH 14/18] xen/arm: Unmask the Abort/SError bit in the exception entries Wei Chen
2017-03-20 21:38   ` Stefano Stabellini
2017-03-22  8:49     ` Wei Chen
2017-03-22 12:26       ` Julien Grall
2017-03-22 22:21         ` Stefano Stabellini
2017-03-23  3:13           ` Wei Chen
2017-03-23 19:12             ` Julien Grall
2017-03-24  0:10               ` Stefano Stabellini
2017-03-24  8:11                 ` Wei Chen
2017-03-24 16:56                   ` Stefano Stabellini
2017-03-13 10:56 ` [PATCH 15/18] xen/arm: Introduce a helper to synchronize SError Wei Chen
2017-03-20 21:40   ` Stefano Stabellini
2017-03-20 21:44     ` Stefano Stabellini
2017-03-22  8:28       ` Wei Chen
2017-03-13 10:56 ` [PATCH 16/18] xen/arm: Isolate the SError between the context switch of 2 vCPUs Wei Chen
2017-03-20 21:46   ` Stefano Stabellini
2017-03-22  8:53     ` Wei Chen
2017-03-22 12:29       ` Julien Grall
2017-03-23  6:32         ` Wei Chen
2017-03-23 18:49           ` Stefano Stabellini
2017-03-13 10:56 ` [PATCH 17/18] xen/arm: Prevent slipping hypervisor SError to guest Wei Chen
2017-03-20 21:49   ` Stefano Stabellini
2017-03-13 10:56 ` [PATCH 18/18] xen/arm: Handle guest external abort as guest SError Wei Chen
2017-03-20 21:53   ` Stefano Stabellini

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=1489402563-4978-13-git-send-email-Wei.Chen@arm.com \
    --to=wei.chen@arm.com \
    --cc=Kaly.Xin@arm.com \
    --cc=julien.grall@arm.com \
    --cc=nd@arm.com \
    --cc=sstabellini@kernel.org \
    --cc=steve.capper@arm.com \
    --cc=xen-devel@lists.xen.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.