Skip to contentSkip to conversation

update gdbstub support

PATCH In review Christian Ehrhardt 3 participants 6 messages Dec 11, 2008 – Dec 17, 2008 KVM

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 update gdbstub support

This patch series updates the gdbstub support for kvm.
Patch 1&2 introduce basic powerpc support while patch 3 fixes gdbstub generic code that was broken in a qemu merge.
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#1 lore raw

PATCH 1/1 kvm-userspace: ppc: Add kvm_translate wrapper

# HG changeset patch
# User Christian Ehrhardt <[email protected]> # Date 1228924564 -3600
# Node ID 38846cef16e56c681da1ddc179e248972c8b2ff9
# Parent 705d874ff7a24484eaa15ed75a748c4e1a70c2ef
[PATCH] kvm-userspace: ppc: Add kvm_translate wrapper

From: Hollis Blanchard <hollisb-r/[email protected]>

Add kvm_translate() wrapper used to get mmu translations from userspace.

---

[diffstat]

 libkvm.c |    5 +++++
 libkvm.h |    2 ++
 2 files changed, 7 insertions(+)

[diff]

libkvm/libkvm.c +5 -0
@@ -987,6 +987,11 @@ int kvm_guest_debug(kvm_context_t kvm, i
 	return ioctl(kvm->vcpu_fd[vcpu], KVM_DEBUG_GUEST, dbg);
 }
 
+int kvm_translate(kvm_context_t kvm, int vcpu, struct kvm_translation *tr)
+{
+	return ioctl(kvm->vcpu_fd[vcpu], KVM_TRANSLATE, tr);
+}
+
 int kvm_set_signal_mask(kvm_context_t kvm, int vcpu, const sigset_t *sigset)
 {
 	struct kvm_signal_mask *sigmask;
libkvm/libkvm.h +2 -0
@@ -639,6 +639,8 @@ int kvm_set_pit(kvm_context_t kvm, struc
 int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s);
 #endif
 
+int kvm_translate(kvm_context_t kvm, int vcpu, struct kvm_translation *tr);
+
 #endif
 
 #ifdef KVM_CAP_VAPIC

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw

PATCH 1/1 qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub

In reply to Christian Ehrhardt

# HG changeset patch
# User Christian Ehrhardt <[email protected]> # Date 1228989956 -3600
# Node ID 6f228c807ad0b239b7342d2974debfc66418d784
# Parent 38846cef16e56c681da1ddc179e248972c8b2ff9
[PATCH] qemu: ppc: kvm-userspace: KVM PowerPC support for qemu gdbstub

From: Hollis Blanchard <hollisb-r/[email protected]>

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.

---

[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]

qemu/gdbstub.c +2 -0
@@ -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->gcpu);
         if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0)
             put_packet(s, "E14");
         else
qemu/hw/ppc440_bamboo.c +1 -0
@@ -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");
qemu/qemu-kvm-powerpc.c +28 -0
@@ -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)
 {
 }
qemu/target-ppc/cpu.h +2 -0
@@ -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                                     */
qemu/target-ppc/helper.c +4 -0
@@ -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 */
qemu/target-ppc/translate_init.c +5 -0
@@ -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";

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw

PATCH 1/1 kvm-userspace: fix gdbstub kvm integration

In reply to Christian Ehrhardt

# HG changeset patch
# User Christian Ehrhardt <[email protected]> # Date 1228989958 -3600
# Node ID f80fb35de91fe69dae889c70948c9a53212ee444
# Parent 6f228c807ad0b239b7342d2974debfc66418d784
[PATCH] kvm-userspace: fix gdbstub kvm integration

From: Christian Ehrhardt <[email protected]>

Some recent qemu upstream merges brought in a new concept to not use "env" as current cpu in gdb_handle_packet anymore. But the kvm calls still do, this leads to SIGDEV's as env is not initialized when calling the functions like kvm_save_registers.

Insted there is now a gdbstate structure holding current cpu for step/continue and "other" ops splitted.

This patch changes the kvm_save_registers calls to use the right CPUState variable for the kvm calls in gdb_handle_packet.

---

[diffstat]

 gdbstub.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

[diff]

qemu/gdbstub.c +2 -2
@@ -1348,7 +1348,7 @@ static int gdb_handle_packet(GDBState *s
         }
         break;
     case 'g':
-        kvm_save_registers(env);
+        kvm_save_registers(s->g_cpu);
         len = 0;
         for (addr = 0; addr < num_g_regs; addr++) {
             reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
@@ -1366,7 +1366,7 @@ static int gdb_handle_packet(GDBState *s
             len -= reg_size;
             registers += reg_size;
         }
-        kvm_load_registers(env);
+        kvm_load_registers(s->g_cpu);
         put_packet(s, "OK");
         break;
     case 'm':

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#4 lore raw

Re: [PATCH 3 of 3] [PATCH] kvm-userspace: fix gdbstub kvm integration

Hello

I was trying to debug my patch that is not working and noticed this crash in current kvm git.

The patch below makes kvm not crash when gdb is attched to gdbserver so it certainly improves things.

Thanks

Michal

PS if you want further input from me add me to CC

Quoted 51 lines · Christian Ehrhardt

# HG changeset patch
# User Christian Ehrhardt <[email protected]> # Date 1228989958 -3600
# Node ID f80fb35de91fe69dae889c70948c9a53212ee444
# Parent 6f228c807ad0b239b7342d2974debfc66418d784
[PATCH] kvm-userspace: fix gdbstub kvm integration

From: Christian Ehrhardt <[email protected]>

Some recent qemu upstream merges brought in a new concept to not use "env" as current cpu in gdb_handle_packet anymore. But the kvm calls still do, this leads to SIGDEV's as env is not initialized when calling the functions like kvm_save_registers.

Insted there is now a gdbstate structure holding current cpu for step/continue and "other" ops splitted.

This patch changes the kvm_save_registers calls to use the right CPUState variable for the kvm calls in gdb_handle_packet.

---

[diffstat]

  gdbstub.c |    8 ++++----
  1 file changed, 4 insertions(+), 4 deletions(-)

[diff]

diff --git a/qemu/gdbstub.c b/qemu/gdbstub.c
--- a/qemu/gdbstub.c
+++ b/qemu/gdbstub.c
@@ -1348,7 +1348,7 @@ static int gdb_handle_packet(GDBState *s

         }
         break;
     case 'g':
 -        kvm_save_registers(env);
 +        kvm_save_registers(s->g_cpu);
         len = 0;
         for (addr = 0; addr < num_g_regs; addr++) {
             reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
 @@ -1366,7 +1366,7 @@ static int gdb_handle_packet(GDBState *s
             len -= reg_size;
             registers += reg_size;
         }
 -        kvm_load_registers(env);
 +        kvm_load_registers(s->g_cpu);
         put_packet(s, "OK");
         break;
     case 'm':
Quoted 6 lines

--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw
In reply to Christian Ehrhardt
Quoted 4 lines · Christian Ehrhardt

This patch series updates the gdbstub support for kvm.
Patch 1&2 introduce basic powerpc support while patch 3 fixes gdbstub generic code that was broken in a qemu merge.

Please rebase, as the recent debug changes probably affect this area.

Signature · 1 line
error compiling committee.c: too many arguments to function