Skip to content

Commit

Permalink
KVM: PPC: E500: Explicitly mark shadow maps invalid
Browse files Browse the repository at this point in the history
When we invalidate shadow TLB maps on the host, we don't mark them
as not valid. But we should.

Fix this by removing the E500_TLB_VALID from their flags when
invalidating.

Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
Alexander Graf committed Jan 24, 2013
1 parent 9445ef0 commit 523f0e5
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions arch/powerpc/kvm/e500_tlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,13 @@ static void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500,
{
struct kvm_book3e_206_tlb_entry *gtlbe =
get_entry(vcpu_e500, tlbsel, esel);
struct tlbe_ref *ref = &vcpu_e500->gtlb_priv[tlbsel][esel].ref;

if (tlbsel == 1 &&
vcpu_e500->gtlb_priv[1][esel].ref.flags & E500_TLB_BITMAP) {
/* Don't bother with unmapped entries */
if (!(ref->flags & E500_TLB_VALID))
return;

if (tlbsel == 1 && ref->flags & E500_TLB_BITMAP) {
u64 tmp = vcpu_e500->g2h_tlb1_map[esel];
int hw_tlb_indx;
unsigned long flags;
Expand All @@ -224,14 +228,17 @@ static void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500,
}
mb();
vcpu_e500->g2h_tlb1_map[esel] = 0;
vcpu_e500->gtlb_priv[1][esel].ref.flags &= ~E500_TLB_BITMAP;
ref->flags &= ~(E500_TLB_BITMAP | E500_TLB_VALID);
local_irq_restore(flags);

return;
}

/* Guest tlbe is backed by at most one host tlbe per shadow pid. */
kvmppc_e500_tlbil_one(vcpu_e500, gtlbe);

/* Mark the TLB as not backed by the host anymore */
ref->flags &= ~E500_TLB_VALID;
}

static int tlb0_set_base(gva_t addr, int sets, int ways)
Expand Down

0 comments on commit 523f0e5

Please sign in to comment.