From mboxrd@z Thu Jan 1 00:00:00 1970 From: George Dunlap Subject: [PATCH] Fix to xenoprof in compat mode Date: Thu, 21 Feb 2008 11:19:50 +0000 Message-ID: <47BD5E56.7050003@eu.citrix.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050003000004020004020108" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------050003000004020004020108 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------050003000004020004020108 Content-Type: text/x-patch; name="xenoprof-compat-fix.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xenoprof-compat-fix.patch" 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 #include #include +#ifdef CONFIG_COMPAT +#include +#endif #include #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; --------------050003000004020004020108 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------050003000004020004020108--