aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/ia64/hypercall.c
diff options
context:
space:
mode:
Diffstat (limited to 'xen/arch/ia64/hypercall.c')
-rw-r--r--xen/arch/ia64/hypercall.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/xen/arch/ia64/hypercall.c b/xen/arch/ia64/hypercall.c
index 648bbfbbe8..b6f3167c09 100644
--- a/xen/arch/ia64/hypercall.c
+++ b/xen/arch/ia64/hypercall.c
@@ -40,6 +40,17 @@ ia64_hypercall (struct pt_regs *regs)
#endif
x = pal_emulator_static(regs->r28);
if (regs->r28 == PAL_HALT_LIGHT) {
+#if 1
+#define SPURIOUS_VECTOR 15
+ if (vcpu_check_pending_interrupts(v)!=SPURIOUS_VECTOR) {
+//printf("Domain trying to go idle when interrupt pending!\n");
+//this shouldn't happen, but it apparently does quite a bit! so don't
+//allow it to happen... i.e. if a domain has an interrupt pending and
+//it tries to halt itself because it thinks it is idle, just return here
+//as deliver_pending_interrupt is called on the way out and will deliver it
+ }
+ else
+#endif
do_sched_op(SCHEDOP_yield);
//break;
}
@@ -138,6 +149,12 @@ ia64_hypercall (struct pt_regs *regs)
regs->r8 = do_event_channel_op(regs->r14);
break;
+#ifndef CONFIG_VTI
+ case __HYPERVISOR_grant_table_op:
+ regs->r8 = do_grant_table_op(regs->r14, regs->r15, regs->r16);
+ break;
+#endif
+
case __HYPERVISOR_console_io:
regs->r8 = do_console_io(regs->r14, regs->r15, regs->r16);
break;