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] x86: Fix event-channel access for 32-bit

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: Fix event-channel access for 32-bit HVM guests.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 03 Mar 2009 11:10:45 -0800
Delivery-date: Tue, 03 Mar 2009 11:13:02 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/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 Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1236086225 0
# Node ID 71af89e70fee39954496130e92807c42d1405489
# Parent  7d55cc23493ba56bb679765075620c222f0ab1f9
x86: Fix event-channel access for 32-bit HVM guests.

Based on a patch by Joe Jin <joe.jin@xxxxxxxxxx>

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/domain.c        |    2 +-
 xen/arch/x86/domctl.c        |    3 ++-
 xen/arch/x86/irq.c           |    3 ++-
 xen/arch/x86/traps.c         |    3 ++-
 xen/common/domctl.c          |   12 ++++++++----
 xen/common/event_channel.c   |    4 ++--
 xen/common/keyhandler.c      |    2 +-
 xen/common/trace.c           |    2 --
 xen/common/xenoprof.c        |    2 +-
 xen/include/asm-x86/domain.h |    1 -
 xen/include/xen/compat.h     |    5 -----
 xen/include/xen/sched.h      |   11 +++--------
 12 files changed, 22 insertions(+), 28 deletions(-)

diff -r 7d55cc23493b -r 71af89e70fee xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/arch/x86/domain.c     Tue Mar 03 13:17:05 2009 +0000
@@ -840,7 +840,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
      * lost.  The domain will get a spurious event, but it can cope.
      */
     vcpu_info(v, evtchn_upcall_pending) = 1;
-    for ( i = 0; i < BITS_PER_GUEST_LONG(d); i++ )
+    for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
         set_bit(i, &vcpu_info(v, evtchn_pending_sel));
 
     return 0;
diff -r 7d55cc23493b -r 71af89e70fee xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c     Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/arch/x86/domctl.c     Tue Mar 03 13:17:05 2009 +0000
@@ -494,7 +494,8 @@ long arch_do_domctl(
             break;
         }
 
-        domctl->u.address_size.size = BITS_PER_GUEST_LONG(d);
+        domctl->u.address_size.size =
+            is_pv_32on64_domain(d) ? 32 : BITS_PER_LONG;
 
         ret = 0;
         rcu_unlock_domain(d);
diff -r 7d55cc23493b -r 71af89e70fee xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c        Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/arch/x86/irq.c        Tue Mar 03 13:17:05 2009 +0000
@@ -1104,7 +1104,8 @@ static void dump_irqs(unsigned char key)
                        (test_bit(d->pirq_to_evtchn[irq],
                                  &shared_info(d, evtchn_pending)) ?
                         'P' : '-'),
-                       (test_bit(d->pirq_to_evtchn[irq]/BITS_PER_GUEST_LONG(d),
+                       (test_bit(d->pirq_to_evtchn[irq] /
+                                 BITS_PER_EVTCHN_WORD(d),
                                  &vcpu_info(d->vcpu[0], evtchn_pending_sel)) ?
                         'S' : '-'),
                        (test_bit(d->pirq_to_evtchn[irq],
diff -r 7d55cc23493b -r 71af89e70fee xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/arch/x86/traps.c      Tue Mar 03 13:17:05 2009 +0000
@@ -3095,7 +3095,8 @@ long register_guest_nmi_callback(unsigne
 
     t->vector  = TRAP_nmi;
     t->flags   = 0;
-    t->cs      = !IS_COMPAT(d) ? FLAT_KERNEL_CS : FLAT_COMPAT_KERNEL_CS;
+    t->cs      = (is_pv_32on64_domain(d) ?
+                  FLAT_COMPAT_KERNEL_CS : FLAT_KERNEL_CS);
     t->address = address;
     TI_SET_IF(t, 1);
 
diff -r 7d55cc23493b -r 71af89e70fee xen/common/domctl.c
--- a/xen/common/domctl.c       Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/common/domctl.c       Tue Mar 03 13:17:05 2009 +0000
@@ -242,13 +242,15 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
         if ( (c.nat = xmalloc(struct vcpu_guest_context)) == NULL )
             goto svc_out;
 
-        if ( !IS_COMPAT(v->domain) )
+#ifdef CONFIG_COMPAT
+        if ( !is_pv_32on64_vcpu(v) )
             ret = copy_from_guest(c.nat, op->u.vcpucontext.ctxt, 1);
-#ifdef CONFIG_COMPAT
         else
             ret = copy_from_guest(c.cmp,
                                   guest_handle_cast(op->u.vcpucontext.ctxt,
                                                     void), 1);
+#else
+        ret = copy_from_guest(c.nat, op->u.vcpucontext.ctxt, 1);
 #endif
         ret = ret ? -EFAULT : 0;
 
@@ -596,12 +598,14 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
         if ( v != current )
             vcpu_unpause(v);
 
-        if ( !IS_COMPAT(v->domain) )
+#ifdef CONFIG_COMPAT
+        if ( !is_pv_32on64_vcpu(v) )
             ret = copy_to_guest(op->u.vcpucontext.ctxt, c.nat, 1);
-#ifdef CONFIG_COMPAT
         else
             ret = copy_to_guest(guest_handle_cast(op->u.vcpucontext.ctxt,
                                                   void), c.cmp, 1);
+#else
+        ret = copy_to_guest(op->u.vcpucontext.ctxt, c.nat, 1);
 #endif
 
         if ( copy_to_guest(u_domctl, op, 1) || ret )
diff -r 7d55cc23493b -r 71af89e70fee xen/common/event_channel.c
--- a/xen/common/event_channel.c        Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/common/event_channel.c        Tue Mar 03 13:17:05 2009 +0000
@@ -548,7 +548,7 @@ static int evtchn_set_pending(struct vcp
         return 1;
 
     if ( !test_bit        (port, &shared_info(d, evtchn_mask)) &&
-         !test_and_set_bit(port / BITS_PER_GUEST_LONG(d),
+         !test_and_set_bit(port / BITS_PER_EVTCHN_WORD(d),
                            &vcpu_info(v, evtchn_pending_sel)) )
     {
         vcpu_mark_events_pending(v);
@@ -783,7 +783,7 @@ int evtchn_unmask(unsigned int port)
      */
     if ( test_and_clear_bit(port, &shared_info(d, evtchn_mask)) &&
          test_bit          (port, &shared_info(d, evtchn_pending)) &&
-         !test_and_set_bit (port / BITS_PER_GUEST_LONG(d),
+         !test_and_set_bit (port / BITS_PER_EVTCHN_WORD(d),
                             &vcpu_info(v, evtchn_pending_sel)) )
     {
         vcpu_mark_events_pending(v);
diff -r 7d55cc23493b -r 71af89e70fee xen/common/keyhandler.c
--- a/xen/common/keyhandler.c   Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/common/keyhandler.c   Tue Mar 03 13:17:05 2009 +0000
@@ -225,7 +225,7 @@ static void dump_domains(unsigned char k
                    test_bit(v->virq_to_evtchn[VIRQ_DEBUG], 
                             &shared_info(d, evtchn_mask)),
                    test_bit(v->virq_to_evtchn[VIRQ_DEBUG] /
-                            BITS_PER_GUEST_LONG(d),
+                            BITS_PER_EVTCHN_WORD(d),
                             &vcpu_info(v, evtchn_pending_sel)));
             send_guest_vcpu_virq(v, VIRQ_DEBUG);
         }
diff -r 7d55cc23493b -r 71af89e70fee xen/common/trace.c
--- a/xen/common/trace.c        Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/common/trace.c        Tue Mar 03 13:17:05 2009 +0000
@@ -37,10 +37,8 @@
 #define xen_t_buf t_buf
 CHECK_t_buf;
 #undef xen_t_buf
-#define TB_COMPAT IS_COMPAT(dom0)
 #else
 #define compat_t_rec t_rec
-#define TB_COMPAT 0
 #endif
 
 /* opt_tbuf_size: trace buffer size (in pages) */
diff -r 7d55cc23493b -r 71af89e70fee xen/common/xenoprof.c
--- a/xen/common/xenoprof.c     Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/common/xenoprof.c     Tue Mar 03 13:17:05 2009 +0000
@@ -208,7 +208,7 @@ static int alloc_xenoprof_struct(
     bufsize = sizeof(struct xenoprof_buf);
     i = sizeof(struct event_log);
 #ifdef CONFIG_COMPAT
-    d->xenoprof->is_compat = IS_COMPAT(is_passive ? dom0 : d);
+    d->xenoprof->is_compat = is_pv_32on64_domain(is_passive ? dom0 : d);
     if ( XENOPROF_COMPAT(d->xenoprof) )
     {
         bufsize = sizeof(struct compat_oprof_buf);
diff -r 7d55cc23493b -r 71af89e70fee xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/include/asm-x86/domain.h      Tue Mar 03 13:17:05 2009 +0000
@@ -16,7 +16,6 @@
 #define is_pv_32on64_domain(d) (0)
 #endif
 #define is_pv_32on64_vcpu(v)   (is_pv_32on64_domain((v)->domain))
-#define IS_COMPAT(d)           (is_pv_32on64_domain(d))
 
 struct trap_bounce {
     uint32_t      error_code;
diff -r 7d55cc23493b -r 71af89e70fee xen/include/xen/compat.h
--- a/xen/include/xen/compat.h  Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/include/xen/compat.h  Tue Mar 03 13:17:05 2009 +0000
@@ -178,15 +178,10 @@ int switch_compat(struct domain *);
 int switch_compat(struct domain *);
 int switch_native(struct domain *);
 
-#define BITS_PER_GUEST_LONG(d) \
-    (!IS_COMPAT(d) ? BITS_PER_LONG : COMPAT_BITS_PER_LONG)
-
 #else
 
 #define compat_handle_is_null(hnd) 0
 
-#define BITS_PER_GUEST_LONG(d) BITS_PER_LONG
-
 #endif
 
 #endif /* __XEN_COMPAT_H__ */
diff -r 7d55cc23493b -r 71af89e70fee xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Tue Mar 03 12:48:16 2009 +0000
+++ b/xen/include/xen/sched.h   Tue Mar 03 13:17:05 2009 +0000
@@ -30,12 +30,11 @@ extern struct domain *dom0;
 extern struct domain *dom0;
 
 #ifndef CONFIG_COMPAT
-#define MAX_EVTCHNS(d)     NR_EVENT_CHANNELS
+#define BITS_PER_EVTCHN_WORD(d) BITS_PER_LONG
 #else
-#define MAX_EVTCHNS(d)     (!IS_COMPAT(d) ? \
-                            NR_EVENT_CHANNELS : \
-                            sizeof(unsigned int) * sizeof(unsigned int) * 64)
+#define BITS_PER_EVTCHN_WORD(d) (has_32bit_shinfo(d) ? 32 : BITS_PER_LONG)
 #endif
+#define MAX_EVTCHNS(d) (BITS_PER_EVTCHN_WORD(d) * BITS_PER_EVTCHN_WORD(d) * 64)
 #define EVTCHNS_PER_BUCKET 128
 #define NR_EVTCHN_BUCKETS  (NR_EVENT_CHANNELS / EVTCHNS_PER_BUCKET)
 
@@ -542,10 +541,6 @@ uint64_t get_cpu_idle_time(unsigned int 
 #define IS_PRIV(_d) ((_d)->is_privileged)
 #define IS_PRIV_FOR(_d, _t) (IS_PRIV(_d) || ((_d)->target && (_d)->target == 
(_t)))
 
-#ifndef IS_COMPAT
-#define IS_COMPAT(d) 0
-#endif
-
 #define VM_ASSIST(_d,_t) (test_bit((_t), &(_d)->vm_assist))
 
 #define is_hvm_domain(d) ((d)->is_hvm)

_______________________________________________
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] x86: Fix event-channel access for 32-bit HVM guests., Xen patchbot-unstable <=