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, ¤t->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, ¤t->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
|