# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID bdf1a8039d1361f47ada7d0cd08582c30469bda8
# Parent 6d981d34cf52dc98a7bffcca9e90f7cde0ba88e2
Failure to revalidate a writable pagetable page should crash
the offending domain, not merely pause it. Also, callers can
now specify another domain to domain_crash().
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Mon Nov 14 11:28:47 2005
+++ b/xen/arch/x86/domain.c Mon Nov 14 14:21:16 2005
@@ -578,7 +578,7 @@
put_user(regs->rcx, rsp-11) )
{
DPRINTK("Error while creating failsafe callback frame.\n");
- domain_crash();
+ domain_crash(n->domain);
}
regs->entry_vector = TRAP_syscall;
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Mon Nov 14 11:28:47 2005
+++ b/xen/arch/x86/mm.c Mon Nov 14 14:21:16 2005
@@ -2529,7 +2529,7 @@
* not enough information in just a gpte to figure out how to
* (re-)shadow this entry.
*/
- domain_crash();
+ domain_crash(d);
}
rc = shadow_do_update_va_mapping(va, val, v);
@@ -2918,7 +2918,6 @@
{
l1_pgentry_t ol1e, nl1e;
int modified = 0, i;
- struct vcpu *v;
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
{
@@ -2944,7 +2943,6 @@
if ( unlikely(!get_page_from_l1e(nl1e, d)) )
{
- MEM_LOG("ptwr: Could not re-validate l1 page");
/*
* Make the remaining p.t's consistent before crashing, so the
* reference counts are correct.
@@ -2953,9 +2951,8 @@
(L1_PAGETABLE_ENTRIES - i) * sizeof(l1_pgentry_t));
/* Crash the offending domain. */
- set_bit(_DOMF_ctrl_pause, &d->domain_flags);
- for_each_vcpu ( d, v )
- vcpu_sleep_nosync(v);
+ MEM_LOG("ptwr: Could not revalidate l1 page");
+ domain_crash(d);
break;
}
@@ -3348,7 +3345,7 @@
/* Toss the writable pagetable state and crash. */
unmap_domain_page(d->arch.ptwr[which].pl1e);
d->arch.ptwr[which].l1va = 0;
- domain_crash();
+ domain_crash(d);
return 0;
}
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c Mon Nov 14 11:28:47 2005
+++ b/xen/arch/x86/shadow_public.c Mon Nov 14 14:21:16 2005
@@ -239,13 +239,13 @@
l4page = alloc_domheap_page(NULL);
if (l4page == NULL)
- domain_crash();
+ domain_crash(d);
l4 = map_domain_page(page_to_pfn(l4page));
memset(l4, 0, PAGE_SIZE);
l3page = alloc_domheap_page(NULL);
if (l3page == NULL)
- domain_crash();
+ domain_crash(d);
l3 = map_domain_page(page_to_pfn(l3page));
memset(l3, 0, PAGE_SIZE);
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c Mon Nov 14 11:28:47 2005
+++ b/xen/arch/x86/vmx.c Mon Nov 14 14:21:16 2005
@@ -191,12 +191,12 @@
case MSR_FS_BASE:
if (!(VMX_LONG_GUEST(vc)))
/* XXX should it be GP fault */
- domain_crash();
+ domain_crash(vc->domain);
__vmread(GUEST_FS_BASE, &msr_content);
break;
case MSR_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash();
+ domain_crash(vc->domain);
__vmread(GUEST_GS_BASE, &msr_content);
break;
case MSR_SHADOW_GS_BASE:
@@ -260,7 +260,7 @@
case MSR_FS_BASE:
case MSR_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash();
+ domain_crash(vc->domain);
if (!IS_CANO_ADDRESS(msr_content)){
VMX_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n");
vmx_inject_exception(vc, TRAP_gp_fault, 0);
@@ -273,7 +273,7 @@
case MSR_SHADOW_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash();
+ domain_crash(vc->domain);
vc->arch.arch_vmx.msr_content.shadow_gs = msr_content;
wrmsrl(MSR_SHADOW_GS_BASE, msr_content);
break;
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c Mon Nov 14 11:28:47 2005
+++ b/xen/arch/x86/vmx_vmcs.c Mon Nov 14 14:21:16 2005
@@ -157,13 +157,13 @@
mpfn = get_mfn_from_pfn(E820_MAP_PAGE >> PAGE_SHIFT);
if (mpfn == INVALID_MFN) {
printk("Can not find E820 memory map page for VMX domain.\n");
- domain_crash();
+ domain_crash(d);
}
p = map_domain_page(mpfn);
if (p == NULL) {
printk("Can not map E820 memory map page for VMX domain.\n");
- domain_crash();
+ domain_crash(d);
}
e820_map_nr = *(p + E820_MAP_NR_OFFSET);
@@ -182,7 +182,7 @@
printk("Can not get io request shared page"
" from E820 memory map for VMX domain.\n");
unmap_domain_page(p);
- domain_crash();
+ domain_crash(d);
}
unmap_domain_page(p);
@@ -190,13 +190,13 @@
mpfn = get_mfn_from_pfn(gpfn);
if (mpfn == INVALID_MFN) {
printk("Can not find io request shared page for VMX domain.\n");
- domain_crash();
+ domain_crash(d);
}
p = map_domain_page(mpfn);
if (p == NULL) {
printk("Can not map io request shared page for VMX domain.\n");
- domain_crash();
+ domain_crash(d);
}
d->arch.vmx_platform.shared_page_va = (unsigned long)p;
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/common/domain.c
--- a/xen/common/domain.c Mon Nov 14 11:28:47 2005
+++ b/xen/common/domain.c Mon Nov 14 14:21:16 2005
@@ -125,18 +125,27 @@
}
-void domain_crash(void)
-{
- printk("Domain %d (vcpu#%d) crashed on cpu#%d:\n",
- current->domain->domain_id, current->vcpu_id, smp_processor_id());
- show_registers(guest_cpu_user_regs());
- domain_shutdown(SHUTDOWN_crash);
+void domain_crash(struct domain *d)
+{
+ if ( d == current->domain )
+ {
+ printk("Domain %d (vcpu#%d) crashed on cpu#%d:\n",
+ d->domain_id, current->vcpu_id, smp_processor_id());
+ show_registers(guest_cpu_user_regs());
+ }
+ else
+ {
+ printk("Domain %d reported crashed by domain %d on cpu#%d:\n",
+ d->domain_id, current->domain->domain_id, smp_processor_id());
+ }
+
+ domain_shutdown(d, SHUTDOWN_crash);
}
void domain_crash_synchronous(void)
{
- domain_crash();
+ domain_crash(current->domain);
for ( ; ; )
do_softirq();
}
@@ -178,10 +187,9 @@
__initcall(domain_shutdown_finaliser_init);
-void domain_shutdown(u8 reason)
-{
- struct domain *d = current->domain;
- struct vcpu *v;
+void domain_shutdown(struct domain *d, u8 reason)
+{
+ struct vcpu *v;
if ( d->domain_id == 0 )
{
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/common/schedule.c
--- a/xen/common/schedule.c Mon Nov 14 11:28:47 2005
+++ b/xen/common/schedule.c Mon Nov 14 14:21:16 2005
@@ -267,7 +267,7 @@
{
TRACE_3D(TRC_SCHED_SHUTDOWN,
current->domain->domain_id, current->vcpu_id, arg);
- domain_shutdown((u8)arg);
+ domain_shutdown(current->domain, (u8)arg);
break;
}
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h Mon Nov 14 11:28:47 2005
+++ b/xen/include/asm-ia64/vmx_vpd.h Mon Nov 14 14:21:16 2005
@@ -122,7 +122,7 @@
do { \
printk("__vmx_bug at %s:%d\n", __FILE__, __LINE__); \
show_registers(regs); \
- domain_crash(); \
+ domain_crash(current->domain); \
} while (0)
#endif //__ASSEMBLY__
diff -r 6d981d34cf52 -r bdf1a8039d13 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h Mon Nov 14 11:28:47 2005
+++ b/xen/include/xen/sched.h Mon Nov 14 14:21:16 2005
@@ -220,14 +220,15 @@
struct domain *find_domain_by_id(domid_t dom);
extern void domain_destruct(struct domain *d);
extern void domain_kill(struct domain *d);
-extern void domain_shutdown(u8 reason);
+extern void domain_shutdown(struct domain *d, u8 reason);
extern void domain_pause_for_debugger(void);
/*
- * Mark current domain as crashed. This function returns: the domain is not
- * synchronously descheduled from any processor.
- */
-extern void domain_crash(void);
+ * Mark specified domain as crashed. This function always returns, even if the
+ * caller is the specified domain. The domain is not synchronously descheduled
+ * from any processor.
+ */
+extern void domain_crash(struct domain *d);
/*
* Mark current domain as crashed and synchronously deschedule from the local
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|