printk("domain_crash_sync called from entry.S: fault at %p %pS\n",
_p(addr), _p(addr));
- __domain_crash_synchronous();
+ __domain_crash(current->domain);
+
+ for ( ; ; )
+ do_softirq();
}
/*
}
-void __domain_crash_synchronous(void)
-{
- __domain_crash(current->domain);
-
- vcpu_end_shutdown_deferral(current);
-
- for ( ; ; )
- do_softirq();
-}
-
-
int domain_shutdown(struct domain *d, u8 reason)
{
struct vcpu *v;
*/
#include <xen/sched.h>
+#include <xen/softirq.h>
#include <xen/wait.h>
#include <xen/errno.h>
if ( vcpu_set_hard_affinity(curr, cpumask_of(wqv->wakeup_cpu)) )
{
gdprintk(XENLOG_ERR, "Unable to set vcpu affinity\n");
- domain_crash_synchronous();
+ domain_crash(current->domain);
+
+ for ( ; ; )
+ do_softirq();
}
/* Hand-rolled setjmp(). */
if ( unlikely(wqv->esp == 0) )
{
gdprintk(XENLOG_ERR, "Stack too large in %s\n", __func__);
- domain_crash_synchronous();
+ domain_crash(current->domain);
+
+ for ( ; ; )
+ do_softirq();
}
cpu_info->guest_cpu_user_regs.entry_vector = entry_vector;
if ( vcpu_set_hard_affinity(curr, cpumask_of(wqv->wakeup_cpu)) )
{
gdprintk(XENLOG_ERR, "Unable to set vcpu affinity\n");
- domain_crash_synchronous();
+ domain_crash(current->domain);
}
wait(); /* takes us back into the scheduler */
}
__domain_crash(d); \
} while (0)
-/*
- * Mark current domain as crashed and synchronously deschedule from the local
- * processor. This function never returns.
- */
-void noreturn __domain_crash_synchronous(void);
-#define domain_crash_synchronous() do { \
- printk("domain_crash_sync called from %s:%d\n", __FILE__, __LINE__); \
- __domain_crash_synchronous(); \
-} while (0)
-
/*
* Called from assembly code, with an optional address to help indicate why
* the crash occured. If addr is 0, look up address from last extable