All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL] QOM CPUState for unicore32
@ 2012-03-30 10:26 Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: Blue Swirl, Peter Maydell, Guan Xuetao, Andreas Färber,
	Anthony Liguori

Hello Anthony or Blue,

Please pull the unicore32 QOM CPU conversion.

Due to my alphabetical ordering in Makefile.target, it is independent
of Peter's upcoming ARM pull.

Cc: Anthony Liguori <anthony@codemonkey.ws>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>

Cc: Peter Maydell <peter.maydell@linaro.org>

The following changes since commit f638f0d3ae214d995cdd94578195700cda24597b:

  qemu tcg: Remove one entry of INDEX_op_ld_i64 from ppc_op_defs (2012-03-29 11:10:08 +0400)

are available in the git repository at:
  git://github.com/afaerber/qemu-cpu.git qom-cpu-unicore32.v3

Andreas Färber (5):
      MAINTAINERS: Add entry for UniCore32
      target-unicore32: Relicense to GPLv2+
      target-unicore32: License future contributions under GPLv2+
      target-unicore32: QOM'ify CPU
      target-unicore32: Move CPU-dependent init into initfn

 MAINTAINERS                  |    5 ++
 Makefile.target              |    1 +
 target-unicore32/cpu-qom.h   |   59 ++++++++++++++++++++++++
 target-unicore32/cpu.c       |  104 ++++++++++++++++++++++++++++++++++++++++++
 target-unicore32/cpu.h       |    4 +-
 target-unicore32/helper.c    |   65 +++-----------------------
 target-unicore32/helper.h    |    3 +-
 target-unicore32/op_helper.c |    3 +-
 target-unicore32/translate.c |    3 +-
 9 files changed, 186 insertions(+), 61 deletions(-)
 create mode 100644 target-unicore32/cpu-qom.h
 create mode 100644 target-unicore32/cpu.c

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v3 1/5] MAINTAINERS: Add entry for UniCore32
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
@ 2012-03-30 10:26 ` Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 2/5] target-unicore32: Relicense to GPLv2+ Andreas Färber
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Andreas Färber

Signed-off-by: Andreas Färber <afaerber@suse.de>
Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
---
 MAINTAINERS |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index f83d07c2..922945c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -112,6 +112,11 @@ M: Blue Swirl <blauwirbel@gmail.com>
 S: Maintained
 F: target-sparc/
 
+UniCore32
+M: Guan Xuetao <gxt@mprc.pku.edu.cn>
+S: Maintained
+F: target-unicore32/
+
 X86
 M: qemu-devel@nongnu.org
 S: Odd Fixes
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v3 2/5] target-unicore32: Relicense to GPLv2+
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
@ 2012-03-30 10:26 ` Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel
  Cc: Blue Swirl, Stefan Weil, Guan Xuetao, Dor Laor, Andreas Färber

Adopt the license text suggested by Guan Xue-tao (with a minor
simplification) for all target-unicore/ files except helper.c.

To helper.c Anthony Liguori contributed a qemu_malloc() -> g_malloc()
conversion, still pending IBM relicensing approval, so that remains
GPLv2 for now.

By relicensing all possible parts now, we avoid having to formally
relicense new, e.g., QOM code.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Dor Laor <dlaor@redhat.com>
---
 target-unicore32/cpu.h       |    3 ++-
 target-unicore32/helper.h    |    3 ++-
 target-unicore32/op_helper.c |    3 ++-
 target-unicore32/translate.c |    3 ++-
 4 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h
index a3f8589..8ec0d2f 100644
--- a/target-unicore32/cpu.h
+++ b/target-unicore32/cpu.h
@@ -5,7 +5,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * published by the Free Software Foundation, or (at your option) any
+ * later version. See the COPYING file in the top-level directory.
  */
 #ifndef __CPU_UC32_H__
 #define __CPU_UC32_H__
diff --git a/target-unicore32/helper.h b/target-unicore32/helper.h
index 615de2a..5a3b8a4 100644
--- a/target-unicore32/helper.h
+++ b/target-unicore32/helper.h
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * published by the Free Software Foundation, or (at your option) any
+ * later version. See the COPYING file in the top-level directory.
  */
 #include "def-helper.h"
 
diff --git a/target-unicore32/op_helper.c b/target-unicore32/op_helper.c
index 638a020..b954c30 100644
--- a/target-unicore32/op_helper.c
+++ b/target-unicore32/op_helper.c
@@ -5,7 +5,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * published by the Free Software Foundation, or (at your option) any
+ * later version. See the COPYING file in the top-level directory.
  */
 #include "cpu.h"
 #include "dyngen-exec.h"
diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c
index 3b3ba16..9793d14 100644
--- a/target-unicore32/translate.c
+++ b/target-unicore32/translate.c
@@ -5,7 +5,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * published by the Free Software Foundation, or (at your option) any
+ * later version. See the COPYING file in the top-level directory.
  */
 #include <stdarg.h>
 #include <stdlib.h>
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v3 3/5] target-unicore32: License future contributions under GPLv2+
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 2/5] target-unicore32: Relicense to GPLv2+ Andreas Färber
@ 2012-03-30 10:26 ` Andreas Färber
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU Andreas Färber
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Andreas Färber

This is to limit relicensing obstacles to the pending IBM investigation.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
---
 target-unicore32/helper.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
index 6af492d..18a9cbb 100644
--- a/target-unicore32/helper.c
+++ b/target-unicore32/helper.c
@@ -4,6 +4,9 @@
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
+ *
+ * Contributions from 2012-04-01 on are considered under GPL version 2,
+ * or (at your option) any later version.
  */
 
 #include "cpu.h"
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
                   ` (2 preceding siblings ...)
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
@ 2012-03-30 10:26 ` Andreas Färber
  2012-03-30 16:15   ` Michael Roth
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
  2012-03-31 13:03 ` [Qemu-devel] [PULL] QOM CPUState for unicore32 Blue Swirl
  5 siblings, 1 reply; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Andreas Färber

Embed CPUUniCore32State as first member of UniCore32CPU.

Contributed under GPLv2+.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
---
 Makefile.target            |    1 +
 target-unicore32/cpu-qom.h |   59 +++++++++++++++++++++++++++++
 target-unicore32/cpu.c     |   90 ++++++++++++++++++++++++++++++++++++++++++++
 target-unicore32/cpu.h     |    1 +
 target-unicore32/helper.c  |   43 +++-----------------
 5 files changed, 158 insertions(+), 36 deletions(-)
 create mode 100644 target-unicore32/cpu-qom.h
 create mode 100644 target-unicore32/cpu.c

diff --git a/Makefile.target b/Makefile.target
index 44b2e83..7cff65f 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -98,6 +98,7 @@ libobj-y += cpu_init.o
 endif
 libobj-$(TARGET_SPARC) += int32_helper.o
 libobj-$(TARGET_SPARC64) += int64_helper.o
+libobj-$(TARGET_UNICORE32) += cpu.o
 libobj-$(TARGET_ALPHA) += int_helper.o fpu_helper.o sys_helper.o mem_helper.o
 
 libobj-y += disas.o
diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h
new file mode 100644
index 0000000..342d85e
--- /dev/null
+++ b/target-unicore32/cpu-qom.h
@@ -0,0 +1,59 @@
+/*
+ * QEMU UniCore32 CPU
+ *
+ * Copyright (c) 2012 SUSE LINUX Products GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation, or (at your option) any
+ * later version. See the COPYING file in the top-level directory.
+ */
+#ifndef QEMU_UC32_CPU_QOM_H
+#define QEMU_UC32_CPU_QOM_H
+
+#include "qemu/cpu.h"
+#include "cpu.h"
+
+#define TYPE_UNICORE32_CPU "unicore32-cpu"
+
+#define UNICORE32_CPU_CLASS(klass) \
+    OBJECT_CLASS_CHECK(UniCore32CPUClass, (klass), TYPE_UNICORE32_CPU)
+#define UNICORE32_CPU(obj) \
+    OBJECT_CHECK(UniCore32CPU, (obj), TYPE_UNICORE32_CPU)
+#define UNICORE32_CPU_GET_CLASS(obj) \
+    OBJECT_GET_CLASS(UniCore32CPUClass, (obj), TYPE_UNICORE32_CPU)
+
+/**
+ * UniCore32CPUClass:
+ *
+ * A UniCore32 CPU model.
+ */
+typedef struct UniCore32CPUClass {
+    /*< private >*/
+    CPUClass parent_class;
+    /*< public >*/
+} UniCore32CPUClass;
+
+/**
+ * UniCore32CPU:
+ * @env: #CPUUniCore32State
+ *
+ * A UniCore32 CPU.
+ */
+typedef struct UniCore32CPU {
+    /*< private >*/
+    CPUState parent_obj;
+    /*< public >*/
+
+    CPUUniCore32State env;
+} UniCore32CPU;
+
+static inline UniCore32CPU *uc32_env_get_cpu(CPUUniCore32State *env)
+{
+    return UNICORE32_CPU(container_of(env, UniCore32CPU, env));
+}
+
+#define ENV_GET_CPU(e) CPU(uc32_env_get_cpu(e))
+
+
+#endif
diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c
new file mode 100644
index 0000000..189b6f6
--- /dev/null
+++ b/target-unicore32/cpu.c
@@ -0,0 +1,90 @@
+/*
+ * QEMU UniCore32 CPU
+ *
+ * Copyright (c) 2010-2011 GUAN Xue-tao
+ * Copyright (c) 2012 SUSE LINUX Products GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Contributions from 2012-04-01 on are considered under GPL version 2,
+ * or (at your option) any later version.
+ */
+
+#include "cpu-qom.h"
+#include "qemu-common.h"
+
+/* CPU models */
+
+typedef struct UniCore32CPUInfo {
+    const char *name;
+    void (*instance_init)(Object *obj);
+} UniCore32CPUInfo;
+
+static void unicore_ii_cpu_initfn(Object *obj)
+{
+    UniCore32CPU *cpu = UNICORE32_CPU(obj);
+    CPUUniCore32State *env = &cpu->env;
+
+    env->cp0.c0_cpuid = 0x40010863;
+}
+
+static void uc32_any_cpu_initfn(Object *obj)
+{
+    UniCore32CPU *cpu = UNICORE32_CPU(obj);
+    CPUUniCore32State *env = &cpu->env;
+
+    env->cp0.c0_cpuid = 0xffffffff;
+}
+
+static const UniCore32CPUInfo uc32_cpus[] = {
+    { .name = "UniCore-II", .instance_init = unicore_ii_cpu_initfn },
+    { .name = "any",        .instance_init = uc32_any_cpu_initfn },
+};
+
+static void uc32_cpu_initfn(Object *obj)
+{
+    UniCore32CPU *cpu = UNICORE32_CPU(obj);
+    CPUUniCore32State *env = &cpu->env;
+
+    cpu_exec_init(env);
+    env->cpu_model_str = object_get_typename(obj);
+
+    env->uncached_asr = ASR_MODE_USER;
+    env->regs[31] = 0;
+
+    tlb_flush(env, 1);
+}
+
+static void uc32_register_cpu_type(const UniCore32CPUInfo *info)
+{
+    TypeInfo type_info = {
+        .name = info->name,
+        .parent = TYPE_UNICORE32_CPU,
+        .instance_init = info->instance_init,
+    };
+
+    type_register_static(&type_info);
+}
+
+static const TypeInfo uc32_cpu_type_info = {
+    .name = TYPE_UNICORE32_CPU,
+    .parent = TYPE_CPU,
+    .instance_size = sizeof(UniCore32CPU),
+    .instance_init = uc32_cpu_initfn,
+    .abstract = true,
+    .class_size = sizeof(UniCore32CPUClass),
+};
+
+static void uc32_cpu_register_types(void)
+{
+    int i;
+
+    type_register_static(&uc32_cpu_type_info);
+    for (i = 0; i < ARRAY_SIZE(uc32_cpus); i++) {
+        uc32_register_cpu_type(&uc32_cpus[i]);
+    }
+}
+
+type_init(uc32_cpu_register_types)
diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h
index 8ec0d2f..81c14ff 100644
--- a/target-unicore32/cpu.h
+++ b/target-unicore32/cpu.h
@@ -160,6 +160,7 @@ static inline void cpu_set_tls(CPUUniCore32State *env, target_ulong newtls)
 }
 
 #include "cpu-all.h"
+#include "cpu-qom.h"
 #include "exec-all.h"
 
 static inline void cpu_pc_from_tb(CPUUniCore32State *env, TranslationBlock *tb)
diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
index 18a9cbb..0f23a40 100644
--- a/target-unicore32/helper.c
+++ b/target-unicore32/helper.c
@@ -19,43 +19,20 @@ static inline void set_feature(CPUUniCore32State *env, int feature)
     env->features |= feature;
 }
 
-struct uc32_cpu_t {
-    uint32_t id;
-    const char *name;
-};
-
-static const struct uc32_cpu_t uc32_cpu_names[] = {
-    { UC32_CPUID_UCV2, "UniCore-II"},
-    { UC32_CPUID_ANY, "any"},
-    { 0, NULL}
-};
-
-/* return 0 if not found */
-static uint32_t uc32_cpu_find_by_name(const char *name)
-{
-    int i;
-    uint32_t id;
-
-    id = 0;
-    for (i = 0; uc32_cpu_names[i].name; i++) {
-        if (strcmp(name, uc32_cpu_names[i].name) == 0) {
-            id = uc32_cpu_names[i].id;
-            break;
-        }
-    }
-    return id;
-}
-
 CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
 {
+    UniCore32CPU *cpu;
     CPUUniCore32State *env;
     uint32_t id;
     static int inited = 1;
 
-    env = g_malloc0(sizeof(CPUUniCore32State));
-    cpu_exec_init(env);
+    if (object_class_by_name(cpu_model) == NULL) {
+        return NULL;
+    }
+    cpu = UNICORE32_CPU(object_new(cpu_model));
+    env = &cpu->env;
 
-    id = uc32_cpu_find_by_name(cpu_model);
+    id = env->cp0.c0_cpuid;
     switch (id) {
     case UC32_CPUID_UCV2:
         set_feature(env, UC32_HWCAP_CMOV);
@@ -72,17 +49,11 @@ CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
         cpu_abort(env, "Bad CPU ID: %x\n", id);
     }
 
-    env->cpu_model_str = cpu_model;
-    env->cp0.c0_cpuid = id;
-    env->uncached_asr = ASR_MODE_USER;
-    env->regs[31] = 0;
-
     if (inited) {
         inited = 0;
         uc32_translate_init();
     }
 
-    tlb_flush(env, 1);
     qemu_init_vcpu(env);
     return env;
 }
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v3 5/5] target-unicore32: Move CPU-dependent init into initfn
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
                   ` (3 preceding siblings ...)
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU Andreas Färber
@ 2012-03-30 10:26 ` Andreas Färber
  2012-03-31 13:03 ` [Qemu-devel] [PULL] QOM CPUState for unicore32 Blue Swirl
  5 siblings, 0 replies; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 10:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Andreas Färber

Instead of setting values in a CPUID switch, do so in initfn functions.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
---
 target-unicore32/cpu.c    |   14 ++++++++++++++
 target-unicore32/helper.c |   23 -----------------------
 2 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c
index 189b6f6..de63f58 100644
--- a/target-unicore32/cpu.c
+++ b/target-unicore32/cpu.c
@@ -15,6 +15,11 @@
 #include "cpu-qom.h"
 #include "qemu-common.h"
 
+static inline void set_feature(CPUUniCore32State *env, int feature)
+{
+    env->features |= feature;
+}
+
 /* CPU models */
 
 typedef struct UniCore32CPUInfo {
@@ -28,6 +33,12 @@ static void unicore_ii_cpu_initfn(Object *obj)
     CPUUniCore32State *env = &cpu->env;
 
     env->cp0.c0_cpuid = 0x40010863;
+
+    set_feature(env, UC32_HWCAP_CMOV);
+    set_feature(env, UC32_HWCAP_UCF64);
+    env->ucf64.xregs[UC32_UCF64_FPSCR] = 0;
+    env->cp0.c0_cachetype = 0x1dd20d2;
+    env->cp0.c1_sys = 0x00090078;
 }
 
 static void uc32_any_cpu_initfn(Object *obj)
@@ -36,6 +47,9 @@ static void uc32_any_cpu_initfn(Object *obj)
     CPUUniCore32State *env = &cpu->env;
 
     env->cp0.c0_cpuid = 0xffffffff;
+
+    set_feature(env, UC32_HWCAP_CMOV);
+    set_feature(env, UC32_HWCAP_UCF64);
 }
 
 static const UniCore32CPUInfo uc32_cpus[] = {
diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
index 0f23a40..9fe4a37 100644
--- a/target-unicore32/helper.c
+++ b/target-unicore32/helper.c
@@ -14,16 +14,10 @@
 #include "helper.h"
 #include "host-utils.h"
 
-static inline void set_feature(CPUUniCore32State *env, int feature)
-{
-    env->features |= feature;
-}
-
 CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
 {
     UniCore32CPU *cpu;
     CPUUniCore32State *env;
-    uint32_t id;
     static int inited = 1;
 
     if (object_class_by_name(cpu_model) == NULL) {
@@ -32,23 +26,6 @@ CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
     cpu = UNICORE32_CPU(object_new(cpu_model));
     env = &cpu->env;
 
-    id = env->cp0.c0_cpuid;
-    switch (id) {
-    case UC32_CPUID_UCV2:
-        set_feature(env, UC32_HWCAP_CMOV);
-        set_feature(env, UC32_HWCAP_UCF64);
-        env->ucf64.xregs[UC32_UCF64_FPSCR] = 0;
-        env->cp0.c0_cachetype = 0x1dd20d2;
-        env->cp0.c1_sys = 0x00090078;
-        break;
-    case UC32_CPUID_ANY: /* For userspace emulation.  */
-        set_feature(env, UC32_HWCAP_CMOV);
-        set_feature(env, UC32_HWCAP_UCF64);
-        break;
-    default:
-        cpu_abort(env, "Bad CPU ID: %x\n", id);
-    }
-
     if (inited) {
         inited = 0;
         uc32_translate_init();
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU Andreas Färber
@ 2012-03-30 16:15   ` Michael Roth
  2012-03-30 21:38     ` Andreas Färber
  0 siblings, 1 reply; 10+ messages in thread
From: Michael Roth @ 2012-03-30 16:15 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On Fri, Mar 30, 2012 at 12:26:09PM +0200, Andreas Färber wrote:
> Embed CPUUniCore32State as first member of UniCore32CPU.
> 
> Contributed under GPLv2+.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>
> ---
>  Makefile.target            |    1 +
>  target-unicore32/cpu-qom.h |   59 +++++++++++++++++++++++++++++
>  target-unicore32/cpu.c     |   90 ++++++++++++++++++++++++++++++++++++++++++++
>  target-unicore32/cpu.h     |    1 +
>  target-unicore32/helper.c  |   43 +++-----------------
>  5 files changed, 158 insertions(+), 36 deletions(-)
>  create mode 100644 target-unicore32/cpu-qom.h
>  create mode 100644 target-unicore32/cpu.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index 44b2e83..7cff65f 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -98,6 +98,7 @@ libobj-y += cpu_init.o
>  endif
>  libobj-$(TARGET_SPARC) += int32_helper.o
>  libobj-$(TARGET_SPARC64) += int64_helper.o
> +libobj-$(TARGET_UNICORE32) += cpu.o
>  libobj-$(TARGET_ALPHA) += int_helper.o fpu_helper.o sys_helper.o mem_helper.o
>  
>  libobj-y += disas.o
> diff --git a/target-unicore32/cpu-qom.h b/target-unicore32/cpu-qom.h
> new file mode 100644
> index 0000000..342d85e
> --- /dev/null
> +++ b/target-unicore32/cpu-qom.h
> @@ -0,0 +1,59 @@
> +/*
> + * QEMU UniCore32 CPU
> + *
> + * Copyright (c) 2012 SUSE LINUX Products GmbH
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation, or (at your option) any
> + * later version. See the COPYING file in the top-level directory.
> + */
> +#ifndef QEMU_UC32_CPU_QOM_H
> +#define QEMU_UC32_CPU_QOM_H
> +
> +#include "qemu/cpu.h"
> +#include "cpu.h"
> +
> +#define TYPE_UNICORE32_CPU "unicore32-cpu"
> +
> +#define UNICORE32_CPU_CLASS(klass) \
> +    OBJECT_CLASS_CHECK(UniCore32CPUClass, (klass), TYPE_UNICORE32_CPU)
> +#define UNICORE32_CPU(obj) \
> +    OBJECT_CHECK(UniCore32CPU, (obj), TYPE_UNICORE32_CPU)
> +#define UNICORE32_CPU_GET_CLASS(obj) \
> +    OBJECT_GET_CLASS(UniCore32CPUClass, (obj), TYPE_UNICORE32_CPU)
> +
> +/**
> + * UniCore32CPUClass:
> + *
> + * A UniCore32 CPU model.
> + */
> +typedef struct UniCore32CPUClass {
> +    /*< private >*/
> +    CPUClass parent_class;
> +    /*< public >*/
> +} UniCore32CPUClass;
> +
> +/**
> + * UniCore32CPU:
> + * @env: #CPUUniCore32State
> + *
> + * A UniCore32 CPU.
> + */
> +typedef struct UniCore32CPU {
> +    /*< private >*/
> +    CPUState parent_obj;
> +    /*< public >*/
> +
> +    CPUUniCore32State env;
> +} UniCore32CPU;
> +
> +static inline UniCore32CPU *uc32_env_get_cpu(CPUUniCore32State *env)
> +{
> +    return UNICORE32_CPU(container_of(env, UniCore32CPU, env));
> +}
> +
> +#define ENV_GET_CPU(e) CPU(uc32_env_get_cpu(e))
> +
> +
> +#endif
> diff --git a/target-unicore32/cpu.c b/target-unicore32/cpu.c
> new file mode 100644
> index 0000000..189b6f6
> --- /dev/null
> +++ b/target-unicore32/cpu.c
> @@ -0,0 +1,90 @@
> +/*
> + * QEMU UniCore32 CPU
> + *
> + * Copyright (c) 2010-2011 GUAN Xue-tao
> + * Copyright (c) 2012 SUSE LINUX Products GmbH
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * Contributions from 2012-04-01 on are considered under GPL version 2,
> + * or (at your option) any later version.
> + */
> +
> +#include "cpu-qom.h"
> +#include "qemu-common.h"
> +
> +/* CPU models */
> +
> +typedef struct UniCore32CPUInfo {
> +    const char *name;
> +    void (*instance_init)(Object *obj);
> +} UniCore32CPUInfo;
> +
> +static void unicore_ii_cpu_initfn(Object *obj)
> +{
> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
> +    CPUUniCore32State *env = &cpu->env;
> +
> +    env->cp0.c0_cpuid = 0x40010863;

Any reason not to use UC32_CPUID_UCV2 here, and UC32_CPUID_ANY below?

> +}
> +
> +static void uc32_any_cpu_initfn(Object *obj)
> +{
> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
> +    CPUUniCore32State *env = &cpu->env;
> +
> +    env->cp0.c0_cpuid = 0xffffffff;
> +}
> +
> +static const UniCore32CPUInfo uc32_cpus[] = {
> +    { .name = "UniCore-II", .instance_init = unicore_ii_cpu_initfn },
> +    { .name = "any",        .instance_init = uc32_any_cpu_initfn },
> +};
> +
> +static void uc32_cpu_initfn(Object *obj)
> +{
> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
> +    CPUUniCore32State *env = &cpu->env;
> +
> +    cpu_exec_init(env);
> +    env->cpu_model_str = object_get_typename(obj);
> +
> +    env->uncached_asr = ASR_MODE_USER;
> +    env->regs[31] = 0;
> +
> +    tlb_flush(env, 1);
> +}
> +
> +static void uc32_register_cpu_type(const UniCore32CPUInfo *info)
> +{
> +    TypeInfo type_info = {
> +        .name = info->name,
> +        .parent = TYPE_UNICORE32_CPU,
> +        .instance_init = info->instance_init,
> +    };
> +
> +    type_register_static(&type_info);
> +}
> +
> +static const TypeInfo uc32_cpu_type_info = {
> +    .name = TYPE_UNICORE32_CPU,
> +    .parent = TYPE_CPU,
> +    .instance_size = sizeof(UniCore32CPU),
> +    .instance_init = uc32_cpu_initfn,
> +    .abstract = true,
> +    .class_size = sizeof(UniCore32CPUClass),
> +};
> +
> +static void uc32_cpu_register_types(void)
> +{
> +    int i;
> +
> +    type_register_static(&uc32_cpu_type_info);
> +    for (i = 0; i < ARRAY_SIZE(uc32_cpus); i++) {
> +        uc32_register_cpu_type(&uc32_cpus[i]);
> +    }
> +}
> +
> +type_init(uc32_cpu_register_types)
> diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h
> index 8ec0d2f..81c14ff 100644
> --- a/target-unicore32/cpu.h
> +++ b/target-unicore32/cpu.h
> @@ -160,6 +160,7 @@ static inline void cpu_set_tls(CPUUniCore32State *env, target_ulong newtls)
>  }
>  
>  #include "cpu-all.h"
> +#include "cpu-qom.h"
>  #include "exec-all.h"
>  
>  static inline void cpu_pc_from_tb(CPUUniCore32State *env, TranslationBlock *tb)
> diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c
> index 18a9cbb..0f23a40 100644
> --- a/target-unicore32/helper.c
> +++ b/target-unicore32/helper.c
> @@ -19,43 +19,20 @@ static inline void set_feature(CPUUniCore32State *env, int feature)
>      env->features |= feature;
>  }
>  
> -struct uc32_cpu_t {
> -    uint32_t id;
> -    const char *name;
> -};
> -
> -static const struct uc32_cpu_t uc32_cpu_names[] = {
> -    { UC32_CPUID_UCV2, "UniCore-II"},
> -    { UC32_CPUID_ANY, "any"},
> -    { 0, NULL}
> -};
> -
> -/* return 0 if not found */
> -static uint32_t uc32_cpu_find_by_name(const char *name)
> -{
> -    int i;
> -    uint32_t id;
> -
> -    id = 0;
> -    for (i = 0; uc32_cpu_names[i].name; i++) {
> -        if (strcmp(name, uc32_cpu_names[i].name) == 0) {
> -            id = uc32_cpu_names[i].id;
> -            break;
> -        }
> -    }
> -    return id;
> -}
> -
>  CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
>  {
> +    UniCore32CPU *cpu;
>      CPUUniCore32State *env;
>      uint32_t id;
>      static int inited = 1;
>  
> -    env = g_malloc0(sizeof(CPUUniCore32State));
> -    cpu_exec_init(env);
> +    if (object_class_by_name(cpu_model) == NULL) {
> +        return NULL;
> +    }
> +    cpu = UNICORE32_CPU(object_new(cpu_model));
> +    env = &cpu->env;
>  
> -    id = uc32_cpu_find_by_name(cpu_model);
> +    id = env->cp0.c0_cpuid;
>      switch (id) {
>      case UC32_CPUID_UCV2:
>          set_feature(env, UC32_HWCAP_CMOV);
> @@ -72,17 +49,11 @@ CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
>          cpu_abort(env, "Bad CPU ID: %x\n", id);
>      }
>  
> -    env->cpu_model_str = cpu_model;
> -    env->cp0.c0_cpuid = id;
> -    env->uncached_asr = ASR_MODE_USER;
> -    env->regs[31] = 0;
> -
>      if (inited) {
>          inited = 0;
>          uc32_translate_init();
>      }
>  
> -    tlb_flush(env, 1);
>      qemu_init_vcpu(env);
>      return env;
>  }
> -- 
> 1.7.7
> 
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU
  2012-03-30 16:15   ` Michael Roth
@ 2012-03-30 21:38     ` Andreas Färber
  2012-03-30 23:04       ` Michael Roth
  0 siblings, 1 reply; 10+ messages in thread
From: Andreas Färber @ 2012-03-30 21:38 UTC (permalink / raw)
  To: Michael Roth; +Cc: qemu-devel

Am 30.03.2012 18:15, schrieb Michael Roth:
> On Fri, Mar 30, 2012 at 12:26:09PM +0200, Andreas Färber wrote:
>> +static void unicore_ii_cpu_initfn(Object *obj)
>> +{
>> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
>> +    CPUUniCore32State *env = &cpu->env;
>> +
>> +    env->cp0.c0_cpuid = 0x40010863;
> 
> Any reason not to use UC32_CPUID_UCV2 here, and UC32_CPUID_ANY below?
> 
>> +}
>> +
>> +static void uc32_any_cpu_initfn(Object *obj)
>> +{
>> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
>> +    CPUUniCore32State *env = &cpu->env;
>> +
>> +    env->cp0.c0_cpuid = 0xffffffff;
>> +}

Yes. Like for target-arm, the idea is to deprecate the use of
CPUID-dependent common code. For unicore32 we are in the lucky position
of being able to do that right away:

commit f8eb3e1d3f4e04b79513655f68fa23a43a31c74c
Author: Andreas Färber <afaerber@suse.de>
Date:   Fri Mar 30 23:19:20 2012 +0200

    target-unicore32: Drop UC32_CPUID macros

    Any code that depends on a particular CPU type can now go through
    callbacks on the QOM UniCore32CPUClass.

    Signed-off-by: Andreas Färber <afaerber@suse.de>

diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h
index 81c14ff..50d5695 100644
--- a/target-unicore32/cpu.h
+++ b/target-unicore32/cpu.h
@@ -120,10 +120,6 @@ void cpu_asr_write(CPUUniCore32State *env1,
target_ulong val, target_ulong mask)
 #define UC32_HWCAP_CMOV                 4 /* 1 << 2 */
 #define UC32_HWCAP_UCF64                8 /* 1 << 3 */

-#define UC32_CPUID(env)                 (env->cp0.c0_cpuid)
-#define UC32_CPUID_UCV2                 0x40010863
-#define UC32_CPUID_ANY                  0xffffffff
-
 #define cpu_init                        uc32_cpu_init
 #define cpu_exec                        uc32_cpu_exec
 #define cpu_signal_handler              uc32_cpu_signal_handler

But that can be done as follow-up IMO (just like adding reset support).

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU
  2012-03-30 21:38     ` Andreas Färber
@ 2012-03-30 23:04       ` Michael Roth
  0 siblings, 0 replies; 10+ messages in thread
From: Michael Roth @ 2012-03-30 23:04 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On Fri, Mar 30, 2012 at 11:38:02PM +0200, Andreas Färber wrote:
> Am 30.03.2012 18:15, schrieb Michael Roth:
> > On Fri, Mar 30, 2012 at 12:26:09PM +0200, Andreas Färber wrote:
> >> +static void unicore_ii_cpu_initfn(Object *obj)
> >> +{
> >> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
> >> +    CPUUniCore32State *env = &cpu->env;
> >> +
> >> +    env->cp0.c0_cpuid = 0x40010863;
> > 
> > Any reason not to use UC32_CPUID_UCV2 here, and UC32_CPUID_ANY below?
> > 
> >> +}
> >> +
> >> +static void uc32_any_cpu_initfn(Object *obj)
> >> +{
> >> +    UniCore32CPU *cpu = UNICORE32_CPU(obj);
> >> +    CPUUniCore32State *env = &cpu->env;
> >> +
> >> +    env->cp0.c0_cpuid = 0xffffffff;
> >> +}
> 
> Yes. Like for target-arm, the idea is to deprecate the use of
> CPUID-dependent common code. For unicore32 we are in the lucky position
> of being able to do that right away:
> 
> commit f8eb3e1d3f4e04b79513655f68fa23a43a31c74c
> Author: Andreas Färber <afaerber@suse.de>
> Date:   Fri Mar 30 23:19:20 2012 +0200
> 
>     target-unicore32: Drop UC32_CPUID macros
> 
>     Any code that depends on a particular CPU type can now go through
>     callbacks on the QOM UniCore32CPUClass.
> 
>     Signed-off-by: Andreas Färber <afaerber@suse.de>
> 
> diff --git a/target-unicore32/cpu.h b/target-unicore32/cpu.h
> index 81c14ff..50d5695 100644
> --- a/target-unicore32/cpu.h
> +++ b/target-unicore32/cpu.h
> @@ -120,10 +120,6 @@ void cpu_asr_write(CPUUniCore32State *env1,
> target_ulong val, target_ulong mask)
>  #define UC32_HWCAP_CMOV                 4 /* 1 << 2 */
>  #define UC32_HWCAP_UCF64                8 /* 1 << 3 */
> 
> -#define UC32_CPUID(env)                 (env->cp0.c0_cpuid)
> -#define UC32_CPUID_UCV2                 0x40010863
> -#define UC32_CPUID_ANY                  0xffffffff
> -
>  #define cpu_init                        uc32_cpu_init
>  #define cpu_exec                        uc32_cpu_exec
>  #define cpu_signal_handler              uc32_cpu_signal_handler
> 
> But that can be done as follow-up IMO (just like adding reset support).

Ahh, gotcha, thanks (and agreed)

> 
> Andreas
> 
> -- 
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PULL] QOM CPUState for unicore32
  2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
                   ` (4 preceding siblings ...)
  2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
@ 2012-03-31 13:03 ` Blue Swirl
  5 siblings, 0 replies; 10+ messages in thread
From: Blue Swirl @ 2012-03-31 13:03 UTC (permalink / raw)
  To: Andreas Färber
  Cc: Peter Maydell, Guan Xuetao, qemu-devel, Anthony Liguori

On Fri, Mar 30, 2012 at 10:26, Andreas Färber <afaerber@suse.de> wrote:
> Hello Anthony or Blue,
>
> Please pull the unicore32 QOM CPU conversion.

Thanks, pulled.

> Due to my alphabetical ordering in Makefile.target, it is independent
> of Peter's upcoming ARM pull.
>
> Cc: Anthony Liguori <anthony@codemonkey.ws>
> Cc: Blue Swirl <blauwirbel@gmail.com>
> Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
>
> Cc: Peter Maydell <peter.maydell@linaro.org>
>
> The following changes since commit f638f0d3ae214d995cdd94578195700cda24597b:
>
>  qemu tcg: Remove one entry of INDEX_op_ld_i64 from ppc_op_defs (2012-03-29 11:10:08 +0400)
>
> are available in the git repository at:
>  git://github.com/afaerber/qemu-cpu.git qom-cpu-unicore32.v3
>
> Andreas Färber (5):
>      MAINTAINERS: Add entry for UniCore32
>      target-unicore32: Relicense to GPLv2+
>      target-unicore32: License future contributions under GPLv2+
>      target-unicore32: QOM'ify CPU
>      target-unicore32: Move CPU-dependent init into initfn
>
>  MAINTAINERS                  |    5 ++
>  Makefile.target              |    1 +
>  target-unicore32/cpu-qom.h   |   59 ++++++++++++++++++++++++
>  target-unicore32/cpu.c       |  104 ++++++++++++++++++++++++++++++++++++++++++
>  target-unicore32/cpu.h       |    4 +-
>  target-unicore32/helper.c    |   65 +++-----------------------
>  target-unicore32/helper.h    |    3 +-
>  target-unicore32/op_helper.c |    3 +-
>  target-unicore32/translate.c |    3 +-
>  9 files changed, 186 insertions(+), 61 deletions(-)
>  create mode 100644 target-unicore32/cpu-qom.h
>  create mode 100644 target-unicore32/cpu.c

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-03-31 13:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-30 10:26 [Qemu-devel] [PULL] QOM CPUState for unicore32 Andreas Färber
2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 2/5] target-unicore32: Relicense to GPLv2+ Andreas Färber
2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 4/5] target-unicore32: QOM'ify CPU Andreas Färber
2012-03-30 16:15   ` Michael Roth
2012-03-30 21:38     ` Andreas Färber
2012-03-30 23:04       ` Michael Roth
2012-03-30 10:26 ` [Qemu-devel] [PATCH v3 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
2012-03-31 13:03 ` [Qemu-devel] [PULL] QOM CPUState for unicore32 Blue Swirl

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.