On 10.11.2009, at 22:16, Benjamin Herrenschmidt wrote:
On Tue, 2009-11-10 at 11:50 +0100, Alexander Graf wrote:
if ((vcpu->arch.last_inst & 0xff0007ff) !=
(INS_DCBZ & 0xfffffff7)) {
+ vcpu->arch.msr |= (vcpu->arch.shadow_msr & 0x1f0000ull);
What bits are those? It might be good to use real #define's here :-).
They are some of those SRR1 bits that don't match MSR bits, used to
convey informations on program check and machine check. I think the
only
#define we have for them are actually deep inside traps.c.
I see ;-).
diff --git a/arch/powerpc/kvm/book3s_64_interrupts.S b/arch/powerpc/
kvm/book3s_64_interrupts.S
index 7b55d80..22f2962 100644
--- a/arch/powerpc/kvm/book3s_64_interrupts.S
+++ b/arch/powerpc/kvm/book3s_64_interrupts.S
@@ -241,8 +241,9 @@ kvmppc_handler_highmem:
rldicl. r5, r5, 0, 63 /* CR = ((r5 & 1) == 0) */
beq no_dcbz32_off
+ li r4,0
mfspr r5,SPRN_HID5
- rldimi r5,r5,6,56
+ rldimi r5,r4,6,56
When you're on a G5 you never get into this code path, right? You're
using the dcbz binary patched emulation instead.
Why ? The G5 is a 970 which supports HID5 and has no hypervisor to get
in the way so it works fine with the dcbz hack (I added printks to
verify it was enabled).
Oh right. Mac OS X enables it too - I forgot.
So what you do is you replace
HID5 &= ~DCBZ32;
with
HID5 = 0;
No. What I do is replace
HID5 = (HID5 & ~0xc0) | ((HID5 & 0x3) << 6)
with
HID5 = (HID5 & ~0xc0)
At least that's my understanding :-)
+ li r4,0
mfspr r5,SPRN_HID5
r5 = *HID5
- rldimi r5,r5,6,56
Take r5, remove some bits, write into r5
+ rldimi r5,r4,6,56
Take r4, remove some bits, write into r5.
Or did I miss anything?
Is that intentional?
mtspr SPRN_HID5,r5
no_dcbz32_off:
diff --git a/arch/powerpc/kvm/book3s_64_slb.S b/arch/powerpc/kvm/
book3s_64_slb.S
index ecd237a..c574cf7 100644
--- a/arch/powerpc/kvm/book3s_64_slb.S
+++ b/arch/powerpc/kvm/book3s_64_slb.S
@@ -205,11 +205,11 @@ ld_last_inst:
/* 1) enable paging for data */
mfmsr r9
ori r11, r9, MSR_DR /* Enable paging for data */
- mtmsr r11
+ mtmsrd r11
Wasn't mtmsrd this extra cool new version that takes a second
argument
so one can only set IF?
Extra argument is optional in the asm but yeah. Though I think mtmsr
also takes it (the L bit basically). No, the difference is that mtmsrd
can write all 64-bit of the MSR while mtmsr only the low 32-bit. Now
in
your case that's fine, both would work, I just did that change as a
reflex :-) (Ie. mtmsr will preserve the top 32-bit of the MSR anyway)
Ah, right. Thanks for the catch!
Note: The karmic installer still goes bonkers a bit later, I don't
know
why yet (works without -enable-kvm). I need to run it without it's
"quiet" thingy so I can see what's happening :-)
Hum, would be interesting to know where it breaks. Either way you're
running the guest pretty far already as userspace is apparently
running. So that's good news :-).
Alex
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html