Commit 251585b5 authored by Alexander Graf's avatar Alexander Graf Committed by Avi Kivity

KVM: PPC: Find HTAB ourselves

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: default avatarAlexander Graf <agraf@suse.de>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 5156f274
...@@ -178,11 +178,6 @@ EXPORT_SYMBOL(switch_mmu_context); ...@@ -178,11 +178,6 @@ EXPORT_SYMBOL(switch_mmu_context);
extern long mol_trampoline; extern long mol_trampoline;
EXPORT_SYMBOL(mol_trampoline); /* For MOL */ EXPORT_SYMBOL(mol_trampoline); /* For MOL */
EXPORT_SYMBOL(flush_hash_pages); /* 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 #ifdef CONFIG_SMP
extern int mmu_hash_lock; extern int mmu_hash_lock;
EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */ EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */
......
...@@ -54,6 +54,9 @@ ...@@ -54,6 +54,9 @@
#error Only 32 bit pages are supported for now #error Only 32 bit pages are supported for now
#endif #endif
static ulong htab;
static u32 htabmask;
static void invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte) static void invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte)
{ {
volatile u32 *pteg; volatile u32 *pteg;
...@@ -217,14 +220,11 @@ static struct kvmppc_sid_map *find_sid_vsid(struct kvm_vcpu *vcpu, u64 gvsid) ...@@ -217,14 +220,11 @@ static struct kvmppc_sid_map *find_sid_vsid(struct kvm_vcpu *vcpu, u64 gvsid)
return NULL; 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, static u32 *kvmppc_mmu_get_pteg(struct kvm_vcpu *vcpu, u32 vsid, u32 eaddr,
bool primary) bool primary)
{ {
u32 page, hash, htabmask; u32 page, hash;
ulong pteg = (ulong)Hash; ulong pteg = htab;
page = (eaddr & ~ESID_MASK) >> 12; page = (eaddr & ~ESID_MASK) >> 12;
...@@ -232,13 +232,12 @@ static u32 *kvmppc_mmu_get_pteg(struct kvm_vcpu *vcpu, u32 vsid, u32 eaddr, ...@@ -232,13 +232,12 @@ static u32 *kvmppc_mmu_get_pteg(struct kvm_vcpu *vcpu, u32 vsid, u32 eaddr,
if (!primary) if (!primary)
hash = ~hash; hash = ~hash;
htabmask = ((_SDR1 & 0x1FF) << 16) | 0xFFC0;
hash &= htabmask; hash &= htabmask;
pteg |= hash; pteg |= hash;
dprintk_mmu("htab: %p | hash: %x | htabmask: %x | pteg: %lx\n", dprintk_mmu("htab: %lx | hash: %x | htabmask: %x | pteg: %lx\n",
Hash, hash, htabmask, pteg); htab, hash, htabmask, pteg);
return (u32*)pteg; return (u32*)pteg;
} }
...@@ -453,6 +452,7 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu) ...@@ -453,6 +452,7 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
{ {
struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu); struct kvmppc_vcpu_book3s *vcpu3s = to_book3s(vcpu);
int err; int err;
ulong sdr1;
err = __init_new_context(); err = __init_new_context();
if (err < 0) if (err < 0)
...@@ -474,5 +474,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu) ...@@ -474,5 +474,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
vcpu3s->vsid_next = vcpu3s->vsid_first; 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; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment