Initial commit.
diff --git a/src/vm.c b/src/vm.c
new file mode 100644
index 0000000..ee6a5cd
--- /dev/null
+++ b/src/vm.c
@@ -0,0 +1,24 @@
+#include "vm.h"
+
+#include "cpu.h"
+
+void vm_init(struct vm *vm, struct cpu *cpus)
+{
+	size_t i;
+
+	/* Do basic initialization of vcpus. */
+	for (i = 0; i < MAX_CPUS; i++) {
+		vcpu_init(vm->vcpus + i, cpus + i, vm);
+	}
+
+	arch_vptable_init(&vm->page_table);
+}
+
+/* TODO: Shall we use index or id here? */
+void vm_start_vcpu(struct vm *vm, size_t index, size_t entry, size_t arg)
+{
+	struct vcpu *vcpu = vm->vcpus + index;
+	arch_regs_init(&vcpu->regs, entry, arg);
+	vcpu_ready(vcpu);
+	cpu_on(vcpu->cpu);
+}