Skip to content

Commit

Permalink
KVM: PPC: Find HTAB ourselves
Browse files Browse the repository at this point in the history
For KVM we need to find the location of the HTAB. We can either rely
on internal data structures of the kernel or ask the hardware.

Ben issued complaints about the internal data structure method, so
let's switch it to our own inquiry of the HTAB. Now we're fully
independend :-).

CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
  • Loading branch information
Alexander Graf authored and Avi Kivity committed May 17, 2010
1 parent 5156f27 commit 251585b
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 13 deletions.
5 changes: 0 additions & 5 deletions arch/powerpc/kernel/ppc_ksyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,6 @@ EXPORT_SYMBOL(switch_mmu_context);
extern long mol_trampoline;
EXPORT_SYMBOL(mol_trampoline); /* For MOL */
EXPORT_SYMBOL(flush_hash_pages); /* For MOL */

extern struct hash_pte *Hash;
extern unsigned long _SDR1;
EXPORT_SYMBOL_GPL(Hash); /* For KVM */
EXPORT_SYMBOL_GPL(_SDR1); /* For KVM */
#ifdef CONFIG_SMP
extern int mmu_hash_lock;
EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */
Expand Down
21 changes: 13 additions & 8 deletions arch/powerpc/kvm/book3s_32_mmu_host.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
#error Only 32 bit pages are supported for now
#endif

static ulong htab;
static u32 htabmask;

static void invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte)
{
volatile u32 *pteg;
Expand Down Expand Up @@ -217,28 +220,24 @@ static struct kvmppc_sid_map *find_sid_vsid(struct kvm_vcpu *vcpu, u64 gvsid)
return NULL;
}

extern struct hash_pte *Hash;
extern unsigned long _SDR1;

static u32 *kvmppc_mmu_get_pteg(struct kvm_vcpu *vcpu, u32 vsid, u32 eaddr,
bool primary)
{
u32 page, hash, htabmask;
ulong pteg = (ulong)Hash;
u32 page, hash;
ulong pteg = htab;

page = (eaddr & ~ESID_MASK) >> 12;

hash = ((vsid ^ page) << 6);
if (!primary)
hash = ~hash;

htabmask = ((_SDR1 & 0x1FF) << 16) | 0xFFC0;
hash &= htabmask;

pteg |= hash;

dprintk_mmu("htab: %p | hash: %x | htabmask: %x | pteg: %lx\n",
Hash, hash, htabmask, pteg);
dprintk_mmu("htab: %lx | hash: %x | htabmask: %x | pteg: %lx\n",
htab, hash, htabmask, pteg);

return (u32*)pteg;
}
Expand Down Expand Up @@ -453,6 +452,7 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
{
struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
int err;
ulong sdr1;

err = __init_new_context();
if (err < 0)
Expand All @@ -474,5 +474,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)

vcpu3s->vsid_next = vcpu3s->vsid_first;

/* Remember where the HTAB is */
asm ( "mfsdr1 %0" : "=r"(sdr1) );
htabmask = ((sdr1 & 0x1FF) << 16) | 0xFFC0;
htab = (ulong)__va(sdr1 & 0xffff0000);

return 0;
}

0 comments on commit 251585b

Please sign in to comment.