aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@hp.com>2007-12-17 09:36:46 -0700
committerAlex Williamson <alex.williamson@hp.com>2007-12-17 09:36:46 -0700
commit0a021885d09ff6a022f77dc2116eea1cc6e02474 (patch)
tree76bbcccc27ba45ab60087c3976c61965ac3a9b64
parent2707b54e9bf13dad99d2467bfecd6dbfac475e41 (diff)
downloadxen-0a021885d09ff6a022f77dc2116eea1cc6e02474.tar.gz
xen-0a021885d09ff6a022f77dc2116eea1cc6e02474.tar.bz2
xen-0a021885d09ff6a022f77dc2116eea1cc6e02474.zip
[IA64] xenoprof: make xenoprofile_get_mode() vti domain aware
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
-rw-r--r--xen/arch/ia64/xen/oprofile/xenoprof.c55
1 files changed, 42 insertions, 13 deletions
diff --git a/xen/arch/ia64/xen/oprofile/xenoprof.c b/xen/arch/ia64/xen/oprofile/xenoprof.c
index 504d4f4fad..fdabc28ef1 100644
--- a/xen/arch/ia64/xen/oprofile/xenoprof.c
+++ b/xen/arch/ia64/xen/oprofile/xenoprof.c
@@ -24,29 +24,58 @@
#include <xen/sched.h>
#include <public/xen.h>
#include <xen/xenoprof.h>
+#include <asm/vmx.h> /* for vmx_user_mode() */
int
xenoprofile_get_mode(struct vcpu *v, struct cpu_user_regs * const regs)
{
int mode;
- // mode
- // 0: user, 1: kernel, 2: xen
- switch (ring(regs))
- {
- case 3:
- mode = 0;
+ /*
+ * mode
+ * 0: user, 1: kernel, 2: xen
+ * see linux/driver/oprofile/cpu_buffer.h
+ */
+#define CPU_MODE_USER 0
+#define CPU_MODE_KERNEL 1
+#define CPU_MODE_XEN 2
+ if (VMX_DOMAIN(v)) {
+ if (vmx_user_mode(regs)) {
+ switch (ring(regs)) {
+ case 3:
+ mode = CPU_MODE_USER;
break;
- case CONFIG_CPL0_EMUL:
- mode = 1;
+ case 0:
+ mode = CPU_MODE_KERNEL;
break;
- case 0:
- mode = 2;
+ /* case 0: case 1: */
+ default:
+ gdprintk(XENLOG_ERR, "%s:%d ring%d in vmx is used!\n",
+ __func__, __LINE__, ring(regs));
+ mode = CPU_MODE_KERNEL; /* fall back to kernel mode. */
break;
+ }
+ } else {
+ mode = CPU_MODE_XEN;
+ BUG_ON(ring(regs) != 0);
+ }
+ } else {
+ switch (ring(regs)) {
+ case 3:
+ mode = CPU_MODE_USER;
+ break;
+ case CONFIG_CPL0_EMUL:
+ mode = CPU_MODE_KERNEL;
+ break;
+ case 0:
+ mode = CPU_MODE_XEN;
+ break;
default:
- gdprintk(XENLOG_ERR, "%s:%d ring%d is used!\n", __func__,
- __LINE__, 3 - CONFIG_CPL0_EMUL);
- mode = 1; /* fall back to kernel mode. */
+ gdprintk(XENLOG_ERR, "%s:%d ring%d in pv is used!\n", __func__,
+ __LINE__, 3 - CONFIG_CPL0_EMUL);
+ mode = CPU_MODE_KERNEL; /* fall back to kernel mode. */
+ break;
+ }
}
return mode;
}