VMM: Hook the VMM to the process (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 12 Mar 2015 17:06:31 +0000 (13:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 Mar 2015 14:55:59 +0000 (10:55 -0400)
Syscall for turning any proc, including SCPs, into VMMs.  We'll see if
we need to limit to MCPs later. (reflected faults and stuff).

This changes the kernel header, so you'll need to reinstall your headers
if you want to access the new syscall by name.  Either copy
bits/syscall.h manually or rebuild your toolchain.

kern/include/ros/bits/syscall.h
kern/src/process.c
kern/src/syscall.c

index 2a60329..4eff6cd 100644 (file)
@@ -44,6 +44,7 @@
 #define SYS_abort_sysc                         31
 #define SYS_populate_va                                32
 #define SYS_abort_sysc_fd                      33
+#define SYS_setup_vmm                          34
 
 /* FS Syscalls */
 #define SYS_read                               100
index 6094254..41ecfe0 100644 (file)
@@ -408,6 +408,8 @@ error_t proc_alloc(struct proc **pp, struct proc *parent, int flags)
        devalarm_init(p);
        TAILQ_INIT(&p->abortable_sleepers);
        spinlock_init_irqsave(&p->abort_list_lock);
+       memset(&p->vmm, 0, sizeof(struct vmm));
+       qlock_init(&p->vmm.qlock);
        printd("[%08x] new process %08x\n", current ? current->pid : 0, p->pid);
        } // INIT_STRUCT
        *pp = p;
@@ -463,6 +465,7 @@ static void __proc_free(struct kref *kref)
        assert(kref_refcnt(&p->p_kref) == 0);
        assert(TAILQ_EMPTY(&p->alarmset.list));
 
+       vmm_struct_cleanup(&p->vmm);
        p->progname[0] = 0;
        cclose(p->dot);
        cclose(p->slash);
index 7f9e80a..099d83f 100644 (file)
@@ -1151,6 +1151,13 @@ static int sys_change_to_m(struct proc *p)
        return retval;
 }
 
+/* Initializes a process to run virtual machine contexts, returning the number
+ * initialized, optionally setting errno */
+static int sys_setup_vmm(struct proc *p, unsigned int nr_guest_pcores)
+{
+       return vmm_struct_init(&p->vmm, nr_guest_pcores);
+}
+
 /* Pokes the ksched for the given resource for target_pid.  If the target pid
  * == 0, we just poke for the calling process.  The common case is poking for
  * self, so we avoid the lookup. 
@@ -2231,6 +2238,7 @@ const struct sys_table_entry syscall_table[] = {
        [SYS_init_arsc] = {(syscall_t)sys_init_arsc, "init_arsc"},
 #endif
        [SYS_change_to_m] = {(syscall_t)sys_change_to_m, "change_to_m"},
+       [SYS_setup_vmm] = {(syscall_t)sys_setup_vmm, "setup_vmm"},
        [SYS_poke_ksched] = {(syscall_t)sys_poke_ksched, "poke_ksched"},
        [SYS_abort_sysc] = {(syscall_t)sys_abort_sysc, "abort_sysc"},
        [SYS_abort_sysc_fd] = {(syscall_t)sys_abort_sysc_fd, "abort_sysc_fd"},