# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 5f94478ca9b52d981aa9b7b1881ac7a46c459cb6
# Parent c0dbb3a538f229d1c42ad367258eebc129e6498a
VMX domain should call domain_crash_synchronous instead of domain_crash.
Since domain_crash will return at last, and I watched system crash after
its return.
Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>
diff -r c0dbb3a538f2 -r 5f94478ca9b5 xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c Sat Dec 10 23:16:26 2005
+++ b/xen/arch/x86/shadow_public.c Sat Dec 10 23:17:11 2005
@@ -236,26 +236,24 @@
l4_pgentry_t *l4;
l3_pgentry_t *l3, *pae_l3;
int i;
-
+
l4page = alloc_domheap_page(NULL);
if (l4page == NULL)
- domain_crash(d);
+ domain_crash_synchronous();
l4 = map_domain_page(page_to_pfn(l4page));
memset(l4, 0, PAGE_SIZE);
l3page = alloc_domheap_page(NULL);
if (l3page == NULL)
- domain_crash(d);
- l3 = map_domain_page(page_to_pfn(l3page));
+ domain_crash_synchronous();
+ l3 = map_domain_page(page_to_pfn(l3page));
memset(l3, 0, PAGE_SIZE);
l4[0] = l4e_from_page(l3page, __PAGE_HYPERVISOR);
+
pae_l3 = map_domain_page(pagetable_get_pfn(d->arch.phys_table));
-
- for (i = 0; i < PDP_ENTRIES; i++) {
- l3[i] = pae_l3[i];
- l3e_add_flags(l3[i], 0x67);
- }
+ for (i = 0; i < PDP_ENTRIES; i++)
+ l3[i] = l3e_from_pfn(l3e_get_pfn(pae_l3[i]), __PAGE_HYPERVISOR);
unmap_domain_page(l4);
unmap_domain_page(l3);
@@ -276,17 +274,18 @@
mmfn_info = alloc_domheap_page(NULL);
ASSERT( mmfn_info );
- mmfn = (unsigned long) (mmfn_info - frame_table);
+ mmfn = page_to_pfn(mmfn_info);
mpl4e = (l4_pgentry_t *) map_domain_page(mmfn);
memcpy(mpl4e, &idle_pg_table[0], PAGE_SIZE);
mpl4e[l4_table_offset(PERDOMAIN_VIRT_START)] =
l4e_from_paddr(__pa(d->arch.mm_perdomain_l3), __PAGE_HYPERVISOR);
+
/* map the phys_to_machine map into the per domain Read-Only MPT space */
phys_table = page_table_convert(d);
-
mpl4e[l4_table_offset(RO_MPT_VIRT_START)] =
l4e_from_paddr(pagetable_get_paddr(phys_table),
__PAGE_HYPERVISOR);
+
v->arch.monitor_table = mk_pagetable(mmfn << PAGE_SHIFT);
v->arch.monitor_vtable = (l2_pgentry_t *) mpl4e;
}
diff -r c0dbb3a538f2 -r 5f94478ca9b5 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c Sat Dec 10 23:16:26 2005
+++ b/xen/arch/x86/vmx.c Sat Dec 10 23:17:11 2005
@@ -196,12 +196,12 @@
case MSR_FS_BASE:
if (!(VMX_LONG_GUEST(vc)))
/* XXX should it be GP fault */
- domain_crash(vc->domain);
+ domain_crash_synchronous();
__vmread(GUEST_FS_BASE, &msr_content);
break;
case MSR_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash(vc->domain);
+ domain_crash_synchronous();
__vmread(GUEST_GS_BASE, &msr_content);
break;
case MSR_SHADOW_GS_BASE:
@@ -265,7 +265,7 @@
case MSR_FS_BASE:
case MSR_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash(vc->domain);
+ domain_crash_synchronous();
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);
@@ -278,7 +278,7 @@
case MSR_SHADOW_GS_BASE:
if (!(VMX_LONG_GUEST(vc)))
- domain_crash(vc->domain);
+ domain_crash_synchronous();
vc->arch.arch_vmx.msr_content.shadow_gs = msr_content;
wrmsrl(MSR_SHADOW_GS_BASE, msr_content);
break;
@@ -1345,12 +1345,8 @@
}
break;
}
- case 4:
+ case 4: /* CR4 */
{
- /* CR4 */
- unsigned long old_guest_cr;
-
- __vmread(GUEST_CR4, &old_guest_cr);
if (value & X86_CR4_PAE){
set_bit(VMX_CPU_STATE_PAE_ENABLED, &v->arch.arch_vmx.cpu_state);
} else {
diff -r c0dbb3a538f2 -r 5f94478ca9b5 xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c Sat Dec 10 23:16:26 2005
+++ b/xen/arch/x86/vmx_vmcs.c Sat Dec 10 23:17:11 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(d);
+ domain_crash_synchronous();
}
p = map_domain_page(mpfn);
if (p == NULL) {
printk("Can not map E820 memory map page for VMX domain.\n");
- domain_crash(d);
+ domain_crash_synchronous();
}
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(d);
+ domain_crash_synchronous();
}
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(d);
+ domain_crash_synchronous();
}
p = map_domain_page(mpfn);
if (p == NULL) {
printk("Can not map io request shared page for VMX domain.\n");
- domain_crash(d);
+ domain_crash_synchronous();
}
d->arch.vmx_platform.shared_page_va = (unsigned long)p;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|