return ret;
}
-struct hax_vm *hax_vm_create(struct hax_state *hax)
+struct hax_vm *hax_vm_create(struct hax_state *hax, int max_cpus)
{
struct hax_vm *vm;
- int vm_id = 0, ret;
+ int vm_id = 0, ret, i;
if (hax_invalid_fd(hax->fd)) {
return NULL;
return hax->vm;
}
+ if (max_cpus > HAX_MAX_VCPU) {
+ fprintf(stderr, "Maximum VCPU number QEMU supported is %d\n", HAX_MAX_VCPU);
+ return NULL;
+ }
+
vm = g_new0(struct hax_vm, 1);
ret = hax_host_create_vm(hax, &vm_id);
goto error;
}
+ vm->numvcpus = max_cpus;
+ vm->vcpus = g_new0(struct hax_vcpu_state *, vm->numvcpus);
+ for (i = 0; i < vm->numvcpus; i++) {
+ vm->vcpus[i] = NULL;
+ }
+
hax->vm = vm;
return vm;
{
int i;
- for (i = 0; i < HAX_MAX_VCPU; i++)
+ for (i = 0; i < vm->numvcpus; i++)
if (vm->vcpus[i]) {
fprintf(stderr, "VCPU should be cleaned before vm clean\n");
return -1;
}
hax_close_fd(vm->fd);
+ vm->numvcpus = 0;
+ g_free(vm->vcpus);
g_free(vm);
hax_global.vm = NULL;
return 0;
}
}
-static int hax_init(ram_addr_t ram_size)
+static int hax_init(ram_addr_t ram_size, int max_cpus)
{
struct hax_state *hax = NULL;
struct hax_qemu_version qversion;
goto error;
}
- hax->vm = hax_vm_create(hax);
+ hax->vm = hax_vm_create(hax, max_cpus);
if (!hax->vm) {
fprintf(stderr, "Failed to create HAX VM\n");
ret = -EINVAL;
static int hax_accel_init(MachineState *ms)
{
- int ret = hax_init(ms->ram_size);
+ int ret = hax_init(ms->ram_size, (int)ms->smp.max_cpus);
if (ret && (ret != -ENOSPC)) {
fprintf(stderr, "No accelerator found.\n");
struct hax_vm {
hax_fd fd;
int id;
- struct hax_vcpu_state *vcpus[HAX_MAX_VCPU];
+ int numvcpus;
+ struct hax_vcpu_state **vcpus;
};
#ifdef NEED_CPU_H
/* Host specific functions */
int hax_mod_version(struct hax_state *hax, struct hax_module_version *version);
int hax_inject_interrupt(CPUArchState *env, int vector);
-struct hax_vm *hax_vm_create(struct hax_state *hax);
+struct hax_vm *hax_vm_create(struct hax_state *hax, int max_cpus);
int hax_vcpu_run(struct hax_vcpu_state *vcpu);
int hax_vcpu_create(int id);
int hax_sync_vcpu_state(CPUArchState *env, struct vcpu_state_t *state,