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-devel

[Xen-devel] [PATCH] Fix to xenoprof in compat mode

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] Fix to xenoprof in compat mode
From: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
Date: Thu, 21 Feb 2008 11:19:50 +0000
Delivery-date: Fri, 22 Feb 2008 07:29:26 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.12 (X11/20071019)
The attached patch fixes xenoprof in compat mode (32-bit guest on a 64-bit hypervisor). Although xen/common/xenoprof.c uses the compat structure sizes, xen/arch/x86/oprofile/xenoprof.c does not. The structures look the same, but the compat mode structure is packed, whereas the non-compat version has 64-bit values 64-bit aligned. The result was that the performance counters are not properly set, and no trace events are generated.

The attached patch adds a function called compat_oprof_arch_counter() in xen/arch/x86/oprofile/xenoprof.c, which uses the correctly-sized structure. In xen/common/compat/xenoprof.c, it adds a #define such that the compat version of do_xenoprof_op() will call the proper version.

-George
diff -r 26d236e3a6ea xen/arch/x86/oprofile/xenoprof.c
--- a/xen/arch/x86/oprofile/xenoprof.c  Tue Feb 19 14:16:09 2008 +0000
+++ b/xen/arch/x86/oprofile/xenoprof.c  Thu Feb 21 11:12:04 2008 +0000
@@ -11,6 +11,9 @@
 #include <xen/guest_access.h>
 #include <xen/sched.h>
 #include <public/xenoprof.h>
+#ifdef CONFIG_COMPAT
+#include <compat/xenoprof.h>
+#endif
 #include <asm/hvm/support.h>
 
 #include "op_counter.h"
@@ -35,6 +38,28 @@ int xenoprof_arch_counter(XEN_GUEST_HAND
     return 0;
 }
 
+#ifdef CONFIG_COMPAT
+int compat_oprof_arch_counter(XEN_GUEST_HANDLE(void) arg)
+{
+    struct compat_oprof_counter counter;
+
+    if ( copy_from_guest(&counter, arg, 1) )
+        return -EFAULT;
+
+    if ( counter.ind > OP_MAX_COUNTER )
+        return -E2BIG;
+
+    counter_config[counter.ind].count     = counter.count;
+    counter_config[counter.ind].enabled   = counter.enabled;
+    counter_config[counter.ind].event     = counter.event;
+    counter_config[counter.ind].kernel    = counter.kernel;
+    counter_config[counter.ind].user      = counter.user;
+    counter_config[counter.ind].unit_mask = counter.unit_mask;
+
+    return 0;
+}
+#endif
+
 int xenoprofile_get_mode(struct vcpu *v, struct cpu_user_regs * const regs)
 {
     if ( !guest_mode(regs) )
diff -r 26d236e3a6ea xen/common/compat/xenoprof.c
--- a/xen/common/compat/xenoprof.c      Tue Feb 19 14:16:09 2008 +0000
+++ b/xen/common/compat/xenoprof.c      Tue Feb 19 14:44:38 2008 +0000
@@ -14,6 +14,7 @@ CHECK_oprof_init;
 
 #define xenoprof_get_buffer compat_oprof_get_buffer
 #define xenoprof_op_get_buffer compat_oprof_op_get_buffer
+#define xenoprof_arch_counter compat_oprof_arch_counter
 
 #define xen_domid_t domid_t
 #define compat_domid_t domid_compat_t
diff -r 26d236e3a6ea xen/include/asm-x86/xenoprof.h
--- a/xen/include/asm-x86/xenoprof.h    Tue Feb 19 14:16:09 2008 +0000
+++ b/xen/include/asm-x86/xenoprof.h    Tue Feb 19 14:47:34 2008 +0000
@@ -41,6 +41,7 @@ int xenoprof_arch_init(int *num_events, 
 #define xenoprof_arch_release_counters()        nmi_release_counters()
 
 int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg);
+int compat_oprof_arch_counter(XEN_GUEST_HANDLE(void) arg);
 
 struct vcpu;
 struct cpu_user_regs;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Fix to xenoprof in compat mode, George Dunlap <=