xen-devel.lists.xenproject.org archive mirror
 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 v2 13/19] xen/arm: Introduce new helpers to handle guest/hyp SErrors
Date: Thu, 30 Mar 2017 17:13:23 +0800	[thread overview]
Message-ID: <1490865209-18283-14-git-send-email-Wei.Chen@arm.com> (raw)
In-Reply-To: <1490865209-18283-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>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
---
 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 dafb730..a6f6e24 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -627,7 +627,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)
 {
@@ -658,7 +657,59 @@ static void inject_vabt_exception(struct cpu_user_regs *regs)
     current->arch.hcr_el2 |= HCR_VA;
     WRITE_SYSREG(current->arch.hcr_el2, HCR_EL2);
 }
-#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 */
@@ -2845,6 +2896,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 700bde9..2db2370 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-30  9:13 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-30  9:13 [PATCH v2 00/19] Provide a command line option to choose how to handle SErrors Wei Chen
2017-03-30  9:13 ` [PATCH v2 01/19] xen/arm: Save ESR_EL2 to avoid using mismatched value in syndrome check Wei Chen
2017-03-30 13:31   ` Julien Grall
2017-03-31  3:26     ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 02/19] xen/arm: Remove vwfi while setting HCR_EL2 in init_traps Wei Chen
2017-03-30 17:05   ` Julien Grall
2017-03-30 22:29     ` Stefano Stabellini
2017-03-31  5:58       ` Wei Chen
2017-03-31  8:34       ` Julien Grall
2017-03-30  9:13 ` [PATCH v2 03/19] xen/arm: Move parse_vwfi from trap.c to domain.c Wei Chen
2017-03-30  9:13 ` [PATCH v2 04/19] xen/arm: Restore HCR_EL2 register Wei Chen
2017-03-30 17:07   ` Julien Grall
2017-03-30 22:03     ` Stefano Stabellini
2017-03-31  2:10       ` Wei Chen
2017-03-31  8:39         ` Julien Grall
2017-03-31  8:59           ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 05/19] xen/arm: Avoid setting/clearing HCR_RW at every context switch Wei Chen
2017-03-30 17:12   ` Julien Grall
2017-03-30 21:21   ` Stefano Stabellini
2017-03-30  9:13 ` [PATCH v2 06/19] xen/arm: Save HCR_EL2 when a guest took the SError Wei Chen
2017-03-30  9:13 ` [PATCH v2 07/19] xen/arm: Introduce a virtual abort injection helper Wei Chen
2017-03-30 17:20   ` Julien Grall
2017-03-30 21:24     ` Stefano Stabellini
2017-03-31  5:25     ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 08/19] xen/arm: Introduce a command line parameter for SErrors/Aborts Wei Chen
2017-03-30 17:39   ` Julien Grall
2017-03-31  5:28     ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 09/19] xen/arm: Introduce a initcall to update cpu_hwcaps by serror_op Wei Chen
2017-03-30 17:51   ` Julien Grall
2017-03-30 18:02   ` Julien Grall
2017-03-30 21:28     ` Stefano Stabellini
2017-03-31  8:50       ` Julien Grall
2017-03-30  9:13 ` [PATCH v2 10/19] xen/arm64: Use alternative to skip the check of pending serrors Wei Chen
2017-03-30  9:13 ` [PATCH v2 11/19] xen/arm32: " Wei Chen
2017-03-30 18:06   ` Julien Grall
2017-03-30 21:29     ` Stefano Stabellini
2017-03-31  5:33       ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 12/19] xen/arm: Move macro VABORT_GEN_BY_GUEST to common header Wei Chen
2017-03-30 21:36   ` Stefano Stabellini
2017-03-31  5:35     ` Wei Chen
2017-03-30  9:13 ` Wei Chen [this message]
2017-03-30  9:13 ` [PATCH v2 14/19] xen/arm: Replace do_trap_guest_serror with new helpers Wei Chen
2017-03-30  9:13 ` [PATCH v2 15/19] xen/arm: Unmask the Abort/SError bit in the exception entries Wei Chen
2017-03-30  9:13 ` [PATCH v2 16/19] xen/arm: Introduce a helper to synchronize SError Wei Chen
2017-03-30 18:28   ` Julien Grall
2017-03-30 18:32     ` Julien Grall
2017-03-30 18:37       ` Julien Grall
2017-03-31  5:51         ` Wei Chen
2017-03-31 10:55         ` Wei Chen
2017-03-31 11:06           ` Julien Grall
2017-03-31 11:09             ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 17/19] xen/arm: Isolate the SError between the context switch of 2 vCPUs Wei Chen
2017-03-30 21:49   ` Stefano Stabellini
2017-03-30 22:00     ` Julien Grall
2017-03-31  5:52       ` Wei Chen
2017-03-30  9:13 ` [PATCH v2 18/19] xen/arm: Prevent slipping hypervisor SError to guest Wei Chen
2017-03-30  9:13 ` [PATCH v2 19/19] xen/arm: Handle guest external abort as guest SError Wei Chen

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=1490865209-18283-14-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).