/* Create a new VM instance */ vm_instance_t *vm_create (const char *name, int machine_type) { vm_instance_t *vm; int i; vm = malloc (sizeof (*vm)); if (!vm) { fprintf (stderr, "VM %s: unable to create new instance!\n", name); return NULL; } memset (vm, 0, sizeof (*vm)); vm->type = machine_type; vm->status = VM_STATUS_HALTED; vm->jit_use = 0; vm->vtty_type[0] = VTTY_TYPE_TERM; for (i=1; i<NVTTY; i++) vm->vtty_type[i] = VTTY_TYPE_NONE; //vm->timer_irq_check_itv = VM_TIMER_IRQ_CHECK_ITV; //vm->log_file_enabled = TRUE; vm->name = strdup (name); if (!name) { fprintf (stderr, "VM %s: unable to store instance name!\n", name); goto err_name; } /* create log file */ if (vm_create_log (vm) == -1) { free (vm->name); err_name: free (vm); return NULL; } return vm; }
/* Create a new VM instance */ static vm_instance_t *vm_create(char *name,int instance_id, vm_platform_t *platform) { vm_instance_t *vm; if (!(vm = malloc(sizeof(*vm)))) { fprintf(stderr,"VM %s: unable to create new instance!\n",name); return NULL; } memset(vm,0,sizeof(*vm)); if (!(vm->name = strdup(name))) { fprintf(stderr,"VM %s: unable to store instance name!\n",name); goto err_name; } vm->instance_id = instance_id; vm->platform = platform; vm->status = VM_STATUS_HALTED; vm->jit_use = JIT_SUPPORT; vm->exec_blk_direct_jump = TRUE; vm->vtty_con_type = VTTY_TYPE_TERM; vm->vtty_aux_type = VTTY_TYPE_NONE; vm->timer_irq_check_itv = VM_TIMER_IRQ_CHECK_ITV; vm->log_file_enabled = TRUE; vm->rommon_vars.filename = vm_build_filename(vm,"rommon_vars"); if (!vm->rommon_vars.filename) goto err_rommon; /* XXX */ rommon_load_file(&vm->rommon_vars); /* create lock file */ if (vm_get_lock(vm) == -1) goto err_lock; /* create log file */ if (vm_create_log(vm) == -1) goto err_log; if (registry_add(vm->name,OBJ_TYPE_VM,vm) == -1) { fprintf(stderr,"VM: Unable to store instance '%s' in registry!\n", vm->name); goto err_reg_add; } m_log("VM","VM %s created.\n",vm->name); return vm; err_reg_add: vm_close_log(vm); err_log: free(vm->lock_file); err_lock: free(vm->rommon_vars.filename); err_rommon: free(vm->name); err_name: free(vm); return NULL; }