qemu/target/ppc
David Gibson 1ad9f0a464 target/ppc: Fix KVM-HV HPTE accessors
When a 'pseries' guest is running with KVM-HV, the guest's hashed page
table (HPT) is stored within the host kernel, so it is not directly
accessible to qemu.  Most of the time, qemu doesn't need to access it:
we're using the hardware MMU, and KVM itself implements the guest
hypercalls for manipulating the HPT.

However, qemu does need access to the in-KVM HPT to implement
get_phys_page_debug() for the benefit of the gdbstub, and maybe for
other debug operations.

To allow this, 7c43bca "target-ppc: Fix page table lookup with kvm
enabled" added kvmppc_hash64_read_pteg() to target/ppc/kvm.c to read
in a batch of HPTEs from the KVM table.  Unfortunately, there are a
couple of problems with this:

First, the name of the function implies it always reads a whole PTEG
from the HPT, but in fact in some cases it's used to grab individual
HPTEs (which ends up pulling 8 HPTEs, not aligned to a PTEG from the
kernel).

Second, and more importantly, the code to read the HPTEs from KVM is
simply wrong, in general.  The data from the fd that KVM provides is
designed mostly for compact migration rather than this sort of one-off
access, and so needs some decoding for this purpose.  The current code
will work in some cases, but if there are invalid HPTEs then it will
not get sane results.

This patch rewrite the HPTE reading function to have a simpler
interface (just read n HPTEs into a caller provided buffer), and to
correctly decode the stream from the kernel.

For consistency we also clean up the similar function for altering
HPTEs within KVM (introduced in c138593 "target-ppc: Update
ppc_hash64_store_hpte to support updating in-kernel htab").

Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2017-03-01 11:23:39 +11:00
..
translate target-ppc: Add xscvqpudz and xscvqpuwz instructions 2017-02-22 11:28:28 +11:00
arch_dump.c
compat.c ppc: Add ppc_set_compat_all() 2017-01-31 10:10:14 +11:00
cpu-models.c target/ppc/cpu-models: Fix/remove bad CPU aliases 2017-01-31 13:46:26 +11:00
cpu-models.h powerpc/cpu-models: rename ISAv3.00 logical PVR definition 2017-01-31 10:10:14 +11:00
cpu-qom.h target/ppc/POWER9: Add ISAv3.00 MMU definition 2017-02-22 11:28:28 +11:00
cpu.c target/ppc: move cpu_[read, write]_xer to cpu.c 2017-03-01 11:23:38 +11:00
cpu.h target/ppc: Fix KVM-HV HPTE accessors 2017-03-01 11:23:39 +11:00
dfp_helper.c
excp_helper.c ppc: Clean up and QOMify hypercall emulation 2017-01-31 10:10:13 +11:00
fpu_helper.c target-ppc: Add xscvqpudz and xscvqpuwz instructions 2017-02-22 11:28:28 +11:00
gdbstub.c
helper_regs.h cputlb: drop flush_global flag from tlb_flush 2017-01-13 14:24:37 +00:00
helper.h target-ppc: Add xscvqpudz and xscvqpuwz instructions 2017-02-22 11:28:28 +11:00
int_helper.c target/ppc: introduce helper_update_ov_legacy 2017-03-01 11:23:39 +11:00
internal.h target-ppc: implement load atomic instruction 2017-02-22 11:28:27 +11:00
kvm_ppc.h target/ppc: Fix KVM-HV HPTE accessors 2017-03-01 11:23:39 +11:00
kvm-stub.c
kvm.c target/ppc: Fix KVM-HV HPTE accessors 2017-03-01 11:23:39 +11:00
machine.c migration: extend VMStateInfo 2017-01-24 17:54:47 +00:00
Makefile.objs target/ppc: move cpu_[read, write]_xer to cpu.c 2017-03-01 11:23:38 +11:00
mem_helper.c target-ppc: implement stxvll instructions 2017-01-31 10:10:13 +11:00
mfrom_table_gen.c
mfrom_table.c
misc_helper.c cputlb: drop flush_global flag from tlb_flush 2017-01-13 14:24:37 +00:00
mmu_helper.c target-ppc: fix Book-E TLB matching 2017-02-22 14:28:53 +11:00
mmu-hash32.c
mmu-hash32.h
mmu-hash64.c target/ppc: Fix KVM-HV HPTE accessors 2017-03-01 11:23:39 +11:00
mmu-hash64.h target/ppc: Fix KVM-HV HPTE accessors 2017-03-01 11:23:39 +11:00
monitor.c monitor: Fix crashes when using HMP commands without CPU 2017-02-21 18:29:01 +00:00
STATUS
timebase_helper.c
trace-events
translate_init.c target/ppc/POWER9: Adapt LPCR handling for POWER9 2017-02-22 11:28:28 +11:00
translate.c target/ppc: optimize gen_write_xer() 2017-03-01 11:23:38 +11:00
user_only_helper.c