target-unicore32: Move CPU-dependent init into initfn
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>
This commit is contained in:
		
							parent
							
								
									ae0f5e9ea8
								
							
						
					
					
						commit
						8df9082da6
					
				| 
						 | 
					@ -15,6 +15,11 @@
 | 
				
			||||||
#include "cpu-qom.h"
 | 
					#include "cpu-qom.h"
 | 
				
			||||||
#include "qemu-common.h"
 | 
					#include "qemu-common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void set_feature(CPUUniCore32State *env, int feature)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    env->features |= feature;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* CPU models */
 | 
					/* CPU models */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct UniCore32CPUInfo {
 | 
					typedef struct UniCore32CPUInfo {
 | 
				
			||||||
| 
						 | 
					@ -28,6 +33,12 @@ static void unicore_ii_cpu_initfn(Object *obj)
 | 
				
			||||||
    CPUUniCore32State *env = &cpu->env;
 | 
					    CPUUniCore32State *env = &cpu->env;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    env->cp0.c0_cpuid = 0x40010863;
 | 
					    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)
 | 
					static void uc32_any_cpu_initfn(Object *obj)
 | 
				
			||||||
| 
						 | 
					@ -36,6 +47,9 @@ static void uc32_any_cpu_initfn(Object *obj)
 | 
				
			||||||
    CPUUniCore32State *env = &cpu->env;
 | 
					    CPUUniCore32State *env = &cpu->env;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    env->cp0.c0_cpuid = 0xffffffff;
 | 
					    env->cp0.c0_cpuid = 0xffffffff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    set_feature(env, UC32_HWCAP_CMOV);
 | 
				
			||||||
 | 
					    set_feature(env, UC32_HWCAP_UCF64);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const UniCore32CPUInfo uc32_cpus[] = {
 | 
					static const UniCore32CPUInfo uc32_cpus[] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,16 +14,10 @@
 | 
				
			||||||
#include "helper.h"
 | 
					#include "helper.h"
 | 
				
			||||||
#include "host-utils.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)
 | 
					CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    UniCore32CPU *cpu;
 | 
					    UniCore32CPU *cpu;
 | 
				
			||||||
    CPUUniCore32State *env;
 | 
					    CPUUniCore32State *env;
 | 
				
			||||||
    uint32_t id;
 | 
					 | 
				
			||||||
    static int inited = 1;
 | 
					    static int inited = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (object_class_by_name(cpu_model) == NULL) {
 | 
					    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));
 | 
					    cpu = UNICORE32_CPU(object_new(cpu_model));
 | 
				
			||||||
    env = &cpu->env;
 | 
					    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) {
 | 
					    if (inited) {
 | 
				
			||||||
        inited = 0;
 | 
					        inited = 0;
 | 
				
			||||||
        uc32_translate_init();
 | 
					        uc32_translate_init();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue