Hi,
this is another patch to be installed on top of my previous one.
It uses cpl=1 for pv-domain kernel mode.
I've fixed xenoprof.c and some more explicit cpl==2 test I've missed before.
A compiler warning in vcpu.c is fixed, too.
Tested by booting dom0.
Juergen
--
Juergen Gross Principal Developer
IP SW OS6 Telephone: +49 (0) 89 636 47950
Fujitsu Siemens Computers e-mail: juergen.gross@xxxxxxxxxxxxxxxxxxx
Otto-Hahn-Ring 6 Internet: www.fujitsu-siemens.com
D-81739 Muenchen Company details: www.fujitsu-siemens.com/imprint.html
# HG changeset patch
# User gross@xxxxxxxxxxxxxxxxxxxx
# Node ID 33704dd9cbbc30cc0e58ec748657e26c97d21d7a
# Parent 985ececb1dcd1c7ef37170c641b41141a87afaa2
cpl=0 emulation for pv-domain
diff -r 985ececb1dcd -r 33704dd9cbbc xen/arch/ia64/xen/faults.c
--- a/xen/arch/ia64/xen/faults.c Tue Jun 26 10:52:55 2007 +0200
+++ b/xen/arch/ia64/xen/faults.c Tue Jun 26 13:37:48 2007 +0200
@@ -505,7 +505,7 @@ ia64_handle_break(unsigned long ifa, str
/* FIXME: don't hardcode constant */
if ((iim == 0x80001 || iim == 0x80002)
- && ia64_get_cpl(regs->cr_ipsr) == 2) {
+ && ia64_get_cpl(regs->cr_ipsr) == CONFIG_CPL0_EMUL) {
do_ssc(vcpu_get_gr(current, 36), regs);
}
#ifdef CRASH_DEBUG
@@ -515,7 +515,8 @@ ia64_handle_break(unsigned long ifa, str
debugger_trap_fatal(0 /* don't care */ , regs);
}
#endif
- else if (iim == d->arch.breakimm && ia64_get_cpl(regs->cr_ipsr) == 2) {
+ else if (iim == d->arch.breakimm &&
+ ia64_get_cpl(regs->cr_ipsr) == CONFIG_CPL0_EMUL) {
/* by default, do not continue */
v->arch.hypercall_continuation = 0;
@@ -525,7 +526,7 @@ ia64_handle_break(unsigned long ifa, str
} else
reflect_interruption(isr, regs, vector);
} else if ((iim - HYPERPRIVOP_START) < HYPERPRIVOP_MAX
- && ia64_get_cpl(regs->cr_ipsr) == 2) {
+ && ia64_get_cpl(regs->cr_ipsr) == CONFIG_CPL0_EMUL) {
if (ia64_hyperprivop(iim, regs))
vcpu_increment_iip(current);
} else {
diff -r 985ececb1dcd -r 33704dd9cbbc xen/arch/ia64/xen/oprofile/xenoprof.c
--- a/xen/arch/ia64/xen/oprofile/xenoprof.c Tue Jun 26 10:52:55 2007 +0200
+++ b/xen/arch/ia64/xen/oprofile/xenoprof.c Tue Jun 26 13:37:48 2007 +0200
@@ -28,20 +28,23 @@ int
int
xenoprofile_get_mode(struct vcpu *v, struct cpu_user_regs * const regs)
{
- int mode = 0;
+ int mode;
// mode
// 0: user, 1: kernel, 2: xen
- // Xen/IA64 uses ring2 for kernel, and doesn't use ring1.
- if (ring_2(regs))
- mode = 1;
- else if (ring_0(regs))
- mode = 2;
- else if (ring_1(regs)) {
- gdprintk(XENLOG_ERR, "%s:%d ring1 is used!\n", __func__, __LINE__);
- mode = 1;// fall back to kernel mode.
+ switch (ring(regs))
+ {
+ case 3: mode = 0;
+ break;
+ case CONFIG_CPL0_EMUL: mode = 1;
+ break;
+ case 0: mode = 2;
+ 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.
}
-
return mode;
}
diff -r 985ececb1dcd -r 33704dd9cbbc xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c Tue Jun 26 10:52:55 2007 +0200
+++ b/xen/arch/ia64/xen/privop.c Tue Jun 26 13:37:48 2007 +0200
@@ -636,7 +636,7 @@ static IA64FAULT priv_handle_op(VCPU * v
}
if (slot_type == B && inst.generic.major == 0 && inst.B8.x6 == 0x0) {
// break instr for privified cover
- } else if (privlvl != 2)
+ } else if (privlvl > CONFIG_CPL0_EMUL)
return IA64_ILLOP_FAULT;
switch (slot_type) {
case M:
diff -r 985ececb1dcd -r 33704dd9cbbc xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c Tue Jun 26 10:52:55 2007 +0200
+++ b/xen/arch/ia64/xen/vcpu.c Tue Jun 26 13:37:48 2007 +0200
@@ -496,7 +496,7 @@ IA64FAULT vcpu_set_psr(VCPU * vcpu, u64
PSCB(vcpu, interrupt_collection_enabled) = vpsr.ic;
vcpu_set_metaphysical_mode(vcpu, !(vpsr.dt && vpsr.rt && vpsr.it));
- newpsr.cpl |= max(vpsr.cpl, CONFIG_CPL0_EMUL);
+ newpsr.cpl |= max(vpsr.cpl, (u64)CONFIG_CPL0_EMUL);
if (PSCB(vcpu, banknum) != vpsr.bn) {
if (vpsr.bn)
diff -r 985ececb1dcd -r 33704dd9cbbc xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h Tue Jun 26 10:52:55 2007 +0200
+++ b/xen/include/asm-ia64/config.h Tue Jun 26 13:37:48 2007 +0200
@@ -56,7 +56,7 @@
#define NR_hypercalls 64
/* PV domains use this value for priv. level 0 emulation */
-#define CONFIG_CPL0_EMUL 2
+#define CONFIG_CPL0_EMUL 1
#ifndef __ASSEMBLY__
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|