int launch_vm(t_param *param) { t_vm *vm; int i; if ((vm = my_malloc(sizeof(t_vm), "Error: fail to malloc vm\n")) == 0) return (1); vm->screen = SDL_SetVideoMode(MEM_SIZE / NB_COL * WIDTH + DECAL, NB_COL * WIDTH, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption("Corewar", NULL); if (vm->screen == NULL) err_SDL(); vm->police = TTF_OpenFont("arial.ttf", 20); vm->param = param; vm->cycle = 0; vm->cycle_to_die = CYCLE_TO_DIE; vm->nb_live = 0; owner_set(vm->mem_owner, -1, 0, MEM_SIZE); my_memset(vm->register_player, 0, (MAX_PLAYER + 1) * sizeof(char)); i = 0; while (i < MAX_PROG_NUMBER) vm->progs_live[i++] = -1; if (load_all_programs(vm) != 0) return (1); my_printf("%d program(s) loaded\n", vm->prog_list->nb_elm); if (param->debug == 1) dump_memory(vm->memory); pause_vm(vm, 1); vm_run(vm); pause_vm(vm, 0); if (param->debug == 1) dump_memory(vm->memory); TTF_CloseFont(vm->police); return (0); }
static inline void enter_s3(struct acrn_vm *vm, uint32_t pm1a_cnt_val, uint32_t pm1b_cnt_val) { uint32_t guest_wakeup_vec32; /* Save the wakeup vec set by guest OS. Will return to guest * with this wakeup vec as entry. */ stac(); guest_wakeup_vec32 = *(vm->pm.sx_state_data->wake_vector_32); clac(); pause_vm(vm); /* pause sos_vm before suspend system */ host_enter_s3(vm->pm.sx_state_data, pm1a_cnt_val, pm1b_cnt_val); resume_vm_from_s3(vm, guest_wakeup_vec32); /* jump back to vm */ }