All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Liu <wei.liu2@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
	Wei Liu <wei.liu2@citrix.com>, Jan Beulich <JBeulich@suse.com>
Subject: [PATCH v4 22/27] x86: move compat_iret along side its non-compat variant
Date: Thu, 8 Jun 2017 18:11:58 +0100	[thread overview]
Message-ID: <20170608171203.20416-23-wei.liu2@citrix.com> (raw)
In-Reply-To: <20170608171203.20416-1-wei.liu2@citrix.com>

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
---
 xen/arch/x86/pv/iret.c             | 120 +++++++++++++++++++++++++++++++++++++
 xen/arch/x86/x86_64/compat/traps.c | 120 -------------------------------------
 2 files changed, 120 insertions(+), 120 deletions(-)

diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
index 358ae7cf08..013e619b3f 100644
--- a/xen/arch/x86/pv/iret.c
+++ b/xen/arch/x86/pv/iret.c
@@ -61,6 +61,126 @@ unsigned long do_iret(void)
     return 0;
 }
 
+unsigned int compat_iret(void)
+{
+    struct cpu_user_regs *regs = guest_cpu_user_regs();
+    struct vcpu *v = current;
+    u32 eflags;
+
+    /* Trim stack pointer to 32 bits. */
+    regs->rsp = (u32)regs->rsp;
+
+    /* Restore EAX (clobbered by hypercall). */
+    if ( unlikely(__get_user(regs->eax, (u32 *)regs->rsp)) )
+    {
+        domain_crash(v->domain);
+        return 0;
+    }
+
+    /* Restore CS and EIP. */
+    if ( unlikely(__get_user(regs->eip, (u32 *)regs->rsp + 1)) ||
+        unlikely(__get_user(regs->cs, (u32 *)regs->rsp + 2)) )
+    {
+        domain_crash(v->domain);
+        return 0;
+    }
+
+    /*
+     * Fix up and restore EFLAGS. We fix up in a local staging area
+     * to avoid firing the BUG_ON(IOPL) check in arch_get_info_guest.
+     */
+    if ( unlikely(__get_user(eflags, (u32 *)regs->rsp + 3)) )
+    {
+        domain_crash(v->domain);
+        return 0;
+    }
+
+    if ( VM_ASSIST(v->domain, architectural_iopl) )
+        v->arch.pv_vcpu.iopl = eflags & X86_EFLAGS_IOPL;
+
+    regs->eflags = (eflags & ~X86_EFLAGS_IOPL) | X86_EFLAGS_IF;
+
+    if ( unlikely(eflags & X86_EFLAGS_VM) )
+    {
+        /*
+         * Cannot return to VM86 mode: inject a GP fault instead. Note that
+         * the GP fault is reported on the first VM86 mode instruction, not on
+         * the IRET (which is why we can simply leave the stack frame as-is
+         * (except for perhaps having to copy it), which in turn seems better
+         * than teaching create_bounce_frame() to needlessly deal with vm86
+         * mode frames).
+         */
+        const struct trap_info *ti;
+        u32 x, ksp = v->arch.pv_vcpu.kernel_sp - 40;
+        unsigned int i;
+        int rc = 0;
+
+        gdprintk(XENLOG_ERR, "VM86 mode unavailable (ksp:%08X->%08X)\n",
+                 regs->esp, ksp);
+        if ( ksp < regs->esp )
+        {
+            for (i = 1; i < 10; ++i)
+            {
+                rc |= __get_user(x, (u32 *)regs->rsp + i);
+                rc |= __put_user(x, (u32 *)(unsigned long)ksp + i);
+            }
+        }
+        else if ( ksp > regs->esp )
+        {
+            for ( i = 9; i > 0; --i )
+            {
+                rc |= __get_user(x, (u32 *)regs->rsp + i);
+                rc |= __put_user(x, (u32 *)(unsigned long)ksp + i);
+            }
+        }
+        if ( rc )
+        {
+            domain_crash(v->domain);
+            return 0;
+        }
+        regs->esp = ksp;
+        regs->ss = v->arch.pv_vcpu.kernel_ss;
+
+        ti = &v->arch.pv_vcpu.trap_ctxt[TRAP_gp_fault];
+        if ( TI_GET_IF(ti) )
+            eflags &= ~X86_EFLAGS_IF;
+        regs->eflags &= ~(X86_EFLAGS_VM|X86_EFLAGS_RF|
+                          X86_EFLAGS_NT|X86_EFLAGS_TF);
+        if ( unlikely(__put_user(0, (u32 *)regs->rsp)) )
+        {
+            domain_crash(v->domain);
+            return 0;
+        }
+        regs->eip = ti->address;
+        regs->cs = ti->cs;
+    }
+    else if ( unlikely(ring_0(regs)) )
+    {
+        domain_crash(v->domain);
+        return 0;
+    }
+    else if ( ring_1(regs) )
+        regs->esp += 16;
+    /* Return to ring 2/3: restore ESP and SS. */
+    else if ( __get_user(regs->ss, (u32 *)regs->rsp + 5) ||
+              __get_user(regs->esp, (u32 *)regs->rsp + 4) )
+    {
+        domain_crash(v->domain);
+        return 0;
+    }
+
+    /* Restore upcall mask from supplied EFLAGS.IF. */
+    vcpu_info(v, evtchn_upcall_mask) = !(eflags & X86_EFLAGS_IF);
+
+    async_exception_cleanup(v);
+
+    /*
+     * The hypercall exit path will overwrite EAX with this return
+     * value.
+     */
+    return regs->eax;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/arch/x86/x86_64/compat/traps.c b/xen/arch/x86/x86_64/compat/traps.c
index add4af3403..df691f0ae3 100644
--- a/xen/arch/x86/x86_64/compat/traps.c
+++ b/xen/arch/x86/x86_64/compat/traps.c
@@ -66,126 +66,6 @@ void compat_show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs,
     printk("\n");
 }
 
-unsigned int compat_iret(void)
-{
-    struct cpu_user_regs *regs = guest_cpu_user_regs();
-    struct vcpu *v = current;
-    u32 eflags;
-
-    /* Trim stack pointer to 32 bits. */
-    regs->rsp = (u32)regs->rsp;
-
-    /* Restore EAX (clobbered by hypercall). */
-    if ( unlikely(__get_user(regs->eax, (u32 *)regs->rsp)) )
-    {
-        domain_crash(v->domain);
-        return 0;
-    }
-
-    /* Restore CS and EIP. */
-    if ( unlikely(__get_user(regs->eip, (u32 *)regs->rsp + 1)) ||
-        unlikely(__get_user(regs->cs, (u32 *)regs->rsp + 2)) )
-    {
-        domain_crash(v->domain);
-        return 0;
-    }
-
-    /*
-     * Fix up and restore EFLAGS. We fix up in a local staging area
-     * to avoid firing the BUG_ON(IOPL) check in arch_get_info_guest.
-     */
-    if ( unlikely(__get_user(eflags, (u32 *)regs->rsp + 3)) )
-    {
-        domain_crash(v->domain);
-        return 0;
-    }
-
-    if ( VM_ASSIST(v->domain, architectural_iopl) )
-        v->arch.pv_vcpu.iopl = eflags & X86_EFLAGS_IOPL;
-
-    regs->eflags = (eflags & ~X86_EFLAGS_IOPL) | X86_EFLAGS_IF;
-
-    if ( unlikely(eflags & X86_EFLAGS_VM) )
-    {
-        /*
-         * Cannot return to VM86 mode: inject a GP fault instead. Note that
-         * the GP fault is reported on the first VM86 mode instruction, not on
-         * the IRET (which is why we can simply leave the stack frame as-is
-         * (except for perhaps having to copy it), which in turn seems better
-         * than teaching create_bounce_frame() to needlessly deal with vm86
-         * mode frames).
-         */
-        const struct trap_info *ti;
-        u32 x, ksp = v->arch.pv_vcpu.kernel_sp - 40;
-        unsigned int i;
-        int rc = 0;
-
-        gdprintk(XENLOG_ERR, "VM86 mode unavailable (ksp:%08X->%08X)\n",
-                 regs->esp, ksp);
-        if ( ksp < regs->esp )
-        {
-            for (i = 1; i < 10; ++i)
-            {
-                rc |= __get_user(x, (u32 *)regs->rsp + i);
-                rc |= __put_user(x, (u32 *)(unsigned long)ksp + i);
-            }
-        }
-        else if ( ksp > regs->esp )
-        {
-            for ( i = 9; i > 0; --i )
-            {
-                rc |= __get_user(x, (u32 *)regs->rsp + i);
-                rc |= __put_user(x, (u32 *)(unsigned long)ksp + i);
-            }
-        }
-        if ( rc )
-        {
-            domain_crash(v->domain);
-            return 0;
-        }
-        regs->esp = ksp;
-        regs->ss = v->arch.pv_vcpu.kernel_ss;
-
-        ti = &v->arch.pv_vcpu.trap_ctxt[TRAP_gp_fault];
-        if ( TI_GET_IF(ti) )
-            eflags &= ~X86_EFLAGS_IF;
-        regs->eflags &= ~(X86_EFLAGS_VM|X86_EFLAGS_RF|
-                          X86_EFLAGS_NT|X86_EFLAGS_TF);
-        if ( unlikely(__put_user(0, (u32 *)regs->rsp)) )
-        {
-            domain_crash(v->domain);
-            return 0;
-        }
-        regs->eip = ti->address;
-        regs->cs = ti->cs;
-    }
-    else if ( unlikely(ring_0(regs)) )
-    {
-        domain_crash(v->domain);
-        return 0;
-    }
-    else if ( ring_1(regs) )
-        regs->esp += 16;
-    /* Return to ring 2/3: restore ESP and SS. */
-    else if ( __get_user(regs->ss, (u32 *)regs->rsp + 5) ||
-              __get_user(regs->esp, (u32 *)regs->rsp + 4) )
-    {
-        domain_crash(v->domain);
-        return 0;
-    }
-
-    /* Restore upcall mask from supplied EFLAGS.IF. */
-    vcpu_info(v, evtchn_upcall_mask) = !(eflags & X86_EFLAGS_IF);
-
-    async_exception_cleanup(v);
-
-    /*
-     * The hypercall exit path will overwrite EAX with this return
-     * value.
-     */
-    return regs->eax;
-}
-
 static long compat_register_guest_callback(
     struct compat_callback_register *reg)
 {
-- 
2.11.0


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

  parent reply	other threads:[~2017-06-08 17:16 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-08 17:11 [PATCH v4 00/27] x86: refactor trap handling code Wei Liu
2017-06-08 17:11 ` [PATCH v4 01/27] x86: factor out common PV emulation code Wei Liu
2017-06-20 16:00   ` Jan Beulich
2017-06-08 17:11 ` [PATCH v4 02/27] x86: move PV privileged instruction " Wei Liu
2017-06-20 16:03   ` Jan Beulich
2017-06-08 17:11 ` [PATCH v4 03/27] x86: move PV gate op " Wei Liu
2017-06-20 16:05   ` Jan Beulich
2017-06-08 17:11 ` [PATCH v4 04/27] x86: move PV invalid " Wei Liu
2017-06-20 16:21   ` Jan Beulich
2017-06-20 16:25     ` Wei Liu
2017-06-21  6:15       ` Jan Beulich
2017-06-21  8:57         ` Wei Liu
2017-06-21  9:09           ` Jan Beulich
2017-06-21  9:14             ` Wei Liu
2017-06-21  9:26               ` Jan Beulich
2017-06-21  9:29                 ` Wei Liu
2017-06-08 17:11 ` [PATCH v4 05/27] x86/traps: remove now unused inclusion of emulate.h Wei Liu
2017-06-20 16:21   ` Jan Beulich
2017-06-08 17:11 ` [PATCH v4 06/27] x86: clean up PV emulation code Wei Liu
2017-06-23 10:56   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 07/27] x86: move do_set_trap_table to pv/traps.c Wei Liu
2017-06-23 11:00   ` Andrew Cooper
2017-06-23 13:59     ` Wei Liu
2017-06-23 13:59       ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 08/27] x86: move some misc PV hypercalls to misc-hypercalls.c Wei Liu
2017-06-23 11:02   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 09/27] x86/traps: move pv_inject_event to pv/traps.c Wei Liu
2017-06-23 11:04   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 10/27] x86/traps: move set_guest_{machine, nmi}_trapbounce Wei Liu
2017-06-23 11:05   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 11/27] x86:/traps: move {un, }register_guest_nmi_callback Wei Liu
2017-06-23 11:38   ` Andrew Cooper
2017-06-23 12:19     ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 12/27] x86/traps: move guest_has_trap_callback to pv/traps.c Wei Liu
2017-06-23 12:01   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 13/27] x86: move toggle_guest_mode to pv/domain.c Wei Liu
2017-06-23 12:10   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 14/27] x86: move do_iret to pv/iret.c Wei Liu
2017-06-23 12:12   ` Andrew Cooper
2017-06-23 14:17     ` Wei Liu
2017-06-23 14:17       ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 15/27] x86: move callback_op code to pv/callback.c Wei Liu
2017-06-08 17:11 ` [PATCH v4 16/27] x86/traps: factor out pv_trap_init Wei Liu
2017-06-23 12:31   ` Andrew Cooper
2017-06-23 13:55     ` Wei Liu
2017-06-08 17:11 ` [PATCH v4 17/27] x86/traps: move some PV specific functions and struct to pv/traps.c Wei Liu
2017-06-23 12:36   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 18/27] x86/traps: move init_int80_direct_trap " Wei Liu
2017-06-23 12:37   ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 19/27] x86: move hypercall_page_initialise_ring3_kernel to pv/hypercall.c Wei Liu
2017-06-23 12:41   ` Andrew Cooper
2017-06-23 14:49     ` Wei Liu
2017-06-23 14:53       ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 20/27] x86: move hypercall_page_initialise_ring1_kernel Wei Liu
2017-06-23 12:41   ` Andrew Cooper
2017-06-23 13:56     ` Wei Liu
2017-06-23 13:56       ` Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 21/27] x86: move compat_set_trap_table along side the non-compat variant Wei Liu
2017-06-23 12:43   ` Andrew Cooper
2017-06-08 17:11 ` Wei Liu [this message]
2017-06-23 12:44   ` [PATCH v4 22/27] x86: move compat_iret along side its " Andrew Cooper
2017-06-08 17:11 ` [PATCH v4 23/27] x86: move the compat callback ops next to the " Wei Liu
2017-06-23 13:40   ` Jan Beulich
2017-06-08 17:12 ` [PATCH v4 24/27] x86: move compat_show_guest_statck near its " Wei Liu
2017-06-23 12:47   ` Andrew Cooper
2017-06-08 17:12 ` [PATCH v4 25/27] x86: remove the now empty x86_64/compat/traps.c Wei Liu
2017-06-23 12:47   ` Andrew Cooper
2017-06-08 17:12 ` [PATCH v4 26/27] x86: fix coding a style issue in asm-x86/traps.h Wei Liu
2017-06-23 12:48   ` Andrew Cooper
2017-06-08 17:12 ` [PATCH v4 27/27] x86: clean up traps.c Wei Liu
2017-06-23 12:50   ` Andrew Cooper
2017-06-23 13:45     ` 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=20170608171203.20416-23-wei.liu2@citrix.com \
    --to=wei.liu2@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=xen-devel@lists.xenproject.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.