Browse Source
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>stable-1.1
5 changed files with 158 additions and 36 deletions
@ -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 |
|||
@ -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) |
|||
Loading…
Reference in new issue