From a6ea7b4c5e44ba6965accd3ada3a9c02fead042d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 14 Mar 2012 00:45:43 +0100 Subject: [PATCH 1/5] MAINTAINERS: Add entry for UniCore32 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andreas Färber Acked-by: Guan Xuetao --- MAINTAINERS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f83d07c2c4..922945c920 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -112,6 +112,11 @@ M: Blue Swirl S: Maintained F: target-sparc/ +UniCore32 +M: Guan Xuetao +S: Maintained +F: target-unicore32/ + X86 M: qemu-devel@nongnu.org S: Odd Fixes From 2b3bc6c0f56968631c4d92b7e06ec969ed0700bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Tue, 13 Mar 2012 16:48:19 +0100 Subject: [PATCH 2/5] target-unicore32: Relicense to GPLv2+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Guan Xuetao Signed-off-by: Stefan Weil Signed-off-by: Blue Swirl Signed-off-by: Dor Laor --- 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 a3f8589205..8ec0d2f595 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 615de2add9..5a3b8a41ea 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 638a02097d..b954c30a84 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 3b3ba163a6..9793d14c1b 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 #include From c3a8baa90d98edcf290bfda6850615368738a17c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Thu, 15 Mar 2012 15:02:14 +0100 Subject: [PATCH 3/5] target-unicore32: License future contributions under GPLv2+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is to limit relicensing obstacles to the pending IBM investigation. Signed-off-by: Andreas Färber Acked-by: Guan Xuetao --- target-unicore32/helper.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target-unicore32/helper.c b/target-unicore32/helper.c index 6af492daf5..18a9cbb40e 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" From ae0f5e9ea80de923ae1c11289cf6ac468f657880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Tue, 14 Feb 2012 01:16:17 +0100 Subject: [PATCH 4/5] target-unicore32: QOM'ify CPU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Embed CPUUniCore32State as first member of UniCore32CPU. Contributed under GPLv2+. Signed-off-by: Andreas Färber Acked-by: Guan Xuetao --- 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 44b2e83e6f..7cff65f224 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 0000000000..342d85e39b --- /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 0000000000..189b6f6b9d --- /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 8ec0d2f595..81c14ffd77 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 18a9cbb40e..0f23a407b4 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; } From 8df9082da6b7a24b299d37462bc3539c15f26135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Thu, 29 Mar 2012 18:03:18 +0200 Subject: [PATCH 5/5] target-unicore32: Move CPU-dependent init into initfn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of setting values in a CPUID switch, do so in initfn functions. Signed-off-by: Andreas Färber Acked-by: Guan Xuetao --- 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 189b6f6b9d..de63f58dda 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 0f23a407b4..9fe4a375e4 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();