diff options
| author | Alexander Graf <agraf@suse.de> | 2009-12-19 12:07:39 -0500 |
|---|---|---|
| committer | Marcelo Tosatti <mtosatti@redhat.com> | 2009-12-27 10:36:34 -0500 |
| commit | 5279aeb4b96cbdac22a0c2f8137dd0bbc35f02b8 (patch) | |
| tree | 592ca08805d9460064a1ab874a1a58e45d0f28c8 | |
| parent | a662b8135a1f9fee7d3f9129498cb03f3d6ce772 (diff) | |
KVM: powerpc: Fix mtsrin in book3s_64 mmu
We were shifting the Ks/Kp/N bits one bit too far on mtsrin. It took
me some time to figure that out, so I also put in some debugging and a
comment explaining the conversion.
This fixes current OpenBIOS boot on PPC64 KVM.
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c index 5598f88f142e..e4beeb371a73 100644 --- a/arch/powerpc/kvm/book3s_64_mmu.c +++ b/arch/powerpc/kvm/book3s_64_mmu.c | |||
| @@ -390,6 +390,26 @@ static void kvmppc_mmu_book3s_64_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, | |||
| 390 | { | 390 | { |
| 391 | u64 rb = 0, rs = 0; | 391 | u64 rb = 0, rs = 0; |
| 392 | 392 | ||
| 393 | /* | ||
| 394 | * According to Book3 2.01 mtsrin is implemented as: | ||
| 395 | * | ||
| 396 | * The SLB entry specified by (RB)32:35 is loaded from register | ||
| 397 | * RS, as follows. | ||
| 398 | * | ||
| 399 | * SLBE Bit Source SLB Field | ||
| 400 | * | ||
| 401 | * 0:31 0x0000_0000 ESID-0:31 | ||
| 402 | * 32:35 (RB)32:35 ESID-32:35 | ||
| 403 | * 36 0b1 V | ||
| 404 | * 37:61 0x00_0000|| 0b0 VSID-0:24 | ||
| 405 | * 62:88 (RS)37:63 VSID-25:51 | ||
| 406 | * 89:91 (RS)33:35 Ks Kp N | ||
| 407 | * 92 (RS)36 L ((RS)36 must be 0b0) | ||
| 408 | * 93 0b0 C | ||
| 409 | */ | ||
| 410 | |||
| 411 | dprintk("KVM MMU: mtsrin(0x%x, 0x%lx)\n", srnum, value); | ||
| 412 | |||
| 393 | /* ESID = srnum */ | 413 | /* ESID = srnum */ |
| 394 | rb |= (srnum & 0xf) << 28; | 414 | rb |= (srnum & 0xf) << 28; |
| 395 | /* Set the valid bit */ | 415 | /* Set the valid bit */ |
| @@ -400,7 +420,7 @@ static void kvmppc_mmu_book3s_64_mtsrin(struct kvm_vcpu *vcpu, u32 srnum, | |||
| 400 | /* VSID = VSID */ | 420 | /* VSID = VSID */ |
| 401 | rs |= (value & 0xfffffff) << 12; | 421 | rs |= (value & 0xfffffff) << 12; |
| 402 | /* flags = flags */ | 422 | /* flags = flags */ |
| 403 | rs |= ((value >> 27) & 0xf) << 9; | 423 | rs |= ((value >> 28) & 0x7) << 9; |
| 404 | 424 | ||
| 405 | kvmppc_mmu_book3s_64_slbmte(vcpu, rs, rb); | 425 | kvmppc_mmu_book3s_64_slbmte(vcpu, rs, rb); |
| 406 | } | 426 | } |
