All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU
@ 2012-03-29 17:14 Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 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-29 17:14 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Guan Xue-tao, Andreas Färber, Anthony Liguori

Hello Xuetao,

This updated series converts the UniCore32 CPU to QOM. In addition to
addressing review comments from v1, a new approach for CPU-dependent
values has been adopted: We should keep setting of features imperative
and can avoid adding new class fields as storage for default values
by moving the existing imperative code into new initfn functions.

Patch 1 adds a "UniCore32 CPU guest core (TCG)" section to MAINTAINERS,
so that the target-unicore32 author gets notified of patches against his code.

Patch 2, based on feedback from Guan Xuetao, changes the license of most
target-unicore32 files from GPLv2 to GPLv2+. Anthony had contributed a
qemu_malloc() -> g_malloc() substitution that he can't relicense at this time,
so leave that as GPLv2 and declare my following patches explicitly as GPLv2+.
Patch 3 adds a notice to license any following contributions under GPLv2+ already.

Patch 4 embeds CPUUniCore32State into UniCore32CPU. My new cpu-qom.h header
can be GPLv2+, but into cpu.c we're moving helper.c code so make it GPLv2 for now.

Patch 5 cleans up uc32_cpu_init() function by moving initializations into initfn.

Could you test this please and, if happy, provide your Acked-by for patches 1 and 3-5?

Available from:
git://github.com/afaerber/qemu-cpu.git qom-cpu-unicore32.v2
https://github.com/afaerber/qemu-cpu/commits/qom-cpu-unicore32.v2

Regards,
Andreas

Cc: Guan Xue-tao <gxt@mprc.pku.edu.cn>
Cc: Anthony Liguori <anthony@codemonkey.ws>
Cc: Peter Maydell <peter.maydell@linaro.org>

v1 -> v2:
* Change license notice to match the previous one more closely.
* Adopt that license notice for new cpu-qom.h as well.
* Add notices to helper.c and cpu.c to license future contributions under GPLv2+.
* Adopt Peter's approach of using per-CPU initfn functions for default values.
* Squash init code movement together (no new UniCore32CPUClass members needed).
* Various naming updates (e.g., ..._type_info).

Changes from former repo.or.cz qom-cpu[-wip] branch:
* Drop duplicate .instance_init.

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

-- 
1.7.7

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

* [Qemu-devel] [PATCH v2 1/5] MAINTAINERS: Add entry for UniCore32
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
@ 2012-03-29 17:14 ` Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 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-29 17:14 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 v2 2/5] target-unicore32: Relicense to GPLv2+
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
@ 2012-03-29 17:14 ` Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 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-29 17:14 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 v2 3/5] target-unicore32: License future contributions under GPLv2+
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 2/5] target-unicore32: Relicense to GPLv2+ Andreas Färber
@ 2012-03-29 17:14 ` Andreas Färber
  2012-03-30  8:27   ` Guan Xuetao
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 4/5] target-unicore32: QOM'ify CPU Andreas Färber
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Andreas Färber @ 2012-03-29 17:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Guan Xuetao, Andreas Färber

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

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 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 v2 4/5] target-unicore32: QOM'ify CPU
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
                   ` (2 preceding siblings ...)
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
@ 2012-03-29 17:14 ` Andreas Färber
  2012-03-30  8:28   ` Guan Xuetao
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
  2012-03-30  8:27 ` [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Guan Xuetao
  5 siblings, 1 reply; 10+ messages in thread
From: Andreas Färber @ 2012-03-29 17:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Guan Xuetao, Andreas Färber

Embed CPUUniCore32State as first member of UniCore32CPU.

Contributed under GPLv2+.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 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 6e8b997..9b0cf74 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -99,6 +99,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 v2 5/5] target-unicore32: Move CPU-dependent init into initfn
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
                   ` (3 preceding siblings ...)
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 4/5] target-unicore32: QOM'ify CPU Andreas Färber
@ 2012-03-29 17:14 ` Andreas Färber
  2012-03-30  8:28   ` Guan Xuetao
  2012-03-30  8:27 ` [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Guan Xuetao
  5 siblings, 1 reply; 10+ messages in thread
From: Andreas Färber @ 2012-03-29 17:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Guan Xuetao, 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>
---
 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 v2 0/5] QOM'ify UniCore32 CPU
  2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
                   ` (4 preceding siblings ...)
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
@ 2012-03-30  8:27 ` Guan Xuetao
  5 siblings, 0 replies; 10+ messages in thread
From: Guan Xuetao @ 2012-03-30  8:27 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Peter Maydell, qemu-devel, Anthony Liguori

On 03/30/2012 01:14 AM, Andreas Färber wrote:
> Hello Xuetao,
>
> This updated series converts the UniCore32 CPU to QOM. In addition to
> addressing review comments from v1, a new approach for CPU-dependent
> values has been adopted: We should keep setting of features imperative
> and can avoid adding new class fields as storage for default values
> by moving the existing imperative code into new initfn functions.
>
> Patch 1 adds a "UniCore32 CPU guest core (TCG)" section to MAINTAINERS,
> so that the target-unicore32 author gets notified of patches against his code.
>
> Patch 2, based on feedback from Guan Xuetao, changes the license of most
> target-unicore32 files from GPLv2 to GPLv2+. Anthony had contributed a
> qemu_malloc() ->  g_malloc() substitution that he can't relicense at this time,
> so leave that as GPLv2 and declare my following patches explicitly as GPLv2+.
> Patch 3 adds a notice to license any following contributions under GPLv2+ already.
>
> Patch 4 embeds CPUUniCore32State into UniCore32CPU. My new cpu-qom.h header
> can be GPLv2+, but into cpu.c we're moving helper.c code so make it GPLv2 for now.
>
> Patch 5 cleans up uc32_cpu_init() function by moving initializations into initfn.
>
> Could you test this please and, if happy, provide your Acked-by for patches 1 and 3-5?
I tested unicore32-linux-user mode, and it worked  very well.

BTW, patch 1 has my Acked-by already.

Thanks & Regards,

Guan Xuetao
>
> Available from:
> git://github.com/afaerber/qemu-cpu.git qom-cpu-unicore32.v2
> https://github.com/afaerber/qemu-cpu/commits/qom-cpu-unicore32.v2
>
> Regards,
> Andreas
>
> Cc: Guan Xue-tao<gxt@mprc.pku.edu.cn>
> Cc: Anthony Liguori<anthony@codemonkey.ws>
> Cc: Peter Maydell<peter.maydell@linaro.org>
>
> v1 ->  v2:
> * Change license notice to match the previous one more closely.
> * Adopt that license notice for new cpu-qom.h as well.
> * Add notices to helper.c and cpu.c to license future contributions under GPLv2+.
> * Adopt Peter's approach of using per-CPU initfn functions for default values.
> * Squash init code movement together (no new UniCore32CPUClass members needed).
> * Various naming updates (e.g., ..._type_info).
>
> Changes from former repo.or.cz qom-cpu[-wip] branch:
> * Drop duplicate .instance_init.
>
> 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

* Re: [Qemu-devel] [PATCH v2 3/5] target-unicore32: License future contributions under GPLv2+
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
@ 2012-03-30  8:27   ` Guan Xuetao
  0 siblings, 0 replies; 10+ messages in thread
From: Guan Xuetao @ 2012-03-30  8:27 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On 03/30/2012 01:14 AM, Andreas Färber wrote:
> This is to limit relicensing obstacles to the pending IBM investigation.
>
> Signed-off-by: Andreas Färber<afaerber@suse.de>
> ---
>   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"
Acked-by: Guan Xuetao <gxt@mprc.pku.edu.cn>

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

* Re: [Qemu-devel] [PATCH v2 4/5] target-unicore32: QOM'ify CPU
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 4/5] target-unicore32: QOM'ify CPU Andreas Färber
@ 2012-03-30  8:28   ` Guan Xuetao
  0 siblings, 0 replies; 10+ messages in thread
From: Guan Xuetao @ 2012-03-30  8:28 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On 03/30/2012 01:14 AM, 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 6e8b997..9b0cf74 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -99,6 +99,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;
>   }

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

* Re: [Qemu-devel] [PATCH v2 5/5] target-unicore32: Move CPU-dependent init into initfn
  2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
@ 2012-03-30  8:28   ` Guan Xuetao
  0 siblings, 0 replies; 10+ messages in thread
From: Guan Xuetao @ 2012-03-30  8:28 UTC (permalink / raw)
  To: Andreas Färber; +Cc: qemu-devel

On 03/30/2012 01:14 AM, Andreas Färber wrote:
> 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();

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

end of thread, other threads:[~2012-03-30  8:27 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-29 17:14 [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Andreas Färber
2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 1/5] MAINTAINERS: Add entry for UniCore32 Andreas Färber
2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 2/5] target-unicore32: Relicense to GPLv2+ Andreas Färber
2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 3/5] target-unicore32: License future contributions under GPLv2+ Andreas Färber
2012-03-30  8:27   ` Guan Xuetao
2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 4/5] target-unicore32: QOM'ify CPU Andreas Färber
2012-03-30  8:28   ` Guan Xuetao
2012-03-29 17:14 ` [Qemu-devel] [PATCH v2 5/5] target-unicore32: Move CPU-dependent init into initfn Andreas Färber
2012-03-30  8:28   ` Guan Xuetao
2012-03-30  8:27 ` [Qemu-devel] [PATCH v2 0/5] QOM'ify UniCore32 CPU Guan Xuetao

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.