Barret pointed out that the inclusion of regions was a mistake.
authorRon Minnich <rminnich@gmail.com>
Wed, 18 Feb 2015 16:26:08 +0000 (08:26 -0800)
committerRon Minnich <rminnich@gmail.com>
Wed, 18 Feb 2015 16:26:08 +0000 (08:26 -0800)
Also, initial non-working code to enable vmx. It's wrong.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
kern/arch/x86/arch.h
kern/arch/x86/vmm/Kbuild
kern/arch/x86/vmm/func.h
kern/arch/x86/vmm/vmm.h
kern/drivers/dev/proc.c

index d2f6d55..9b8db75 100644 (file)
@@ -170,4 +170,20 @@ static inline void reboot(void)
        while (1);
 }
 
+/* Guest VMs have a maximum physical address they can use.  Guest
+ * physical addresses are mapped into this MCP 1:1, but limited to
+ * this max address *in hardware*.  I.e., the MCP process can address
+ * more memory than the VMMCP can.  This is great; it means that
+ * keeping VM management stuff separate from the VM is trivial: just
+ * map it above max_vm_address. There's no need, as in other systems,
+ * to tweak the page table or root pointer to protect management
+ * memory from VM memory.
+ *
+ * TODO: read a register the first time this is called and save it
+ * away.  But this is more than enough for now.
+ */
+static inline uint64_t max_guest_pa(void)
+{
+       return (1ULL<<40) - 1;
+}
 #endif /* !ROS_INC_ARCH_H */
index 6f46965..3b42510 100644 (file)
@@ -1 +1,2 @@
 obj-y                                          += vmm.o
+obj-y                                          += intel/
index 02ad4f8..be3194e 100644 (file)
@@ -61,4 +61,7 @@ void vm_inject_pf(void *vm, int vcpuid, int error_code, uint64_t cr2);
 
 int vm_restart_instruction(void *vm, int vcpuid);
 
+/* Intel functions */
+void vminit(struct proc *p);
+
 #endif /* _VMM_FUNC_H_ */
index baa0a0f..dba60be 100644 (file)
@@ -358,7 +358,6 @@ struct vmm {
        // we have a VMMCP. N.B. only for the sie of the EPT
        // address space, which is limited to much less than
        // the virtual address space.
-       struct vmr_tailq vm_regions;
        physaddr_t eptpt;
 
        // The VMCS is intel-specific. But, maybe, someday, AMD will
index 99c08cd..8e7f0f3 100644 (file)
@@ -29,6 +29,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
+#include <arch/vmm/vmm.h>
 
 enum {
        Qdir,
@@ -74,6 +75,9 @@ enum {
        CMwired,
        CMtrace,
        CMcore,
+       CMvminit,
+       CMvmstart,
+       CMvmkill,
 };
 
 enum {
@@ -130,6 +134,11 @@ struct cmdtab proccmd[] = {
        {CMwired, "wired", 2},
        {CMtrace, "trace", 0},
        {CMcore, "core", 2},
+       {CMcore, "core", 2},
+       {CMcore, "core", 2},
+       {CMvminit, "vminit", 0},
+       {CMvmstart, "vmstart", 0},
+       {CMvmkill, "vmkill", 0},
 };
 
 /*
@@ -1427,7 +1436,7 @@ void procctlclosefiles(struct proc *p, int all, int fd)
 
 static void procctlreq(struct proc *p, char *va, int n)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        int8_t irq_state = 0;
        int npc, pri, core;
        struct cmdbuf *cb;
@@ -1444,6 +1453,8 @@ static void procctlreq(struct proc *p, char *va, int n)
        ct = lookupcmd(cb, proccmd, ARRAY_SIZE(proccmd));
 
        switch (ct->index) {
+               case CMvmstart:
+               case CMvmkill:
                default:
                        error("nope\n");
                        break;
@@ -1474,6 +1485,9 @@ static void procctlreq(struct proc *p, char *va, int n)
                         * hyperthreaded core. */
                        spin_on(p->env_cr3);
                        break;
+               case CMvminit:
+                       vminit(current);
+                       break;
        }
        poperror();
        kfree(cb);