static void vm_init(struct vm *vm, bool create) { int vcpu; if (create) { callout_system_init(); } vm->cookie = VM_INIT(vm); vm->vioapic = vioapic_init(vm); vm->vhpet = vhpet_init(vm); vm->vatpic = vatpic_init(vm); vm->vatpit = vatpit_init(vm); vm->vpmtmr = vpmtmr_init(vm); if (create) { vm->vrtc = vrtc_init(vm); } CPU_ZERO(&vm->active_cpus); vm->suspend = 0; CPU_ZERO(&vm->suspended_cpus); for (vcpu = 0; vcpu < VM_MAXCPU; vcpu++) { vcpu_init(vm, vcpu, create); } }
int main(int argc, char **argv) { struct vm vm; struct vcpu vcpu; enum { REAL_MODE, PROTECTED_MODE, PAGED_32BIT_MODE, LONG_MODE, } mode = REAL_MODE; int opt; while ((opt = getopt(argc, argv, "rspl")) != -1) { switch (opt) { case 'r': mode = REAL_MODE; break; case 's': mode = PROTECTED_MODE; break; case 'p': mode = PAGED_32BIT_MODE; break; case 'l': mode = LONG_MODE; break; default: fprintf(stderr, "Usage: %s [ -r | -s | -p | -l ]\n", argv[0]); return 1; } } vm_init(&vm, 0x200000); vcpu_init(&vm, &vcpu); switch (mode) { case REAL_MODE: return !run_real_mode(&vm, &vcpu); case PROTECTED_MODE: return !run_protected_mode(&vm, &vcpu); case PAGED_32BIT_MODE: return !run_paged_32bit_mode(&vm, &vcpu); case LONG_MODE: return !run_long_mode(&vm, &vcpu); } return 1; }
int vm_create(const char *name, struct vm **retvm) { int i; struct vm *vm; struct vmspace *vmspace; const int BSP = 0; /* * If vmm.ko could not be successfully initialized then don't attempt * to create the virtual machine. */ if (!vmm_initialized) return (ENXIO); if (name == NULL || strlen(name) >= VM_MAX_NAMELEN) return (EINVAL); vmspace = VMSPACE_ALLOC(VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS); if (vmspace == NULL) return (ENOMEM); vm = malloc(sizeof(struct vm), M_VM, M_WAITOK | M_ZERO); strcpy(vm->name, name); vm->vmspace = vmspace; mtx_init(&vm->rendezvous_mtx, "vm rendezvous lock", 0, MTX_DEF); vm->cookie = VMINIT(vm, vmspace_pmap(vmspace)); vm->vioapic = vioapic_init(vm); vm->vhpet = vhpet_init(vm); vm->vatpic = vatpic_init(vm); for (i = 0; i < VM_MAXCPU; i++) { vcpu_init(vm, i); guest_msrs_init(vm, i); } vm_activate_cpu(vm, BSP); *retvm = vm; return (0); }