From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Ehrhardt Subject: Re: [PATCH] [PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub Date: Thu, 11 Dec 2008 13:53:53 +0100 Message-ID: <49410D61.9090309@linux.vnet.ibm.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org To: avi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org Return-path: In-Reply-To: Sender: kvm-ppc-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: kvm.vger.kernel.org This is v2 as version one had a type in it occured when splitting patch= es. Mercurial somehow lost my changes to the patch description explaining=20 that, but the patch is right this way. Christian Ehrhardt wrote: > # HG changeset patch > # User Christian Ehrhardt > # Date 1228999833 -3600 > # Node ID dc1466c9077ab162f4637fffee1869f26be02299 > # Parent 4c07fe2a56c7653a9113e05bb08c2de9aec210ce > [PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstu= b > > From: Hollis Blanchard > > Add basic KVM PowerPC support to qemu's gdbstub introducing a kvm ppc= style > mmu implementation that uses the kvm_translate ioctl. > This also requires to save the kvm registers prior to the 'm' gdb ope= rations. > > Signed-off-by: Hollis Blanchard > Signed-off-by: Christian Ehrhardt > --- > > [diffstat] > gdbstub.c | 2 ++ > hw/ppc440_bamboo.c | 1 + > qemu-kvm-powerpc.c | 28 ++++++++++++++++++++++++++++ > target-ppc/cpu.h | 2 ++ > target-ppc/helper.c | 4 ++++ > target-ppc/translate_init.c | 5 +++++ > 6 files changed, 42 insertions(+) > > [diff] > > diff --git a/qemu/gdbstub.c b/qemu/gdbstub.c > --- a/qemu/gdbstub.c > +++ b/qemu/gdbstub.c > @@ -1374,6 +1374,7 @@ static int gdb_handle_packet(GDBState *s > if (*p =3D=3D ',') > p++; > len =3D strtoull(p, NULL, 16); > + kvm_save_registers(s->g_cpu); > if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) !=3D= 0) { > put_packet (s, "E14"); > } else { > @@ -1389,6 +1390,7 @@ static int gdb_handle_packet(GDBState *s > if (*p =3D=3D ':') > p++; > hextomem(mem_buf, p, len); > + kvm_save_registers(s->g_cpu); > if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) !=3D= 0) > put_packet(s, "E14"); > else > diff --git a/qemu/hw/ppc440_bamboo.c b/qemu/hw/ppc440_bamboo.c > --- a/qemu/hw/ppc440_bamboo.c > +++ b/qemu/hw/ppc440_bamboo.c > @@ -99,6 +99,7 @@ void bamboo_init(ram_addr_t ram_size, in > fprintf(stderr, "Unable to initialize CPU!\n"); > exit(1); > } > + env->mmu_model =3D POWERPC_MMU_KVM; > > /* call init */ > printf("Calling function ppc440_init\n"); > diff --git a/qemu/qemu-kvm-powerpc.c b/qemu/qemu-kvm-powerpc.c > --- a/qemu/qemu-kvm-powerpc.c > +++ b/qemu/qemu-kvm-powerpc.c > @@ -102,6 +102,7 @@ void kvm_arch_save_regs(CPUState *env) > > env->spr[SPR_SRR0] =3D regs.srr0; > env->spr[SPR_SRR1] =3D regs.srr1; > + env->spr[SPR_BOOKE_PID] =3D regs.pid; > > env->spr[SPR_SPRG0] =3D regs.sprg0; > env->spr[SPR_SPRG1] =3D regs.sprg1; > @@ -219,6 +220,33 @@ int handle_powerpc_dcr_write(int vcpu, u > return 0; /* XXX ignore failed DCR ops */ > } > > +int mmukvm_get_physical_address(CPUState *env, mmu_ctx_t *ctx, > + target_ulong eaddr, int rw, int acce= ss_type) > +{ > + struct kvm_translation tr; > + uint64_t pid; > + uint64_t as; > + int r; > + > + pid =3D env->spr[SPR_BOOKE_PID]; > + > + if (access_type =3D=3D ACCESS_CODE) > + as =3D env->msr & msr_ir; > + else > + as =3D env->msr & msr_dr; > + > + tr.linear_address =3D as << 40 | pid << 32 | eaddr; > + r =3D kvm_translate(kvm_context, env->cpu_index, &tr); > + if (r =3D=3D -1) > + return r; > + > + if (!tr.valid) > + return -EFAULT; > + > + ctx->raddr =3D tr.physical_address; > + return 0; > +} > + > void kvm_arch_cpu_reset(CPUState *env) > { > } > diff --git a/qemu/target-ppc/cpu.h b/qemu/target-ppc/cpu.h > --- a/qemu/target-ppc/cpu.h > +++ b/qemu/target-ppc/cpu.h > @@ -98,6 +98,8 @@ enum powerpc_mmu_t { > POWERPC_MMU_BOOKE_FSL =3D 0x00000009, > /* PowerPC 601 MMU model (specific BATs format) */ > POWERPC_MMU_601 =3D 0x0000000A, > + /* KVM managing the MMU state */ > + POWERPC_MMU_KVM =3D 0x0000000B, > #if defined(TARGET_PPC64) > #define POWERPC_MMU_64 0x00010000 > /* 64 bits PowerPC MMU */ > diff --git a/qemu/target-ppc/helper.c b/qemu/target-ppc/helper.c > --- a/qemu/target-ppc/helper.c > +++ b/qemu/target-ppc/helper.c > @@ -1429,6 +1429,10 @@ int get_physical_address (CPUState *env, > fprintf(logfile, "%s\n", __func__); > } > #endif > + > + if (env->mmu_model =3D=3D POWERPC_MMU_KVM) > + return mmukvm_get_physical_address(env, ctx, eaddr, rw, acce= ss_type); > + > if ((access_type =3D=3D ACCESS_CODE && msr_ir =3D=3D 0) || > (access_type !=3D ACCESS_CODE && msr_dr =3D=3D 0)) { > /* No address translation */ > diff --git a/qemu/target-ppc/translate_init.c b/qemu/target-ppc/trans= late_init.c > --- a/qemu/target-ppc/translate_init.c > +++ b/qemu/target-ppc/translate_init.c > @@ -9273,6 +9273,11 @@ int cpu_ppc_register_internal (CPUPPCSta > case POWERPC_MMU_601: > mmu_model =3D "PowerPC 601"; > break; > +#ifdef KVM > + case POWERPC_MMU_KVM: > + mmu_model =3D "PowerPC KVM"; > + break; > +#endif > #if defined (TARGET_PPC64) > case POWERPC_MMU_64B: > mmu_model =3D "PowerPC 64"; > =20 --=20 Gr=FCsse / regards,=20 Christian Ehrhardt IBM Linux Technology Center, Open Virtualization -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html