From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
Jan Beulich <JBeulich@suse.com>
Subject: [PATCH for-4.8] x86/pv: Fix the handling of `int $x` for vectors which alias exceptions
Date: Thu, 22 Jun 2017 20:12:47 +0100 [thread overview]
Message-ID: <1498158767-4923-1-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <593AABBC02000078001614E1@prv-mh.provo.novell.com>
The claim at the top of c/s 2e426d6eecf "x86/traps: Drop use_error_code
parameter from do_{,guest_}trap()" is only actually true for hardware
exceptions. It is not true for `int $x` instructions (which never push error
code), irrespective of whether the vector aliases an exception or not.
Furthermore, c/s 6480cc6280e "x86/traps: Fix failed ASSERT() in
do_guest_trap()" really should have helped highlight that a regression had
been introduced.
Modify pv_inject_event() to understand event types other than
X86_EVENTTYPE_HW_EXCEPTION, and introduce pv_inject_sw_interrupt() for the
`int $x` handling code.
Add further assertions to pv_inject_event() concerning the type of events
passed in, which in turn requires that do_guest_trap() set its type
appropriately (which is now used exclusively for hardware exceptions).
This is logically a backport of c/s 5c4f579e0ee4f38cad5636bbf8ce700a394338d0
from Xen 4.9, but disentangled from the other injection work.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
---
xen/arch/x86/traps.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 19ac652..8c992ce 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -625,14 +625,24 @@ void fatal_trap(const struct cpu_user_regs *regs, bool_t show_remote)
(regs->eflags & X86_EFLAGS_IF) ? "" : ", IN INTERRUPT CONTEXT");
}
-static void do_guest_trap(unsigned int trapnr,
- const struct cpu_user_regs *regs)
+static void pv_inject_event(
+ unsigned int trapnr, const struct cpu_user_regs *regs, unsigned int type)
{
struct vcpu *v = current;
struct trap_bounce *tb;
const struct trap_info *ti;
- const bool use_error_code =
- ((trapnr < 32) && (TRAP_HAVE_EC & (1u << trapnr)));
+ bool use_error_code;
+
+ if ( type == X86_EVENTTYPE_HW_EXCEPTION )
+ {
+ ASSERT(trapnr < 32);
+ use_error_code = TRAP_HAVE_EC & (1u << trapnr);
+ }
+ else
+ {
+ ASSERT(type == X86_EVENTTYPE_SW_INTERRUPT);
+ use_error_code = false;
+ }
trace_pv_trap(trapnr, regs->eip, use_error_code, regs->error_code);
@@ -658,6 +668,12 @@ static void do_guest_trap(unsigned int trapnr,
trapstr(trapnr), trapnr, regs->error_code);
}
+static void do_guest_trap(
+ unsigned int trapnr, const struct cpu_user_regs *regs)
+{
+ pv_inject_event(trapnr, regs, X86_EVENTTYPE_HW_EXCEPTION);
+}
+
static void instruction_done(
struct cpu_user_regs *regs, unsigned long eip, unsigned int bpmatch)
{
@@ -3685,7 +3701,7 @@ void do_general_protection(struct cpu_user_regs *regs)
if ( permit_softint(TI_GET_DPL(ti), v, regs) )
{
regs->eip += 2;
- do_guest_trap(vector, regs);
+ pv_inject_event(vector, regs, X86_EVENTTYPE_SW_INTERRUPT);
return;
}
}
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-06-22 19:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-09 12:07 preparations 4.7.3 and 4.6.6 Jan Beulich
2017-06-09 12:22 ` Andrew Cooper
2017-06-09 12:47 ` Jan Beulich
2017-06-09 14:25 ` Andrew Cooper
2017-06-20 12:51 ` Wei Liu
2017-06-20 13:29 ` Lars Kurth
2017-06-22 19:12 ` Andrew Cooper [this message]
2017-06-23 13:17 ` [PATCH for-4.8] x86/pv: Fix the handling of `int $x` for vectors which alias exceptions Jan Beulich
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=1498158767-4923-1-git-send-email-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=JBeulich@suse.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.