qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: qemu-devel qemu-devel <qemu-devel@nongnu.org>
Cc: "Blue Swirl" <blauwirbel@gmail.com>,
	"qemu-ppc@nongnu.org list:PowerPC" <qemu-ppc@nongnu.org>,
	"Aurélien Jarno" <aurelien@aurel32.net>,
	"David Gibson" <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 57/66] target-ppc: Add mechanism for synchronizing SPRs with KVM
Date: Fri,  8 Mar 2013 21:06:59 +0100	[thread overview]
Message-ID: <1362773228-1747-58-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1362773228-1747-1-git-send-email-agraf@suse.de>

From: David Gibson <david@gibson.dropbear.id.au>

Currently when runing under KVM on ppc, we synchronize a certain number of
vital SPRs to KVM through the SET_SREGS call.  This leaves out quite a lot
of important SPRs which are maintained in KVM.  It would be helpful to
have their contents in qemu for debugging purposes, and when we implement
migration it will be vital, since they include important guest state that
will need to be restored on the target.

This patch sets up for synchronization of any registers supported by the
KVM ONE_REG calls.  A new variant on spr_register() allows a ONE_REG id to
be stored with the SPR information.  When we set/get information to KVM
we also synchronize any SPRs so registered.

For now we set this mechanism up to synchronize a handful of important
registers that already have ONE_REG IDs, notably the DAR and DSISR.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 target-ppc/cpu.h            |    6 ++
 target-ppc/kvm.c            |  115 ++++++++++++++++++++++++++++++++++++++++---
 target-ppc/translate_init.c |  114 ++++++++++++++++++++++++------------------
 3 files changed, 178 insertions(+), 57 deletions(-)

diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index e4cf96c..417abb0 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -329,6 +329,12 @@ struct ppc_spr_t {
     void (*hea_write)(void *opaque, int spr_num, int gpr_num);
 #endif
     const char *name;
+#ifdef CONFIG_KVM
+    /* We (ab)use the fact that all the SPRs will have ids for the
+     * ONE_REG interface will have KVM_REG_PPC to use 0 as meaning,
+     * don't sync this */
+    uint64_t one_reg_id;
+#endif
 };
 
 /* Altivec registers (128 bits) */
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index a89c3cf..02ab559 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -61,6 +61,7 @@ static int cap_ppc_smt;
 static int cap_ppc_rma;
 static int cap_spapr_tce;
 static int cap_hior;
+static int cap_one_reg;
 
 /* XXX We have a race condition where we actually have a level triggered
  *     interrupt, but the infrastructure can't expose that yet, so the guest
@@ -89,6 +90,7 @@ int kvm_arch_init(KVMState *s)
     cap_ppc_smt = kvm_check_extension(s, KVM_CAP_PPC_SMT);
     cap_ppc_rma = kvm_check_extension(s, KVM_CAP_PPC_RMA);
     cap_spapr_tce = kvm_check_extension(s, KVM_CAP_SPAPR_TCE);
+    cap_one_reg = kvm_check_extension(s, KVM_CAP_ONE_REG);
     cap_hior = kvm_check_extension(s, KVM_CAP_PPC_HIOR);
 
     if (!cap_interrupt_level) {
@@ -449,6 +451,76 @@ static void kvm_sw_tlb_put(PowerPCCPU *cpu)
     g_free(bitmap);
 }
 
+static void kvm_get_one_spr(CPUState *cs, uint64_t id, int spr)
+{
+    PowerPCCPU *cpu = POWERPC_CPU(cs);
+    CPUPPCState *env = &cpu->env;
+    union {
+        uint32_t u32;
+        uint64_t u64;
+    } val;
+    struct kvm_one_reg reg = {
+        .id = id,
+        .addr = (uintptr_t) &val,
+    };
+    int ret;
+
+    ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
+    if (ret != 0) {
+        fprintf(stderr, "Warning: Unable to retrieve SPR %d from KVM: %s\n",
+                spr, strerror(errno));
+    } else {
+        switch (id & KVM_REG_SIZE_MASK) {
+        case KVM_REG_SIZE_U32:
+            env->spr[spr] = val.u32;
+            break;
+
+        case KVM_REG_SIZE_U64:
+            env->spr[spr] = val.u64;
+            break;
+
+        default:
+            /* Don't handle this size yet */
+            abort();
+        }
+    }
+}
+
+static void kvm_put_one_spr(CPUState *cs, uint64_t id, int spr)
+{
+    PowerPCCPU *cpu = POWERPC_CPU(cs);
+    CPUPPCState *env = &cpu->env;
+    union {
+        uint32_t u32;
+        uint64_t u64;
+    } val;
+    struct kvm_one_reg reg = {
+        .id = id,
+        .addr = (uintptr_t) &val,
+    };
+    int ret;
+
+    switch (id & KVM_REG_SIZE_MASK) {
+    case KVM_REG_SIZE_U32:
+        val.u32 = env->spr[spr];
+        break;
+
+    case KVM_REG_SIZE_U64:
+        val.u64 = env->spr[spr];
+        break;
+
+    default:
+        /* Don't handle this size yet */
+        abort();
+    }
+
+    ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
+    if (ret != 0) {
+        fprintf(stderr, "Warning: Unable to set SPR %d to KVM: %s\n",
+                spr, strerror(errno));
+    }
+}
+
 int kvm_arch_put_registers(CPUState *cs, int level)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
@@ -530,15 +602,22 @@ int kvm_arch_put_registers(CPUState *cs, int level)
     }
 
     if (cap_hior && (level >= KVM_PUT_RESET_STATE)) {
-        uint64_t hior = env->spr[SPR_HIOR];
-        struct kvm_one_reg reg = {
-            .id = KVM_REG_PPC_HIOR,
-            .addr = (uintptr_t) &hior,
-        };
+        kvm_put_one_spr(cs, KVM_REG_PPC_HIOR, SPR_HIOR);
+    }
 
-        ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
-        if (ret) {
-            return ret;
+    if (cap_one_reg) {
+        int i;
+
+        /* We deliberately ignore errors here, for kernels which have
+         * the ONE_REG calls, but don't support the specific
+         * registers, there's a reasonable chance things will still
+         * work, at least until we try to migrate. */
+        for (i = 0; i < 1024; i++) {
+            uint64_t id = env->spr_cb[i].one_reg_id;
+
+            if (id != 0) {
+                kvm_put_one_spr(cs, id, i);
+            }
         }
     }
 
@@ -721,6 +800,26 @@ int kvm_arch_get_registers(CPUState *cs)
         }
     }
 
+    if (cap_hior) {
+        kvm_get_one_spr(cs, KVM_REG_PPC_HIOR, SPR_HIOR);
+    }
+
+    if (cap_one_reg) {
+        int i;
+
+        /* We deliberately ignore errors here, for kernels which have
+         * the ONE_REG calls, but don't support the specific
+         * registers, there's a reasonable chance things will still
+         * work, at least until we try to migrate. */
+        for (i = 0; i < 1024; i++) {
+            uint64_t id = env->spr_cb[i].one_reg_id;
+
+            if (id != 0) {
+                kvm_get_one_spr(cs, id, i);
+            }
+        }
+    }
+
     return 0;
 }
 
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index 1015077..7fb314c 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -572,26 +572,42 @@ static inline void vscr_init (CPUPPCState *env, uint32_t val)
     set_flush_to_zero(vscr_nj, &env->vec_status);
 }
 
-#if defined(CONFIG_USER_ONLY)
-#define spr_register(env, num, name, uea_read, uea_write,                     \
-                     oea_read, oea_write, initial_value)                      \
-do {                                                                          \
-     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
-} while (0)
-static inline void _spr_register (CPUPPCState *env, int num,
-                                  const char *name,
-                                  void (*uea_read)(void *opaque, int gprn, int sprn),
-                                  void (*uea_write)(void *opaque, int sprn, int gprn),
-                                  target_ulong initial_value)
+#ifdef CONFIG_USER_ONLY
+#define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
+                         oea_read, oea_write, one_reg_id, initial_value)       \
+    _spr_register(env, num, name, uea_read, uea_write, initial_value)
+#else
+#if !defined(CONFIG_KVM)
+#define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
+                         oea_read, oea_write, one_reg_id, initial_value) \
+    _spr_register(env, num, name, uea_read, uea_write,                         \
+                  oea_read, oea_write, initial_value)
 #else
-static inline void spr_register (CPUPPCState *env, int num,
+#define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
+                         oea_read, oea_write, one_reg_id, initial_value) \
+    _spr_register(env, num, name, uea_read, uea_write,                         \
+                  oea_read, oea_write, one_reg_id, initial_value)
+#endif
+#endif
+
+#define spr_register(env, num, name, uea_read, uea_write,                      \
+                     oea_read, oea_write, initial_value)                       \
+    spr_register_kvm(env, num, name, uea_read, uea_write,                      \
+                     oea_read, oea_write, 0, initial_value)
+
+static inline void _spr_register(CPUPPCState *env, int num,
                                  const char *name,
                                  void (*uea_read)(void *opaque, int gprn, int sprn),
                                  void (*uea_write)(void *opaque, int sprn, int gprn),
+#if !defined(CONFIG_USER_ONLY)
+
                                  void (*oea_read)(void *opaque, int gprn, int sprn),
                                  void (*oea_write)(void *opaque, int sprn, int gprn),
-                                 target_ulong initial_value)
 #endif
+#if defined(CONFIG_KVM)
+                                 uint64_t one_reg_id,
+#endif
+                                 target_ulong initial_value)
 {
     ppc_spr_t *spr;
 
@@ -667,14 +683,14 @@ static void gen_spr_generic (CPUPPCState *env)
 static void gen_spr_ne_601 (CPUPPCState *env)
 {
     /* Exception processing */
-    spr_register(env, SPR_DSISR, "DSISR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
-    spr_register(env, SPR_DAR, "DAR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
+    spr_register_kvm(env, SPR_DSISR, "DSISR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DSISR, 0x00000000);
+    spr_register_kvm(env, SPR_DAR, "DAR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DAR, 0x00000000);
     /* Timer */
     spr_register(env, SPR_DECR, "DECR",
                  SPR_NOACCESS, SPR_NOACCESS,
@@ -918,10 +934,10 @@ static void gen_spr_7xx (CPUPPCState *env)
 {
     /* Breakpoints */
     /* XXX : not implemented */
-    spr_register(env, SPR_DABR, "DABR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
+    spr_register_kvm(env, SPR_DABR, "DABR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DABR, 0x00000000);
     /* XXX : not implemented */
     spr_register(env, SPR_IABR, "IABR",
                  SPR_NOACCESS, SPR_NOACCESS,
@@ -1047,10 +1063,10 @@ static void gen_spr_604 (CPUPPCState *env)
                  &spr_read_generic, &spr_write_generic,
                  0x00000000);
     /* XXX : not implemented */
-    spr_register(env, SPR_DABR, "DABR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
+    spr_register_kvm(env, SPR_DABR, "DABR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DABR, 0x00000000);
     /* Performance counters */
     /* XXX : not implemented */
     spr_register(env, SPR_MMCR0, "MMCR0",
@@ -2305,14 +2321,14 @@ static void gen_spr_620 (CPUPPCState *env)
 static void gen_spr_5xx_8xx (CPUPPCState *env)
 {
     /* Exception processing */
-    spr_register(env, SPR_DSISR, "DSISR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
-    spr_register(env, SPR_DAR, "DAR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
+    spr_register_kvm(env, SPR_DSISR, "DSISR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DSISR, 0x00000000);
+    spr_register_kvm(env, SPR_DAR, "DAR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DAR, 0x00000000);
     /* Timer */
     spr_register(env, SPR_DECR, "DECR",
                  SPR_NOACCESS, SPR_NOACCESS,
@@ -7036,22 +7052,22 @@ static void init_proc_POWER7 (CPUPPCState *env)
                  0x00000000);
 #if !defined(CONFIG_USER_ONLY)
     /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
-    spr_register(env, SPR_PURR,   "PURR",
-                 &spr_read_purr, SPR_NOACCESS,
-                 &spr_read_purr, SPR_NOACCESS,
-                 0x00000000);
-    spr_register(env, SPR_SPURR,   "SPURR",
-                 &spr_read_purr, SPR_NOACCESS,
-                 &spr_read_purr, SPR_NOACCESS,
-                 0x00000000);
+    spr_register_kvm(env, SPR_PURR,   "PURR",
+                     &spr_read_purr, SPR_NOACCESS,
+                     &spr_read_purr, SPR_NOACCESS,
+                     KVM_REG_PPC_PURR, 0x00000000);
+    spr_register_kvm(env, SPR_SPURR,   "SPURR",
+                     &spr_read_purr, SPR_NOACCESS,
+                     &spr_read_purr, SPR_NOACCESS,
+                     KVM_REG_PPC_SPURR, 0x00000000);
     spr_register(env, SPR_CFAR, "SPR_CFAR",
                  SPR_NOACCESS, SPR_NOACCESS,
                  &spr_read_cfar, &spr_write_cfar,
                  0x00000000);
-    spr_register(env, SPR_DSCR, "SPR_DSCR",
-                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
-                 0x00000000);
+    spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
+                     SPR_NOACCESS, SPR_NOACCESS,
+                     &spr_read_generic, &spr_write_generic,
+                     KVM_REG_PPC_DSCR, 0x00000000);
 #endif /* !CONFIG_USER_ONLY */
     /* Memory management */
     /* XXX : not implemented */
-- 
1.6.0.2

  parent reply	other threads:[~2013-03-08 20:08 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-08 20:06 [Qemu-devel] [PULL 00/66] ppc patch queue 2013-03-08 Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 01/66] pseries: Add cleanup hook for PAPR virtual LAN device Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 02/66] target-ppc: Fix CPU_POWERPC_MPC8547E Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 03/66] target-ppc: Fix "G2leGP3" PVR Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 04/66] target-ppc: Update error handling in ppc_cpu_realize() Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 05/66] target-ppc: Drop nested TARGET_PPC64 guard for POWER7 Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 06/66] target-ppc: Inline comma into POWERPC_DEF_SVR() macro Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 07/66] target-ppc: Extract aliases from definitions list Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 08/66] target-ppc: Make -cpu "ppc" an alias to "ppc32" Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 09/66] target-ppc: Extract MPC5xx aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 10/66] target-ppc: Extract MGT823/MPC8xx as aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 11/66] target-ppc: Extract 40x aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 12/66] target-ppc: Extract 440 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 13/66] target-ppc: Turn "ppc32" and "ppc64" CPUs into aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 14/66] target-ppc: Extract 74x7[A] aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 15/66] target-ppc: Extract 74x5 as aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 16/66] target-ppc: Extract 74x1 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 17/66] target-ppc: Extract 7450 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 18/66] target-ppc: Extract 7448 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 19/66] target-ppc: Extract 7410 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 20/66] target-ppc: Extract 7400 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 21/66] target-ppc: Extract 7x5 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 22/66] target-ppc: Extract 750 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 23/66] target-ppc: Extract 740/750 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 24/66] target-ppc: Extract 603e alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 25/66] target-ppc: Extract 603r alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 26/66] target-ppc: Extract 601/601v aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 27/66] target-ppc: Extract 604e alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 28/66] target-ppc: Extract MPC85xx aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 29/66] target-ppc: Extract e500v1/e500v2 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 30/66] target-ppc: Extract MPC83xx aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 31/66] target-ppc: Extract e300 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 32/66] target-ppc: Extract e200 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 33/66] target-ppc: Extract MPC82xx alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 34/66] target-ppc: Extract MPC8247/MPC8248/MPC8270-80 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 35/66] target-ppc: Extract MPC82xx aliases to *_HiP4 Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 36/66] target-ppc: Extract MPC82xx_HiP{3, 4} aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 37/66] target-ppc: Extract MPC52xx alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 38/66] target-ppc: Extract MPC5200/MPC5200B aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 39/66] target-ppc: Extract MPC8240 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 40/66] target-ppc: Extract 405GPe alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 41/66] target-ppc: Extract 970 aliases Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 42/66] target-ppc: Extract POWER7 alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 43/66] target-ppc: Get model name from type name Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 44/66] target-ppc: Convert CPU definitions Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 45/66] target-ppc: Introduce abstract CPU family types Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 46/66] target-ppc: Set instruction flags on CPU family classes Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 47/66] target-ppc: Register all types for TARGET_PPCEMB Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 48/66] target-ppc: Set remaining fields on CPU family classes Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 49/66] target-ppc: Turn descriptive CPU family comments into device descriptions Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 50/66] target-ppc: Turn descriptive CPU model " Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 51/66] target-ppc: Update Coding Style for CPU models Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 52/66] target-ppc: Split model definitions out of translate_init.c Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 53/66] target-ppc: Fix remaining microcontroller typos among models Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 54/66] target-ppc: Change "POWER7" CPU alias Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 55/66] pseries: Implement h_read hcall Alexander Graf
2013-03-08 20:06 ` [Qemu-devel] [PATCH 56/66] Save memory allocation in the elf loader Alexander Graf
2013-03-08 20:06 ` Alexander Graf [this message]
2013-03-08 20:07 ` [Qemu-devel] [PATCH 58/66] target-ppc: Synchronize FPU state with KVM Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 59/66] target-ppc: Fix PPC_DUMP_SPR_ACCESS build Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 60/66] PPC: Fix dma interrupt Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 61/66] PPC: xnu kernel expects FLUSH to be cleared on STOP Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 62/66] target-ppc: Make host CPU a subclass of the host's CPU model Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 63/66] target-ppc: List alias names alongside CPU models Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 64/66] target-ppc: Report CPU aliases for QMP Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 65/66] target-ppc: Move CPU aliases out of translate_init.c Alexander Graf
2013-03-08 20:07 ` [Qemu-devel] [PATCH 66/66] pseries: Add compatible property to root of device tree Alexander Graf
2013-03-09 12:09 ` [Qemu-devel] [PULL 00/66] ppc patch queue 2013-03-08 Blue Swirl

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=1362773228-1747-58-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=aurelien@aurel32.net \
    --cc=blauwirbel@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.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;
as well as URLs for NNTP newsgroup(s).