Skip to content

Commit ffe3649

Browse files
ozbenhagraf
authored andcommitted
powerpc/kvm: Fix VSID usage in 64-bit "PR" KVM
The code forgot to scramble the VSIDs the way we normally do and was basically using the "proto VSID" directly with the MMU. This means that in practice, KVM used random VSIDs that could collide with segments used by other user space programs. Signed-off-by: Benjamin Herrenschmidt <[email protected]> [agraf: simplify ppc32 case] Signed-off-by: Alexander Graf <[email protected]>
1 parent 32c7dbf commit ffe3649

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

arch/powerpc/include/asm/kvm_book3s.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,13 @@ struct kvmppc_vcpu_book3s {
8181
u64 sdr1;
8282
u64 hior;
8383
u64 msr_mask;
84-
u64 vsid_next;
8584
#ifdef CONFIG_PPC_BOOK3S_32
8685
u32 vsid_pool[VSID_POOL_SIZE];
86+
u32 vsid_next;
8787
#else
88-
u64 vsid_first;
89-
u64 vsid_max;
88+
u64 proto_vsid_first;
89+
u64 proto_vsid_max;
90+
u64 proto_vsid_next;
9091
#endif
9192
int context_id[SID_CONTEXTS];
9293

arch/powerpc/kvm/book3s_64_mmu_host.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ static struct kvmppc_sid_map *create_sid_map(struct kvm_vcpu *vcpu, u64 gvsid)
194194
backwards_map = !backwards_map;
195195

196196
/* Uh-oh ... out of mappings. Let's flush! */
197-
if (vcpu_book3s->vsid_next == vcpu_book3s->vsid_max) {
198-
vcpu_book3s->vsid_next = vcpu_book3s->vsid_first;
197+
if (vcpu_book3s->proto_vsid_next == vcpu_book3s->proto_vsid_max) {
198+
vcpu_book3s->proto_vsid_next = vcpu_book3s->proto_vsid_first;
199199
memset(vcpu_book3s->sid_map, 0,
200200
sizeof(struct kvmppc_sid_map) * SID_MAP_NUM);
201201
kvmppc_mmu_pte_flush(vcpu, 0, 0);
202202
kvmppc_mmu_flush_segments(vcpu);
203203
}
204-
map->host_vsid = vcpu_book3s->vsid_next++;
204+
map->host_vsid = vsid_scramble(vcpu_book3s->proto_vsid_next++, 256M);
205205

206206
map->guest_vsid = gvsid;
207207
map->valid = true;
@@ -319,9 +319,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
319319
return -1;
320320
vcpu3s->context_id[0] = err;
321321

322-
vcpu3s->vsid_max = ((vcpu3s->context_id[0] + 1) << USER_ESID_BITS) - 1;
323-
vcpu3s->vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
324-
vcpu3s->vsid_next = vcpu3s->vsid_first;
322+
vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
323+
<< USER_ESID_BITS) - 1;
324+
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
325+
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
325326

326327
kvmppc_mmu_hpte_init(vcpu);
327328

0 commit comments

Comments
 (0)