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] [IA64] xenoprof linux/ia64 part

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] xenoprof linux/ia64 part
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 09 Dec 2006 15:43:33 +0000
Delivery-date: Sat, 09 Dec 2006 07:44:24 -0800
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 awilliam@xxxxxxxxxxx
# Node ID fe565ac4bf254cec49d74a009c73da065d09d6d6
# Parent  8ab9b43ad5574e19a1b754597a16832f80e6eba4
[IA64] xenoprof linux/ia64 part

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
 linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c            |   90 ++++++++
 linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile           |    4 
 linux-2.6-xen-sparse/arch/ia64/oprofile/init.c             |   14 +
 linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h |   30 ++
 linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c          |   35 ++-
 linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c         |  142 +++++++++++++
 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c            |   52 ++++
 linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c            |   66 ++++++
 linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c             |   99 +++++++++
 linux-2.6-xen-sparse/include/asm-ia64/hypercall.h          |   21 +
 linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h     |   18 +
 linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h           |   48 ++++
 12 files changed, 611 insertions(+), 8 deletions(-)

diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c
--- a/linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c   Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/kernel/perfmon.c   Tue Nov 28 22:54:24 
2006 -0700
@@ -53,6 +53,28 @@
 #include <asm/delay.h>
 
 #ifdef CONFIG_PERFMON
+#ifdef CONFIG_XEN
+//#include <xen/xenoprof.h>
+#include <xen/interface/xenoprof.h>
+
+static int xenoprof_is_primary = 0;
+#define init_xenoprof_primary(is_primary)  (xenoprof_is_primary = (is_primary))
+#define is_xenoprof_primary()  (xenoprof_is_primary)
+#define XEN_NOT_SUPPORTED_YET                                          \
+       do {                                                            \
+               if (is_running_on_xen()) {                              \
+                       printk("%s is not supported yet under xen.\n",  \
+                              __func__);                               \
+                       return -ENOSYS;                                 \
+               }                                                       \
+       } while (0)
+#else
+#define init_xenoprof_primary(is_primary)      do { } while (0)
+#define is_xenoprof_primary()                  (0)
+#define XEN_NOT_SUPPORTED_YET                  do { } while (0)
+#define HYPERVISOR_perfmon_op(cmd, arg, count) do { } while (0)
+#endif
+
 /*
  * perfmon context state
  */
@@ -1515,6 +1537,7 @@ pfm_read(struct file *filp, char __user 
        ssize_t ret;
        unsigned long flags;
        DECLARE_WAITQUEUE(wait, current);
+       XEN_NOT_SUPPORTED_YET;
        if (PFM_IS_FILE(filp) == 0) {
                printk(KERN_ERR "perfmon: pfm_poll: bad magic [%d]\n", 
current->pid);
                return -EINVAL;
@@ -2113,6 +2136,15 @@ doit:
         */
        if (free_possible) pfm_context_free(ctx);
 
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary()) {
+                       int ret = HYPERVISOR_perfmon_op(PFM_DESTROY_CONTEXT,
+                                                       NULL, 0);
+                       if (ret)
+                               printk("%s:%d PFM_DESTROY_CONTEXT hypercall "
+                                      "failed\n", __func__, __LINE__);
+               }
+       }
        return 0;
 }
 
@@ -2736,6 +2768,23 @@ pfm_context_create(pfm_context_t *ctx, v
         */
        pfm_reset_pmu_state(ctx);
 
+       if (is_running_on_xen()) {
+               /*
+                * kludge to get xenoprof.is_primary.
+                * XENOPROF_init/ia64 is nop. so it is safe to call it here.
+                */
+               struct xenoprof_init init;
+               ret = HYPERVISOR_xenoprof_op(XENOPROF_init, &init);
+               if (ret)
+                       goto buffer_error;
+               init_xenoprof_primary(init.is_primary);
+
+               if (is_xenoprof_primary()) {
+                       ret = HYPERVISOR_perfmon_op(PFM_CREATE_CONTEXT, arg, 0);
+                       if (ret)
+                               goto buffer_error;
+               }
+       }
        return 0;
 
 buffer_error:
@@ -2872,6 +2921,12 @@ pfm_write_pmcs(pfm_context_t *ctx, void 
        pfm_reg_check_t wr_func;
 #define PFM_CHECK_PMC_PM(x, y, z) ((x)->ctx_fl_system ^ PMC_PM(y, z))
 
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_WRITE_PMCS,
+                                                    arg, count);
+               return 0;
+       }
        state     = ctx->ctx_state;
        is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
        is_system = ctx->ctx_fl_system;
@@ -3112,6 +3167,12 @@ pfm_write_pmds(pfm_context_t *ctx, void 
        int ret = -EINVAL;
        pfm_reg_check_t wr_func;
 
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_WRITE_PMDS,
+                                                    arg, count);
+               return 0;
+       }
 
        state     = ctx->ctx_state;
        is_loaded = state == PFM_CTX_LOADED ? 1 : 0;
@@ -3309,6 +3370,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *
        int is_loaded, is_system, is_counting, expert_mode;
        int ret = -EINVAL;
        pfm_reg_check_t rd_func;
+       XEN_NOT_SUPPORTED_YET;
 
        /*
         * access is possible when loaded only for
@@ -3560,6 +3622,7 @@ pfm_restart(pfm_context_t *ctx, void *ar
        pfm_ovfl_ctrl_t rst_ctrl;
        int state, is_system;
        int ret = 0;
+       XEN_NOT_SUPPORTED_YET;
 
        state     = ctx->ctx_state;
        fmt       = ctx->ctx_buf_fmt;
@@ -3709,6 +3772,7 @@ pfm_debug(pfm_context_t *ctx, void *arg,
 pfm_debug(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
 {
        unsigned int m = *(unsigned int *)arg;
+       XEN_NOT_SUPPORTED_YET;
 
        pfm_sysctl.debug = m == 0 ? 0 : 1;
 
@@ -3979,6 +4043,8 @@ pfm_get_features(pfm_context_t *ctx, voi
 {
        pfarg_features_t *req = (pfarg_features_t *)arg;
 
+       if (is_running_on_xen())
+               return HYPERVISOR_perfmon_op(PFM_GET_FEATURES, &arg, 0);
        req->ft_version = PFM_VERSION;
        return 0;
 }
@@ -3989,6 +4055,12 @@ pfm_stop(pfm_context_t *ctx, void *arg, 
        struct pt_regs *tregs;
        struct task_struct *task = PFM_CTX_TASK(ctx);
        int state, is_system;
+
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_STOP, NULL, 0);
+               return 0;
+       }
 
        state     = ctx->ctx_state;
        is_system = ctx->ctx_fl_system;
@@ -4078,6 +4150,12 @@ pfm_start(pfm_context_t *ctx, void *arg,
        struct pt_regs *tregs;
        int state, is_system;
 
+       if (is_running_on_xen()) {
+               XENPERFMON_PRINTD("PFM_START\n");
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_START, NULL, 0);
+               return 0;
+       }
        state     = ctx->ctx_state;
        is_system = ctx->ctx_fl_system;
 
@@ -4160,6 +4238,7 @@ pfm_get_pmc_reset(pfm_context_t *ctx, vo
        unsigned int cnum;
        int i;
        int ret = -EINVAL;
+       XEN_NOT_SUPPORTED_YET;
 
        for (i = 0; i < count; i++, req++) {
 
@@ -4218,6 +4297,11 @@ pfm_context_load(pfm_context_t *ctx, voi
        int ret = 0;
        int state, is_system, set_dbregs = 0;
 
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_LOAD_CONTEXT, arg, 0);
+               return 0;
+       }
        state     = ctx->ctx_state;
        is_system = ctx->ctx_fl_system;
        /*
@@ -4466,6 +4550,12 @@ pfm_context_unload(pfm_context_t *ctx, v
        int prev_state, is_system;
        int ret;
 
+       if (is_running_on_xen()) {
+               if (is_xenoprof_primary())
+                       return HYPERVISOR_perfmon_op(PFM_UNLOAD_CONTEXT,
+                                                    NULL, 0);
+               return 0;
+       }
        DPRINT(("ctx_state=%d task [%d]\n", ctx->ctx_state, task ? task->pid : 
-1));
 
        prev_state = ctx->ctx_state;
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile
--- a/linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile  Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/oprofile/Makefile  Tue Nov 28 22:54:24 
2006 -0700
@@ -8,3 +8,7 @@ DRIVER_OBJS := $(addprefix ../../../driv
 
 oprofile-y := $(DRIVER_OBJS) init.o backtrace.o
 oprofile-$(CONFIG_PERFMON) += perfmon.o
+ifeq ($(CONFIG_XEN), y)
+oprofile-$(CONFIG_PERFMON) += xenoprof.o \
+       ../../../drivers/xen/xenoprof/xenoprofile.o
+endif
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/oprofile/init.c
--- a/linux-2.6-xen-sparse/arch/ia64/oprofile/init.c    Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/oprofile/init.c    Tue Nov 28 22:54:24 
2006 -0700
@@ -11,6 +11,7 @@
 #include <linux/oprofile.h>
 #include <linux/init.h>
 #include <linux/errno.h>
+#include "oprofile_perfmon.h"
  
 extern int perfmon_init(struct oprofile_operations * ops);
 extern void perfmon_exit(void);
@@ -19,6 +20,13 @@ int __init oprofile_arch_init(struct opr
 int __init oprofile_arch_init(struct oprofile_operations * ops)
 {
        int ret = -ENODEV;
+
+       if (is_running_on_xen()) {
+               ret = xen_perfmon_init();
+               if (ret)
+                       return ret;
+               return xenoprofile_init(ops);
+       }
 
 #ifdef CONFIG_PERFMON
        /* perfmon_init() can fail, but we have no way to report it */
@@ -32,6 +40,12 @@ int __init oprofile_arch_init(struct opr
 
 void oprofile_arch_exit(void)
 {
+       if (is_running_on_xen()) {
+               xenoprofile_exit();
+               xen_perfmon_exit();
+               return;
+       }
+
 #ifdef CONFIG_PERFMON
        perfmon_exit();
 #endif
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c
--- a/linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/oprofile/perfmon.c Tue Nov 28 22:54:24 
2006 -0700
@@ -14,6 +14,7 @@
 #include <asm/perfmon.h>
 #include <asm/ptrace.h>
 #include <asm/errno.h>
+#include "oprofile_perfmon.h"
 
 static int allow_ints;
 
@@ -34,14 +35,16 @@ perfmon_handler(struct task_struct *task
 }
 
 
-static int perfmon_start(void)
+STATIC_IF_NO_XEN
+int perfmon_start(void)
 {
        allow_ints = 1;
        return 0;
 }
 
 
-static void perfmon_stop(void)
+STATIC_IF_NO_XEN
+void perfmon_stop(void)
 {
        allow_ints = 0;
 }
@@ -76,16 +79,35 @@ static char * get_cpu_type(void)
 
 static int using_perfmon;
 
+STATIC_IF_NO_XEN
+int __perfmon_init(void)
+{
+       int ret = pfm_register_buffer_fmt(&oprofile_fmt);
+       if (ret)
+               return -ENODEV;
+
+       using_perfmon = 1;
+       return 0;
+}
+
+STATIC_IF_NO_XEN
+void __perfmon_exit(void)
+{
+       if (!using_perfmon)
+               return;
+
+       pfm_unregister_buffer_fmt(oprofile_fmt.fmt_uuid);
+}
+
 int perfmon_init(struct oprofile_operations * ops)
 {
-       int ret = pfm_register_buffer_fmt(&oprofile_fmt);
+       int ret = __perfmon_init();
        if (ret)
                return -ENODEV;
 
        ops->cpu_type = get_cpu_type();
        ops->start = perfmon_start;
        ops->stop = perfmon_stop;
-       using_perfmon = 1;
        printk(KERN_INFO "oprofile: using perfmon.\n");
        return 0;
 }
@@ -93,8 +115,5 @@ int perfmon_init(struct oprofile_operati
 
 void perfmon_exit(void)
 {
-       if (!using_perfmon)
-               return;
-
-       pfm_unregister_buffer_fmt(oprofile_fmt.fmt_uuid);
+       __perfmon_exit();
 }
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c   Tue Nov 28 22:54:24 
2006 -0700
@@ -1050,3 +1050,55 @@ EXPORT_SYMBOL_GPL(p2m_pte);
 EXPORT_SYMBOL_GPL(p2m_pte);
 EXPORT_SYMBOL_GPL(p2m_phystomach);
 #endif
+
+///////////////////////////////////////////////////////////////////////////
+// for xenoprof
+
+struct resource*
+xen_ia64_allocate_resource(unsigned long size)
+{
+       struct resource* res;
+       int error;
+       
+       res = kmalloc(sizeof(*res), GFP_KERNEL);
+       if (res == NULL)
+               return ERR_PTR(-ENOMEM);
+
+       res->name = "Xen";
+       res->flags = IORESOURCE_MEM;
+       error = allocate_resource(&iomem_resource, res, PAGE_ALIGN(size),
+                                 privcmd_resource_min, privcmd_resource_max,
+                                 IA64_GRANULE_SIZE, NULL, NULL);
+       if (error) {
+               kfree(res);
+               return ERR_PTR(error);
+       }
+       return res;
+}
+EXPORT_SYMBOL_GPL(xen_ia64_allocate_resource);
+
+void
+xen_ia64_release_resource(struct resource* res)
+{
+       release_resource(res);
+       kfree(res);
+}
+EXPORT_SYMBOL_GPL(xen_ia64_release_resource);
+
+void
+xen_ia64_unmap_resource(struct resource* res)
+{
+       unsigned long gpfn = res->start >> PAGE_SHIFT;
+       unsigned long nr_pages = (res->end - res->start) >> PAGE_SHIFT;
+       unsigned long i;
+       
+       for (i = 0; i < nr_pages; i++) {
+               int error = HYPERVISOR_zap_physmap(gpfn + i, 0);
+               if (error)
+                       printk(KERN_ERR
+                              "%s:%d zap_phsymap failed %d gpfn %lx\n",
+                              __func__, __LINE__, error, gpfn + i);
+       }
+       xen_ia64_release_resource(res);
+}
+EXPORT_SYMBOL_GPL(xen_ia64_unmap_resource);
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c   Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c   Tue Nov 28 22:54:24 
2006 -0700
@@ -32,10 +32,12 @@
 #include <xen/interface/callback.h>
 #include <xen/interface/acm_ops.h>
 #include <xen/interface/hvm/params.h>
+#include <xen/interface/xenoprof.h>
 #include <asm/hypercall.h>
 #include <asm/page.h>
 #include <asm/uaccess.h>
 #include <asm/xen/xencomm.h>
+#include <asm/perfmon.h>
 
 /* Xencomm notes:
  * This file defines hypercalls to be used by xencomm.  The hypercalls simply
@@ -301,3 +303,67 @@ xencomm_hypercall_suspend(unsigned long 
 
        return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg));
 }
+
+#if defined(CONFIG_OPROFILE) || defined(CONFIG_OPROFILE_MODULE)
+int
+xencomm_hypercall_xenoprof_op(int op, void *arg)
+{
+       switch (op) {
+       case XENOPROF_init:
+       case XENOPROF_set_active:
+       case XENOPROF_set_passive:
+       case XENOPROF_counter:
+       case XENOPROF_get_buffer:
+               break;
+
+       case XENOPROF_reset_active_list:
+       case XENOPROF_reset_passive_list:
+       case XENOPROF_reserve_counters:
+       case XENOPROF_setup_events:
+       case XENOPROF_enable_virq:
+       case XENOPROF_start:
+       case XENOPROF_stop:
+       case XENOPROF_disable_virq:
+       case XENOPROF_release_counters:
+       case XENOPROF_shutdown:
+               return xencomm_arch_hypercall_xenoprof_op(op, arg);
+               break;
+
+       default:
+               printk("%s: op %d isn't supported\n", __func__, op);
+               return -ENOSYS;
+       }
+       return xencomm_arch_hypercall_xenoprof_op(op,
+                                                 xencomm_create_inline(arg));
+}
+#endif
+
+#ifdef CONFIG_PERFMON
+int
+xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg, unsigned long count)
+{
+       switch (cmd) {
+       case PFM_GET_FEATURES:
+       case PFM_CREATE_CONTEXT:
+       case PFM_WRITE_PMCS:
+       case PFM_WRITE_PMDS:
+       case PFM_LOAD_CONTEXT:
+               break;
+
+       case PFM_DESTROY_CONTEXT:
+       case PFM_UNLOAD_CONTEXT:
+       case PFM_START:
+       case PFM_STOP:
+               return xencomm_arch_hypercall_perfmon_op(cmd, arg, count);
+
+       default:
+               printk("%s:%d cmd %ld isn't supported\n",
+                      __func__,__LINE__, cmd);
+               BUG();
+       }
+
+       return xencomm_arch_hypercall_perfmon_op(cmd,
+                                                xencomm_create_inline(arg),
+                                                count);
+}
+#endif
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c
--- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c    Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_mini.c    Tue Nov 28 22:54:24 
2006 -0700
@@ -28,12 +28,14 @@
 #include <xen/interface/physdev.h>
 #include <xen/interface/grant_table.h>
 #include <xen/interface/hvm/params.h>
+#include <xen/interface/xenoprof.h>
 #ifdef CONFIG_VMX_GUEST
 #include <asm/hypervisor.h>
 #else
 #include <asm/hypercall.h>
 #endif
 #include <asm/xen/xencomm.h>
+#include <asm/perfmon.h>
 
 int
 xencomm_mini_hypercall_event_channel_op(int cmd, void *op)
@@ -320,3 +322,100 @@ xencomm_mini_hypercall_xen_version(int c
        return xencomm_arch_hypercall_xen_version(cmd, desc);
 }
 EXPORT_SYMBOL(xencomm_mini_hypercall_xen_version);
+
+#if defined(CONFIG_OPROFILE) || defined(CONFIG_OPROFILE_MODULE)
+int
+xencomm_mini_hypercall_xenoprof_op(int op, void *arg)
+{
+       unsigned int argsize;
+       struct xencomm_mini xc_area[2];
+       int nbr_area = 2;
+       struct xencomm_handle *desc;
+       int rc;
+
+       switch (op) {
+       case XENOPROF_init:
+               argsize = sizeof(xenoprof_init_t);
+               break;
+       case XENOPROF_set_active:
+               argsize = sizeof(domid_t);
+               break;
+       case XENOPROF_set_passive:
+               argsize = sizeof(xenoprof_passive_t);
+               break;
+       case XENOPROF_counter:
+               argsize = sizeof(xenoprof_counter_t);
+               break;
+       case XENOPROF_get_buffer:
+               argsize = sizeof(xenoprof_get_buffer_t);
+               break;
+
+       case XENOPROF_reset_active_list:
+       case XENOPROF_reset_passive_list:
+       case XENOPROF_reserve_counters:
+       case XENOPROF_setup_events:
+       case XENOPROF_enable_virq:
+       case XENOPROF_start:
+       case XENOPROF_stop:
+       case XENOPROF_disable_virq:
+       case XENOPROF_release_counters:
+       case XENOPROF_shutdown:
+               return xencomm_arch_hypercall_xenoprof_op(op, arg);
+
+       default:
+               printk("%s: op %d isn't supported\n", __func__, op);
+               return -ENOSYS;
+       }
+       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
+       if (rc)
+               return rc;
+       return xencomm_arch_hypercall_xenoprof_op(op, desc);
+}
+EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_xenoprof_op);
+#endif
+
+#ifdef CONFIG_PERFMON
+int
+xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
+                                  unsigned long count)
+{
+       unsigned int argsize;
+       struct xencomm_mini xc_area[2];
+       int nbr_area = 2;
+       struct xencomm_handle *desc;
+       int rc;
+
+       switch (cmd) {
+       case PFM_GET_FEATURES:
+               argsize = sizeof(pfarg_features_t);
+               break;
+       case PFM_CREATE_CONTEXT:
+               argsize = sizeof(pfarg_context_t);
+               break;
+       case PFM_LOAD_CONTEXT:
+               argsize = sizeof(pfarg_load_t);
+               break;
+       case PFM_WRITE_PMCS:
+       case PFM_WRITE_PMDS:
+               argsize = sizeof(pfarg_reg_t) * count;
+               break;
+
+       case PFM_DESTROY_CONTEXT:
+       case PFM_UNLOAD_CONTEXT:
+       case PFM_START:
+       case PFM_STOP:
+               return xencomm_arch_hypercall_perfmon_op(cmd, arg, count);
+
+       default:
+               printk("%s:%d cmd %ld isn't supported\n",
+                      __func__, __LINE__, cmd);
+               BUG();
+       }
+
+       rc = xencomm_create_mini(xc_area, &nbr_area, arg, argsize, &desc);
+       if (rc)
+               return rc;
+       return xencomm_arch_hypercall_perfmon_op(cmd, desc, count);
+}
+EXPORT_SYMBOL_GPL(xencomm_mini_hypercall_perfmon_op);
+#endif
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/include/asm-ia64/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Tue Nov 28 21:35:13 
2006 -0700
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Tue Nov 28 22:54:24 
2006 -0700
@@ -271,6 +271,12 @@ HYPERVISOR_physdev_op(int cmd, void *arg
        }
 }
 
+static inline int
+xencomm_arch_hypercall_xenoprof_op(int op, struct xencomm_handle *arg)
+{
+       return _hypercall2(int, xenoprof_op, op, arg);
+}
+
 extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
 static inline void exit_idle(void) {}
 #define do_IRQ(irq, regs) ({                   \
@@ -390,6 +396,17 @@ HYPERVISOR_expose_p2m(unsigned long conv
        return _hypercall5(unsigned long, ia64_dom0vp_op,
                           IA64_DOM0VP_expose_p2m, conv_start_gpfn,
                           assign_start_gpfn, expose_size, granule_pfn);
+}
+#endif
+
+#ifdef CONFIG_PERFMON
+static inline int
+xencomm_arch_hypercall_perfmon_op(unsigned long cmd,
+                                  struct xencomm_handle *arg,
+                                  unsigned long count)
+{
+       return _hypercall4(int, ia64_dom0vp_op,
+                          IA64_DOM0VP_perfmon, cmd, arg, count);
 }
 #endif
 
@@ -406,6 +423,8 @@ HYPERVISOR_expose_p2m(unsigned long conv
 #define HYPERVISOR_console_io xencomm_mini_hypercall_console_io
 #define HYPERVISOR_hvm_op xencomm_mini_hypercall_hvm_op
 #define HYPERVISOR_memory_op xencomm_mini_hypercall_memory_op
+#define HYPERVISOR_xenoprof_op xencomm_mini_hypercall_xenoprof_op
+#define HYPERVISOR_perfmon_op xencomm_mini_hypercall_perfmon_op
 #else
 #define HYPERVISOR_sched_op xencomm_hypercall_sched_op
 #define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
@@ -415,6 +434,8 @@ HYPERVISOR_expose_p2m(unsigned long conv
 #define HYPERVISOR_console_io xencomm_hypercall_console_io
 #define HYPERVISOR_hvm_op xencomm_hypercall_hvm_op
 #define HYPERVISOR_memory_op xencomm_hypercall_memory_op
+#define HYPERVISOR_xenoprof_op xencomm_hypercall_xenoprof_op
+#define HYPERVISOR_perfmon_op xencomm_hypercall_perfmon_op
 #endif
 
 #define HYPERVISOR_suspend xencomm_hypercall_suspend
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h    Tue Nov 28 
21:35:13 2006 -0700
+++ b/linux-2.6-xen-sparse/include/asm-ia64/xen/xcom_hcall.h    Tue Nov 28 
22:54:24 2006 -0700
@@ -46,6 +46,15 @@ extern unsigned long xencomm_hypercall_h
 
 extern int xencomm_hypercall_suspend(unsigned long srec);
 
+#if defined(CONFIG_OPROFILE) || defined(CONFIG_OPROFILE_MODULE)
+extern int xencomm_hypercall_xenoprof_op(int op, void *arg);
+#endif
+
+#ifdef CONFIG_PERFMON
+extern int xencomm_hypercall_perfmon_op(unsigned long cmd, void* arg,
+                                        unsigned long count);
+#endif
+
 /* Using mini xencomm.  */
 extern int xencomm_mini_hypercall_console_io(int cmd, int count, char *str);
 
@@ -68,6 +77,15 @@ extern int xencomm_mini_hypercall_memory
 
 extern unsigned long xencomm_mini_hypercall_hvm_op(int cmd, void *arg);
 
+#if defined(CONFIG_OPROFILE) || defined(CONFIG_OPROFILE_MODULE)
+extern int xencomm_mini_hypercall_xenoprof_op(int op, void *arg);
+#endif
+
+#ifdef CONFIG_PERFMON
+extern int xencomm_mini_hypercall_perfmon_op(unsigned long cmd, void* arg,
+                                             unsigned long count);
+#endif
+
 /* For privcmd.  Locally declare argument type to avoid include storm.
    Type coherency will be checked within privcmd.c  */
 struct privcmd_hypercall;
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/arch/ia64/oprofile/oprofile_perfmon.h        Tue Nov 
28 22:54:24 2006 -0700
@@ -0,0 +1,30 @@
+#ifndef OPROFILE_PERFMON_H
+#define OPROFILE_PERFMON_H
+
+#include <linux/config.h>
+
+#ifdef CONFIG_PERFMON
+int __perfmon_init(void);
+void __perfmon_exit(void);
+int perfmon_start(void);
+void perfmon_stop(void);
+#else
+#define __perfmon_init()       (-ENOSYS)
+#define __perfmon_exit()       do {} while (0)
+#endif /* CONFIG_PERFMON */
+
+#ifdef CONFIG_XEN
+#define STATIC_IF_NO_XEN       /* nothing */
+#define xen_perfmon_init()     __perfmon_init()
+#define xen_perfmon_exit()     __perfmon_exit()
+extern int xenoprofile_init(struct oprofile_operations * ops);
+extern void xenoprofile_exit(void);
+#else
+#define STATIC_IF_NO_XEN       static
+#define xen_perfmon_init()     (-ENOSYS)
+#define xen_perfmon_exit()     do {} while (0)
+#define xenoprofile_init()     (-ENOSYS)
+#define xenoprofile_exit()     do {} while (0)
+#endif /* CONFIG_XEN */
+
+#endif /* OPROFILE_PERFMON_H */
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/arch/ia64/oprofile/xenoprof.c        Tue Nov 28 
22:54:24 2006 -0700
@@ -0,0 +1,142 @@
+/******************************************************************************
+ * xenoprof ia64 specific part
+ *
+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
+ *                    VA Linux Systems Japan K.K.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+#include <linux/init.h>
+#include <linux/oprofile.h>
+#include <linux/ioport.h>
+
+#include <xen/driver_util.h>
+#include <xen/interface/xen.h>
+#include <xen/interface/xenoprof.h>
+#include <xen/xenoprof.h>
+
+#include "oprofile_perfmon.h"
+
+void __init xenoprof_arch_init_counter(struct xenoprof_init *init)
+{
+       init->num_events = 0; /* perfmon manages. */
+}
+
+void xenoprof_arch_counter(void)
+{
+       /* nothing. perfmon does. */
+}
+
+void xenoprof_arch_start(void) 
+{
+       perfmon_start();
+}
+
+void xenoprof_arch_stop(void)
+{
+       perfmon_stop();
+}
+
+/* XXX move them to an appropriate header file. */
+struct resource* xen_ia64_allocate_resource(unsigned long size); 
+void xen_ia64_release_resource(struct resource* res); 
+void xen_ia64_unmap_resource(struct resource* res); 
+
+struct resource*
+xenoprof_ia64_allocate_resource(int32_t max_samples)
+{
+       unsigned long bufsize;
+
+       /* XXX add hypercall to get bufsize? */
+       /*     this value is taken from alloc_xenoprof_struct(). */
+#if 0
+       bufsize = NR_CPUS * (sizeof(struct xenoprof_buf) +
+                            (max_samples - 1) * sizeof(struct event_log));
+       bufsize = PAGE_ALIGN(bufsize) + PAGE_SIZE;
+#else
+#define MAX_OPROF_SHARED_PAGES 32
+       bufsize = (MAX_OPROF_SHARED_PAGES + 1) * PAGE_SIZE;
+#endif
+       return xen_ia64_allocate_resource(bufsize);
+}
+
+void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf)
+{
+       if (sbuf->buffer) {
+               xen_ia64_unmap_resource(sbuf->arch.res);
+               sbuf->buffer = NULL;
+               sbuf->arch.res = NULL;
+       }
+}
+
+int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer,
+                                    struct xenoprof_shared_buffer* sbuf)
+{
+       int ret;
+       struct resource* res;
+
+       sbuf->buffer = NULL;
+       sbuf->arch.res = NULL;
+
+       res = xenoprof_ia64_allocate_resource(get_buffer->max_samples);
+       if (IS_ERR(res))
+               return PTR_ERR(res);
+
+       get_buffer->buf_gmaddr = res->start;
+
+       ret = HYPERVISOR_xenoprof_op(XENOPROF_get_buffer, get_buffer);
+       if (ret) {
+               xen_ia64_release_resource(res);
+               return ret;
+       }
+
+       BUG_ON((res->end - res->start + 1) <
+              get_buffer->bufsize * get_buffer->nbuf);
+
+       sbuf->buffer = __va(res->start);
+       sbuf->arch.res = res;
+
+       return ret;
+}
+
+int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain,
+                              struct xenoprof_shared_buffer* sbuf)
+{
+       int ret;
+       struct resource* res;
+
+       sbuf->buffer = NULL;
+       sbuf->arch.res = NULL;
+
+       res = xenoprof_ia64_allocate_resource(pdomain->max_samples);
+       if (IS_ERR(res))
+               return PTR_ERR(res);
+
+       pdomain->buf_gmaddr = res->start;
+
+       ret = HYPERVISOR_xenoprof_op(XENOPROF_set_passive, pdomain);
+       if (ret) {
+               xen_ia64_release_resource(res);
+               return ret;
+       }
+
+       BUG_ON((res->end - res->start + 1) < pdomain->bufsize * pdomain->nbuf);
+
+       sbuf->buffer = __va(res->start);
+       sbuf->arch.res = res;
+
+       return ret;
+}
diff -r 8ab9b43ad557 -r fe565ac4bf25 
linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/asm-ia64/xenoprof.h  Tue Nov 28 22:54:24 
2006 -0700
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * asm-ia64/xenoprof.h
+ *
+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
+ *                    VA Linux Systems Japan K.K.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+#ifndef __ASM_XENOPROF_H__
+#define __ASM_XENOPROF_H__
+#ifdef CONFIG_XEN
+
+#undef HAVE_XENOPROF_CREATE_FILES
+
+struct xenoprof_init;
+void xenoprof_arch_init_counter(struct xenoprof_init *init);
+void xenoprof_arch_counter(void);
+void xenoprof_arch_start(void);
+void xenoprof_arch_stop(void);
+
+struct xenoprof_arch_shared_buffer {
+       struct resource*        res;
+};
+
+struct xenoprof_shared_buffer;
+void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf);
+struct xenoprof_get_buffer;
+int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer,
+                                    struct xenoprof_shared_buffer* sbuf);
+struct xenoprof_passive;
+int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain,
+                              struct xenoprof_shared_buffer* sbuf);
+
+#endif /* CONFIG_XEN */
+#endif /* __ASM_XENOPROF_H__ */

_______________________________________________
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] [IA64] xenoprof linux/ia64 part, Xen patchbot-unstable <=