On 18.08.2011, at 22:38, Scott Wood wrote: > Share the TLB array with KVM. This allows us to set the initial TLB > both on initial boot and reset, is useful for debugging, and could > eventually be used to support migration. > > Signed-off-by: Scott Wood <scottw...@freescale.com> > --- > v2 (was 1/3 in v1): > updated for kernel API change, removed kernel header ifdefs, > minor changes as requested > > hw/ppce500_mpc8544ds.c | 2 + > target-ppc/cpu.h | 2 + > target-ppc/kvm.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 91 insertions(+), 0 deletions(-) > > diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c > index b739ce2..3626e26 100644 > --- a/hw/ppce500_mpc8544ds.c > +++ b/hw/ppce500_mpc8544ds.c > @@ -202,6 +202,8 @@ static void mmubooke_create_initial_mapping(CPUState *env, > tlb->mas2 = va & TARGET_PAGE_MASK; > tlb->mas7_3 = pa & TARGET_PAGE_MASK; > tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX; > + > + env->tlb_dirty = true; > } > > static void mpc8544ds_cpu_reset(void *opaque) > diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h > index 024eb6f..0e38d4f 100644 > --- a/target-ppc/cpu.h > +++ b/target-ppc/cpu.h > @@ -919,6 +919,8 @@ struct CPUPPCState { > ppc_tlb_t tlb; /* TLB is optional. Allocate them only if needed > */ > /* 403 dedicated access protection registers */ > target_ulong pb[4]; > + bool tlb_dirty; /* Set to non-zero when modifying TLB > */ > + bool kvm_sw_tlb; /* non-zero if KVM SW TLB API is active > */ > #endif > > /* Other registers */ > diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c > index 21f35af7..1e1e5db 100644 > --- a/target-ppc/kvm.c > +++ b/target-ppc/kvm.c > @@ -105,6 +105,54 @@ static int kvm_arch_sync_sregs(CPUState *cenv) > return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs); > } > > +/* Set up a shared TLB array with KVM */ > +static int kvm_booke206_tlb_init(CPUState *env) > +{ > + struct kvm_book3e_206_tlb_params params = {}; > + struct kvm_config_tlb cfg = {}; > + struct kvm_enable_cap encap = {}; > + size_t array_len; > + unsigned int entries = 0; > + int ret, i; > + > + if (!kvm_enabled() || > + !kvm_check_extension(env->kvm_state, KVM_CAP_SW_TLB)) { > + return 0; > + } > + > + assert(ARRAY_SIZE(params.tlb_sizes) == BOOKE206_MAX_TLBN); > + > + for (i = 0; i < BOOKE206_MAX_TLBN; i++) { > + params.tlb_sizes[i] = booke206_tlb_size(env, i); > + params.tlb_ways[i] = booke206_tlb_ways(env, i); > + entries += params.tlb_sizes[i]; > + } > + > + assert(entries == env->nb_tlb); > + assert(sizeof(struct kvm_book3e_206_tlb_entry) == sizeof(ppcmas_tlb_t)); > + > + array_len = sizeof(ppcmas_tlb_t) * entries;
/dev/shm/qemu/target-ppc/kvm.c: In function 'kvm_booke206_tlb_init': /dev/shm/qemu/target-ppc/kvm.c:121:12: warning: variable 'array_len' set but not used [-Wunused-but-set-variable] Alex