aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>2005-09-20 16:11:19 -0600
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>2005-09-20 16:11:19 -0600
commita93316bff0ca3d59d3a0652ac859e650aaeedec4 (patch)
tree1e3e10b90eacb2304ea0ba70171c78425d819049
parent2c01d5bac9ec665b176622bd28517a78c8c38e19 (diff)
downloadxen-a93316bff0ca3d59d3a0652ac859e650aaeedec4.tar.gz
xen-a93316bff0ca3d59d3a0652ac859e650aaeedec4.tar.bz2
xen-a93316bff0ca3d59d3a0652ac859e650aaeedec4.zip
Fix dcr.pp and psr.pp support (non-VTI) so pfmon --system-wide works
Signed-off by: Dan Magenheimer <dan.magenheimer@hp.com>
-rw-r--r--xen/arch/ia64/linux-xen/setup.c5
-rw-r--r--xen/arch/ia64/xen/hyperprivop.S3
-rw-r--r--xen/arch/ia64/xen/vcpu.c26
-rw-r--r--xen/include/public/arch-ia64.h1
4 files changed, 31 insertions, 4 deletions
diff --git a/xen/arch/ia64/linux-xen/setup.c b/xen/arch/ia64/linux-xen/setup.c
index b31f22ae35..ba7f91098d 100644
--- a/xen/arch/ia64/linux-xen/setup.c
+++ b/xen/arch/ia64/linux-xen/setup.c
@@ -824,8 +824,13 @@ cpu_init (void)
* shouldn't be affected by this (moral: keep your ia32 locks aligned and you'll
* be fine).
*/
+#ifdef XEN
+ ia64_setreg(_IA64_REG_CR_DCR, ( IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
+ | IA64_DCR_PP | IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
+#else
ia64_setreg(_IA64_REG_CR_DCR, ( IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
| IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
+#endif
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
#ifdef XEN
diff --git a/xen/arch/ia64/xen/hyperprivop.S b/xen/arch/ia64/xen/hyperprivop.S
index dd8de48c2d..cb314386fb 100644
--- a/xen/arch/ia64/xen/hyperprivop.S
+++ b/xen/arch/ia64/xen/hyperprivop.S
@@ -261,7 +261,8 @@ ENTRY(hyper_ssm_i)
;;
// FOR SSM_I ONLY, also turn on psr.i and psr.ic
movl r28=(IA64_PSR_DT|IA64_PSR_IT|IA64_PSR_RT|IA64_PSR_I|IA64_PSR_IC);;
- movl r27=~(IA64_PSR_BE|IA64_PSR_PP|IA64_PSR_BN);;
+// movl r27=~(IA64_PSR_BE|IA64_PSR_PP|IA64_PSR_BN);;
+ movl r27=~(IA64_PSR_BE|IA64_PSR_BN);;
or r30=r30,r28;;
and r30=r30,r27;;
adds r21=XSI_IPSR_OFS-XSI_PSR_IC_OFS,r18 ;;
diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c
index d650301242..5e2a92d5ac 100644
--- a/xen/arch/ia64/xen/vcpu.c
+++ b/xen/arch/ia64/xen/vcpu.c
@@ -191,7 +191,12 @@ IA64FAULT vcpu_reset_psr_sm(VCPU *vcpu, UINT64 imm24)
return (IA64_ILLOP_FAULT);
if (imm.dfh) ipsr->dfh = 0;
if (imm.dfl) ipsr->dfl = 0;
- if (imm.pp) { ipsr->pp = 0; psr.pp = 0; }
+ if (imm.pp) {
+ ipsr->pp = 1;
+ psr.pp = 1; // priv perf ctrs always enabled
+// FIXME: need new field in mapped_regs_t for virtual psr.pp (psr.be too?)
+ PSCB(vcpu,tmp[8]) = 0; // but fool the domain if it gets psr
+ }
if (imm.up) { ipsr->up = 0; psr.up = 0; }
if (imm.sp) { ipsr->sp = 0; psr.sp = 0; }
if (imm.be) ipsr->be = 0;
@@ -233,7 +238,11 @@ IA64FAULT vcpu_set_psr_sm(VCPU *vcpu, UINT64 imm24)
if (imm24 & ~mask) return (IA64_ILLOP_FAULT);
if (imm.dfh) ipsr->dfh = 1;
if (imm.dfl) ipsr->dfl = 1;
- if (imm.pp) { ipsr->pp = 1; psr.pp = 1; }
+ if (imm.pp) {
+ ipsr->pp = 1; psr.pp = 1;
+// FIXME: need new field in mapped_regs_t for virtual psr.pp (psr.be too?)
+ PSCB(vcpu,tmp[8]) = 1;
+ }
if (imm.sp) { ipsr->sp = 1; psr.sp = 1; }
if (imm.i) {
if (!PSCB(vcpu,interrupt_delivery_enabled)) {
@@ -284,7 +293,15 @@ IA64FAULT vcpu_set_psr_l(VCPU *vcpu, UINT64 val)
// however trying to set other bits can't be an error as it is in ssm
if (newpsr.dfh) ipsr->dfh = 1;
if (newpsr.dfl) ipsr->dfl = 1;
- if (newpsr.pp) { ipsr->pp = 1; psr.pp = 1; }
+ if (newpsr.pp) {
+ ipsr->pp = 1; psr.pp = 1;
+// FIXME: need new field in mapped_regs_t for virtual psr.pp (psr.be too?)
+ PSCB(vcpu,tmp[8]) = 1;
+ }
+ else {
+ ipsr->pp = 1; psr.pp = 1;
+ PSCB(vcpu,tmp[8]) = 0;
+ }
if (newpsr.up) { ipsr->up = 1; psr.up = 1; }
if (newpsr.sp) { ipsr->sp = 1; psr.sp = 1; }
if (newpsr.i) {
@@ -331,6 +348,9 @@ IA64FAULT vcpu_get_psr(VCPU *vcpu, UINT64 *pval)
else newpsr.i = 0;
if (PSCB(vcpu,interrupt_collection_enabled)) newpsr.ic = 1;
else newpsr.ic = 0;
+// FIXME: need new field in mapped_regs_t for virtual psr.pp (psr.be too?)
+ if (PSCB(vcpu,tmp[8])) newpsr.pp = 1;
+ else newpsr.pp = 0;
*pval = *(unsigned long *)&newpsr;
return IA64_NO_FAULT;
}
diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h
index 05900bfa0b..d25ec18fcf 100644
--- a/xen/include/public/arch-ia64.h
+++ b/xen/include/public/arch-ia64.h
@@ -229,6 +229,7 @@ typedef struct {
unsigned long krs[8]; // kernel registers
unsigned long pkrs[8]; // protection key registers
unsigned long tmp[8]; // temp registers (e.g. for hyperprivops)
+ // FIXME: tmp[8] temp'ly being used for virtual psr.pp
};
};
#if 0