diff -r 200a9c6deeb3 xen/arch/ia64/vmx/vlsapic.c --- a/xen/arch/ia64/vmx/vlsapic.c Mon Jan 22 16:27:03 2007 +0000 +++ b/xen/arch/ia64/vmx/vlsapic.c Fri Jan 19 13:07:07 2007 +0900 @@ -493,6 +493,18 @@ chk_irq_exit: } /* + * Set a INIT interruption request to vcpu[0] of target domain. + * The INIT interruption is injected into each vcpu by guest firmware. + */ +void vmx_pend_pal_init(struct domain *d) +{ + VCPU *vcpu; + + vcpu = d->vcpu[0]; + vcpu->arch.arch_vmx.pal_init_pending = 1; +} + +/* * Only coming from virtualization fault. */ void guest_write_eoi(VCPU *vcpu) @@ -636,6 +648,14 @@ static void vlsapic_deliver_ipi(VCPU *vc panic_domain(NULL, "Deliver reserved IPI!\n"); break; } +} + +/* + * Deliver the INIT interruption to guest. + */ +void deliver_pal_init(VCPU *vcpu) +{ + vlsapic_deliver_ipi(vcpu, SAPIC_INIT, 0); } /* diff -r 200a9c6deeb3 xen/arch/ia64/vmx/vmx_process.c --- a/xen/arch/ia64/vmx/vmx_process.c Mon Jan 22 16:27:03 2007 +0000 +++ b/xen/arch/ia64/vmx/vmx_process.c Fri Jan 19 15:44:49 2007 +0900 @@ -209,6 +209,12 @@ void leave_hypervisor_tail(struct pt_reg if (v->vcpu_id == 0) { int callback_irq = d->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ]; + if ( v->arch.arch_vmx.pal_init_pending ) { + /*inject INIT interruption to guest pal*/ + v->arch.arch_vmx.pal_init_pending = 0; + deliver_pal_init(v); + return; + } if (callback_irq != 0 && local_events_need_delivery()) { /* change level for para-device callback irq */ /* use level irq to send discrete event */ diff -r 200a9c6deeb3 xen/arch/ia64/xen/dom0_ops.c --- a/xen/arch/ia64/xen/dom0_ops.c Mon Jan 22 16:27:03 2007 +0000 +++ b/xen/arch/ia64/xen/dom0_ops.c Fri Jan 19 15:44:49 2007 +0900 @@ -174,6 +174,20 @@ long arch_do_domctl(xen_domctl_t *op, XE put_domain(d); } break; + + case XEN_DOMCTL_send_init: + { + struct domain *d = find_domain_by_id(op->domain); + + if ( d == NULL ) { + ret = -ESRCH; + break; + } + vmx_pend_pal_init(d); + put_domain(d); + } + break; + default: printk("arch_do_domctl: unrecognized domctl: %d!!!\n",op->cmd); ret = -ENOSYS; diff -r 200a9c6deeb3 xen/include/asm-ia64/vmx.h --- a/xen/include/asm-ia64/vmx.h Mon Jan 22 16:27:03 2007 +0000 +++ b/xen/include/asm-ia64/vmx.h Fri Jan 19 13:07:07 2007 +0900 @@ -55,6 +55,8 @@ extern void vmx_relinquish_vcpu_resource extern void vmx_relinquish_vcpu_resources(struct vcpu *v); extern void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err); extern void vmx_send_assist_req(struct vcpu *v); +extern void deliver_pal_init(struct vcpu *vcpu); +extern void vmx_pend_pal_init(struct domain *d); static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu) { diff -r 200a9c6deeb3 xen/include/asm-ia64/vmx_vpd.h --- a/xen/include/asm-ia64/vmx_vpd.h Mon Jan 22 16:27:03 2007 +0000 +++ b/xen/include/asm-ia64/vmx_vpd.h Fri Jan 19 13:07:07 2007 +0900 @@ -99,6 +99,7 @@ struct arch_vmx_struct { unsigned long flags; unsigned long xen_port; unsigned char xtp; + unsigned char pal_init_pending; #ifdef VTI_DEBUG unsigned long ivt_current; struct ivt_debug ivt_debug[IVT_DEBUG_MAX];