public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
To: avi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Cc: kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
Subject: Re: [PATCH] [PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub
Date: Thu, 11 Dec 2008 13:53:53 +0100	[thread overview]
Message-ID: <49410D61.9090309@linux.vnet.ibm.com> (raw)
In-Reply-To: <dc1466c9077ab162f463.1228999931@HelionPrime>

This is v2 as version one had a type in it occured when splitting patches.
Mercurial somehow lost my changes to the patch description explaining 
that, but the patch is right this way.

Christian Ehrhardt wrote:
> # HG changeset patch
> # User Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> # Date 1228999833 -3600
> # Node ID dc1466c9077ab162f4637fffee1869f26be02299
> # Parent  4c07fe2a56c7653a9113e05bb08c2de9aec210ce
> [PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub
>
> From: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
>
> 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 operations.
>
> Signed-off-by: Hollis Blanchard <hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Christian Ehrhardt <ehrhardt-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>
> [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 == ',')
>              p++;
>          len = strtoull(p, NULL, 16);
> +        kvm_save_registers(s->g_cpu);
>          if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
>              put_packet (s, "E14");
>          } else {
> @@ -1389,6 +1390,7 @@ static int gdb_handle_packet(GDBState *s
>          if (*p == ':')
>              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) != 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 = 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] = regs.srr0;
>      env->spr[SPR_SRR1] = regs.srr1;
> +    env->spr[SPR_BOOKE_PID] = regs.pid;
>
>      env->spr[SPR_SPRG0] = regs.sprg0;
>      env->spr[SPR_SPRG1] = 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 access_type)
> +{
> +    struct kvm_translation tr;
> +    uint64_t pid;
> +    uint64_t as;
> +    int r;
> +
> +    pid = env->spr[SPR_BOOKE_PID];
> +
> +    if (access_type == ACCESS_CODE)
> +        as = env->msr & msr_ir;
> +    else
> +        as = env->msr & msr_dr;
> +
> +    tr.linear_address = as << 40 | pid << 32 | eaddr;
> +    r = kvm_translate(kvm_context, env->cpu_index, &tr);
> +    if (r == -1)
> +        return r;
> +
> +    if (!tr.valid)
> +        return -EFAULT;
> +
> +    ctx->raddr = 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  = 0x00000009,
>      /* PowerPC 601 MMU model (specific BATs format)            */
>      POWERPC_MMU_601        = 0x0000000A,
> +    /* KVM managing the MMU state                              */
> +    POWERPC_MMU_KVM        = 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 == POWERPC_MMU_KVM)
> +        return mmukvm_get_physical_address(env, ctx, eaddr, rw, access_type);
> +
>      if ((access_type == ACCESS_CODE && msr_ir == 0) ||
>          (access_type != ACCESS_CODE && msr_dr == 0)) {
>          /* No address translation */
> diff --git a/qemu/target-ppc/translate_init.c b/qemu/target-ppc/translate_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 = "PowerPC 601";
>              break;
> +#ifdef KVM
> +        case POWERPC_MMU_KVM:
> +            mmu_model = "PowerPC KVM";
> +            break;
> +#endif
>  #if defined (TARGET_PPC64)
>          case POWERPC_MMU_64B:
>              mmu_model = "PowerPC 64";
>   


-- 

Grüsse / regards, 
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

  reply	other threads:[~2008-12-11 12:53 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-11 12:52 [PATCH] [PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub Christian Ehrhardt
2008-12-11 12:53 ` Christian Ehrhardt [this message]
     [not found]   ` <49410D61.9090309-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2008-12-11 15:53     ` Hollis Blanchard
2008-12-11 16:05       ` Jan Kiszka
2008-12-11 18:31         ` Hollis Blanchard
     [not found]           ` <1229020274.26586.24.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-12-12 12:42             ` Christian Ehrhardt
     [not found]               ` <49425C2B.5040701-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2008-12-13  8:35                 ` Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49410D61.9090309@linux.vnet.ibm.com \
    --to=ehrhardt-23vcf4htsmix0ybbhkvfkdbpr1lh4cv8@public.gmane.org \
    --cc=avi-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=hollisb-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
    --cc=kvm-ppc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox