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