[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] RFC: vcpu hotplug (with patch!)


Le Mercredi 17 Mai 2006 16:24, Tristan Gingold a écrit :
Patch included.  Thanks to Isaku.

> Hi,
>
> this patch allows vcpu hot remove and hot add.
> Use echo 0/1 > /sys/devices/system/cpu/cpuN/online to hotadd/hotremove a
> vcpu.
>
> I'd like to clean up domain construction before submitting a new version of
> the patch.  The main issue is the use of vcpu_guest_context to build the
> domain.
>
> Tristan.
>
> _______________________________________________
> Xen-ia64-devel mailing list
> Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-ia64-devel
diff -r 45a3c14a5878 xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c	Wed May 17 07:19:24 2006
+++ b/xen/arch/ia64/xen/dom_fw.c	Wed May 17 11:28:14 2006
@@ -17,6 +17,7 @@
 #include <asm/meminit.h>
 #include <xen/compile.h>
 #include <xen/acpi.h>
+//#include <xen/hypercall.h>
 
 #include <asm/dom_fw.h>
 #include <public/sched.h>
@@ -113,25 +114,6 @@
 
 /* the following heavily leveraged from linux/arch/ia64/hp/sim/fw-emu.c */
 
-/* Set IP and GR1 of not yet initialized vcpu.  */
-static void
-set_os_boot_rendez (struct domain *d, unsigned long pc, unsigned long gr1)
-{
-	struct vcpu *v;
-	int i;
-
-	printf ("set_os_boot_rendez: %lx %lx\n", pc, gr1);
-	for (i = 1; i < MAX_VIRT_CPUS; i++) {
-		v = d->vcpu[i];
-		if (v != NULL
-		    && !test_bit(_VCPUF_initialised, &v->vcpu_flags)) {
-			struct pt_regs *regs = vcpu_regs (v);
-			regs->cr_iip = pc;
-			regs->r1 = gr1;
-		}
-	}
-}
-
 struct sal_ret_values
 sal_emulator (long index, unsigned long in1, unsigned long in2,
 	      unsigned long in3, unsigned long in4, unsigned long in5,
@@ -195,8 +177,11 @@
  				   second vector is reserved.  */
  				status = -2;
  			}
- 			else
- 				set_os_boot_rendez (current->domain, in2, in3);
+ 			else {
+				struct domain *d = current->domain;
+				d->arch.boot_rdv_ip = in2;
+				d->arch.boot_rdv_r1 = in3;
+			}
  		}
  		else
  			printf("*** CALLED SAL_SET_VECTORS %lu.  IGNORED...\n",
@@ -951,6 +936,11 @@
 	dom_fw_hypercall_patch (d, sal_ed->sal_proc, FW_HYPERCALL_SAL_CALL, 1);
 	sal_ed->gp = 0;  // will be ignored
 
+	/* SAL return point.  */
+	d->arch.sal_return_addr = FW_HYPERCALL_SAL_RETURN_PADDR + start_mpaddr;
+	dom_fw_hypercall_patch (d, d->arch.sal_return_addr,
+				FW_HYPERCALL_SAL_RETURN, 0);
+
 	/* Fill an AP wakeup descriptor.  */
 	sal_wakeup->type = SAL_DESC_AP_WAKEUP;
 	sal_wakeup->mechanism = IA64_SAL_AP_EXTERNAL_INT;
diff -r 45a3c14a5878 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c	Wed May 17 07:19:24 2006
+++ b/xen/arch/ia64/xen/domain.c	Wed May 17 11:28:14 2006
@@ -69,6 +69,8 @@
 unsigned long initrd_start = 0, initrd_end = 0;
 extern unsigned long running_on_sim;
 
+extern char dom0_command_line[];
+
 #define IS_XEN_ADDRESS(d,a) ((a >= d->xen_vastart) && (a <= d->xen_vaend))
 
 /* FIXME: where these declarations should be there ? */
@@ -210,8 +212,7 @@
 	sw->ar_fpsr = FPSR_DEFAULT;
 	v->arch._thread.ksp = (unsigned long) sw - 16;
 	// stay on kernel stack because may get interrupts!
-	// ia64_ret_from_clone (which b0 gets in new_thread) switches
-	// to user stack
+	// ia64_ret_from_clone switches to user stack
 	v->arch._thread.on_ustack = 0;
 	memset(v->arch._thread.fph,0,sizeof(struct ia64_fpreg)*96);
 }
@@ -246,6 +247,9 @@
 	if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
 	    goto fail_nomem;
 
+	d->shared_info->arch.flags = (d == dom0) ?
+		(SIF_INITDOMAIN|SIF_PRIVILEGED) : 0;
+
 	printf ("arch_domain_create: domain=%p\n", d);
 	return 0;
 
@@ -267,6 +271,7 @@
 {
 	struct pt_regs *regs = vcpu_regs (v);
 	struct domain *d = v->domain;
+	unsigned long cmdline_addr;
 
 	if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
             return 0;
@@ -284,6 +289,7 @@
 	    build_physmap_table(d);
 
 	*regs = c->regs;
+	cmdline_addr = 0;
 	if (v == d->vcpu[0]) {
 	    /* Only for first vcpu.  */
 	    d->arch.sys_pgnr = c->sys_pgnr;
@@ -292,11 +298,28 @@
 	    d->arch.cmdline      = c->cmdline;
 	    d->shared_info->arch = c->shared;
 
+	    if (!VMX_DOMAIN(v)) {
+		    const char *cmdline = d->arch.cmdline;
+		    int len;
+
+		    if (*cmdline == 0) {
+#define DEFAULT_CMDLINE "nomca nosmp xencons=tty0 console=tty0 root=/dev/hda1"
+			    cmdline = DEFAULT_CMDLINE;
+			    len = sizeof (DEFAULT_CMDLINE);
+			    printf("domU command line defaulted to"
+				   DEFAULT_CMDLINE "\n");
+		    }
+		    else
+			    len = IA64_COMMAND_LINE_SIZE;
+		    cmdline_addr = dom_fw_setup (d, cmdline, len);
+	    }
+
 	    /* Cache synchronization seems to be done by the linux kernel
 	       during mmap/unmap operation.  However be conservative.  */
 	    domain_cache_flush (d, 1);
 	}
-	new_thread(v, regs->cr_iip, 0, 0);
+	vcpu_init_regs (v);
+	regs->r28 = cmdline_addr;
 
 	if ( c->privregs && copy_from_user(v->arch.privregs,
 			   c->privregs, sizeof(mapped_regs_t))) {
@@ -305,7 +328,6 @@
 	    return -EFAULT;
 	}
 
-	v->arch.domain_itm_last = -1L;
 
 	/* Don't redo final setup */
 	set_bit(_VCPUF_initialised, &v->vcpu_flags);
@@ -492,20 +514,9 @@
     relinquish_memory(d, &d->page_list);
 }
 
-// heavily leveraged from linux/arch/ia64/kernel/process.c:copy_thread()
-// and linux/arch/ia64/kernel/process.c:kernel_thread()
-void new_thread(struct vcpu *v,
-                unsigned long start_pc,
-                unsigned long start_stack,
-                unsigned long start_info)
-{
-	struct domain *d = v->domain;
+void vcpu_init_regs (struct vcpu *v)
+{
 	struct pt_regs *regs;
-	extern char dom0_command_line[];
-
-#ifdef CONFIG_DOMAIN0_CONTIGUOUS
-	if (d == dom0 && v->vcpu_id == 0) start_pc += dom0_start;
-#endif
 
 	regs = vcpu_regs (v);
 	if (VMX_DOMAIN(v)) {
@@ -518,44 +529,16 @@
 				   | IA64_PSR_RI | IA64_PSR_IS);
 		regs->cr_ipsr |= 2UL << IA64_PSR_CPL0_BIT; // domain runs at PL2
 	}
-	regs->cr_iip = start_pc;
 	regs->cr_ifs = 1UL << 63; /* or clear? */
 	regs->ar_fpsr = FPSR_DEFAULT;
 
 	if (VMX_DOMAIN(v)) {
 		vmx_init_all_rr(v);
-		if (d == dom0)
-		    regs->r28 = dom_fw_setup(d,dom0_command_line,
-					     COMMAND_LINE_SIZE);
 		/* Virtual processor context setup */
 		VCPU(v, vpsr) = IA64_PSR_BN;
 		VCPU(v, dcr) = 0;
 	} else {
 		init_all_rr(v);
-		if (v->vcpu_id == 0) {
-			/* Build the firmware.  */
-			if (d == dom0) 
-				regs->r28 = dom_fw_setup(d,dom0_command_line,
-							 COMMAND_LINE_SIZE);
-			else {
-				const char *cmdline = d->arch.cmdline;
-				int len;
-
-				if (*cmdline == 0) {
-#define DEFAULT_CMDLINE "nomca nosmp xencons=tty0 console=tty0 root=/dev/hda1"
-					cmdline = DEFAULT_CMDLINE;
-					len = sizeof (DEFAULT_CMDLINE);
-					printf("domU command line defaulted to"
-					       DEFAULT_CMDLINE "\n");
-				}
-				else
-					len = IA64_COMMAND_LINE_SIZE;
-
-				regs->r28 = dom_fw_setup (d, cmdline, len);
-			}
-			d->shared_info->arch.flags = (d == dom0) ?
-				(SIF_INITDOMAIN|SIF_PRIVILEGED) : 0;
-		}
 		regs->ar_rsc |= (2 << 2); /* force PL2/3 */
 		VCPU(v, banknum) = 1;
 		VCPU(v, metaphysical_mode) = 1;
@@ -563,6 +546,8 @@
 		    (uint64_t)SHAREDINFO_ADDR + INT_ENABLE_OFFSET(v);
 		VCPU(v, itv) = (1 << 16); /* timer vector masked */
 	}
+
+	v->arch.domain_itm_last = -1L;
 }
 
 // stolen from share_xen_page_with_guest() in xen/arch/x86/mm.c
@@ -1560,6 +1545,7 @@
 	unsigned long pkern_end;
 	unsigned long pinitrd_start = 0;
 	unsigned long pstart_info;
+	unsigned long cmdline_addr;
 	struct page_info *start_info_page;
 
 #ifdef VALIDATE_VT
@@ -1733,7 +1719,16 @@
 
 	set_bit(_VCPUF_initialised, &v->vcpu_flags);
 
-	new_thread(v, pkern_entry, 0, 0);
+	cmdline_addr = dom_fw_setup(d, dom0_command_line, COMMAND_LINE_SIZE);
+
+	vcpu_init_regs (v);
+
+#ifdef CONFIG_DOMAIN0_CONTIGUOUS
+	pkern_entry += dom0_start;
+#endif
+	vcpu_regs (v)->cr_iip = pkern_entry;
+	vcpu_regs (v)->r28 = cmdline_addr;
+
 	physdev_init_dom0(d);
 
 	// dom0 doesn't need build_physmap_table()
diff -r 45a3c14a5878 xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c	Wed May 17 07:19:24 2006
+++ b/xen/arch/ia64/xen/hypercall.c	Wed May 17 11:28:14 2006
@@ -128,6 +128,7 @@
 	int cpu = regs->r14;
 	int vector = regs->r15;
 	struct vcpu *targ;
+	struct domain *d = current->domain;
 		    
 	if (0 && vector == 254)
 		printf ("send_ipi from %d to %d vector=%d\n",
@@ -136,32 +137,39 @@
 	if (cpu > MAX_VIRT_CPUS)
 		return;
 
-	targ = current->domain->vcpu[cpu];
+	targ = d->vcpu[cpu];
 	if (targ == NULL)
 		return;
 
-	if (vector == XEN_SAL_BOOT_RENDEZ_VEC
-	    && !test_bit(_VCPUF_initialised, &targ->vcpu_flags)) {
-		struct pt_regs *targ_regs = vcpu_regs (targ);
-		struct vcpu_guest_context c;
+  	if (vector == XEN_SAL_BOOT_RENDEZ_VEC
+	    && (!test_bit(_VCPUF_initialised, &targ->vcpu_flags)
+		|| test_bit(_VCPUF_down, &targ->vcpu_flags))) {
+		if (!test_bit(_VCPUF_initialised, &targ->vcpu_flags)) {
+			struct vcpu_guest_context c;
 		
-		printf ("arch_boot_vcpu: %p %p\n",
-			(void *)targ_regs->cr_iip,
-			(void *)targ_regs->r1);
-		memset (&c, 0, sizeof (c));
-		/* Copy regs.  */
-		c.regs.cr_iip = targ_regs->cr_iip;
-		c.regs.r1 = targ_regs->r1;
-		
-		if (arch_set_info_guest (targ, &c) != 0) {
-			printf ("arch_boot_vcpu: failure\n");
-			return;
+			memset (&c, 0, sizeof (c));
+
+#if 0			
+			/* Copy from vcpu 0.  */
+			c.vcpu.evtchn_vector = current->domain->vcpu[0]->
+				vcpu_info->arch.evtchn_vector;
+#endif
+			if (arch_set_info_guest (targ, &c) != 0) {
+				printf ("arch_boot_vcpu: failure\n");
+				return;
+			}
 		}
+			
+		vcpu_init_regs (targ);
+		vcpu_regs (targ)->cr_iip = d->arch.boot_rdv_ip;
+		vcpu_regs (targ)->r1 = d->arch.boot_rdv_r1;
+		vcpu_regs (targ)->b0 = d->arch.sal_return_addr;
+
 		if (test_and_clear_bit(_VCPUF_down,
 				       &targ->vcpu_flags)) {
 			vcpu_wake(targ);
-			printf ("arch_boot_vcpu: vcpu %d awaken %016lx!\n",
-				targ->vcpu_id, targ_regs->cr_iip);
+			printf ("arch_boot_vcpu: vcpu %d awaken\n",
+				targ->vcpu_id);
 		}
 		else
 			printf ("arch_boot_vcpu: huu, already awaken!");
@@ -245,6 +253,11 @@
 		regs->r8 = x.r8; regs->r9 = x.r9;
 		regs->r10 = x.r10; regs->r11 = x.r11;
 		break;
+ 	    case FW_HYPERCALL_SAL_RETURN:
+	      printf ("Sal_return vcpu %d\n", v->vcpu_id);
+	        if ( !test_and_set_bit(_VCPUF_down, &v->vcpu_flags) )
+			vcpu_sleep_nosync(v);
+		break;
 	    case FW_HYPERCALL_EFI_CALL:
 		efi_ret_value = efi_emulator (regs, &fault);
 		if (fault != IA64_NO_FAULT) return fault;
diff -r 45a3c14a5878 xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c	Wed May 17 07:19:24 2006
+++ b/xen/arch/ia64/xen/privop.c	Wed May 17 11:28:14 2006
@@ -166,19 +166,19 @@
 IA64FAULT priv_ptr_d(VCPU *vcpu, INST64 inst)
 {
 	UINT64 vadr = vcpu_get_gr(vcpu,inst.M45.r3);
-	UINT64 addr_range;
-
-	addr_range = 1 << ((vcpu_get_gr(vcpu,inst.M45.r2) & 0xfc) >> 2);
-	return vcpu_ptr_d(vcpu,vadr,addr_range);
+	UINT64 log_range;
+
+	log_range = (vcpu_get_gr(vcpu,inst.M45.r2) & 0xfc) >> 2;
+	return vcpu_ptr_d(vcpu,vadr,log_range);
 }
 
 IA64FAULT priv_ptr_i(VCPU *vcpu, INST64 inst)
 {
 	UINT64 vadr = vcpu_get_gr(vcpu,inst.M45.r3);
-	UINT64 addr_range;
-
-	addr_range = 1 << ((vcpu_get_gr(vcpu,inst.M45.r2) & 0xfc) >> 2);
-	return vcpu_ptr_i(vcpu,vadr,addr_range);
+	UINT64 log_range;
+
+	log_range = (vcpu_get_gr(vcpu,inst.M45.r2) & 0xfc) >> 2;
+	return vcpu_ptr_i(vcpu,vadr,log_range);
 }
 
 IA64FAULT priv_tpa(VCPU *vcpu, INST64 inst)
diff -r 45a3c14a5878 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c	Wed May 17 07:19:24 2006
+++ b/xen/arch/ia64/xen/vcpu.c	Wed May 17 11:28:14 2006
@@ -1275,6 +1275,12 @@
 
 int warn_region0_address = 0; // FIXME later: tie to a boot parameter?
 
+/* Return TRUE iff [b1,e1] and [b2,e2] partially or fully overlaps.  */
+static inline int range_overlap (u64 b1, u64 e1, u64 b2, u64 e2)
+{
+	return (b1 <= e2) && (e1 >= b2);
+}
+
 // FIXME: also need to check && (!trp->key || vcpu_pkr_match(trp->key))
 static inline int vcpu_match_tr_entry_no_p(TR_ENTRY *trp, UINT64 ifa, UINT64 rid)
 {
@@ -1286,6 +1292,16 @@
 static inline int vcpu_match_tr_entry(TR_ENTRY *trp, UINT64 ifa, UINT64 rid)
 {
 	return trp->pte.p && vcpu_match_tr_entry_no_p(trp, ifa, rid);
+}
+
+static inline int
+vcpu_match_tr_entry_range(TR_ENTRY *trp, UINT64 rid, u64 b, u64 e)
+{
+	return trp->rid == rid
+		&& trp->pte.p
+		&& range_overlap (b, e,
+				  trp->vadr, trp->vadr + (1L << trp->ps) - 1);
+
 }
 
 IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 *pteval, UINT64 *itir, UINT64 *iha)
@@ -1310,8 +1326,8 @@
 			 * region=5,VMM need to handle this tlb miss as if
 			 * PSCB(vcpu,metaphysical_mode)=0
 			 */           
-			printk("vcpu_translate: bad physical address: 0x%lx\n",
-			       address);
+			printk("vcpu_translate: bad physical address: 0x%lx at %lx\n",
+			       address, vcpu_regs (vcpu)->cr_iip);
 
 		} else {
 			*pteval = (address & _PAGE_PPN_MASK) | __DIRTY_BITS |
@@ -1750,8 +1766,6 @@
  VCPU translation cache access routines
 **************************************************************************/
 
-void foobar(void) { /*vcpu_verbose = 1;*/ }
-
 void vcpu_itc_no_srlz(VCPU *vcpu, UINT64 IorD, UINT64 vaddr, UINT64 pte, UINT64 mp_pte, UINT64 logps)
 {
 	unsigned long psr;
@@ -1889,16 +1903,59 @@
 	return IA64_NO_FAULT;
 }
 
-IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr,UINT64 addr_range)
-{
-	printf("vcpu_ptr_d: Purging TLB is unsupported\n");
-	// don't forget to recompute dtr_regions
-	return (IA64_ILLOP_FAULT);
-}
-
-IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr,UINT64 addr_range)
-{
-	printf("vcpu_ptr_i: Purging TLB is unsupported\n");
-	// don't forget to recompute itr_regions
-	return (IA64_ILLOP_FAULT);
-}
+IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr,UINT64 log_range)
+{
+	unsigned long region = vadr >> 61;
+	u64 addr_range = 1UL << log_range;
+	unsigned long rid, rr;
+	int i;
+	TR_ENTRY *trp;
+
+	rr = PSCB(vcpu,rrs)[region];
+	rid = rr & RR_RID_MASK;
+
+	/* Purge TC  */
+	vcpu_purge_tr_entry(&PSCBX(vcpu,dtlb));
+
+	/* Purge tr and recompute dtr_regions.  */
+	vcpu->arch.dtr_regions = 0;
+	for (trp = vcpu->arch.dtrs, i = NDTRS; i; i--, trp++)
+		if (vcpu_match_tr_entry_range (trp,rid, vadr, vadr+addr_range))
+			vcpu_purge_tr_entry(trp);
+		else if (trp->pte.p)
+			vcpu_quick_region_set(vcpu->arch.dtr_regions,
+					      trp->vadr);
+
+	vcpu_flush_tlb_vhpt_range (vadr, log_range);
+
+	return IA64_NO_FAULT;
+}
+
+IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr,UINT64 log_range)
+{
+	unsigned long region = vadr >> 61;
+	u64 addr_range = 1UL << log_range;
+	unsigned long rid, rr;
+	int i;
+	TR_ENTRY *trp;
+
+	rr = PSCB(vcpu,rrs)[region];
+	rid = rr & RR_RID_MASK;
+
+	/* Purge TC  */
+	vcpu_purge_tr_entry(&PSCBX(vcpu,itlb));
+
+	/* Purge tr and recompute itr_regions.  */
+	vcpu->arch.itr_regions = 0;
+	for (trp = vcpu->arch.itrs, i = NITRS; i; i--, trp++)
+		if (vcpu_match_tr_entry_range (trp,rid, vadr, vadr+addr_range))
+			vcpu_purge_tr_entry(trp);
+		else if (trp->pte.p)
+			vcpu_quick_region_set(vcpu->arch.itr_regions,
+					      trp->vadr);
+
+
+	vcpu_flush_tlb_vhpt_range (vadr, log_range);
+
+	return IA64_NO_FAULT;
+}
diff -r 45a3c14a5878 xen/include/asm-ia64/dom_fw.h
--- a/xen/include/asm-ia64/dom_fw.h	Wed May 17 07:19:24 2006
+++ b/xen/include/asm-ia64/dom_fw.h	Wed May 17 11:28:14 2006
@@ -20,6 +20,11 @@
 #define FW_HYPERCALL_BASE_PADDR HYPERCALL_START
 #define	FW_HYPERCALL_END_PADDR HYPERCALL_END
 #define	FW_HYPERCALL_PADDR(index) (FW_HYPERCALL_BASE_PADDR + (16UL * index))
+
+/* Hypercalls number have a low part and a high part.
+   The high part is the class (xen/pal/sal/efi).  */
+#define FW_HYPERCALL_NUM_MASK_HIGH	~0xffUL
+#define FW_HYPERCALL_NUM_MASK_LOW	 0xffUL
 
 /*
  * PAL can be called in physical or virtual mode simply by
@@ -57,6 +62,11 @@
 #define FW_HYPERCALL_SAL_CALL_PADDR	FW_HYPERCALL_PADDR(FW_HYPERCALL_SAL_CALL_INDEX)
 #define FW_HYPERCALL_SAL_CALL		0x1100UL
 
+/* SAL return point.  */
+#define FW_HYPERCALL_SAL_RETURN_INDEX	0x84UL
+#define FW_HYPERCALL_SAL_RETURN_PADDR	FW_HYPERCALL_PADDR(FW_HYPERCALL_SAL_RETURN_INDEX)
+#define FW_HYPERCALL_SAL_RETURN		0x1200UL
+
 /*
  * EFI is accessed via the EFI system table, which contains:
  * - a header which contains version info
@@ -81,7 +91,6 @@
  */
 
 /* these are indexes into the runtime services table */
-#define	FW_HYPERCALL_EFI_BASE
 #define FW_HYPERCALL_EFI_GET_TIME_INDEX			0UL
 #define FW_HYPERCALL_EFI_SET_TIME_INDEX			1UL
 #define FW_HYPERCALL_EFI_GET_WAKEUP_TIME_INDEX		2UL
@@ -134,9 +143,6 @@
 /* Interrupt vector used for os boot rendez vous.  */
 #define XEN_SAL_BOOT_RENDEZ_VEC	0xF3
 
-#define FW_HYPERCALL_NUM_MASK_HIGH	~0xffUL
-#define FW_HYPERCALL_NUM_MASK_LOW	 0xffUL
-
 #define EFI_MEMDESC_VERSION		1
 
 extern struct ia64_pal_retval xen_pal_emulator(UINT64, u64, u64, u64);
diff -r 45a3c14a5878 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h	Wed May 17 07:19:24 2006
+++ b/xen/include/asm-ia64/domain.h	Wed May 17 11:28:14 2006
@@ -52,6 +52,13 @@
     unsigned long max_pfn; /* Max pfn including I/O holes */
     struct virtual_platform_def     vmx_platform;
 #define	hvm_domain vmx_platform /* platform defs are not vmx specific */
+
+    /* OS boot rendez vous.  */
+    unsigned long boot_rdv_ip;
+    unsigned long boot_rdv_r1;
+
+    /* SAL return point.  */
+    unsigned long sal_return_addr;
 
     u64 xen_vastart;
     u64 xen_vaend;
diff -r 45a3c14a5878 xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h	Wed May 17 07:19:24 2006
+++ b/xen/include/asm-ia64/vcpu.h	Wed May 17 11:28:14 2006
@@ -149,8 +149,8 @@
 extern IA64FAULT vcpu_ptc_e(VCPU *vcpu, UINT64 vadr);
 extern IA64FAULT vcpu_ptc_g(VCPU *vcpu, UINT64 vadr, UINT64 addr_range);
 extern IA64FAULT vcpu_ptc_ga(VCPU *vcpu, UINT64 vadr, UINT64 addr_range);
-extern IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr, UINT64 addr_range);
-extern IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr, UINT64 addr_range);
+extern IA64FAULT vcpu_ptr_d(VCPU *vcpu,UINT64 vadr, UINT64 log_range);
+extern IA64FAULT vcpu_ptr_i(VCPU *vcpu,UINT64 vadr, UINT64 log_range);
 extern IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data,
 				UINT64 *pteval, UINT64 *itir, UINT64 *iha);
 extern IA64FAULT vcpu_tpa(VCPU *vcpu, UINT64 vadr, UINT64 *padr);
@@ -173,6 +173,9 @@
 extern UINT64 vcpu_get_tmp(VCPU *, UINT64);
 extern void vcpu_set_tmp(VCPU *, UINT64, UINT64);
 
+/* Initialize vcpu regs (but not cr_iip, r1, b0...)  */
+extern void vcpu_init_regs (struct vcpu *v);
+
 static inline UINT64
 itir_ps(UINT64 itir)
 {
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


This mailing list archive is a service of Copilotco.