WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Fix preemption of multicalls in compat mo

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Fix preemption of multicalls in compat mode.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 04 Jun 2007 03:16:08 -0700
Delivery-date: Mon, 04 Jun 2007 03:18:15 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
# Date 1180522538 -3600
# Node ID 63211a8027fa994290e23be17f4de9ba3b3e953e
# Parent  c4f62fe631e4a5f7ff20ec7bab0a81cd97a14974
Fix preemption of multicalls in compat mode.

mcs->call (struct multicall_entry) always needs to be translated into
mcs->compat_call (struct compat_multicall_entry) when a multicall is
preempted in compat mode. Previously this translation only occured for
those hypercalls which explicitly called hypercall_xlat_continuation()
which doesn't cover all hypercalls which could potentially be
preempted.

Change hypercall_xlat_continuation() to only translate only the
hypercall arguments themselves and not the multicall_entry
layout. Translate the layout for all hypercalls in in
compat_multicall() instead.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
---
 xen/arch/x86/domain.c         |    9 ++++-----
 xen/common/compat/multicall.c |    7 +++++++
 xen/common/multicall.c        |    4 ++++
 3 files changed, 15 insertions(+), 5 deletions(-)

diff -r c4f62fe631e4 -r 63211a8027fa xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Wed May 30 10:47:05 2007 +0100
+++ b/xen/arch/x86/domain.c     Wed May 30 11:55:38 2007 +0100
@@ -1456,13 +1456,12 @@ int hypercall_xlat_continuation(unsigned
                 id = NULL;
             }
             if ( (mask & 1) && mcs->call.args[i] == nval )
+            {
+                mcs->call.args[i] = cval;
                 ++rc;
+            }
             else
-            {
-                cval = mcs->call.args[i];
-                BUG_ON(mcs->call.args[i] != cval);
-            }
-            mcs->compat_call.args[i] = cval;
+                BUG_ON(mcs->call.args[i] != (unsigned int)mcs->call.args[i]);
         }
     }
     else
diff -r c4f62fe631e4 -r 63211a8027fa xen/common/compat/multicall.c
--- a/xen/common/compat/multicall.c     Wed May 30 10:47:05 2007 +0100
+++ b/xen/common/compat/multicall.c     Wed May 30 11:55:38 2007 +0100
@@ -9,6 +9,13 @@
 #define COMPAT
 typedef int ret_t;
 #undef do_multicall_call
+
+static inline void xlat_multicall_entry(struct mc_state *mcs)
+{
+    int i;
+    for (i=0; i<6; i++)
+        mcs->compat_call.args[i] = mcs->call.args[i];
+}
 
 DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
 #define multicall_entry      compat_multicall_entry
diff -r c4f62fe631e4 -r 63211a8027fa xen/common/multicall.c
--- a/xen/common/multicall.c    Wed May 30 10:47:05 2007 +0100
+++ b/xen/common/multicall.c    Wed May 30 11:55:38 2007 +0100
@@ -17,6 +17,7 @@
 #ifndef COMPAT
 DEFINE_PER_CPU(struct mc_state, mc_state);
 typedef long ret_t;
+#define xlat_multicall_entry(mcs)
 #endif
 
 ret_t
@@ -62,6 +63,9 @@ do_multicall(
 
         if ( test_bit(_MCSF_call_preempted, &mcs->flags) )
         {
+            /* Translate sub-call continuation to guest layout */
+            xlat_multicall_entry(mcs);
+
             /* Copy the sub-call continuation. */
             (void)__copy_to_guest(call_list, &mcs->call, 1);
             goto preempted;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Fix preemption of multicalls in compat mode., Xen patchbot-unstable <=