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);
+}