 5bf58abf1c
			
		
	
	
		5bf58abf1c
		
	
	
	
	
		
			
			commit 5ce4f35781028ce1aee3341e6002f925fdc7aaf3
    "target-arm: A64: add set_pc cpu method"
introduces an array aarch64_cpus which is zero
size if this code is built without CONFIG_USER_ONLY.
In particular an attempt to iterate over this array produces a warning
under gcc 4.8.2:
 CC    aarch64-softmmu/target-arm/cpu64.o
/scm/qemu/target-arm/cpu64.c: In function ‘aarch64_cpu_register_types’:
/scm/qemu/target-arm/cpu64.c:124:5: error: comparison of unsigned
expression < 0 is always false [-Werror=type-limits]
     for (i = 0; i < ARRAY_SIZE(aarch64_cpus); i++) {
     ^
cc1: all warnings being treated as errors
This is the result of ARRAY_SIZE being an unsigned type,
causing "i" to be promoted to unsigned int as well.
As zero size arrays are a gcc extension, it seems
cleanest to add a dummy element with NULL name,
and test for it during registration.
We'll be able to drop this when we add more CPUs.
Cc: Alexander Graf <agraf@suse.de>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Stefan Weil <sw@weilnetz.de>
		
	
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * QEMU AArch64 CPU
 | |
|  *
 | |
|  * Copyright (c) 2013 Linaro Ltd
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version 2
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program; if not, see
 | |
|  * <http://www.gnu.org/licenses/gpl-2.0.html>
 | |
|  */
 | |
| 
 | |
| #include "cpu.h"
 | |
| #include "qemu-common.h"
 | |
| #if !defined(CONFIG_USER_ONLY)
 | |
| #include "hw/loader.h"
 | |
| #endif
 | |
| #include "hw/arm/arm.h"
 | |
| #include "sysemu/sysemu.h"
 | |
| #include "sysemu/kvm.h"
 | |
| 
 | |
| static inline void set_feature(CPUARMState *env, int feature)
 | |
| {
 | |
|     env->features |= 1ULL << feature;
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_USER_ONLY
 | |
| static void aarch64_any_initfn(Object *obj)
 | |
| {
 | |
|     ARMCPU *cpu = ARM_CPU(obj);
 | |
| 
 | |
|     set_feature(&cpu->env, ARM_FEATURE_V8);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_VFP4);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_NEON);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_ARM_DIV);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_V7MP);
 | |
|     set_feature(&cpu->env, ARM_FEATURE_AARCH64);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| typedef struct ARMCPUInfo {
 | |
|     const char *name;
 | |
|     void (*initfn)(Object *obj);
 | |
|     void (*class_init)(ObjectClass *oc, void *data);
 | |
| } ARMCPUInfo;
 | |
| 
 | |
| static const ARMCPUInfo aarch64_cpus[] = {
 | |
| #ifdef CONFIG_USER_ONLY
 | |
|     { .name = "any",         .initfn = aarch64_any_initfn },
 | |
| #endif
 | |
|     { .name = NULL } /* TODO: drop when we support more CPUs */
 | |
| };
 | |
| 
 | |
| static void aarch64_cpu_initfn(Object *obj)
 | |
| {
 | |
| }
 | |
| 
 | |
| static void aarch64_cpu_finalizefn(Object *obj)
 | |
| {
 | |
| }
 | |
| 
 | |
| static void aarch64_cpu_set_pc(CPUState *cs, vaddr value)
 | |
| {
 | |
|     ARMCPU *cpu = ARM_CPU(cs);
 | |
|     /*
 | |
|      * TODO: this will need updating for system emulation,
 | |
|      * when the core may be in AArch32 mode.
 | |
|      */
 | |
|     cpu->env.pc = value;
 | |
| }
 | |
| 
 | |
| static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
 | |
| {
 | |
|     CPUClass *cc = CPU_CLASS(oc);
 | |
| 
 | |
|     cc->dump_state = aarch64_cpu_dump_state;
 | |
|     cc->set_pc = aarch64_cpu_set_pc;
 | |
|     cc->gdb_read_register = aarch64_cpu_gdb_read_register;
 | |
|     cc->gdb_write_register = aarch64_cpu_gdb_write_register;
 | |
|     cc->gdb_num_core_regs = 34;
 | |
|     cc->gdb_core_xml_file = "aarch64-core.xml";
 | |
| }
 | |
| 
 | |
| static void aarch64_cpu_register(const ARMCPUInfo *info)
 | |
| {
 | |
|     TypeInfo type_info = {
 | |
|         .parent = TYPE_AARCH64_CPU,
 | |
|         .instance_size = sizeof(ARMCPU),
 | |
|         .instance_init = info->initfn,
 | |
|         .class_size = sizeof(ARMCPUClass),
 | |
|         .class_init = info->class_init,
 | |
|     };
 | |
| 
 | |
|     /* TODO: drop when we support more CPUs - all entries will have name set */
 | |
|     if (!info->name) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
 | |
|     type_register(&type_info);
 | |
|     g_free((void *)type_info.name);
 | |
| }
 | |
| 
 | |
| static const TypeInfo aarch64_cpu_type_info = {
 | |
|     .name = TYPE_AARCH64_CPU,
 | |
|     .parent = TYPE_ARM_CPU,
 | |
|     .instance_size = sizeof(ARMCPU),
 | |
|     .instance_init = aarch64_cpu_initfn,
 | |
|     .instance_finalize = aarch64_cpu_finalizefn,
 | |
|     .abstract = true,
 | |
|     .class_size = sizeof(AArch64CPUClass),
 | |
|     .class_init = aarch64_cpu_class_init,
 | |
| };
 | |
| 
 | |
| static void aarch64_cpu_register_types(void)
 | |
| {
 | |
|     int i;
 | |
| 
 | |
|     type_register_static(&aarch64_cpu_type_info);
 | |
|     for (i = 0; i < ARRAY_SIZE(aarch64_cpus); i++) {
 | |
|         aarch64_cpu_register(&aarch64_cpus[i]);
 | |
|     }
 | |
| }
 | |
| 
 | |
| type_init(aarch64_cpu_register_types)
 |