WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Merge firebug.cl.cam.ac.uk:/local/scratch/kaf24/xen-2.0-

To: xen-changelog@xxxxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Merge firebug.cl.cam.ac.uk:/local/scratch/kaf24/xen-2.0-testing.bk
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Wed, 23 Mar 2005 09:08:07 +0000
Delivery-date: Wed, 23 Mar 2005 14:17:06 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-archive: <http://sourceforge.net/mailarchive/forum.php?forum=xen-changelog>
List-help: <mailto:xen-changelog-request@lists.sourceforge.net?subject=help>
List-id: <xen-changelog.lists.sourceforge.net>
List-post: <mailto:xen-changelog@lists.sourceforge.net>
List-subscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=subscribe>
List-unsubscribe: <https://lists.sourceforge.net/lists/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.sourceforge.net?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-admin@xxxxxxxxxxxxxxxxxxxxx
ChangeSet 1.1352, 2005/03/23 09:08:07+00:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Merge firebug.cl.cam.ac.uk:/local/scratch/kaf24/xen-2.0-testing.bk
        into firebug.cl.cam.ac.uk:/local/scratch/kaf24/xen-unstable.bk



 tools/libxc/xc_private.h |   13 ++++
 xen/common/domain.c      |  144 +++++++++++++++++++++++++++++++++++++----------
 2 files changed, 129 insertions(+), 28 deletions(-)


diff -Nru a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h
--- a/tools/libxc/xc_private.h  2005-03-23 05:03:38 -05:00
+++ b/tools/libxc/xc_private.h  2005-03-23 05:03:38 -05:00
@@ -199,4 +199,17 @@
 
 unsigned long xc_get_m2p_start_mfn ( int xc_handle );
 
+long xc_get_tot_pages(int xc_handle, u32 domid);
+
+int xc_copy_to_domain_page(int xc_handle, u32 domid,
+                            unsigned long dst_pfn, void *src_page);
+
+unsigned long xc_get_filesz(int fd);
+
+char *xc_read_kernel_image(const char *filename, unsigned long *size);
+
+void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
+                   int xch, u32 dom, unsigned long *parray,
+                   unsigned long vstart);
+
 #endif /* __XC_PRIVATE_H__ */
diff -Nru a/xen/common/domain.c b/xen/common/domain.c
--- a/xen/common/domain.c       2005-03-23 05:03:38 -05:00
+++ b/xen/common/domain.c       2005-03-23 05:03:38 -05:00
@@ -7,6 +7,7 @@
 #include <xen/config.h>
 #include <xen/init.h>
 #include <xen/lib.h>
+#include <xen/sched.h>
 #include <xen/errno.h>
 #include <xen/sched.h>
 #include <xen/mm.h>
@@ -16,7 +17,7 @@
 #include <asm/shadow.h>
 #include <public/dom0_ops.h>
 #include <asm/domain_page.h>
-#include <public/io/domain_controller.h>
+#include <asm/debugger.h>
 
 /* Both these structures are protected by the domlist_lock. */
 rwlock_t domlist_lock = RW_LOCK_UNLOCKED;
@@ -28,20 +29,23 @@
 struct domain *do_createdomain(domid_t dom_id, unsigned int cpu)
 {
     struct domain *d, **pd;
+    struct exec_domain *ed;
 
     if ( (d = alloc_domain_struct()) == NULL )
         return NULL;
 
-    atomic_set(&d->refcnt, 1);
-    atomic_set(&d->pausecnt, 0);
+    ed = d->exec_domain[0];
 
-    shadow_lock_init(d);
+    atomic_set(&d->refcnt, 1);
+    atomic_set(&ed->pausecnt, 0);
 
     d->id          = dom_id;
-    d->processor   = cpu;
+    ed->processor  = cpu;
     d->create_time = NOW();
  
-    memcpy(&d->thread, &idle0_task.thread, sizeof(d->thread));
+    spin_lock_init(&d->time_lock);
+
+    spin_lock_init(&d->big_lock);
 
     spin_lock_init(&d->page_alloc_lock);
     INIT_LIST_HEAD(&d->page_list);
@@ -59,9 +63,9 @@
         return NULL;
     }
     
-    arch_do_createdomain(d);
+    arch_do_createdomain(ed);
     
-    sched_add_domain(d);
+    sched_add_domain(ed);
 
     if ( d->id != IDLE_DOMAIN_ID )
     {
@@ -127,10 +131,13 @@
 
 void domain_kill(struct domain *d)
 {
+    struct exec_domain *ed;
+
     domain_pause(d);
-    if ( !test_and_set_bit(DF_DYING, &d->flags) )
+    if ( !test_and_set_bit(DF_DYING, &d->d_flags) )
     {
-        sched_rem_domain(d);
+        for_each_exec_domain(d, ed)
+            sched_rem_domain(ed);
         domain_relinquish_memory(d);
         put_domain(d);
     }
@@ -139,24 +146,32 @@
 
 void domain_crash(void)
 {
-    if ( current->id == 0 )
+    struct domain *d = current->domain;
+
+    if ( d->id == 0 )
         BUG();
 
-    set_bit(DF_CRASHED, &current->flags);
+    set_bit(DF_CRASHED, &d->d_flags);
 
-    send_guest_virq(dom0, VIRQ_DOM_EXC);
+    send_guest_virq(dom0->exec_domain[0], VIRQ_DOM_EXC);
     
     __enter_scheduler();
     BUG();
 }
 
+extern void trap_to_xendbg(void);
+
 void domain_shutdown(u8 reason)
 {
-    if ( current->id == 0 )
+    struct domain *d = current->domain;
+
+    if ( d->id == 0 )
     {
         extern void machine_restart(char *);
         extern void machine_halt(void);
 
+        debugger_trap_immediate();
+
         if ( reason == SHUTDOWN_poweroff ) 
         {
             printk("Domain 0 halted: halting machine.\n");
@@ -175,10 +190,10 @@
         BUG();
     }
 
-    current->shutdown_code = reason;
-    set_bit(DF_SHUTDOWN, &current->flags);
+    d->shutdown_code = reason;
+    set_bit(DF_SHUTDOWN, &d->d_flags);
 
-    send_guest_virq(dom0, VIRQ_DOM_EXC);
+    send_guest_virq(dom0->exec_domain[0], VIRQ_DOM_EXC);
 
     __enter_scheduler();
 }
@@ -214,7 +229,7 @@
     struct domain **pd;
     atomic_t      old, new;
 
-    if ( !test_bit(DF_DYING, &d->flags) )
+    if ( !test_bit(DF_DYING, &d->d_flags) )
         BUG();
 
     /* May be already destructed, or get_domain() can race us. */
@@ -247,38 +262,101 @@
 
 
 /*
- * final_setup_guestos is used for final setup and launching of domains other
+ * set_info_guest is used for final setup, launching, and state modification 
+ * of domains other than domain 0. ie. the domains that are being built by 
+ * the userspace dom0 domain builder.
+ */
+int set_info_guest(struct domain *p, dom0_setdomaininfo_t *setdomaininfo)
+{
+    int rc = 0;
+    full_execution_context_t *c = NULL;
+    unsigned long vcpu = setdomaininfo->exec_domain;
+    struct exec_domain *ed; 
+
+    if ( (vcpu >= MAX_VIRT_CPUS) || ((ed = p->exec_domain[vcpu]) == NULL) )
+        return -EINVAL;
+    
+    if (test_bit(DF_CONSTRUCTED, &p->d_flags) && 
+        !test_bit(EDF_CTRLPAUSE, &ed->ed_flags))
+        return -EINVAL;
+
+    if ( (c = xmalloc(full_execution_context_t)) == NULL )
+        return -ENOMEM;
+
+    if ( copy_from_user(c, setdomaininfo->ctxt, sizeof(*c)) )
+    {
+        rc = -EFAULT;
+        goto out;
+    }
+    
+    if ( (rc = arch_set_info_guest(ed, c)) != 0 )
+        goto out;
+
+    set_bit(DF_CONSTRUCTED, &p->d_flags);
+
+ out:    
+    if ( c != NULL )
+        xfree(c);
+    return rc;
+}
+
+/*
+ * final_setup_guest is used for final setup and launching of domains other
  * than domain 0. ie. the domains that are being built by the userspace dom0
  * domain builder.
  */
-int final_setup_guestos(struct domain *p, dom0_builddomain_t *builddomain)
+long do_boot_vcpu(unsigned long vcpu, full_execution_context_t *ctxt) 
 {
+    struct domain *d = current->domain;
+    struct exec_domain *ed;
     int rc = 0;
     full_execution_context_t *c;
 
-    if ( (c = xmalloc(sizeof(*c))) == NULL )
+    if ( (vcpu >= MAX_VIRT_CPUS) || (d->exec_domain[vcpu] != NULL) )
+        return -EINVAL;
+
+    if ( alloc_exec_domain_struct(d, vcpu) == NULL )
         return -ENOMEM;
 
-    if ( test_bit(DF_CONSTRUCTED, &p->flags) )
+    if ( (c = xmalloc(full_execution_context_t)) == NULL )
     {
-        rc = -EINVAL;
+        rc = -ENOMEM;
         goto out;
     }
 
-    if ( copy_from_user(c, builddomain->ctxt, sizeof(*c)) )
+    if ( copy_from_user(c, ctxt, sizeof(*c)) )
     {
         rc = -EFAULT;
         goto out;
     }
-    
-    if ( (rc = arch_final_setup_guestos(p,c)) != 0 )
+
+    ed = d->exec_domain[vcpu];
+
+    atomic_set(&ed->pausecnt, 0);
+
+    memcpy(&ed->arch, &idle0_exec_domain.arch, sizeof(ed->arch));
+
+    arch_do_boot_vcpu(ed);
+
+    sched_add_domain(ed);
+
+    if ( (rc = arch_set_info_guest(ed, c)) != 0 ) {
+        sched_rem_domain(ed);


-------------------------------------------------------
This SF.net email is sponsored by: 2005 Windows Mobile Application Contest
Submit applications for Windows Mobile(tm)-based Pocket PCs or Smartphones
for the chance to win $25,000 and application distribution. Enter today at
http://ads.osdn.com/?ad_id=6882&alloc_id=15148&op=click
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/xen-changelog