cpu->cpu_index = UNASSIGNED_CPU_INDEX;
cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
cpu->as = NULL;
- cpu->num_ases = 0;
/* user-mode doesn't have configurable SMP topology */
/* the default value is changed by qemu_init_vcpu() for system-mode */
cpu->nr_threads = 1;
if (cpu->cc->sysemu_ops->asidx_from_attrs) {
ret = cpu->cc->sysemu_ops->asidx_from_attrs(cpu, attrs);
- assert(ret < cpu->num_ases && ret >= 0);
+ assert(ret <= cpu->cc->max_as && ret >= 0);
}
return ret;
}
* The target-specific code which registers ASes is responsible
* for defining what semantics address space 0, 1, 2, etc have.
*
- * Before the first call to this function, the caller must set
- * cpu->num_ases to the total number of address spaces it needs
- * to support.
- *
* Note that with KVM only one address space is supported.
*/
void cpu_address_space_init(CPUState *cpu, int asidx,
* address before attempting to match it against watchpoints.
* @deprecation_note: If this CPUClass is deprecated, this field provides
* related information.
+ * @max_as: Maximum valid index used to refer to the address spaces supported by
+ * the architecture, i.e., to refer to CPUAddressSpaces in
+ * CPUState::cpu_ases.
*
* Represents a CPU family or model.
*/
int reset_dump_flags;
int gdb_num_core_regs;
bool gdb_stop_before_watchpoint;
+
+ int max_as;
};
/*
* @icount_extra: Instructions until next timer event.
* @cpu_ases: Pointer to array of CPUAddressSpaces (which define the
* AddressSpaces this CPU has)
- * @num_ases: number of CPUAddressSpaces in @cpu_ases
* @as: Pointer to the first AddressSpace, for the convenience of targets which
* only have a single AddressSpace
* @gdb_regs: Additional GDB registers.
QSIMPLEQ_HEAD(, qemu_work_item) work_list;
struct CPUAddressSpace *cpu_ases;
- int num_ases;
AddressSpace *as;
MemoryRegion *memory;
/* If the target cpu hasn't set up any address spaces itself,
* give it the default one.
*/
- cpu->num_ases = 1;
cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
}
address_space_init(as, mr, as_name);
g_free(as_name);
- /* Target code should have set num_ases before calling us */
- assert(asidx < cpu->num_ases);
+ /* Target code should have set max_as before calling us */
+ assert(asidx <= cpu->cc->max_as);
if (asidx == 0) {
/* address space 0 gets the convenience alias */
}
if (!cpu->cpu_ases) {
- cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->num_ases);
+ cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->cc->max_as + 1);
}
newas = &cpu->cpu_ases[asidx];
/* convenience alias just points to some cpu_ases[n] */
cpu->as = NULL;
- for (asidx = 0; asidx < cpu->num_ases; asidx++) {
+ for (asidx = 0; asidx <= cpu->cc->max_as; asidx++) {
cpuas = &cpu->cpu_ases[asidx];
if (!cpuas->as) {
/* This index was never initialized; no deinit needed */
unsigned int smp_cpus = ms->smp.cpus;
bool has_secure = cpu->has_el3 || arm_feature(env, ARM_FEATURE_M_SECURITY);
- /*
- * We must set cs->num_ases to the final value before
- * the first call to cpu_address_space_init.
- */
- if (cpu->tag_memory != NULL) {
- cs->num_ases = 3 + has_secure;
- } else {
- cs->num_ases = 1 + has_secure;
- }
-
cpu_address_space_init(cs, ARMASIdx_NS, "cpu-memory", cs->memory);
if (has_secure) {
cc->gdb_read_register = arm_cpu_gdb_read_register;
cc->gdb_write_register = arm_cpu_gdb_write_register;
#ifndef CONFIG_USER_ONLY
+ cc->max_as = ARMASIdx_MAX;
cc->sysemu_ops = &arm_sysemu_ops;
#endif
cc->gdb_arch_name = arm_gdb_arch_name;
cc->get_arch_id = x86_cpu_get_arch_id;
#ifndef CONFIG_USER_ONLY
+ cc->max_as = X86ASIdx_MAX;
cc->sysemu_ops = &i386_sysemu_ops;
#endif /* !CONFIG_USER_ONLY */
#ifdef CONFIG_TCG
* Only initialize address space 0 here, the second one for SMM is
* initialized at register_smram_listener() after machine init done.
*/
- cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
cpu_address_space_init(cs, X86ASIdx_MEM, "cpu-memory", cs->memory);
return true;
memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
memory_region_set_enabled(cpu->cpu_as_mem, true);
- cs->num_ases = 2;
cpu_address_space_init(cs, X86ASIdx_MEM, "cpu-memory", cs->memory);
cpu_address_space_init(cs, X86ASIdx_SMM, "cpu-smm", cpu->cpu_as_root);