# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID a9ead230cc6038dd4905574b70328d3889c22c03
# Parent d783bdd14f2eff514e36b92ded0e3d22be7cf3d0
Complete arch_domain_create refactoring for ia64.
Signed-off-by: Kevin Tian <kevin.tian@xxxxxxxxx>
diff -r d783bdd14f2e -r a9ead230cc60 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Sat Jan 14 22:40:09 2006
+++ b/xen/arch/ia64/xen/domain.c Mon Jan 16 13:47:31 2006
@@ -65,6 +65,7 @@
unsigned long map_domain_page0(struct domain *);
extern unsigned long dom_fw_setup(struct domain *, char *, int);
+static void init_switch_stack(struct vcpu *v);
/* this belongs in include/asm, but there doesn't seem to be a suitable place
*/
void arch_domain_destroy(struct domain *d)
@@ -145,27 +146,45 @@
struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id)
{
struct vcpu *v;
+ struct thread_info *ti;
/* Still keep idle vcpu0 static allocated at compilation, due
* to some code from Linux still requires it in early phase.
*/
if (is_idle_domain(d) && !vcpu_id)
- return idle_vcpu[0];
-
- if ((v = alloc_xenheap_pages(KERNEL_STACK_SIZE_ORDER)) == NULL)
+ v = idle_vcpu[0];
+ else {
+ if ((v = alloc_xenheap_pages(KERNEL_STACK_SIZE_ORDER)) == NULL)
return NULL;
-
- memset(v, 0, sizeof(*v));
- memcpy(&v->arch, &idle_vcpu[0]->arch, sizeof(v->arch));
+ memset(v, 0, sizeof(*v));
+ }
+
+ ti = alloc_thread_info(v);
+ /* Clear thread_info to clear some important fields, like
+ * preempt_count
+ */
+ memset(ti, 0, sizeof(struct thread_info));
+ init_switch_stack(v);
if (!is_idle_domain(d)) {
v->arch.privregs =
alloc_xenheap_pages(get_order(sizeof(mapped_regs_t)));
BUG_ON(v->arch.privregs == NULL);
memset(v->arch.privregs, 0, PAGE_SIZE);
- }
-
- printf("arch_vcpu_info=%p\n", v->arch.privregs);
+
+ if (!vcpu_id)
+ memset(&d->shared_info->evtchn_mask[0], 0xff,
+ sizeof(d->shared_info->evtchn_mask));
+
+ v->vcpu_info = &(d->shared_info->vcpu_info[0]);
+ v->arch.metaphysical_rr0 = d->arch.metaphysical_rr0;
+ v->arch.metaphysical_rr4 = d->arch.metaphysical_rr4;
+ v->arch.metaphysical_saved_rr0 = d->arch.metaphysical_rr0;
+ v->arch.metaphysical_saved_rr4 = d->arch.metaphysical_rr4;
+ v->arch.starting_rid = d->arch.starting_rid;
+ v->arch.ending_rid = d->arch.ending_rid;
+ v->arch.breakimm = d->arch.breakimm;
+ }
return v;
}
@@ -195,34 +214,19 @@
int arch_domain_create(struct domain *d)
{
- struct thread_info *ti = alloc_thread_info(v);
-
- /* Clear thread_info to clear some important fields, like preempt_count
*/
- memset(ti, 0, sizeof(struct thread_info));
- init_switch_stack(v);
-
// the following will eventually need to be negotiated dynamically
d->xen_vastart = XEN_START_ADDR;
d->xen_vaend = XEN_END_ADDR;
d->shared_info_va = SHAREDINFO_ADDR;
- if (is_idle_vcpu(v))
+ if (is_idle_domain(d))
return 0;
- d->shared_info = (void *)alloc_xenheap_page();
- if (!d->shared_info) {
- printk("ERROR/HALTING: CAN'T ALLOC PAGE\n");
- while (1);
- }
+ if ((d->shared_info = (void *)alloc_xenheap_page()) == NULL)
+ goto fail_nomem;
memset(d->shared_info, 0, PAGE_SIZE);
- if (v == d->vcpu[0])
- memset(&d->shared_info->evtchn_mask[0], 0xff,
- sizeof(d->shared_info->evtchn_mask));
-
- v->vcpu_info = &(d->shared_info->vcpu_info[0]);
d->max_pages = (128UL*1024*1024)/PAGE_SIZE; // 128MB default // FIXME
-
/* We may also need emulation rid for region4, though it's unlikely
* to see guest issue uncacheable access in metaphysical mode. But
* keep such info here may be more sane.
@@ -230,34 +234,27 @@
if (((d->arch.metaphysical_rr0 = allocate_metaphysical_rr()) == -1UL)
|| ((d->arch.metaphysical_rr4 = allocate_metaphysical_rr()) == -1UL))
BUG();
-// VCPU(v, metaphysical_mode) = 1;
- v->arch.metaphysical_rr0 = d->arch.metaphysical_rr0;
- v->arch.metaphysical_rr4 = d->arch.metaphysical_rr4;
- v->arch.metaphysical_saved_rr0 = d->arch.metaphysical_rr0;
- v->arch.metaphysical_saved_rr4 = d->arch.metaphysical_rr4;
#define DOMAIN_RID_BITS_DEFAULT 18
if (!allocate_rid_range(d,DOMAIN_RID_BITS_DEFAULT)) // FIXME
BUG();
- v->arch.starting_rid = d->arch.starting_rid;
- v->arch.ending_rid = d->arch.ending_rid;
d->arch.breakimm = 0x1000;
- v->arch.breakimm = d->arch.breakimm;
-
d->arch.sys_pgnr = 0;
- d->arch.mm = xmalloc(struct mm_struct);
- if (unlikely(!d->arch.mm)) {
- printk("Can't allocate mm_struct for domain %d\n",d->domain_id);
- return -ENOMEM;
- }
+
+ if ((d->arch.mm = xmalloc(struct mm_struct)) == NULL)
+ goto fail_nomem;
memset(d->arch.mm, 0, sizeof(*d->arch.mm));
- d->arch.mm->pgd = pgd_alloc(d->arch.mm);
- if (unlikely(!d->arch.mm->pgd)) {
- printk("Can't allocate pgd for domain %d\n",d->domain_id);
- return -ENOMEM;
- }
+
+ if ((d->arch.mm->pgd = pgd_alloc(d->arch.mm)) == NULL)
+ goto fail_nomem;
+
printf ("arch_domain_create: domain=%p\n", d);
-
return 0;
+
+fail_nomem:
+ free_xenheap_page(d->shared_info);
+ xfree(d->arch.mm);
+ pgd_free(d->arch.mm->pgd);
+ return -ENOMEM;
}
void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|