SHA256
1
0
forked from pool/xen
OBS User unknown 2008-03-14 23:07:14 +00:00 committed by Git OBS Bridge
parent 0ef5182655
commit 9c16971e0e
65 changed files with 3459 additions and 1613 deletions

View File

@ -7,10 +7,10 @@ x86: Allow batched mmu updates which preserve accessed/dirty pte bits.
Signed-off-by: Bruce Rogers <brogers@novell.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/mm.c
Index: xen-3.2.1-testing/xen/arch/x86/mm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm.c
+++ xen-3.2-testing/xen/arch/x86/mm.c
--- xen-3.2.1-testing.orig/xen/arch/x86/mm.c
+++ xen-3.2.1-testing/xen/arch/x86/mm.c
@@ -1342,21 +1342,30 @@ static inline int update_intpte(intpte_t
intpte_t old,
intpte_t new,
@ -80,24 +80,26 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
{
@@ -1415,12 +1423,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
/* Fast path for identical mapping, r/w and presence. */
@@ -1415,14 +1423,16 @@ static int mod_l1_entry(l1_pgentry_t *pl
if ( !l1e_has_changed(ol1e, nl1e, _PAGE_RW | _PAGE_PRESENT) )
{
adjust_guest_l1e(nl1e, d);
- return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr);
+ return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr,
+ preserve_ad);
}
if ( unlikely(!get_page_from_l1e(nl1e, FOREIGNDOM)) )
return 0;
adjust_guest_l1e(nl1e, d);
- if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr)) )
+ if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr,
+ preserve_ad)) )
{
put_page_from_l1e(nl1e, d);
return 0;
@@ -1428,7 +1438,8 @@ static int mod_l1_entry(l1_pgentry_t *pl
@@ -1430,7 +1440,8 @@ static int mod_l1_entry(l1_pgentry_t *pl
}
else
{
@ -107,7 +109,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
return 0;
}
@@ -1441,7 +1452,8 @@ static int mod_l1_entry(l1_pgentry_t *pl
@@ -1443,7 +1454,8 @@ static int mod_l1_entry(l1_pgentry_t *pl
static int mod_l2_entry(l2_pgentry_t *pl2e,
l2_pgentry_t nl2e,
unsigned long pfn,
@ -117,16 +119,18 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
l2_pgentry_t ol2e;
struct vcpu *curr = current;
@@ -1469,18 +1481,20 @@ static int mod_l2_entry(l2_pgentry_t *pl
/* Fast path for identical mapping and presence. */
if ( !l2e_has_changed(ol2e, nl2e, _PAGE_PRESENT))
@@ -1471,20 +1483,22 @@ static int mod_l2_entry(l2_pgentry_t *pl
if ( !l2e_has_changed(ol2e, nl2e, _PAGE_PRESENT) )
{
adjust_guest_l2e(nl2e, d);
- return UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr);
+ return UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr, preserve_ad);
}
if ( unlikely(!get_page_from_l2e(nl2e, pfn, d)) )
return 0;
adjust_guest_l2e(nl2e, d);
- if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr)) )
+ if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr,
+ preserve_ad)) )
@ -141,7 +145,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
return 0;
}
@@ -1494,7 +1508,8 @@ static int mod_l2_entry(l2_pgentry_t *pl
@@ -1498,7 +1512,8 @@ static int mod_l2_entry(l2_pgentry_t *pl
/* Update the L3 entry at pl3e to new value nl3e. pl3e is within frame pfn. */
static int mod_l3_entry(l3_pgentry_t *pl3e,
l3_pgentry_t nl3e,
@ -151,16 +155,18 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
l3_pgentry_t ol3e;
struct vcpu *curr = current;
@@ -1532,18 +1547,20 @@ static int mod_l3_entry(l3_pgentry_t *pl
/* Fast path for identical mapping and presence. */
if (!l3e_has_changed(ol3e, nl3e, _PAGE_PRESENT))
@@ -1536,20 +1551,22 @@ static int mod_l3_entry(l3_pgentry_t *pl
if ( !l3e_has_changed(ol3e, nl3e, _PAGE_PRESENT) )
{
adjust_guest_l3e(nl3e, d);
- return UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr);
+ return UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr, preserve_ad);
}
if ( unlikely(!get_page_from_l3e(nl3e, pfn, d)) )
return 0;
adjust_guest_l3e(nl3e, d);
- if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr)) )
+ if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr,
+ preserve_ad)) )
@ -175,7 +181,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
return 0;
}
@@ -1564,7 +1581,8 @@ static int mod_l3_entry(l3_pgentry_t *pl
@@ -1570,7 +1587,8 @@ static int mod_l3_entry(l3_pgentry_t *pl
/* Update the L4 entry at pl4e to new value nl4e. pl4e is within frame pfn. */
static int mod_l4_entry(l4_pgentry_t *pl4e,
l4_pgentry_t nl4e,
@ -185,16 +191,18 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
struct vcpu *curr = current;
struct domain *d = curr->domain;
@@ -1592,18 +1610,20 @@ static int mod_l4_entry(l4_pgentry_t *pl
/* Fast path for identical mapping and presence. */
if (!l4e_has_changed(ol4e, nl4e, _PAGE_PRESENT))
@@ -1598,20 +1616,22 @@ static int mod_l4_entry(l4_pgentry_t *pl
if ( !l4e_has_changed(ol4e, nl4e, _PAGE_PRESENT) )
{
adjust_guest_l4e(nl4e, d);
- return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr);
+ return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr, preserve_ad);
}
if ( unlikely(!get_page_from_l4e(nl4e, pfn, d)) )
return 0;
adjust_guest_l4e(nl4e, d);
- if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr)) )
+ if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr,
+ preserve_ad)) )
@ -209,7 +217,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
return 0;
}
@@ -1946,7 +1966,7 @@ int new_guest_cr3(unsigned long mfn)
@@ -1954,7 +1974,7 @@ int new_guest_cr3(unsigned long mfn)
l4e_from_pfn(
mfn,
(_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED)),
@ -218,7 +226,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
if ( unlikely(!okay) )
{
MEM_LOG("Error while installing new compat baseptr %lx", mfn);
@@ -2458,13 +2478,16 @@ int do_mmu_update(
@@ -2466,13 +2486,16 @@ int do_mmu_update(
{
/*
* MMU_NORMAL_PT_UPDATE: Normal update to any level of page table.
@ -236,7 +244,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
gmfn = req.ptr >> PAGE_SHIFT;
mfn = gmfn_to_mfn(d, gmfn);
@@ -2501,20 +2524,23 @@ int do_mmu_update(
@@ -2509,20 +2532,23 @@ int do_mmu_update(
case PGT_l1_page_table:
{
l1_pgentry_t l1e = l1e_from_intpte(req.val);
@ -263,7 +271,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
}
break;
#endif
@@ -2522,7 +2548,8 @@ int do_mmu_update(
@@ -2530,7 +2556,8 @@ int do_mmu_update(
case PGT_l4_page_table:
{
l4_pgentry_t l4e = l4e_from_intpte(req.val);
@ -273,7 +281,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
}
break;
#endif
@@ -2652,7 +2679,7 @@ static int create_grant_pte_mapping(
@@ -2660,7 +2687,7 @@ static int create_grant_pte_mapping(
}
ol1e = *(l1_pgentry_t *)va;
@ -282,7 +290,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
put_page_type(page);
rc = GNTST_general_error;
@@ -2720,9 +2747,11 @@ static int destroy_grant_pte_mapping(
@@ -2728,9 +2755,11 @@ static int destroy_grant_pte_mapping(
}
/* Delete pagetable entry. */
@ -297,7 +305,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
MEM_LOG("Cannot delete PTE entry at %p", va);
put_page_type(page);
@@ -2758,7 +2787,7 @@ static int create_grant_va_mapping(
@@ -2766,7 +2795,7 @@ static int create_grant_va_mapping(
return GNTST_general_error;
}
ol1e = *pl1e;
@ -306,7 +314,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
guest_unmap_l1e(v, pl1e);
pl1e = NULL;
@@ -2796,7 +2825,7 @@ static int replace_grant_va_mapping(
@@ -2804,7 +2833,7 @@ static int replace_grant_va_mapping(
}
/* Delete pagetable entry. */
@ -315,7 +323,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
rc = GNTST_general_error;
@@ -2860,7 +2889,8 @@ int replace_grant_host_mapping(
@@ -2868,7 +2897,8 @@ int replace_grant_host_mapping(
}
ol1e = *pl1e;
@ -325,7 +333,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
{
MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
guest_unmap_l1e(curr, pl1e);
@@ -2948,7 +2978,7 @@ int do_update_va_mapping(unsigned long v
@@ -2956,7 +2986,7 @@ int do_update_va_mapping(unsigned long v
pl1e = guest_map_l1e(v, va, &gl1mfn);
@ -334,7 +342,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
rc = -EINVAL;
if ( pl1e )
@@ -3517,7 +3547,7 @@ static int ptwr_emulated_update(
@@ -3525,7 +3555,7 @@ static int ptwr_emulated_update(
else
{
ol1e = *pl1e;
@ -343,10 +351,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
BUG();
}
Index: xen-3.2-testing/xen/include/public/xen.h
Index: xen-3.2.1-testing/xen/include/public/xen.h
===================================================================
--- xen-3.2-testing.orig/xen/include/public/xen.h
+++ xen-3.2-testing/xen/include/public/xen.h
--- xen-3.2.1-testing.orig/xen/include/public/xen.h
+++ xen-3.2.1-testing/xen/include/public/xen.h
@@ -168,9 +168,14 @@
* ptr[:2] -- Machine address within the frame whose mapping to modify.
* The frame must belong to the FD, if one is specified.

View File

@ -1,31 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1200995509 0
# Node ID 6f3fb3f86b68182bb61a661e81f346f653005852
# Parent 2af5fb3e34e54e96d0c58e0e4557ee1240df9ce8
xend: On block-attach, remove device information when VmError occurs.
I tested xm block-attach command with a wrong
parameter(file:). Naturally a command error occurred. Then I retested
xm block-attach command with a correct parameter(phy:). But a command
error occurred again. The second command error occurred because Xend
did not remove device information from self.info when the first
command error occurred.
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
diff -r 2af5fb3e34e5 -r 6f3fb3f86b68 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Tue Jan 22 09:50:06 2008 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py Tue Jan 22 09:51:49 2008 +0000
@@ -535,6 +535,11 @@ class XendDomainInfo:
self._createDevice(dev_type, dev_config_dict)
self._waitForDevice(dev_type, devid)
except VmError, ex:
+ del self.info['devices'][dev_uuid]
+ if dev_type == 'tap':
+ self.info['vbd_refs'].remove(dev_uuid)
+ else:
+ self.info['%s_refs' % dev_type].remove(dev_uuid)
raise ex
else:
devid = None

View File

@ -1,21 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201096764 0
# Node ID 7f940c605893749225a5605fb8a1fa38972bdeb6
# Parent c364f80eb4b591f8ecd9dd803081923b94a8c688
x86_emulate: Fix CLTS emulation.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
@@ -177,7 +177,7 @@ static uint8_t opcode_table[256] = {
static uint8_t twobyte_table[256] = {
/* 0x00 - 0x07 */
- 0, ImplicitOps|ModRM, 0, 0, 0, ImplicitOps, 0, 0,
+ 0, ImplicitOps|ModRM, 0, 0, 0, 0, ImplicitOps, 0,
/* 0x08 - 0x0F */
ImplicitOps, ImplicitOps, 0, 0, 0, ImplicitOps|ModRM, 0, 0,
/* 0x10 - 0x17 */

View File

@ -10,10 +10,10 @@ crashed but preserved VM and renaming/restarting a crashed VM.
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
Index: xen-3.2-testing/docs/xen-api/vm-lifecycle.tex
Index: xen-3.2.1-testing/docs/xen-api/vm-lifecycle.tex
===================================================================
--- xen-3.2-testing.orig/docs/xen-api/vm-lifecycle.tex
+++ xen-3.2-testing/docs/xen-api/vm-lifecycle.tex
--- xen-3.2.1-testing.orig/docs/xen-api/vm-lifecycle.tex
+++ xen-3.2.1-testing/docs/xen-api/vm-lifecycle.tex
@@ -21,7 +21,10 @@
\end{figure}
@ -26,10 +26,10 @@ Index: xen-3.2-testing/docs/xen-api/vm-lifecycle.tex
\section{VM boot parameters}
Index: xen-3.2-testing/docs/xen-api/vm_lifecycle.dot
Index: xen-3.2.1-testing/docs/xen-api/vm_lifecycle.dot
===================================================================
--- xen-3.2-testing.orig/docs/xen-api/vm_lifecycle.dot
+++ xen-3.2-testing/docs/xen-api/vm_lifecycle.dot
--- xen-3.2.1-testing.orig/docs/xen-api/vm_lifecycle.dot
+++ xen-3.2.1-testing/docs/xen-api/vm_lifecycle.dot
@@ -1,6 +1,6 @@
digraph g{
@ -47,10 +47,10 @@ Index: xen-3.2-testing/docs/xen-api/vm_lifecycle.dot
}
\ No newline at end of file
Index: xen-3.2-testing/docs/xen-api/xenapi-datamodel.tex
Index: xen-3.2.1-testing/docs/xen-api/xenapi-datamodel.tex
===================================================================
--- xen-3.2-testing.orig/docs/xen-api/xenapi-datamodel.tex
+++ xen-3.2-testing/docs/xen-api/xenapi-datamodel.tex
--- xen-3.2.1-testing.orig/docs/xen-api/xenapi-datamodel.tex
+++ xen-3.2.1-testing/docs/xen-api/xenapi-datamodel.tex
@@ -156,6 +156,7 @@ The following enumeration types are used
\hspace{0.5cm}{\tt Paused} & Paused \\
\hspace{0.5cm}{\tt Running} & Running \\
@ -59,10 +59,10 @@ Index: xen-3.2-testing/docs/xen-api/xenapi-datamodel.tex
\hspace{0.5cm}{\tt Unknown} & Some other unknown state \\
\hline
\end{longtable}
Index: xen-3.2-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
Index: xen-3.2.1-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
===================================================================
--- xen-3.2-testing.orig/tools/libxen/include/xen/api/xen_vm_power_state.h
+++ xen-3.2-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
--- xen-3.2.1-testing.orig/tools/libxen/include/xen/api/xen_vm_power_state.h
+++ xen-3.2.1-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
@@ -46,6 +46,11 @@ enum xen_vm_power_state
XEN_VM_POWER_STATE_SUSPENDED,
@ -75,10 +75,10 @@ Index: xen-3.2-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
* Some other unknown state
*/
XEN_VM_POWER_STATE_UNKNOWN
Index: xen-3.2-testing/tools/libxen/src/xen_vm_power_state.c
Index: xen-3.2.1-testing/tools/libxen/src/xen_vm_power_state.c
===================================================================
--- xen-3.2-testing.orig/tools/libxen/src/xen_vm_power_state.c
+++ xen-3.2-testing/tools/libxen/src/xen_vm_power_state.c
--- xen-3.2.1-testing.orig/tools/libxen/src/xen_vm_power_state.c
+++ xen-3.2.1-testing/tools/libxen/src/xen_vm_power_state.c
@@ -32,6 +32,7 @@ static const char *lookup_table[] =
"Paused",
"Running",
@ -87,10 +87,10 @@ Index: xen-3.2-testing/tools/libxen/src/xen_vm_power_state.c
"Unknown"
};
Index: xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendAPIConstants.py
+++ xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendAPIConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
@@ -25,6 +25,7 @@ XEN_API_VM_POWER_STATE = [
'Running',
'Suspended',
@ -109,10 +109,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
XEN_API_ON_NORMAL_EXIT = [
'destroy',
Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConstants.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
@@ -61,6 +61,7 @@ DOM_STATES = [
'running',
'suspended',
@ -129,10 +129,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
DOM_STATE_UNKNOWN = XEN_API_VM_POWER_STATE_UNKNOWN
DOM_STATES_OLD = [
Index: xen-3.2-testing/tools/python/xen/xend/XendDomain.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomain.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomain.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomain.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomain.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomain.py
@@ -43,6 +43,7 @@ from xen.xend.XendConstants import XS_VM
from xen.xend.XendConstants import DOM_STATE_HALTED, DOM_STATE_PAUSED
from xen.xend.XendConstants import DOM_STATE_RUNNING, DOM_STATE_SUSPENDED
@ -175,10 +175,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomain.py
raise VMBadState("Domain '%s' is not started" % domid,
POWER_STATE_NAMES[DOM_STATE_PAUSED],
POWER_STATE_NAMES[dominfo._stateGet()])
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -414,7 +414,7 @@ class XendDomainInfo:
"""
from xen.xend import XendDomain
@ -197,7 +197,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
return self.getDeviceController(deviceClass).sxprs()
else:
sxprs = []
@@ -2248,6 +2248,9 @@ class XendDomainInfo:
@@ -2258,6 +2258,9 @@ class XendDomainInfo:
return XEN_API_VM_POWER_STATE_SUSPENDED
else:
return XEN_API_VM_POWER_STATE_HALTED

View File

@ -21,11 +21,11 @@ construct the restarted domain.
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1386,9 +1386,10 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1391,9 +1391,10 @@ class XendDomainInfo:
self._writeVm('xend/previous_restart_time', str(now))
@ -37,7 +37,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
else:
self._unwatchVm()
self.destroyDomain()
@@ -1402,7 +1403,7 @@ class XendDomainInfo:
@@ -1407,7 +1408,7 @@ class XendDomainInfo:
new_dom = None
try:
new_dom = XendDomain.instance().domain_create_from_dict(
@ -46,7 +46,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
new_dom.waitForDevices()
new_dom.unpause()
rst_cnt = self._readVm('xend/restart_count')
@@ -1433,11 +1434,15 @@ class XendDomainInfo:
@@ -1438,11 +1439,15 @@ class XendDomainInfo:
new_name, new_uuid)
self._unwatchVm()
self._releaseDevices()

View File

@ -7,11 +7,11 @@ Fix leaking of /vm/<uuid> path in xenstore on various VM lifecycle events.
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
Index: xen-3.2-testing/tools/python/xen/xend/XendCheckpoint.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendCheckpoint.py
+++ xen-3.2-testing/tools/python/xen/xend/XendCheckpoint.py
@@ -125,10 +125,10 @@ def save(fd, dominfo, network, live, dst
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
@@ -128,10 +128,10 @@ def save(fd, dominfo, network, live, dst
if checkpoint:
dominfo.resumeDomain()
else:
@ -24,11 +24,11 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendCheckpoint.py
except VmError:
# Ignore this. The name conflict (hopefully) arises because we
# are doing localhost migration; if we are doing a suspend of a
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1118,10 +1118,11 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1120,10 +1120,11 @@ class XendDomainInfo:
def getDomid(self):
return self.domid
@ -42,7 +42,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
def getName(self):
return self.info['name_label']
@@ -1392,7 +1393,7 @@ class XendDomainInfo:
@@ -1397,7 +1398,7 @@ class XendDomainInfo:
new_dom_info = self._preserveForRestart()
else:
self._unwatchVm()
@ -51,7 +51,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
# new_dom's VM will be the same as this domain's VM, except where
# the rename flag has instructed us to call preserveForRestart.
@@ -1406,9 +1407,6 @@ class XendDomainInfo:
@@ -1411,9 +1412,6 @@ class XendDomainInfo:
new_dom_info)
new_dom.waitForDevices()
new_dom.unpause()
@ -61,7 +61,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
new_dom._removeVm(RESTART_IN_PROGRESS)
except:
if new_dom:
@@ -1434,13 +1432,19 @@ class XendDomainInfo:
@@ -1439,13 +1437,19 @@ class XendDomainInfo:
new_name, new_uuid)
self._unwatchVm()
self._releaseDevices()

View File

@ -1,26 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201607262 0
# Node ID 128f7bc0a277375571b4817fc65bfcd14e00a7ec
# Parent 7aa2149a3b0e94eb01b39ae8cf4a41bc225be94e
x86: Fix HVM hypercall preemption causing guest crash.
Signed-off-by: Yu Zhao <yu.zhao@intel.com>
Index: xen-3.2-testing/xen/arch/x86/domain.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/domain.c
+++ xen-3.2-testing/xen/arch/x86/domain.c
@@ -1507,7 +1507,12 @@ unsigned long hypercall_create_continuat
{
regs = guest_cpu_user_regs();
regs->eax = op;
- regs->eip -= 2; /* re-execute 'syscall' / 'int 0x82' */
+ /*
+ * For PV guest, we update EIP to re-execute 'syscall' / 'int 0x82';
+ * HVM does not need this since 'vmcall' / 'vmmcall' is fault-like.
+ */
+ if ( !is_hvm_vcpu(current) )
+ regs->eip -= 2; /* re-execute 'syscall' / 'int 0x82' */
#ifdef __x86_64__
if ( !is_hvm_vcpu(current) ?

View File

@ -1,34 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201607430 0
# Node ID 193afcdb85b211d72f940e086397490ce72f06e6
# Parent 128f7bc0a277375571b4817fc65bfcd14e00a7ec
x86: Fix shadow pinning logic (for PV live relo).
From: Tim Deegan <Tim.Deegan@citrix.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/shadow/multi.c
+++ xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
@@ -3518,8 +3518,18 @@ sh_set_toplevel_shadow(struct vcpu *v,
v->arch.shadow_table[slot] = new_entry;
/* Decrement the refcount of the old contents of this slot */
- if ( !pagetable_is_null(old_entry) )
- sh_put_ref(v, pagetable_get_mfn(old_entry), 0);
+ if ( !pagetable_is_null(old_entry) ) {
+ mfn_t old_smfn = pagetable_get_mfn(old_entry);
+ /* Need to repin the old toplevel shadow if it's been unpinned
+ * by shadow_prealloc(): in PV mode we're still running on this
+ * shadow and it's not safe to free it yet. */
+ if ( !mfn_to_shadow_page(old_smfn)->pinned && !sh_pin(v, old_smfn) )
+ {
+ SHADOW_ERROR("can't re-pin %#lx\n", mfn_x(old_smfn));
+ domain_crash(v->domain);
+ }
+ sh_put_ref(v, old_smfn, 0);
+ }
}

285
16931-hvm-hap-param.patch Normal file
View File

@ -0,0 +1,285 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201614376 0
# Node ID 98c2665056ea4fe63e02c943536db686fcedc459
# Parent 193afcdb85b211d72f940e086397490ce72f06e6
x86, hvm: Add a per-domain parameter to specify shadow or hap.
Signed-off-by: Xu Dongxiao <dongxiao.xu@intel.com>
Index: xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/lowlevel/xc/xc.c
+++ xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
@@ -97,16 +97,16 @@ static PyObject *pyxc_domain_create(XcOb
PyObject *kwds)
{
uint32_t dom = 0, ssidref = 0, flags = 0;
- int ret, i, hvm = 0;
+ int ret, i;
PyObject *pyhandle = NULL;
xen_domain_handle_t handle = {
0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef };
- static char *kwd_list[] = { "domid", "ssidref", "handle", "hvm", NULL };
+ static char *kwd_list[] = { "domid", "ssidref", "handle", "flags", NULL };
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|iiOi", kwd_list,
- &dom, &ssidref, &pyhandle, &hvm))
+ &dom, &ssidref, &pyhandle, &flags))
return NULL;
if ( pyhandle != NULL )
@@ -124,9 +124,6 @@ static PyObject *pyxc_domain_create(XcOb
}
}
- if ( hvm )
- flags |= XEN_DOMCTL_CDF_hvm_guest;
-
if ( (ret = xc_domain_create(self->xc_handle, ssidref,
handle, flags, &dom)) < 0 )
return pyxc_error_to_exception();
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
@@ -130,7 +130,7 @@ XENAPI_PLATFORM_CFG = [ 'acpi', 'apic',
'soundhw','stdvga', 'usb', 'usbdevice', 'vnc',
'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode',
'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt',
- 'guest_os_type' ]
+ 'guest_os_type', 'hap']
# Xen API console 'other_config' keys.
XENAPI_CONSOLE_OTHER_CFG = ['vncunused', 'vncdisplay', 'vnclisten',
@@ -1588,3 +1588,6 @@ class XendConfig(dict):
def image_type(self):
stored_type = self['platform'].get('image_type')
return stored_type or (self.is_hvm() and 'hvm' or 'linux')
+
+ def is_hap(self):
+ return self['platform']['hap']
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1624,11 +1624,18 @@ class XendDomainInfo:
@raise: VmError on error
"""
+ hvm_bit_offset = 0
+
+ hap_bit_offset = 1
+
log.debug('XendDomainInfo.constructDomain')
self.shutdownStartTime = None
hvm = self.info.is_hvm()
+
+ hap = self.info.is_hap()
+
if hvm:
info = xc.xeninfo()
if 'hvm' not in info['xen_caps']:
@@ -1654,7 +1661,7 @@ class XendDomainInfo:
domid = 0,
ssidref = ssidref,
handle = uuid.fromString(self.info['uuid']),
- hvm = int(hvm))
+ flags = int((hvm << hvm_bit_offset) | (hap << hap_bit_offset)))
except Exception, e:
# may get here if due to ACM the operation is not permitted
if security.on():
Index: xen-3.2.1-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/create.py
@@ -521,6 +521,11 @@ gopts.var('on_xend_stop', val='ignore|sh
- suspend: Domain is suspended;
""")
+gopts.var('hap', val='HAP',
+ fn=set_int, default=1,
+ use="""Hap status (0=hap is disabled;
+ 1=hap is enabled.""")
+
def err(msg):
"""Print an error to stderr and exit.
"""
@@ -724,7 +729,7 @@ def configure_hvm(config_image, vals):
'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten',
'sdl', 'display', 'xauthority', 'rtc_timeoffset', 'monitor',
'acpi', 'apic', 'usb', 'usbdevice', 'keymap', 'pci',
- 'guest_os_type']
+ 'guest_os_type', 'hap']
for a in args:
if a in vals.__dict__ and vals.__dict__[a] is not None:
Index: xen-3.2.1-testing/tools/python/xen/xm/xenapi_create.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xm/xenapi_create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/xenapi_create.py
@@ -818,7 +818,7 @@ class sxp2xml:
def extract_platform(self, image, document):
- platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode']
+ platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode', 'hap']
def extract_platform_key(key):
platform = document.createElement("platform")
Index: xen-3.2.1-testing/xen/arch/ia64/xen/domain.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/ia64/xen/domain.c
+++ xen-3.2.1-testing/xen/arch/ia64/xen/domain.c
@@ -550,7 +550,7 @@ static int opt_pervcpu_vhpt = 1;
integer_param("pervcpu_vhpt", opt_pervcpu_vhpt);
#endif
-int arch_domain_create(struct domain *d)
+int arch_domain_create(struct domain *d, unsigned int domcr_flags)
{
int i;
Index: xen-3.2.1-testing/xen/arch/powerpc/domain.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/powerpc/domain.c
+++ xen-3.2.1-testing/xen/arch/powerpc/domain.c
@@ -76,7 +76,7 @@ unsigned long hypercall_create_continuat
return XEN_MARK(op);
}
-int arch_domain_create(struct domain *d)
+int arch_domain_create(struct domain *d, unsigned int domcr_flags)
{
if (d->domain_id == IDLE_DOMAIN_ID) {
d->shared_info = (void *)alloc_xenheap_page();
Index: xen-3.2.1-testing/xen/arch/x86/domain.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/domain.c
+++ xen-3.2.1-testing/xen/arch/x86/domain.c
@@ -436,7 +436,7 @@ void vcpu_destroy(struct vcpu *v)
hvm_vcpu_destroy(v);
}
-int arch_domain_create(struct domain *d)
+int arch_domain_create(struct domain *d, unsigned int domcr_flags)
{
#ifdef __x86_64__
struct page_info *pg;
@@ -446,6 +446,11 @@ int arch_domain_create(struct domain *d)
int vcpuid, pdpt_order, paging_initialised = 0;
int rc = -ENOMEM;
+ d->arch.hvm_domain.hap_enabled =
+ is_hvm_domain(d) &&
+ hvm_funcs.hap_supported &&
+ (domcr_flags & DOMCRF_hap);
+
d->arch.relmem = RELMEM_not_started;
INIT_LIST_HEAD(&d->arch.relmem_list);
Index: xen-3.2.1-testing/xen/arch/x86/mm/paging.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/paging.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/paging.c
@@ -28,7 +28,7 @@
#include <asm/guest_access.h>
#include <xsm/xsm.h>
-#define hap_enabled(d) (hvm_funcs.hap_supported && is_hvm_domain(d))
+#define hap_enabled(d) (is_hvm_domain(d) && (d)->arch.hvm_domain.hap_enabled)
/* Printouts */
#define PAGING_PRINTK(_f, _a...) \
Index: xen-3.2.1-testing/xen/common/domain.c
===================================================================
--- xen-3.2.1-testing.orig/xen/common/domain.c
+++ xen-3.2.1-testing/xen/common/domain.c
@@ -235,7 +235,7 @@ struct domain *domain_create(
init_status |= INIT_gnttab;
}
- if ( arch_domain_create(d) != 0 )
+ if ( arch_domain_create(d, domcr_flags) != 0 )
goto fail;
init_status |= INIT_arch;
Index: xen-3.2.1-testing/xen/common/domctl.c
===================================================================
--- xen-3.2.1-testing.orig/xen/common/domctl.c
+++ xen-3.2.1-testing/xen/common/domctl.c
@@ -325,7 +325,8 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
ret = -EINVAL;
if ( supervisor_mode_kernel ||
- (op->u.createdomain.flags & ~XEN_DOMCTL_CDF_hvm_guest) )
+ (op->u.createdomain.flags &
+ ~(XEN_DOMCTL_CDF_hvm_guest | XEN_DOMCTL_CDF_hap)) )
break;
dom = op->domain;
@@ -355,6 +356,8 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
domcr_flags = 0;
if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hvm_guest )
domcr_flags |= DOMCRF_hvm;
+ if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hap )
+ domcr_flags |= DOMCRF_hap;
ret = -ENOMEM;
d = domain_create(dom, domcr_flags, op->u.createdomain.ssidref);
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
@@ -73,6 +73,8 @@ struct hvm_domain {
/* Pass-through */
struct hvm_iommu hvm_iommu;
+
+ bool_t hap_enabled;
};
#endif /* __ASM_X86_HVM_DOMAIN_H__ */
Index: xen-3.2.1-testing/xen/include/public/domctl.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/public/domctl.h
+++ xen-3.2.1-testing/xen/include/public/domctl.h
@@ -53,6 +53,9 @@ struct xen_domctl_createdomain {
/* Is this an HVM guest (as opposed to a PV guest)? */
#define _XEN_DOMCTL_CDF_hvm_guest 0
#define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest)
+ /* Use hardware-assisted paging if available? */
+#define _XEN_DOMCTL_CDF_hap 1
+#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap)
uint32_t flags;
};
typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
Index: xen-3.2.1-testing/xen/include/xen/domain.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/xen/domain.h
+++ xen-3.2.1-testing/xen/include/xen/domain.h
@@ -40,7 +40,7 @@ void free_vcpu_struct(struct vcpu *v);
int vcpu_initialise(struct vcpu *v);
void vcpu_destroy(struct vcpu *v);
-int arch_domain_create(struct domain *d);
+int arch_domain_create(struct domain *d, unsigned int domcr_flags);
void arch_domain_destroy(struct domain *d);
Index: xen-3.2.1-testing/xen/include/xen/sched.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/xen/sched.h
+++ xen-3.2.1-testing/xen/include/xen/sched.h
@@ -311,6 +311,8 @@ struct domain *domain_create(
/* DOMCRF_hvm: Create an HVM domain, as opposed to a PV domain. */
#define _DOMCRF_hvm 0
#define DOMCRF_hvm (1U<<_DOMCRF_hvm)
+#define _DOMCRF_hap 1
+#define DOMCRF_hap (1U<<_DOMCRF_hap)
int construct_dom0(
struct domain *d,

View File

@ -1,87 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201619751 0
# Node ID 04e24b9dcc1649e86d3e94a81489dab9c6ec82bc
# Parent 98c2665056ea4fe63e02c943536db686fcedc459
xend: Obey localtime config option for HVM guests as well as PV guests.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/lowlevel/xc/xc.c
+++ xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
@@ -1154,23 +1154,13 @@ static PyObject *pyxc_domain_iomem_permi
static PyObject *pyxc_domain_set_time_offset(XcObject *self, PyObject *args)
{
uint32_t dom;
- int32_t time_offset_seconds;
- time_t calendar_time;
- struct tm local_time;
- struct tm utc_time;
+ int32_t offset;
- if (!PyArg_ParseTuple(args, "i", &dom))
+ if (!PyArg_ParseTuple(args, "ii", &dom, &offset))
return NULL;
- calendar_time = time(NULL);
- localtime_r(&calendar_time, &local_time);
- gmtime_r(&calendar_time, &utc_time);
- /* set up to get calendar time based on utc_time, with local dst setting */
- utc_time.tm_isdst = local_time.tm_isdst;
- time_offset_seconds = (int32_t)difftime(calendar_time, mktime(&utc_time));
-
- if (xc_domain_set_time_offset(self->xc_handle, dom, time_offset_seconds) != 0)
- return NULL;
+ if (xc_domain_set_time_offset(self->xc_handle, dom, offset) != 0)
+ return pyxc_error_to_exception();
Py_INCREF(zero);
return zero;
@@ -1619,6 +1609,7 @@ static PyMethodDef pyxc_methods[] = {
METH_VARARGS, "\n"
"Set a domain's time offset to Dom0's localtime\n"
" dom [int]: Domain whose time offset is being set.\n"
+ " offset [int]: Time offset from UTC in seconds.\n"
"Returns: [int] 0 on success; -1 on error.\n" },
{ "domain_send_trigger",
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1708,10 +1708,14 @@ class XendDomainInfo:
self._configureBootloader()
try:
- self.image = image.create(self, self.info)
-
if self.info['platform'].get('localtime', 0):
- xc.domain_set_time_offset(self.domid)
+ t = time.time()
+ loc = time.localtime(t)
+ utc = time.gmtime(t)
+ timeoffset = int(time.mktime(loc) - time.mktime(utc))
+ self.info['platform']['rtc_timeoffset'] = timeoffset
+
+ self.image = image.create(self, self.info)
xc.domain_setcpuweight(self.domid, \
self.info['vcpus_params']['weight'])
Index: xen-3.2-testing/tools/python/xen/xend/image.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2-testing/tools/python/xen/xend/image.py
@@ -342,6 +342,12 @@ class LinuxImageHandler(ImageHandler):
flags = 0
vhpt = 0
+ def configure(self, vmConfig):
+ ImageHandler.configure(self, vmConfig)
+ rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset')
+ if rtc_timeoffset is not None:
+ xc.domain_set_time_offset(self.vm.getDomid(), rtc_timeoffset)
+
def buildDomain(self):
store_evtchn = self.vm.getStorePort()
console_evtchn = self.vm.getConsolePort()

53
16933-hvm-hap-fix.patch Normal file
View File

@ -0,0 +1,53 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201619795 0
# Node ID 233f40973e1d689d66b25e439b2f48524dd579ea
# Parent 04e24b9dcc1649e86d3e94a81489dab9c6ec82bc
xend: Fix building PV guests after introducing new HVM-HAP config option.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
@@ -1590,4 +1590,4 @@ class XendConfig(dict):
return stored_type or (self.is_hvm() and 'hvm' or 'linux')
def is_hap(self):
- return self['platform']['hap']
+ return self['platform'].get('hap', 0)
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1624,19 +1624,14 @@ class XendDomainInfo:
@raise: VmError on error
"""
- hvm_bit_offset = 0
-
- hap_bit_offset = 1
-
log.debug('XendDomainInfo.constructDomain')
self.shutdownStartTime = None
+ hap = 0
hvm = self.info.is_hvm()
-
- hap = self.info.is_hap()
-
if hvm:
+ hap = self.info.is_hap()
info = xc.xeninfo()
if 'hvm' not in info['xen_caps']:
raise VmError("HVM guest support is unavailable: is VT/AMD-V "
@@ -1661,7 +1656,7 @@ class XendDomainInfo:
domid = 0,
ssidref = ssidref,
handle = uuid.fromString(self.info['uuid']),
- flags = int((hvm << hvm_bit_offset) | (hap << hap_bit_offset)))
+ flags = int((hvm << 0) | (hap << 1)))
except Exception, e:
# may get here if due to ACM the operation is not permitted
if security.on():

21
16939-hvm-hap-fix.patch Normal file
View File

@ -0,0 +1,21 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201685890 0
# Node ID 47b7ec3b4055d59a09a1af26a29e8ef90e0d8d9c
# Parent 92aa029e7cb19ac32c7e3ff2a3d78bd67af047f3
xend: Small fix for hvm/hap flags.
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1656,7 +1656,7 @@ class XendDomainInfo:
domid = 0,
ssidref = ssidref,
handle = uuid.fromString(self.info['uuid']),
- flags = int((hvm << 0) | (hap << 1)))
+ flags = (int(hvm) << 0) | (int(hap) << 1))
except Exception, e:
# may get here if due to ACM the operation is not permitted
if security.on():

View File

@ -1,49 +0,0 @@
Index: xen-3.2-testing/tools/ioemu/xenstore.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2-testing/tools/ioemu/xenstore.c
@@ -418,7 +418,7 @@ void xenstore_record_dm_state(char *stat
void xenstore_process_event(void *opaque)
{
- char **vec, *image = NULL;
+ char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL;
unsigned int len, num, hd_index;
vec = xs_read_watch(xsh, &num);
@@ -440,8 +440,23 @@ void xenstore_process_event(void *opaque
goto out;
hd_index = vec[XS_WATCH_TOKEN][2] - 'a';
image = xs_read(xsh, XBT_NULL, vec[XS_WATCH_PATH], &len);
- if (image == NULL || !strcmp(image, bs_table[hd_index]->filename))
- goto out; /* gone or identical */
+ if (image == NULL)
+ goto out; /* gone */
+
+ /* Strip off blktap sub-type prefix */
+ bpath = strdup(vec[XS_WATCH_PATH]);
+ if (bpath == NULL)
+ goto out;
+ if ((offset = strrchr(bpath, '/')) != NULL)
+ *offset = '\0';
+ if (pasprintf(&buf, "%s/type", bpath) == -1)
+ goto out;
+ drv = xs_read(xsh, XBT_NULL, buf, &len);
+ if (drv && !strcmp(drv, "tap") && ((offset = strchr(image, ':')) != NULL))
+ memmove(image, offset+1, strlen(offset+1)+1);
+
+ if (!strcmp(image, bs_table[hd_index]->filename))
+ goto out; /* identical */
do_eject(0, vec[XS_WATCH_TOKEN]);
bs_table[hd_index]->filename[0] = 0;
@@ -456,6 +471,9 @@ void xenstore_process_event(void *opaque
}
out:
+ free(drv);
+ free(buf);
+ free(bpath);
free(image);
free(vec);
}

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/ioemu/hw/xen_machine_fv.c
Index: xen-3.2.1-testing/tools/ioemu/hw/xen_machine_fv.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/xen_machine_fv.c
+++ xen-3.2-testing/tools/ioemu/hw/xen_machine_fv.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/xen_machine_fv.c
+++ xen-3.2.1-testing/tools/ioemu/hw/xen_machine_fv.c
@@ -205,6 +205,8 @@ static void xen_init_fv(uint64_t ram_siz
}
#endif
@ -11,11 +11,11 @@ Index: xen-3.2-testing/tools/ioemu/hw/xen_machine_fv.c
xc_get_hvm_param(xc_handle, domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
fprintf(logfile, "shared page at pfn %lx\n", ioreq_pfn);
shared_page = xc_map_foreign_range(xc_handle, domid, XC_PAGE_SIZE,
Index: xen-3.2-testing/tools/ioemu/vl.c
Index: xen-3.2.1-testing/tools/ioemu/vl.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.c
+++ xen-3.2-testing/tools/ioemu/vl.c
@@ -7593,7 +7593,7 @@ int main(int argc, char **argv)
--- xen-3.2.1-testing.orig/tools/ioemu/vl.c
+++ xen-3.2.1-testing/tools/ioemu/vl.c
@@ -7613,7 +7613,7 @@ int main(int argc, char **argv)
#ifdef CONFIG_DM
bdrv_init();
xc_handle = xc_interface_open();
@ -24,11 +24,11 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
#endif /* CONFIG_DM */
#ifdef USE_KQEMU
Index: xen-3.2-testing/tools/ioemu/vl.h
Index: xen-3.2.1-testing/tools/ioemu/vl.h
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.h
+++ xen-3.2-testing/tools/ioemu/vl.h
@@ -1454,6 +1454,7 @@ void readline_start(const char *prompt,
--- xen-3.2.1-testing.orig/tools/ioemu/vl.h
+++ xen-3.2.1-testing/tools/ioemu/vl.h
@@ -1456,6 +1456,7 @@ void readline_start(const char *prompt,
ReadLineFunc *readline_func, void *opaque);
/* xenstore.c */
@ -36,10 +36,10 @@ Index: xen-3.2-testing/tools/ioemu/vl.h
void xenstore_parse_domain_config(int domid);
int xenstore_fd(void);
void xenstore_process_event(void *opaque);
Index: xen-3.2-testing/tools/ioemu/xenstore.c
Index: xen-3.2.1-testing/tools/ioemu/xenstore.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2-testing/tools/ioemu/xenstore.c
--- xen-3.2.1-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2.1-testing/tools/ioemu/xenstore.c
@@ -77,6 +77,13 @@ static void waitForDevice(char *fn)
return;
}
@ -54,7 +54,7 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
void xenstore_parse_domain_config(int domid)
{
char **e = NULL;
@@ -89,12 +96,6 @@ void xenstore_parse_domain_config(int do
@@ -90,12 +97,6 @@ void xenstore_parse_domain_config(int do
for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
media_filename[i] = NULL;

View File

@ -1,21 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201864887 0
# Node ID 3787e70b2ab219de50dff7417917fd9f9ccfcc35
# Parent 396ab902b02daf14deed0f3261c1c179b7378b4d
x86 shadow: Fix cross-page write emulation failure.
Signed-off-by: Disheng Su <disheng.su@intel.com>
Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/shadow/multi.c
+++ xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
@@ -4076,7 +4076,7 @@ static void *emulate_map_dest(struct vcp
sh_ctxt->mfn2 = emulate_gva_to_mfn(v, (vaddr + bytes - 1) & PAGE_MASK,
sh_ctxt);
if ( !mfn_valid(sh_ctxt->mfn2) )
- return ((mfn_x(sh_ctxt->mfn1) == BAD_GVA_TO_GFN) ?
+ return ((mfn_x(sh_ctxt->mfn2) == BAD_GVA_TO_GFN) ?
MAPPING_EXCEPTION : MAPPING_UNHANDLEABLE);
/* Cross-page writes mean probably not a pagetable */

View File

@ -1,24 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1201949604 0
# Node ID b1b93caa7d8e2414af06f06c3a9734675f715bad
# Parent 5d84464dc1fc013110c25dc0ff1f99585e699fa3
xend: Fix grow of the LEGACY_UNSUPPORTED_BY_XENAPI_CFG list each time
we instantiate a new XendConfig.
Signed-off-by: Pascal Bouchareine <pascal@gandi.net>
Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConfig.py
@@ -501,8 +501,8 @@ class XendConfig(dict):
int(sxp.child_value(sxp_cfg, "cpu_cap", 0))
# Only extract options we know about.
- extract_keys = LEGACY_UNSUPPORTED_BY_XENAPI_CFG
- extract_keys += XENAPI_CFG_TO_LEGACY_CFG.values()
+ extract_keys = LEGACY_UNSUPPORTED_BY_XENAPI_CFG + \
+ XENAPI_CFG_TO_LEGACY_CFG.values()
for key in extract_keys:
val = sxp.child_value(sxp_cfg, key)

View File

@ -1,22 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202207359 0
# Node ID 32e9c52fc6d9a6104afb2dbd84a89395b16f0e34
# Parent 99b8ffe250888d0c3fe86b726edf18f620072045
x86_emulate: Fix SAHF emulation.
Signed-off-by: Xiaohui Xin <xiaohui.xin@intel.com>
Signed-off-by: Kevin Tian <kevin.tian@intel.com>
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
@@ -2176,7 +2176,7 @@ x86_emulate(
}
case 0x9e: /* sahf */
- *(uint8_t *)_regs.eflags = (((uint8_t *)&_regs.eax)[1] & 0xd7) | 0x02;
+ *(uint8_t *)&_regs.eflags = (((uint8_t *)&_regs.eax)[1] & 0xd7) | 0x02;
break;
case 0x9f: /* lahf */

View File

@ -13,11 +13,11 @@ domains, not previous domains.
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -880,6 +880,9 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -882,6 +882,9 @@ class XendDomainInfo:
def _gatherVm(self, *args):
return xstransact.Gather(self.vmpath, *args)
@ -27,7 +27,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
def storeVm(self, *args):
return xstransact.Store(self.vmpath, *args)
@@ -1387,6 +1390,7 @@ class XendDomainInfo:
@@ -1392,6 +1395,7 @@ class XendDomainInfo:
self._writeVm('xend/previous_restart_time', str(now))
@ -35,7 +35,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
new_dom_info = self.info
try:
if rename:
@@ -1405,8 +1409,13 @@ class XendDomainInfo:
@@ -1410,8 +1414,13 @@ class XendDomainInfo:
try:
new_dom = XendDomain.instance().domain_create_from_dict(
new_dom_info)
@ -49,7 +49,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
new_dom._removeVm(RESTART_IN_PROGRESS)
except:
if new_dom:
@@ -1442,9 +1451,6 @@ class XendDomainInfo:
@@ -1447,9 +1456,6 @@ class XendDomainInfo:
self.vmpath = XS_VMROOT + new_uuid
# Write out new vm node to xenstore
self._storeVmDetails()

View File

@ -1,36 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202226659 0
# Node ID bf4a24c172d23ae9839ee564225d49ed95167de3
# Parent 92734271810aaa32d27fce777684649995fb1665
x86_emulate: fix side-effect macro call.
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
@@ -546,7 +546,8 @@ do {
#define jmp_rel(rel) \
do { \
- _regs.eip += (int)(rel); \
+ int _rel = (int)(rel); \
+ _regs.eip += _rel; \
if ( !mode_64bit() ) \
_regs.eip = ((op_bytes == 2) \
? (uint16_t)_regs.eip : (uint32_t)_regs.eip); \
@@ -2543,9 +2544,11 @@ x86_emulate(
break;
}
- case 0xeb: /* jmp (short) */
- jmp_rel(insn_fetch_type(int8_t));
+ case 0xeb: /* jmp (short) */ {
+ int rel = insn_fetch_type(int8_t);
+ jmp_rel(rel);
break;
+ }
case 0xf1: /* int1 (icebp) */
src.val = EXC_DB;

View File

@ -1,62 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202376466 0
# Node ID d04593aa1605fd337423b2c1296e275424e06656
# Parent 45b2e7d59e3a1895e903cbb7939e79c2f1f351d6
xm reboot: Fix wait option of xm reboot command
When I rebooted a domain by xm reboot command with wait option,
I saw the following message. But, rebooting the domain succeeded.
Domain vm1 destroyed for failed in rebooting
The cause why the message was shown is the domain is destroyed
temporarily by processing of xm reboot command. The domain
information is not gotten from Xend by server.xend.domains()
function till recreating the domain is completed.
This patch fixes processing of xm reboot command in Xm side.
It waits just a bit till recreating the domain is completed,
then it measures the success or failure of the reboot of the
domain.
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
diff -r 45b2e7d59e3a -r d04593aa1605 tools/python/xen/xm/shutdown.py
--- a/tools/python/xen/xm/shutdown.py Thu Feb 07 09:21:19 2008 +0000
+++ b/tools/python/xen/xm/shutdown.py Thu Feb 07 09:27:46 2008 +0000
@@ -23,6 +23,8 @@ from opts import *
from opts import *
from main import server, serverType, SERVER_XEN_API, get_single_vm
from xen.xend.XendAPIConstants import *
+
+RECREATING_TIMEOUT = 30
gopts = Opts(use="""[options] [DOM]
@@ -53,6 +55,7 @@ def wait_reboot(opts, doms, rcs):
if serverType == SERVER_XEN_API:
opts.err("Cannot wait for reboot w/ XenAPI (yet)")
+ recreating = {}
while doms:
alive = server.xend.domains(0)
reboot = []
@@ -61,9 +64,17 @@ def wait_reboot(opts, doms, rcs):
rc = server.xend.domain.getRestartCount(d)
if rc == rcs[d]: continue
reboot.append(d)
+
+ # Probably the domain is being recreated now.
+ # We have to wait just a bit for recreating the domain.
+ elif not recreating.has_key(d):
+ recreating[d] = 0
else:
- opts.info("Domain %s destroyed for failed in rebooting" % d)
- doms.remove(d)
+ recreating[d] += 1
+ if recreating[d] > RECREATING_TIMEOUT:
+ opts.info("Domain %s destroyed for failing to reboot" % d)
+ doms.remove(d)
+
for d in reboot:
opts.info("Domain %s rebooted" % d)
doms.remove(d)

View File

@ -11,10 +11,10 @@ config files and through the xm tool as well.
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
Index: xen-3.2-testing/docs/man/xmdomain.cfg.pod.5
Index: xen-3.2.1-testing/docs/man/xmdomain.cfg.pod.5
===================================================================
--- xen-3.2-testing.orig/docs/man/xmdomain.cfg.pod.5
+++ xen-3.2-testing/docs/man/xmdomain.cfg.pod.5
--- xen-3.2.1-testing.orig/docs/man/xmdomain.cfg.pod.5
+++ xen-3.2.1-testing/docs/man/xmdomain.cfg.pod.5
@@ -298,6 +298,22 @@ it holds, so that the new one may take t
=back
@ -38,10 +38,10 @@ Index: xen-3.2-testing/docs/man/xmdomain.cfg.pod.5
=head1 EXAMPLES
The following are quick examples of ways that domains might be
Index: xen-3.2-testing/tools/examples/xmexample.hvm
Index: xen-3.2.1-testing/tools/examples/xmexample.hvm
===================================================================
--- xen-3.2-testing.orig/tools/examples/xmexample.hvm
+++ xen-3.2-testing/tools/examples/xmexample.hvm
--- xen-3.2.1-testing.orig/tools/examples/xmexample.hvm
+++ xen-3.2.1-testing/tools/examples/xmexample.hvm
@@ -87,6 +87,11 @@ disk = [ 'file:/var/images/min-el3-i386.
# "rename-restart", meaning that the old domain is not cleaned up, but is
# renamed and a new domain started in its place.
@ -54,10 +54,10 @@ Index: xen-3.2-testing/tools/examples/xmexample.hvm
# The default is
#
# on_poweroff = 'destroy'
Index: xen-3.2-testing/tools/examples/xmexample1
Index: xen-3.2.1-testing/tools/examples/xmexample1
===================================================================
--- xen-3.2-testing.orig/tools/examples/xmexample1
+++ xen-3.2-testing/tools/examples/xmexample1
--- xen-3.2.1-testing.orig/tools/examples/xmexample1
+++ xen-3.2.1-testing/tools/examples/xmexample1
@@ -155,6 +155,11 @@ extra = "4"
# "rename-restart", meaning that the old domain is not cleaned up, but is
# renamed and a new domain started in its place.
@ -70,10 +70,10 @@ Index: xen-3.2-testing/tools/examples/xmexample1
# The default is
#
# on_poweroff = 'destroy'
Index: xen-3.2-testing/tools/examples/xmexample2
Index: xen-3.2.1-testing/tools/examples/xmexample2
===================================================================
--- xen-3.2-testing.orig/tools/examples/xmexample2
+++ xen-3.2-testing/tools/examples/xmexample2
--- xen-3.2.1-testing.orig/tools/examples/xmexample2
+++ xen-3.2.1-testing/tools/examples/xmexample2
@@ -191,6 +191,11 @@ extra = "4 VMID=%d usr=/dev/sda6" % vmid
# "rename-restart", meaning that the old domain is not cleaned up, but is
# renamed and a new domain started in its place.
@ -86,10 +86,10 @@ Index: xen-3.2-testing/tools/examples/xmexample2
# The default is
#
# on_poweroff = 'destroy'
Index: xen-3.2-testing/tools/examples/xmexample3
Index: xen-3.2.1-testing/tools/examples/xmexample3
===================================================================
--- xen-3.2-testing.orig/tools/examples/xmexample3
+++ xen-3.2-testing/tools/examples/xmexample3
--- xen-3.2.1-testing.orig/tools/examples/xmexample3
+++ xen-3.2.1-testing/tools/examples/xmexample3
@@ -177,6 +177,11 @@ extra = "4 VMID=%d" % vmid
# "rename-restart", meaning that the old domain is not cleaned up, but is
# renamed and a new domain started in its place.
@ -102,10 +102,10 @@ Index: xen-3.2-testing/tools/examples/xmexample3
# The default is
#
# on_poweroff = 'destroy'
Index: xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendAPIConstants.py
+++ xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendAPIConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
@@ -51,6 +51,18 @@ XEN_API_ON_CRASH_BEHAVIOUR = [
'rename_restart'
]
@ -125,10 +125,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendAPIConstants.py
XEN_API_VBD_MODE = ['RO', 'RW']
XEN_API_VDI_TYPE = ['system', 'user', 'ephemeral']
XEN_API_VBD_TYPE = ['CD', 'Disk']
Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConfig.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
@@ -241,7 +241,8 @@ LEGACY_XENSTORE_VM_PARAMS = [
## Config Choices
##
@ -139,10 +139,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
CONFIG_OLD_DOM_STATES = ('running', 'blocked', 'paused', 'shutdown',
'crashed', 'dying')
Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConstants.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
@@ -52,7 +52,9 @@ restart_modes = [
"restart",
"destroy",
@ -154,11 +154,11 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
]
DOM_STATES = [
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1257,14 +1257,6 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1262,14 +1262,6 @@ class XendDomainInfo:
self.info['name_label'], self.domid)
self._writeVm(LAST_SHUTDOWN_REASON, 'crash')
@ -173,7 +173,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
restart_reason = 'crash'
self._stateSet(DOM_STATE_HALTED)
@@ -1332,14 +1324,30 @@ class XendDomainInfo:
@@ -1337,14 +1329,30 @@ class XendDomainInfo:
def _clearRestart(self):
self._removeDom("xend/shutdown_start_time")
@ -205,7 +205,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
action_conf = {
'poweroff': 'actions_after_shutdown',
@@ -2551,9 +2559,10 @@ class XendDomainInfo:
@@ -2559,9 +2567,10 @@ class XendDomainInfo:
def get_on_crash(self):
after_crash = self.info.get('actions_after_crash')
@ -218,10 +218,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
def get_dev_config_by_uuid(self, dev_class, dev_uuid):
""" Get's a device configuration either from XendConfig or
Index: xen-3.2-testing/tools/python/xen/xm/create.py
Index: xen-3.2.1-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2-testing/tools/python/xen/xm/create.py
--- xen-3.2.1-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/create.py
@@ -260,15 +260,17 @@ gopts.var('on_reboot', val='destroy|rest
renamed and a new domain started in its place.
""")

View File

@ -1,35 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202407244 0
# Node ID 445edf4089a3ccaca977665423e903b5300832cb
# Parent e6cf98edf0c573d86c59863c6b861f9a4d6350c3
x86_emulate: Fix MUL emulation.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
@@ -1547,11 +1547,14 @@ x86_emulate(
switch ( src.bytes )
{
case 1:
+ dst.val = (uint8_t)dst.val;
dst.val *= src.val;
if ( (uint8_t)dst.val != (uint16_t)dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;
+ dst.bytes = 2;
break;
case 2:
+ dst.val = (uint16_t)dst.val;
dst.val *= src.val;
if ( (uint16_t)dst.val != (uint32_t)dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;
@@ -1559,6 +1562,7 @@ x86_emulate(
break;
#ifdef __x86_64__
case 4:
+ dst.val = (uint32_t)dst.val;
dst.val *= src.val;
if ( (uint32_t)dst.val != dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;

View File

@ -1,20 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202412636 0
# Node ID 1b750b9cf4319c076bb831d26dcdcffbd5cfb913
# Parent 8e4cd0658c4152a02576892e895e63772bd9df1c
x86_emulate: Fix IMUL r/m8 emulation.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
@@ -1592,6 +1592,7 @@ x86_emulate(
(uint16_t)(int8_t)dst.val);
if ( (int8_t)dst.val != (uint16_t)dst.val )
_regs.eflags |= EFLG_OF|EFLG_CF;
+ dst.bytes = 2;
break;
case 2:
dst.val = ((uint32_t)(int16_t)src.val *

View File

@ -1,197 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202723858 0
# Node ID 96b418cf047e6d869740efd3660ab175303a3148
# Parent c68ce89542c7fbba9d00fd3a7d4e190476554e55
qemu: Queue mouse clicks.
qemu doesn't enqueue mouse events, just records the latest mouse
state. This can cause some lost mouse double clicks if the events are
not processed fast enought. This patch implements a simple queue for
left mouse click events.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff -r c68ce89542c7 -r 96b418cf047e tools/ioemu/hw/usb-hid.c
--- a/tools/ioemu/hw/usb-hid.c Mon Feb 11 09:47:19 2008 +0000
+++ b/tools/ioemu/hw/usb-hid.c Mon Feb 11 09:57:38 2008 +0000
@@ -224,15 +224,37 @@ static const uint8_t qemu_tablet_hid_rep
0xC0, /* End Collection */
};
+static int currentbutton = 0;
+typedef struct _mouseclick {
+ int button_state;
+ struct _mouseclick *next;
+} mouseclick;
+static mouseclick mousequeue[20];
+static mouseclick *head = mousequeue;
+static mouseclick *tail = mousequeue;
+
static void usb_mouse_event(void *opaque,
int dx1, int dy1, int dz1, int buttons_state)
{
USBMouseState *s = opaque;
+
+ if (s->status_changed == 1){
+ //A mouse event is lost
+ if (buttons_state != currentbutton && tail->next != head) {
+ //A left click event is lost: let's add it to the queue
+ //counter++;
+ tail->button_state = buttons_state;
+ tail = tail->next;
+ }
+ }
+ else {
+ s->buttons_state = buttons_state;
+ }
s->dx += dx1;
s->dy += dy1;
s->dz += dz1;
- s->buttons_state = buttons_state;
+ currentbutton = buttons_state;
s->status_changed = 1;
}
@@ -240,11 +262,24 @@ static void usb_tablet_event(void *opaqu
int x, int y, int dz, int buttons_state)
{
USBMouseState *s = opaque;
+
+ if (s->status_changed == 1){
+ //A mouse event is lost
+ if (buttons_state != currentbutton && tail->next != head) {
+ //A left click event is lost: let's add it to the queue
+ //counter++;
+ tail->button_state = buttons_state;
+ tail = tail->next;
+ }
+ }
+ else {
+ s->buttons_state = buttons_state;
+ }
s->x = x;
s->y = y;
s->dz += dz;
- s->buttons_state = buttons_state;
+ currentbutton = buttons_state;
s->status_changed = 1;
}
@@ -493,10 +528,17 @@ static int usb_mouse_handle_data(USBDevi
else if (s->kind == USB_TABLET)
ret = usb_tablet_poll(s, p->data, p->len);
- if (!s->status_changed)
+ if (!s->status_changed) {
ret = USB_RET_NAK;
- else
- s->status_changed = 0;
+ } else {
+ if (head != tail) {
+ s->buttons_state = head->button_state;
+ head = head->next;
+ }
+ else {
+ s->status_changed = 0;
+ }
+ }
} else {
goto fail;
@@ -567,6 +609,14 @@ USBDevice *usb_tablet_init(void)
USBDevice *usb_tablet_init(void)
{
USBMouseState *s;
+ int i;
+
+ for (i = 0; i < 19; i++) {
+ mousequeue[i].button_state = 0;
+ mousequeue[i].next = &(mousequeue[i + 1]);
+ }
+ mousequeue[i].button_state = 0;
+ mousequeue[i].next = mousequeue;
s = qemu_mallocz(sizeof(USBMouseState));
if (!s)
@@ -591,6 +641,14 @@ USBDevice *usb_mouse_init(void)
USBDevice *usb_mouse_init(void)
{
USBMouseState *s;
+ int i;
+
+ for (i = 0; i < 19; i++) {
+ mousequeue[i].button_state = 0;
+ mousequeue[i].next = &(mousequeue[i + 1]);
+ }
+ mousequeue[i].button_state = 0;
+ mousequeue[i].next = mousequeue;
s = qemu_mallocz(sizeof(USBMouseState));
if (!s)
diff -r c68ce89542c7 -r 96b418cf047e tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Mon Feb 11 09:47:19 2008 +0000
+++ b/tools/ioemu/sdl.c Mon Feb 11 09:57:38 2008 +0000
@@ -259,11 +259,9 @@ static void sdl_grab_end(void)
sdl_update_caption();
}
-static void sdl_send_mouse_event(int dz)
-{
- int dx, dy, state, buttons;
- state = SDL_GetRelativeMouseState(&dx, &dy);
- buttons = 0;
+static void sdl_send_mouse_event(int dx, int dy, int dz, int state)
+{
+ int buttons = 0;
if (state & SDL_BUTTON(SDL_BUTTON_LEFT))
buttons |= MOUSE_EVENT_LBUTTON;
if (state & SDL_BUTTON(SDL_BUTTON_RIGHT))
@@ -425,11 +423,19 @@ static void sdl_refresh(DisplayState *ds
case SDL_MOUSEMOTION:
if (gui_grab || kbd_mouse_is_absolute() ||
absolute_enabled) {
- sdl_send_mouse_event(0);
+ int dx, dy, state;
+ state = SDL_GetRelativeMouseState(&dx, &dy);
+ sdl_send_mouse_event(dx, dy, 0, state);
+ }
+ break;
+ case SDL_MOUSEBUTTONUP:
+ if (gui_grab || kbd_mouse_is_absolute()) {
+ int dx, dy, state;
+ state = SDL_GetRelativeMouseState(&dx, &dy);
+ sdl_send_mouse_event(dx, dy, 0, state);
}
break;
case SDL_MOUSEBUTTONDOWN:
- case SDL_MOUSEBUTTONUP:
{
SDL_MouseButtonEvent *bev = &ev->button;
if (!gui_grab && !kbd_mouse_is_absolute()) {
@@ -439,16 +445,19 @@ static void sdl_refresh(DisplayState *ds
sdl_grab_start();
}
} else {
- int dz;
+ int dx, dy, dz, state;
dz = 0;
+ state = SDL_GetRelativeMouseState(&dx, &dy);
#ifdef SDL_BUTTON_WHEELUP
- if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {
+ if (bev->button == SDL_BUTTON_WHEELUP) {
dz = -1;
- } else if (bev->button == SDL_BUTTON_WHEELDOWN && ev->type == SDL_MOUSEBUTTONDOWN) {
+ } else if (bev->button == SDL_BUTTON_WHEELDOWN) {
dz = 1;
+ } else {
+ state = bev->button | state;
}
#endif
- sdl_send_mouse_event(dz);
+ sdl_send_mouse_event(dx, dy, dz, state);
}
}
break;

View File

@ -13,10 +13,10 @@ timer_mode adjustments).
Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/build.c
Index: xen-3.2.1-testing/tools/firmware/hvmloader/acpi/build.c
===================================================================
--- xen-3.2-testing.orig/tools/firmware/hvmloader/acpi/build.c
+++ xen-3.2-testing/tools/firmware/hvmloader/acpi/build.c
--- xen-3.2.1-testing.orig/tools/firmware/hvmloader/acpi/build.c
+++ xen-3.2.1-testing/tools/firmware/hvmloader/acpi/build.c
@@ -62,11 +62,18 @@ static int uart_exists(uint16_t uart_bas
return ((b == 0) && (c == 0xf));
}
@ -61,10 +61,10 @@ Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/build.c
/* Processor Object SSDT. */
table_ptrs[nr_tables++] = (unsigned long)&buf[offset];
Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
Index: xen-3.2.1-testing/tools/firmware/hvmloader/acpi/dsdt.asl
===================================================================
--- xen-3.2-testing.orig/tools/firmware/hvmloader/acpi/dsdt.asl
+++ xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
--- xen-3.2.1-testing.orig/tools/firmware/hvmloader/acpi/dsdt.asl
+++ xen-3.2.1-testing/tools/firmware/hvmloader/acpi/dsdt.asl
@@ -49,6 +49,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
Field(BIOS, ByteAcc, NoLock, Preserve) {
UAR1, 1,
@ -87,10 +87,10 @@ Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
Name(_CRS, ResourceTemplate() {
DWordMemory(
ResourceConsumer, PosDecode, MinFixed, MaxFixed,
Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.c
Index: xen-3.2.1-testing/tools/firmware/hvmloader/acpi/dsdt.c
===================================================================
--- xen-3.2-testing.orig/tools/firmware/hvmloader/acpi/dsdt.c
+++ xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.c
--- xen-3.2.1-testing.orig/tools/firmware/hvmloader/acpi/dsdt.c
+++ xen-3.2.1-testing/tools/firmware/hvmloader/acpi/dsdt.c
@@ -5,15 +5,15 @@
* Copyright (C) 2000 - 2006 Intel Corporation
* Supports ACPI Specification Revision 3.0a
@ -1010,10 +1010,10 @@ Index: xen-3.2-testing/tools/firmware/hvmloader/acpi/dsdt.c
+ 0x08,0x22,0x80,0x00,0x79,0x00,
};
int DsdtLen=sizeof(AmlCode);
Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConfig.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
@@ -127,7 +127,7 @@ LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(
XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display',
'fda', 'fdb', 'keymap', 'isa', 'localtime', 'monitor',
@ -1022,11 +1022,11 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
+ 'soundhw','stdvga', 'usb', 'usbdevice', 'hpet', 'vnc',
'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode',
'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt',
'guest_os_type' ]
Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
'guest_os_type', 'hap']
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConstants.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
@@ -47,6 +47,7 @@ HVM_PARAM_NVRAM_FD = 7
HVM_PARAM_VHPT_SIZE = 8
HVM_PARAM_BUFPIOREQ_PFN = 9
@ -1035,13 +1035,13 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendConstants.py
restart_modes = [
"restart",
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1682,6 +1682,12 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1690,6 +1690,12 @@ class XendDomainInfo:
xc.hvm_set_param(self.domid, HVM_PARAM_TIMER_MODE,
long(self.info["platform"].get("timer_mode")))
long(timer_mode))
+ # Optionally enable virtual HPET
+ hpet = self.info["platform"].get("hpet")
@ -1052,10 +1052,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
# Set maximum number of vcpus in domain
xc.domain_max_vcpus(self.domid, int(self.info['VCPUs_max']))
Index: xen-3.2-testing/tools/python/xen/xm/create.py
Index: xen-3.2.1-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2-testing/tools/python/xen/xm/create.py
--- xen-3.2.1-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/create.py
@@ -194,6 +194,10 @@ gopts.var('pae', val='PAE',
fn=set_int, default=1,
use="Disable or enable PAE of HVM domain.")
@ -1067,33 +1067,33 @@ Index: xen-3.2-testing/tools/python/xen/xm/create.py
gopts.var('timer_mode', val='TIMER_MODE',
fn=set_int, default=0,
use="""Timer mode (0=delay virtual time when ticks are missed;
@@ -725,7 +729,7 @@ def configure_hvm(config_image, vals):
@@ -730,7 +734,7 @@ def configure_hvm(config_image, vals):
'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'soundhw',
'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten',
'sdl', 'display', 'xauthority', 'rtc_timeoffset', 'monitor',
- 'acpi', 'apic', 'usb', 'usbdevice', 'keymap', 'pci',
+ 'acpi', 'apic', 'usb', 'usbdevice', 'keymap', 'pci', 'hpet',
'guest_os_type']
'guest_os_type', 'hap']
for a in args:
Index: xen-3.2-testing/tools/python/xen/xm/xenapi_create.py
Index: xen-3.2.1-testing/tools/python/xen/xm/xenapi_create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/xenapi_create.py
+++ xen-3.2-testing/tools/python/xen/xm/xenapi_create.py
--- xen-3.2.1-testing.orig/tools/python/xen/xm/xenapi_create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/xenapi_create.py
@@ -818,7 +818,8 @@ class sxp2xml:
def extract_platform(self, image, document):
- platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode']
- platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode', 'hap']
+ platform_keys = ['acpi', 'apic', 'pae', 'vhpt', 'timer_mode',
+ 'hap', 'hpet']
def extract_platform_key(key):
platform = document.createElement("platform")
Index: xen-3.2-testing/xen/arch/x86/hvm/hpet.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/hpet.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/hpet.c
+++ xen-3.2-testing/xen/arch/x86/hvm/hpet.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/hpet.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/hpet.c
@@ -353,7 +353,8 @@ static void hpet_write(
static int hpet_range(struct vcpu *v, unsigned long addr)
@ -1104,10 +1104,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hpet.c
(addr < (HPET_BASE_ADDRESS + HPET_MMAP_SIZE)));
}
Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/hvm.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
@@ -235,6 +235,8 @@ int hvm_domain_initialise(struct domain
spin_lock_init(&d->arch.hvm_domain.irq_lock);
spin_lock_init(&d->arch.hvm_domain.uc_lock);
@ -1117,10 +1117,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
hvm_init_cacheattr_region_list(d);
rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
Index: xen-3.2-testing/xen/include/public/hvm/params.h
Index: xen-3.2.1-testing/xen/include/public/hvm/params.h
===================================================================
--- xen-3.2-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2-testing/xen/include/public/hvm/params.h
--- xen-3.2.1-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2.1-testing/xen/include/public/hvm/params.h
@@ -81,6 +81,9 @@
#define HVMPTM_no_missed_ticks_pending 2
#define HVMPTM_one_missed_tick_pending 3

View File

@ -1,235 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1202899393 0
# Node ID 0164d924cebacfef62673a49c2f4ad395df5444b
# Parent 27314cfbcefe8ee261da3ea827eb8336c32ad987
Tools: fix save/restore of 32-bit PV guests with 64-bit tools
by removing some obvious typos, handling CR3 folding and hvirt_start
based on guest word-size, and understanding 32-bit INVALID_MFN.
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
Index: xen-3.2-testing/tools/libxc/xc_domain_restore.c
===================================================================
--- xen-3.2-testing.orig/tools/libxc/xc_domain_restore.c
+++ xen-3.2-testing/tools/libxc/xc_domain_restore.c
@@ -251,7 +251,7 @@ static xen_pfn_t *load_p2m_frame_list(
/* Now that we know the guest's word-size, can safely allocate
* the p2m frame list */
- if ( (p2m_frame_list = malloc(P2M_FL_SIZE)) == NULL )
+ if ( (p2m_frame_list = malloc(P2M_TOOLS_FL_SIZE)) == NULL )
{
ERROR("Couldn't allocate p2m_frame_list array");
return NULL;
@@ -1040,7 +1040,7 @@ int xc_domain_restore(int xc_handle, int
SET_FIELD(&ctxt, gdt_frames[j], p2m[pfn]);
}
/* Uncanonicalise the page table base pointer. */
- pfn = xen_cr3_to_pfn(GET_FIELD(&ctxt, ctrlreg[3]));
+ pfn = UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3]));
if ( pfn >= p2m_size )
{
@@ -1057,12 +1057,12 @@ int xc_domain_restore(int xc_handle, int
(unsigned long)pt_levels<<XEN_DOMCTL_PFINFO_LTAB_SHIFT);
goto out;
}
- SET_FIELD(&ctxt, ctrlreg[3], xen_pfn_to_cr3(p2m[pfn]));
+ SET_FIELD(&ctxt, ctrlreg[3], FOLD_CR3(p2m[pfn]));
/* Guest pagetable (x86/64) stored in otherwise-unused CR1. */
if ( (pt_levels == 4) && (ctxt.x64.ctrlreg[1] & 1) )
{
- pfn = xen_cr3_to_pfn(ctxt.x64.ctrlreg[1] & ~1);
+ pfn = UNFOLD_CR3(ctxt.x64.ctrlreg[1] & ~1);
if ( pfn >= p2m_size )
{
ERROR("User PT base is bad: pfn=%lu p2m_size=%lu",
@@ -1077,7 +1077,7 @@ int xc_domain_restore(int xc_handle, int
(unsigned long)pt_levels<<XEN_DOMCTL_PFINFO_LTAB_SHIFT);
goto out;
}
- ctxt.x64.ctrlreg[1] = xen_pfn_to_cr3(p2m[pfn]);
+ ctxt.x64.ctrlreg[1] = FOLD_CR3(p2m[pfn]);
}
domctl.cmd = XEN_DOMCTL_setvcpucontext;
domctl.domain = (domid_t)dom;
@@ -1158,7 +1158,7 @@ int xc_domain_restore(int xc_handle, int
if ( guest_width > sizeof (xen_pfn_t) )
for ( i = p2m_size - 1; i >= 0; i-- )
((uint64_t *)p2m)[i] = p2m[i];
- else if ( guest_width > sizeof (xen_pfn_t) )
+ else if ( guest_width < sizeof (xen_pfn_t) )
for ( i = 0; i < p2m_size; i++ )
((uint32_t *)p2m)[i] = p2m[i];
Index: xen-3.2-testing/tools/libxc/xc_domain_save.c
===================================================================
--- xen-3.2-testing.orig/tools/libxc/xc_domain_save.c
+++ xen-3.2-testing/tools/libxc/xc_domain_save.c
@@ -61,10 +61,11 @@ unsigned int guest_width;
#define mfn_to_pfn(_mfn) (live_m2p[(_mfn)])
-#define pfn_to_mfn(_pfn) \
- ((xen_pfn_t) ((guest_width==8) \
- ? (((uint64_t *)live_p2m)[(_pfn)]) \
- : (((uint32_t *)live_p2m)[(_pfn)])))
+#define pfn_to_mfn(_pfn) \
+ ((xen_pfn_t) ((guest_width==8) \
+ ? (((uint64_t *)live_p2m)[(_pfn)]) \
+ : ((((uint32_t *)live_p2m)[(_pfn)]) == 0xffffffffU \
+ ? (-1UL) : (((uint32_t *)live_p2m)[(_pfn)]))))
/*
* Returns TRUE if the given machine frame number has a unique mapping
@@ -496,10 +497,9 @@ static int canonicalize_pagetable(unsign
xen_start = L3_PAGETABLE_ENTRIES_PAE;
/*
- ** in PAE only the L2 mapping the top 1GB contains Xen mappings.
- ** We can spot this by looking for the guest linear mapping which
- ** Xen always ensures is present in that L2. Guests must ensure
- ** that this check will fail for other L2s.
+ ** In PAE only the L2 mapping the top 1GB contains Xen mappings.
+ ** We can spot this by looking for the guest's mappingof the m2p.
+ ** Guests must ensure that this check will fail for other L2s.
*/
if ( (pt_levels == 3) && (type == XEN_DOMCTL_PFINFO_L2TAB) )
{
@@ -555,7 +555,13 @@ static int canonicalize_pagetable(unsign
/* This will happen if the type info is stale which
is quite feasible under live migration */
pfn = 0; /* zap it - we'll retransmit this page later */
- race = 1; /* inform the caller of race; fatal if !live */
+ /* XXX: We can't spot Xen mappings in compat-mode L2es
+ * from 64-bit tools, but the only thing in them is the
+ * compat m2p, so we quietly zap them. This doesn't
+ * count as a race, so don't report it. */
+ if ( !(type == XEN_DOMCTL_PFINFO_L2TAB
+ && sizeof (unsigned long) > guest_width) )
+ race = 1; /* inform the caller; fatal if !live */
}
else
pfn = mfn_to_pfn(mfn);
@@ -690,7 +696,7 @@ static xen_pfn_t *map_and_save_p2m_table
else
p2m_frame_list_list[i] = 0;
else if ( guest_width < sizeof(unsigned long) )
- for ( i = PAGE_SIZE/sizeof(unsigned long) - 1; i >= 0; i++ )
+ for ( i = PAGE_SIZE/sizeof(unsigned long) - 1; i >= 0; i-- )
p2m_frame_list_list[i] = ((uint32_t *)p2m_frame_list_list)[i];
live_p2m_frame_list =
@@ -704,19 +710,20 @@ static xen_pfn_t *map_and_save_p2m_table
}
/* Get a local copy of the live_P2M_frame_list */
- if ( !(p2m_frame_list = malloc(P2M_FL_SIZE)) )
+ if ( !(p2m_frame_list = malloc(P2M_TOOLS_FL_SIZE)) )
{
ERROR("Couldn't allocate p2m_frame_list array");
goto out;
}
- memcpy(p2m_frame_list, live_p2m_frame_list, P2M_FL_SIZE);
+ memset(p2m_frame_list, 0, P2M_TOOLS_FL_SIZE);
+ memcpy(p2m_frame_list, live_p2m_frame_list, P2M_GUEST_FL_SIZE);
/* Canonicalize guest's unsigned long vs ours */
if ( guest_width > sizeof(unsigned long) )
for ( i = 0; i < P2M_FL_ENTRIES; i++ )
p2m_frame_list[i] = ((uint64_t *)p2m_frame_list)[i];
else if ( guest_width < sizeof(unsigned long) )
- for ( i = P2M_FL_ENTRIES - 1; i >= 0; i++ )
+ for ( i = P2M_FL_ENTRIES - 1; i >= 0; i-- )
p2m_frame_list[i] = ((uint32_t *)p2m_frame_list)[i];
@@ -1559,31 +1566,26 @@ int xc_domain_save(int xc_handle, int io
}
/* Canonicalise the page table base pointer. */
- if ( !MFN_IS_IN_PSEUDOPHYS_MAP(xen_cr3_to_pfn(
- GET_FIELD(&ctxt, ctrlreg[3]))) )
+ if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(
+ GET_FIELD(&ctxt, ctrlreg[3]))) )
{
ERROR("PT base is not in range of pseudophys map");
goto out;
}
SET_FIELD(&ctxt, ctrlreg[3],
- xen_pfn_to_cr3(
- mfn_to_pfn(
- xen_cr3_to_pfn(
- GET_FIELD(&ctxt, ctrlreg[3])))));
+ FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3])))));
/* Guest pagetable (x86/64) stored in otherwise-unused CR1. */
if ( (pt_levels == 4) && ctxt.x64.ctrlreg[1] )
{
- if ( !MFN_IS_IN_PSEUDOPHYS_MAP(
- xen_cr3_to_pfn(ctxt.x64.ctrlreg[1])) )
+ if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(ctxt.x64.ctrlreg[1])) )
{
ERROR("PT base is not in range of pseudophys map");
goto out;
}
/* Least-significant bit means 'valid PFN'. */
ctxt.x64.ctrlreg[1] = 1 |
- xen_pfn_to_cr3(
- mfn_to_pfn(xen_cr3_to_pfn(ctxt.x64.ctrlreg[1])));
+ FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(ctxt.x64.ctrlreg[1])));
}
if ( write_exact(io_fd, &ctxt, ((guest_width==8)
Index: xen-3.2-testing/tools/libxc/xg_private.h
===================================================================
--- xen-3.2-testing.orig/tools/libxc/xg_private.h
+++ xen-3.2-testing/tools/libxc/xg_private.h
@@ -155,7 +155,9 @@ typedef l4_pgentry_64_t l4_pgentry_t;
#define P2M_FL_ENTRIES (((p2m_size)+FPP-1)/FPP)
/* Size in bytes of the pfn_to_mfn_frame_list */
-#define P2M_FL_SIZE ((P2M_FL_ENTRIES)*(guest_width))
+#define P2M_GUEST_FL_SIZE ((P2M_FL_ENTRIES) * (guest_width))
+#define P2M_TOOLS_FL_SIZE ((P2M_FL_ENTRIES) * \
+ MAX((sizeof (xen_pfn_t)), guest_width))
/* Masks for PTE<->PFN conversions */
#define MADDR_BITS_X86 ((guest_width == 8) ? 52 : 44)
Index: xen-3.2-testing/tools/libxc/xg_save_restore.h
===================================================================
--- xen-3.2-testing.orig/tools/libxc/xg_save_restore.h
+++ xen-3.2-testing/tools/libxc/xg_save_restore.h
@@ -68,6 +68,13 @@ static inline int get_platform_info(int
*guest_width = domctl.u.address_size.size / 8;
+ /* 64-bit tools will see the 64-bit hvirt_start, but 32-bit guests
+ * will be using the compat one. */
+ if ( *guest_width < sizeof (unsigned long) )
+ /* XXX need to fix up a way of extracting this value from Xen if
+ * XXX it becomes variable for domU */
+ *hvirt_start = 0xf5800000;
+
if (strstr(xen_caps, "xen-3.0-x86_64"))
/* Depends on whether it's a compat 32-on-64 guest */
*pt_levels = ( (*guest_width == 8) ? 4 : 3 );
@@ -136,6 +143,16 @@ typedef union
(_p)->x32._f = (_v); \
} while (0)
+#define UNFOLD_CR3(_c) \
+ ((uint64_t)((guest_width == 8) \
+ ? ((_c) >> 12) \
+ : (((uint32_t)(_c) >> 12) | ((uint32_t)(_c) << 20))))
+
+#define FOLD_CR3(_c) \
+ ((uint64_t)((guest_width == 8) \
+ ? ((uint64_t)(_c)) << 12 \
+ : (((uint32_t)(_c) << 12) | ((uint32_t)(_c) >> 20))))
+
#define MEMCPY_FIELD(_d, _s, _f) do { \
if (guest_width == 8) \
memcpy(&(_d)->x64._f, &(_s)->x64._f,sizeof((_d)->x64._f)); \

View File

@ -1,27 +0,0 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1204036539 0
# Node ID 9dd235d6174d1944caf53798a07ecf509678eead
# Parent b6323bf8dae0116a206a303b66b8fa539ba7c52d
Fix restore of saved image containing rtc_timeoffset
Saved images contain rtc_timeoffset as a string value, resulting in a
TypeError exception when calling xc.domain_set_time_offset() on
restore. Cast rtc_timeoffset to int before calling
xc.domain_set_time_offset().
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
Index: xen-3.2-testing/tools/python/xen/xend/image.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2-testing/tools/python/xen/xend/image.py
@@ -346,7 +346,7 @@ class LinuxImageHandler(ImageHandler):
ImageHandler.configure(self, vmConfig)
rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset')
if rtc_timeoffset is not None:
- xc.domain_set_time_offset(self.vm.getDomid(), rtc_timeoffset)
+ xc.domain_set_time_offset(self.vm.getDomid(), int(rtc_timeoffset))
def buildDomain(self):
store_evtchn = self.vm.getStorePort()

View File

@ -0,0 +1,85 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1204038008 0
# Node ID 6ef22eefc36056daa4f7e6c6f14873ea72658161
# Parent c8b58f82d893d821d60cb96225f94170bd7ae595
xend: Add free memory size of every node in physinfo to help user to
get usage of memory of their NUMA machine.
Signed-off-by: Duan Ronghui <ronghui.duan@intel.com>
Index: xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/lowlevel/xc/xc.c
+++ xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
@@ -780,7 +780,8 @@ static PyObject *pyxc_physinfo(XcObject
xc_physinfo_t info;
char cpu_cap[128], *p=cpu_cap, *q=cpu_cap;
int i, j, max_cpu_id;
- PyObject *ret_obj, *node_to_cpu_obj;
+ uint64_t free_heap;
+ PyObject *ret_obj, *node_to_cpu_obj, *node_to_memory_obj;
xc_cpu_to_node_t map[MAX_CPU_ID + 1];
set_xen_guest_handle(info.cpu_to_node, map);
@@ -828,7 +829,17 @@ static PyObject *pyxc_physinfo(XcObject
PyList_Append(node_to_cpu_obj, cpus);
}
+ node_to_memory_obj = PyList_New(0);
+
+ for ( i = 0; i < info.nr_nodes; i++ )
+ {
+ xc_availheap(self->xc_handle, 0, 0, i, &free_heap);
+ PyList_Append(node_to_memory_obj,
+ PyInt_FromLong(free_heap / 1024));
+ }
+
PyDict_SetItemString(ret_obj, "node_to_cpu", node_to_cpu_obj);
+ PyDict_SetItemString(ret_obj, "node_to_memory", node_to_memory_obj);
return ret_obj;
#undef MAX_CPU_ID
Index: xen-3.2.1-testing/tools/python/xen/xend/XendNode.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendNode.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendNode.py
@@ -573,6 +573,20 @@ class XendNode:
except:
str='none\n'
return str[:-1];
+ def format_node_to_memory(self, pinfo):
+ str=''
+ whitespace=''
+ try:
+ node_to_memory=pinfo['node_to_memory']
+ for i in range(0, pinfo['nr_nodes']):
+ str+='%snode%d:%d\n' % (whitespace,
+ i,
+ node_to_memory[i] / 1024)
+ whitespace='%25s' % ''
+ except:
+ str='none\n'
+ return str[:-1];
+
def physinfo(self):
info = self.xc.physinfo()
@@ -583,6 +597,7 @@ class XendNode:
info['total_memory'] = info['total_memory'] / 1024
info['free_memory'] = info['free_memory'] / 1024
info['node_to_cpu'] = self.format_node_to_cpu(info)
+ info['node_to_memory'] = self.format_node_to_memory(info)
ITEM_ORDER = ['nr_cpus',
'nr_nodes',
@@ -592,7 +607,8 @@ class XendNode:
'hw_caps',
'total_memory',
'free_memory',
- 'node_to_cpu'
+ 'node_to_cpu',
+ 'node_to_memory'
]
return [[k, info[k]] for k in ITEM_ORDER]

View File

@ -0,0 +1,52 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1204118269 0
# Node ID b58180cf8ab8c69def4129f7152f136daf5e1596
# Parent 2b940e46857c0ddf5ef1e255e201a42caf310df6
xend: Set default vcpu affinity for better performance in NUMA systems.
Signed-off-by: Duan Ronghui <ronghui.duan@intel.com>
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1754,6 +1754,39 @@ class XendDomainInfo:
if self.info['cpus'] is not None and len(self.info['cpus']) > 0:
for v in range(0, self.info['VCPUs_max']):
xc.vcpu_setaffinity(self.domid, v, self.info['cpus'])
+ else:
+ info = xc.physinfo()
+ if info['nr_nodes'] > 1:
+ node_memory_list = info['node_to_memory']
+ needmem = self.image.getRequiredAvailableMemory(self.info['memory_dynamic_max']) / 1024
+ candidate_node_list = []
+ for i in range(0, info['nr_nodes']):
+ if node_memory_list[i] >= needmem:
+ candidate_node_list.append(i)
+ if candidate_node_list is None or len(candidate_node_list) == 1:
+ index = node_memory_list.index( max(node_memory_list) )
+ cpumask = info['node_to_cpu'][index]
+ else:
+ nodeload = [0]
+ nodeload = nodeload * info['nr_nodes']
+ from xen.xend import XendDomain
+ doms = XendDomain.instance().list('all')
+ for dom in doms:
+ cpuinfo = dom.getVCPUInfo()
+ for vcpu in sxp.children(cpuinfo, 'vcpu'):
+ def vinfo(n, t):
+ return t(sxp.child_value(vcpu, n))
+ cpumap = vinfo('cpumap', list)
+ for i in candidate_node_list:
+ node_cpumask = info['node_to_cpu'][i]
+ for j in node_cpumask:
+ if j in cpumap:
+ nodeload[i] += 1
+ break
+ index = nodeload.index( min(nodeload) )
+ cpumask = info['node_to_cpu'][index]
+ for v in range(0, self.info['VCPUs_max']):
+ xc.vcpu_setaffinity(self.domid, v, cpumask)
# Use architecture- and image-specific calculations to determine
# the various headrooms necessary, given the raw configured

View File

@ -0,0 +1,44 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1204715792 0
# Node ID f85b379fa9436be0ecd733d7bedbebdf1838a310
# Parent 86e64b684fb2751f8d2db7e07e88da8505008255
x86 hvm: Remove global 'hap' boot parameter now that their is a
per-domain configuration option.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/hvm.c
@@ -50,16 +50,6 @@
#include <public/version.h>
#include <public/memory.h>
-/*
- * Xen command-line option to allow/disallow hardware-assisted paging.
- * Since the phys-to-machine table of AMD NPT is in host format, 32-bit Xen
- * can only support guests using NPT with up to a 4GB memory map. Therefore
- * we disallow HAP by default on PAE Xen (by default we want to support an
- * 8GB pseudophysical memory map for HVM guests on a PAE host).
- */
-static int opt_hap_permitted = (CONFIG_PAGING_LEVELS != 3);
-boolean_param("hap", opt_hap_permitted);
-
int hvm_enabled __read_mostly;
unsigned int opt_hvm_debug_level __read_mostly;
@@ -87,12 +77,7 @@ void hvm_enable(struct hvm_function_tabl
hvm_enabled = 1;
if ( hvm_funcs.hap_supported )
- {
- if ( !opt_hap_permitted )
- hvm_funcs.hap_supported = 0;
- printk("HVM: Hardware Assisted Paging detected %s.\n",
- hvm_funcs.hap_supported ? "and enabled" : "but disabled");
- }
+ printk("HVM: Hardware Assisted Paging detected.\n");
}
void hvm_set_guest_tsc(struct vcpu *v, u64 guest_tsc)

View File

@ -0,0 +1,22 @@
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1204715870 0
# Node ID 1166ee0f476539a2cd5830854b7a22d5004ed291
# Parent f85b379fa9436be0ecd733d7bedbebdf1838a310
docs: Remove 'hap' boot parameter from the user manual.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
diff -r f85b379fa943 -r 1166ee0f4765 docs/src/user.tex
--- a/docs/src/user.tex Wed Mar 05 11:16:32 2008 +0000
+++ b/docs/src/user.tex Wed Mar 05 11:17:50 2008 +0000
@@ -4209,10 +4209,6 @@ writing to the VGA console after domain
\item [ dma\_emergency\_pool=xxx ] Specify lower bound on size of DMA
pool below which ordinary allocations will fail rather than fall
back to allocating from the DMA pool.
-\item [ hap ] Instruct Xen to detect hardware-assisted paging support, such
- as AMD-V's nested paging or Intel\textregistered VT's extended paging. If
- available, Xen will use hardware-assisted paging instead of shadow paging
- for guest memory management.
\end{description}
In addition, the following options may be specified on the Xen command

152
17xxx-xenapi-defaults.patch Normal file
View File

@ -0,0 +1,152 @@
Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConfig.py
@@ -124,13 +124,41 @@ XENAPI_CFG_TO_LEGACY_CFG = {
LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(XENAPI_CFG_TO_LEGACY_CFG)
# Platform configuration keys.
-XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display',
- 'fda', 'fdb', 'keymap', 'isa', 'localtime', 'monitor',
- 'nographic', 'pae', 'rtc_timeoffset', 'serial', 'sdl',
- 'soundhw','stdvga', 'usb', 'usbdevice', 'hpet', 'vnc',
- 'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode',
- 'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt',
- 'guest_os_type', 'hap']
+XENAPI_PLATFORM_CFG_TYPES = {
+ 'acpi': int,
+ 'apic': int,
+ 'boot': str,
+ 'device_model': str,
+ 'display' : str,
+ 'fda': str,
+ 'fdb': str,
+ 'keymap': str,
+ 'isa' : int,
+ 'localtime': int,
+ 'monitor': int,
+ 'nographic': int,
+ 'pae' : int,
+ 'rtc_timeoffset': int,
+ 'serial': str,
+ 'sdl': int,
+ 'soundhw': str,
+ 'stdvga': int,
+ 'usb': int,
+ 'usbdevice': str,
+ 'hpet': int,
+ 'vnc': int,
+ 'vncconsole': int,
+ 'vncdisplay': int,
+ 'vnclisten': str,
+ 'timer_mode': int,
+ 'vncpasswd': str,
+ 'vncunused': int,
+ 'xauthority': str,
+ 'pci': str,
+ 'vhpt': int,
+ 'guest_os_type': str,
+ 'hap': int,
+}
# Xen API console 'other_config' keys.
XENAPI_CONSOLE_OTHER_CFG = ['vncunused', 'vncdisplay', 'vnclisten',
@@ -397,12 +425,19 @@ class XendConfig(dict):
def _platform_sanity_check(self):
if 'keymap' not in self['platform'] and XendOptions.instance().get_keymap():
self['platform']['keymap'] = XendOptions.instance().get_keymap()
-
+
+ # XenAPI defines
if self.is_hvm() or self.has_rfb():
if 'device_model' not in self['platform']:
self['platform']['device_model'] = xen.util.auxbin.pathTo("qemu-dm")
if self.is_hvm():
+ if 'timer_mode' not in self['platform']:
+ self['platform']['timer_mode'] = 0
+ if 'rtc_timeoffset' not in self['platform']:
+ self['platform']['rtc_timeoffset'] = 0
+ if 'hpet' not in self['platform']:
+ self['platform']['hpet'] = 0
# Compatibility hack, can go away soon.
if 'soundhw' not in self['platform'] and \
self['platform'].get('enable_audio'):
@@ -523,7 +558,7 @@ class XendConfig(dict):
cfg['platform']['localtime'] = localtime
# Compatibility hack -- can go soon.
- for key in XENAPI_PLATFORM_CFG:
+ for key in XENAPI_PLATFORM_CFG_TYPES.keys():
val = sxp.child_value(sxp_cfg, "platform_" + key, None)
if val is not None:
self['platform'][key] = val
@@ -702,7 +737,7 @@ class XendConfig(dict):
self.update_with_image_sxp(image_sxp)
# Convert Legacy HVM parameters to Xen API configuration
- for key in XENAPI_PLATFORM_CFG:
+ for key in XENAPI_PLATFORM_CFG_TYPES.keys():
if key in cfg:
self['platform'][key] = cfg[key]
@@ -752,7 +787,7 @@ class XendConfig(dict):
if image_type != 'hvm' and image_type != 'linux':
self['platform']['image_type'] = image_type
- for key in XENAPI_PLATFORM_CFG:
+ for key in XENAPI_PLATFORM_CFG_TYPES.keys():
val = sxp.child_value(image_sxp, key, None)
if val is not None and val != '':
self['platform'][key] = val
@@ -836,6 +871,19 @@ class XendConfig(dict):
self[key] = type_conv(val)
else:
self[key] = val
+
+ # XenAPI defines platform as a string-string map. If platform
+ # configuration exists, convert values to appropriate type.
+ if 'platform' in xapi:
+ for key, val in xapi['platform'].items():
+ type_conv = XENAPI_PLATFORM_CFG_TYPES.get(key)
+ if type_conv is None:
+ key = key.lower()
+ type_conv = XENAPI_PLATFORM_CFG_TYPES.get(key)
+ if callable(type_conv):
+ self['platform'][key] = type_conv(val)
+ else:
+ self['platform'][key] = val
self['vcpus_params']['weight'] = \
int(self['vcpus_params'].get('weight', 256))
@@ -1265,6 +1313,12 @@ class XendConfig(dict):
target['devices'][dev_uuid] = ('vfb', dev_info)
target['console_refs'].append(dev_uuid)
+ # if console is rfb, set device_model ensuring qemu
+ # is invoked for pvfb services
+ if 'device_model' not in target['platform']:
+ target['platform']['device_model'] = \
+ xen.util.auxbin.pathTo("qemu-dm")
+
# Finally, if we are a pvfb, we need to make a vkbd
# as well that is not really exposed to Xen API
vkbd_uuid = uuid.createString()
@@ -1508,7 +1562,7 @@ class XendConfig(dict):
if self.has_key('PV_args') and self['PV_args']:
image.append(['args', self['PV_args']])
- for key in XENAPI_PLATFORM_CFG:
+ for key in XENAPI_PLATFORM_CFG_TYPES.keys():
if key in self['platform']:
image.append([key, self['platform'][key]])
@@ -1544,7 +1598,7 @@ class XendConfig(dict):
self['PV_ramdisk'] = sxp.child_value(image_sxp, 'ramdisk','')
self['PV_args'] = kernel_args
- for key in XENAPI_PLATFORM_CFG:
+ for key in XENAPI_PLATFORM_CFG_TYPES.keys():
val = sxp.child_value(image_sxp, key, None)
if val is not None and val != '':
self['platform'][key] = val

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1796,7 +1796,7 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1837,7 +1837,7 @@ class XendDomainInfo:
xc.domain_setmaxmem(self.domid, maxmem)
# Make sure there's enough RAM available for the domain

View File

@ -1,11 +1,11 @@
bug #239173
bug #242953
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -2102,7 +2102,7 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -2143,7 +2143,7 @@ class XendDomainInfo:
(fn, BOOTLOADER_LOOPBACK_DEVICE))
vbd = {
@ -14,10 +14,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
'device': BOOTLOADER_LOOPBACK_DEVICE,
}
Index: xen-3.2-testing/tools/ioemu/xenstore.c
Index: xen-3.2.1-testing/tools/ioemu/xenstore.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2-testing/tools/ioemu/xenstore.c
--- xen-3.2.1-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2.1-testing/tools/ioemu/xenstore.c
@@ -88,9 +88,9 @@ void xenstore_parse_domain_config(int do
{
char **e = NULL;
@ -28,9 +28,9 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
- int i, is_scsi, is_hdN = 0;
+ int i, is_scsi, is_tap, is_hdN = 0;
unsigned int len, num, hd_index;
BlockDriverState *bs;
for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
@@ -117,6 +117,14 @@ void xenstore_parse_domain_config(int do
@@ -118,6 +118,14 @@ void xenstore_parse_domain_config(int do
bpath = xs_read(xsh, XBT_NULL, buf, &len);
if (bpath == NULL)
continue;
@ -45,7 +45,7 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
/* read the name of the device */
if (pasprintf(&buf, "%s/dev", bpath) == -1)
continue;
@@ -251,6 +259,7 @@ void xenstore_parse_domain_config(int do
@@ -252,6 +260,7 @@ void xenstore_parse_domain_config(int do
free(type);
free(params);
free(dev);

View File

@ -180,7 +180,7 @@ Index: xen-3.2-testing/tools/examples/block
- if LANG=C losetup -h 2>&1 | grep read-only >/dev/null
- then
- roflag="-$mode"; roflag="${roflag#-w}"
- roflag="-$mode"; roflag="${roflag#-w}"; roflag="${roflag#-!}"
- else
- roflag=''
- fi

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/python/xen/xend/server/HalDaemon.py
Index: xen-3.2.1-testing/tools/python/xen/xend/server/HalDaemon.py
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ xen-3.2-testing/tools/python/xen/xend/server/HalDaemon.py 2008-02-29 08:11:00.000000000 -0700
--- /dev/null
+++ xen-3.2.1-testing/tools/python/xen/xend/server/HalDaemon.py
@@ -0,0 +1,238 @@
+#!/usr/bin/env python
+# -*- mode: python; -*-
@ -241,10 +241,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/server/HalDaemon.py
+ print 'Falling off end'
+
+
Index: xen-3.2-testing/tools/python/xen/xend/server/Hald.py
Index: xen-3.2.1-testing/tools/python/xen/xend/server/Hald.py
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ xen-3.2-testing/tools/python/xen/xend/server/Hald.py 2008-02-29 08:11:00.000000000 -0700
--- /dev/null
+++ xen-3.2.1-testing/tools/python/xen/xend/server/Hald.py
@@ -0,0 +1,125 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
@ -371,11 +371,11 @@ Index: xen-3.2-testing/tools/python/xen/xend/server/Hald.py
+ watcher.run()
+ time.sleep(10)
+ watcher.shutdown()
Index: xen-3.2-testing/tools/python/xen/xend/server/SrvServer.py
Index: xen-3.2.1-testing/tools/python/xen/xend/server/SrvServer.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/server/SrvServer.py 2008-01-16 13:19:05.000000000 -0700
+++ xen-3.2-testing/tools/python/xen/xend/server/SrvServer.py 2008-02-29 08:11:00.000000000 -0700
@@ -56,6 +56,7 @@
--- xen-3.2.1-testing.orig/tools/python/xen/xend/server/SrvServer.py
+++ xen-3.2.1-testing/tools/python/xen/xend/server/SrvServer.py
@@ -56,6 +56,7 @@ from xen.web.SrvDir import SrvDir
from SrvRoot import SrvRoot
from XMLRPCServer import XMLRPCServer
@ -383,7 +383,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/server/SrvServer.py
xoptions = XendOptions.instance()
@@ -245,6 +246,8 @@
@@ -245,6 +246,8 @@ def _loadConfig(servers, root, reload):
if xoptions.get_xend_unix_xmlrpc_server():
servers.add(XMLRPCServer(XendAPI.AUTH_PAM, False))
@ -392,12 +392,12 @@ Index: xen-3.2-testing/tools/python/xen/xend/server/SrvServer.py
def create():
root = SrvDir()
Index: xen-3.2-testing/tools/ioemu/xenstore.c
Index: xen-3.2.1-testing/tools/ioemu/xenstore.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/xenstore.c 2008-02-29 08:10:59.000000000 -0700
+++ xen-3.2-testing/tools/ioemu/xenstore.c 2008-02-29 08:11:38.000000000 -0700
@@ -216,6 +216,13 @@
bdrv_set_type_hint(bs_table[hd_index], BDRV_TYPE_CDROM);
--- xen-3.2.1-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2.1-testing/tools/ioemu/xenstore.c
@@ -217,6 +217,13 @@ void xenstore_parse_domain_config(int do
bdrv_set_type_hint(bs, BDRV_TYPE_CDROM);
if (pasprintf(&buf, "%s/params", bpath) != -1)
xs_watch(xsh, buf, dev);
+ /* if pyhsical put a watch on media-present after creating it */
@ -408,9 +408,9 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
+ }
+ }
}
/* open device now if media present */
if (params[0]) {
@@ -417,6 +424,50 @@
@@ -418,6 +425,50 @@ void xenstore_record_dm_state(char *stat
free(path);
}
@ -461,7 +461,7 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
void xenstore_process_event(void *opaque)
{
char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL;
@@ -436,6 +487,11 @@
@@ -437,6 +488,11 @@ void xenstore_process_event(void *opaque
goto out;
}
@ -473,11 +473,11 @@ Index: xen-3.2-testing/tools/ioemu/xenstore.c
if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) ||
strlen(vec[XS_WATCH_TOKEN]) != 3)
goto out;
Index: xen-3.2-testing/tools/ioemu/hw/ide.c
Index: xen-3.2.1-testing/tools/ioemu/hw/ide.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/ide.c 2008-02-29 08:11:33.000000000 -0700
+++ xen-3.2-testing/tools/ioemu/hw/ide.c 2008-02-29 08:16:50.000000000 -0700
@@ -350,6 +350,7 @@
--- xen-3.2.1-testing.orig/tools/ioemu/hw/ide.c
+++ xen-3.2.1-testing/tools/ioemu/hw/ide.c
@@ -350,6 +350,7 @@ typedef struct IDEState {
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
QEMUTimer *sector_write_timer; /* only used for win2k instal hack */
uint32_t irq_count; /* counts IRQs when using win2k install hack */
@ -485,7 +485,7 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
} IDEState;
#define BM_STATUS_DMAING 0x01
@@ -1403,8 +1404,15 @@
@@ -1405,8 +1406,15 @@ static void ide_atapi_cmd(IDEState *s)
switch(s->io_buffer[0]) {
case GPCMD_TEST_UNIT_READY:
if (bdrv_is_inserted(s->bs)) {

View File

@ -1,7 +1,7 @@
Index: 2008-01-18/xen/arch/x86/traps.c
Index: xen-3.2.1-testing/xen/arch/x86/traps.c
===================================================================
--- 2008-01-18.orig/xen/arch/x86/traps.c 2008-01-17 09:25:35.000000000 +0100
+++ 2008-01-18/xen/arch/x86/traps.c 2008-01-18 09:03:16.000000000 +0100
--- xen-3.2.1-testing.orig/xen/arch/x86/traps.c
+++ xen-3.2.1-testing/xen/arch/x86/traps.c
@@ -49,6 +49,7 @@
#include <xen/trace.h>
#include <asm/paging.h>
@ -10,7 +10,7 @@ Index: 2008-01-18/xen/arch/x86/traps.c
#include <asm/io.h>
#include <asm/atomic.h>
#include <asm/desc.h>
@@ -2822,7 +2823,7 @@ long unregister_guest_nmi_callback(void)
@@ -2828,7 +2829,7 @@ long unregister_guest_nmi_callback(void)
return 0;
}
@ -19,10 +19,10 @@ Index: 2008-01-18/xen/arch/x86/traps.c
{
struct trap_info cur;
struct vcpu *curr = current;
Index: 2008-01-18/xen/include/asm-x86/hypercall.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hypercall.h
===================================================================
--- 2008-01-18.orig/xen/include/asm-x86/hypercall.h 2008-01-16 14:24:36.000000000 +0100
+++ 2008-01-18/xen/include/asm-x86/hypercall.h 2008-01-18 09:03:16.000000000 +0100
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hypercall.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hypercall.h
@@ -32,9 +32,10 @@ extern long
do_physdev_op_compat(
XEN_GUEST_HANDLE(physdev_op_t) uop);
@ -35,10 +35,10 @@ Index: 2008-01-18/xen/include/asm-x86/hypercall.h
extern int
do_mmu_update(
Index: 2008-01-18/xen/include/public/arch-x86/xen.h
Index: xen-3.2.1-testing/xen/include/public/arch-x86/xen.h
===================================================================
--- 2008-01-18.orig/xen/include/public/arch-x86/xen.h 2008-01-18 09:03:15.000000000 +0100
+++ 2008-01-18/xen/include/public/arch-x86/xen.h 2008-01-18 09:03:16.000000000 +0100
--- xen-3.2.1-testing.orig/xen/include/public/arch-x86/xen.h
+++ xen-3.2.1-testing/xen/include/public/arch-x86/xen.h
@@ -98,7 +98,6 @@ struct trap_info {
unsigned long address; /* code offset */
};

1015
ept-novell-i386.patch Normal file

File diff suppressed because it is too large Load Diff

602
ept-novell-x64-2m.patch Normal file
View File

@ -0,0 +1,602 @@
Index: xen-3.2.1-testing/tools/libxc/xc_hvm_build.c
===================================================================
--- xen-3.2.1-testing.orig/tools/libxc/xc_hvm_build.c
+++ xen-3.2.1-testing/tools/libxc/xc_hvm_build.c
@@ -208,15 +208,39 @@ static int setup_guest(int xc_handle,
for ( i = HVM_BELOW_4G_RAM_END >> PAGE_SHIFT; i < nr_pages; i++ )
page_array[i] += HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
- /* Allocate memory for HVM guest, skipping VGA hole 0xA0000-0xC0000. */
+ /* Allocate memory for HVM guest:
+ * 1) skip VGA hole 0xA0000-0xC0000;
+ * 2) Allocate 4K pages for the first 2M guest memory;
+ * 3) try to allocate 2M pages for the left guest memory, or use 4k pages;
+ */
rc = xc_domain_memory_populate_physmap(
xc_handle, dom, 0xa0, 0, 0, &page_array[0x00]);
if ( rc == 0 )
rc = xc_domain_memory_populate_physmap(
- xc_handle, dom, nr_pages - 0xc0, 0, 0, &page_array[0xc0]);
+ xc_handle, dom, 0x200 - 0xc0, 0, 0, &page_array[0xc0]);
if ( rc != 0 )
{
- PERROR("Could not allocate memory for HVM guest.\n");
+ PERROR("Cannot allocate memory for HVM guest 1.\n");
+ goto error_out;
+ }
+
+ /* Allocate 2M pages */
+ for ( i = 0x200; (i + 0x1ff) < nr_pages; i += 0x200 )
+ {
+ rc = xc_domain_memory_populate_physmap(
+ xc_handle, dom, 1, 9, 0, &page_array[i]);
+ if ( rc != 0 )
+ {
+ PERROR("Cannot allocate more 2M pages for HVM guest.\n");
+ break;
+ }
+ }
+ if ( i < nr_pages )
+ rc = xc_domain_memory_populate_physmap(
+ xc_handle, dom, nr_pages - i, 0, 0, &page_array[i]);
+ if ( rc != 0 )
+ {
+ PERROR("Cannot allocate memory for HVM guest 2.\n");
goto error_out;
}
Index: xen-3.2.1-testing/xen/arch/ia64/xen/mm.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/ia64/xen/mm.c
+++ xen-3.2.1-testing/xen/arch/ia64/xen/mm.c
@@ -2416,7 +2416,7 @@ steal_page(struct domain *d, struct page
int
guest_physmap_add_page(struct domain *d, unsigned long gpfn,
- unsigned long mfn)
+ unsigned long mfn, int order)
{
BUG_ON(!mfn_valid(mfn));
BUG_ON(mfn_to_page(mfn)->count_info != (PGC_allocated | 1));
@@ -2433,7 +2433,7 @@ guest_physmap_add_page(struct domain *d,
void
guest_physmap_remove_page(struct domain *d, unsigned long gpfn,
- unsigned long mfn)
+ unsigned long mfn, int order)
{
BUG_ON(mfn == 0);//XXX
zap_domain_page_one(d, gpfn << PAGE_SHIFT, 0, mfn);
@@ -2836,7 +2836,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(
if (prev_mfn && mfn_valid(prev_mfn)) {
if (is_xen_heap_mfn(prev_mfn))
/* Xen heap frames are simply unhooked from this phys slot. */
- guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
+ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
else
/* Normal domain memory is freed, to avoid leaking memory. */
guest_remove_page(d, xatp.gpfn);
@@ -2845,10 +2845,10 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(
/* Unmap from old location, if any. */
gpfn = get_gpfn_from_mfn(mfn);
if (gpfn != INVALID_M2P_ENTRY)
- guest_physmap_remove_page(d, gpfn, mfn);
+ guest_physmap_remove_page(d, gpfn, mfn, 0);
/* Map at new location. */
- guest_physmap_add_page(d, xatp.gpfn, mfn);
+ guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
out:
UNLOCK_BIGLOCK(d);
Index: xen-3.2.1-testing/xen/arch/powerpc/mm.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/powerpc/mm.c
+++ xen-3.2.1-testing/xen/arch/powerpc/mm.c
@@ -591,7 +591,7 @@ void guest_physmap_add_page(
}
void guest_physmap_remove_page(
- struct domain *d, unsigned long gpfn, unsigned long mfn)
+ struct domain *d, unsigned long gpfn, unsigned long mfn, int order)
{
if (page_get_owner(mfn_to_page(mfn)) != d) {
printk("Won't unmap foreign MFN 0x%lx for DOM%d\n", mfn, d->domain_id);
Index: xen-3.2.1-testing/xen/arch/x86/mm.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/mm.c
+++ xen-3.2.1-testing/xen/arch/x86/mm.c
@@ -3286,7 +3286,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
{
if ( is_xen_heap_mfn(prev_mfn) )
/* Xen heap frames are simply unhooked from this phys slot. */
- guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
+ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn, 0);
else
/* Normal domain memory is freed, to avoid leaking memory. */
guest_remove_page(d, xatp.gpfn);
@@ -3295,10 +3295,10 @@ long arch_memory_op(int op, XEN_GUEST_HA
/* Unmap from old location, if any. */
gpfn = get_gpfn_from_mfn(mfn);
if ( gpfn != INVALID_M2P_ENTRY )
- guest_physmap_remove_page(d, gpfn, mfn);
+ guest_physmap_remove_page(d, gpfn, mfn, 0);
/* Map at new location. */
- guest_physmap_add_page(d, xatp.gpfn, mfn);
+ guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
UNLOCK_BIGLOCK(d);
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/p2m-ept.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
@@ -20,6 +20,7 @@
#include <xen/domain_page.h>
#include <xen/sched.h>
#include <asm/current.h>
+#include <asm/paging.h>
#include <asm/types.h>
#include <asm/domain.h>
#include <asm/hvm/vmx/vmx.h>
@@ -32,7 +33,6 @@ static int ept_next_level(struct domain
u32 index;
index = *gfn_remainder >> shift;
- *gfn_remainder &= (1UL << shift) - 1;
ept_entry = (*table) + index;
@@ -59,31 +59,52 @@ static int ept_next_level(struct domain
/* last step */
ept_entry->r = ept_entry->w = ept_entry->x = 1;
}
-
- next = map_domain_page(ept_entry->mfn);
- unmap_domain_page(*table);
- *table = next;
-
- return 1;
+ if ( !ept_entry->sp_avail )
+ {
+ *gfn_remainder &= (1UL << shift) - 1;
+ next = map_domain_page(ept_entry->mfn);
+ unmap_domain_page(*table);
+ *table = next;
+ return 1;
+ }
+ else
+ return 2;
}
+#define GUEST_TABLE_SUPER_PAGE 2
static int
-ept_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+ept_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, int order, p2m_type_t p2mt)
{
ept_entry_t *table =
map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
- unsigned long gfn_remainder = gfn;
+ unsigned long gfn_remainder = gfn, offset = 0;
ept_entry_t *ept_entry;
u32 index;
- int i, rv = 0;
+ int i, rv = 0, ret = 0;
+ int walk_level = order / EPT_TABLE_ORDER;
+
+ ASSERT(table != NULL);
/* should check if gfn obeys GAW here */
- for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
- if ( !ept_next_level(d, 0, &table, &gfn_remainder, i * EPT_TABLE_ORDER) )
+ if ( order != 0 )
+ if ( (gfn & ((1UL << order) - 1)) )
+ return 1;
+
+ for ( i = EPT_DEFAULT_GAW; i > walk_level; i-- )
+ {
+ ret = ept_next_level(d, 0, &table,
+ &gfn_remainder, i * EPT_TABLE_ORDER);
+ if ( !ret )
goto out;
+ else if ( ret == GUEST_TABLE_SUPER_PAGE )
+ break;
+ }
+
+ index = gfn_remainder >> ( i ? (i * EPT_TABLE_ORDER): order);
+ walk_level = ( i ? ( i * EPT_TABLE_ORDER) : order) / EPT_TABLE_ORDER;
+ offset = (gfn_remainder & ( ((1 << (i*EPT_TABLE_ORDER)) - 1)));
- index = gfn_remainder;
ept_entry = table + index;
if ( mfn_valid(mfn_x(mfn)) )
@@ -93,9 +114,20 @@ ept_set_entry(struct domain *d, unsigned
d->arch.p2m.max_mapped_pfn = gfn;
ept_entry->emt = EPT_DEFAULT_MT;
- ept_entry->sp_avail = 0;
+ ept_entry->sp_avail = walk_level ? 1 : 0;
+
+ if ( ret == 2)
+ {
+ ept_entry->mfn = mfn_x(mfn) - offset;
+ if ( ept_entry->avail1 == p2m_ram_logdirty &&
+ p2mt == p2m_ram_rw )
+ for ( i = 0; i < 512; i++ )
+ paging_mark_dirty(d, mfn_x(mfn)-offset+i);
+ }
+ else
+ ept_entry->mfn = mfn_x(mfn);
+
ept_entry->avail1 = p2mt;
- ept_entry->mfn = mfn_x(mfn);
ept_entry->rsvd = 0;
ept_entry->avail2 = 0;
/* last step */
@@ -122,7 +154,7 @@ static mfn_t ept_get_entry(struct domain
unsigned long gfn_remainder = gfn;
ept_entry_t *ept_entry;
u32 index;
- int i;
+ int i, ret=0;
mfn_t mfn = _mfn(INVALID_MFN);
*t = p2m_mmio_dm;
@@ -134,18 +166,29 @@ static mfn_t ept_get_entry(struct domain
/* should check if gfn obeys GAW here */
for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
- if ( !ept_next_level(d, 1, &table, &gfn_remainder, i * EPT_TABLE_ORDER) )
+ {
+ ret = ept_next_level(d, 1, &table, &gfn_remainder, i * EPT_TABLE_ORDER);
+ if ( ret == 0 )
goto out;
+ else if ( ret == 2 )
+ break;
+ }
- index = gfn_remainder;
+ index = gfn_remainder >> ( i * EPT_TABLE_ORDER);
ept_entry = table + index;
- if ( (ept_entry->epte & 0x7) == 0x7 )
+ if ( ept_entry->avail1 != p2m_invalid )
{
- if ( ept_entry->avail1 != p2m_invalid )
- {
- *t = ept_entry->avail1;
- mfn = _mfn(ept_entry->mfn);
+ *t = ept_entry->avail1;
+ mfn = _mfn(ept_entry->mfn);
+ if ( i )
+ {
+ /* we may meet super pages, and to split into 4k pages
+ * to emulate p2m table
+ */
+ unsigned long split_mfn =
+ mfn_x(mfn) + (gfn_remainder & ( ((1 << (i*EPT_TABLE_ORDER)) - 1 )));
+ mfn = _mfn(split_mfn);
}
}
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
@@ -203,7 +203,7 @@ p2m_next_level(struct domain *d, mfn_t *
// Returns 0 on error (out of memory)
static int
-p2m_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+p2m_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, int order, p2m_type_t p2mt)
{
// XXX -- this might be able to be faster iff current->domain == d
mfn_t table_mfn = pagetable_get_mfn(d->arch.phys_table);
@@ -285,9 +285,9 @@ void p2m_init(struct domain *d)
}
static inline
-int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, int order, p2m_type_t p2mt)
{
- return d->arch.p2m.set_entry(d, gfn, mfn, p2mt);
+ return d->arch.p2m.set_entry(d, gfn, mfn, order, p2mt);
}
// Allocate a new p2m table for a domain.
@@ -349,7 +349,7 @@ int p2m_alloc_table(struct domain *d,
P2M_PRINTK("populating p2m table\n");
/* Initialise physmap tables for slot zero. Other code assumes this. */
- if ( !set_p2m_entry(d, 0, _mfn(INVALID_MFN), p2m_invalid) )
+ if ( !set_p2m_entry(d, 0, _mfn(INVALID_MFN), 0, p2m_invalid) )
goto error;
/* Copy all existing mappings from the page list and m2p */
@@ -368,7 +368,7 @@ int p2m_alloc_table(struct domain *d,
(gfn != 0x55555555L)
#endif
&& gfn != INVALID_M2P_ENTRY
- && !set_p2m_entry(d, gfn, mfn, p2m_ram_rw) )
+ && !set_p2m_entry(d, gfn, mfn, 0, p2m_ram_rw) )
goto error;
}
@@ -682,30 +682,31 @@ static void audit_p2m(struct domain *d)
static void
-p2m_remove_page(struct domain *d, unsigned long gfn, unsigned long mfn)
+p2m_remove_page(struct domain *d, unsigned long gfn, unsigned long mfn, int order)
{
if ( !paging_mode_translate(d) )
return;
P2M_DEBUG("removing gfn=%#lx mfn=%#lx\n", gfn, mfn);
- set_p2m_entry(d, gfn, _mfn(INVALID_MFN), p2m_invalid);
+ set_p2m_entry(d, gfn, _mfn(INVALID_MFN), order, p2m_invalid);
set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
}
void
guest_physmap_remove_page(struct domain *d, unsigned long gfn,
- unsigned long mfn)
+ unsigned long mfn, int order)
{
p2m_lock(d);
audit_p2m(d);
- p2m_remove_page(d, gfn, mfn);
+ for ( int i = 0; i < ( 1<< order); i++ )
+ p2m_remove_page(d, gfn+i, mfn+i, order);
audit_p2m(d);
p2m_unlock(d);
}
int
guest_physmap_add_entry(struct domain *d, unsigned long gfn,
- unsigned long mfn, p2m_type_t t)
+ unsigned long mfn, int order, p2m_type_t t)
{
unsigned long ogfn;
p2m_type_t ot;
@@ -756,13 +757,13 @@ guest_physmap_add_entry(struct domain *d
P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n",
ogfn , mfn_x(omfn));
if ( mfn_x(omfn) == mfn )
- p2m_remove_page(d, ogfn, mfn);
+ p2m_remove_page(d, ogfn, mfn, order);
}
}
if ( mfn_valid(_mfn(mfn)) )
{
- if ( !set_p2m_entry(d, gfn, _mfn(mfn), t) )
+ if ( !set_p2m_entry(d, gfn, _mfn(mfn), order, t) )
rc = -EINVAL;
set_gpfn_from_mfn(mfn, gfn);
}
@@ -770,7 +771,7 @@ guest_physmap_add_entry(struct domain *d
{
gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
gfn, mfn);
- if ( !set_p2m_entry(d, gfn, _mfn(INVALID_MFN), p2m_invalid) )
+ if ( !set_p2m_entry(d, gfn, _mfn(INVALID_MFN), order, p2m_invalid) )
rc = -EINVAL;
}
@@ -893,7 +894,7 @@ p2m_type_t p2m_change_type(struct domain
mfn = gfn_to_mfn(d, gfn, &pt);
if ( pt == ot )
- set_p2m_entry(d, gfn, mfn, nt);
+ set_p2m_entry(d, gfn, mfn, 0, nt);
p2m_unlock(d);
@@ -917,7 +918,7 @@ set_mmio_p2m_entry(struct domain *d, uns
set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
}
- rc = set_p2m_entry(d, gfn, mfn, p2m_mmio_direct);
+ rc = set_p2m_entry(d, gfn, mfn, 0, p2m_mmio_direct);
if ( 0 == rc )
gdprintk(XENLOG_ERR,
"set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
@@ -941,7 +942,7 @@ clear_mmio_p2m_entry(struct domain *d, u
"clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
return 0;
}
- rc = set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0);
+ rc = set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0, 0);
return rc;
}
Index: xen-3.2.1-testing/xen/common/grant_table.c
===================================================================
--- xen-3.2.1-testing.orig/xen/common/grant_table.c
+++ xen-3.2.1-testing/xen/common/grant_table.c
@@ -1154,7 +1154,7 @@ gnttab_transfer(
spin_lock(&e->grant_table->lock);
sha = &shared_entry(e->grant_table, gop.ref);
- guest_physmap_add_page(e, sha->frame, mfn);
+ guest_physmap_add_page(e, sha->frame, mfn, 0);
sha->frame = mfn;
wmb();
sha->flags |= GTF_transfer_completed;
Index: xen-3.2.1-testing/xen/common/memory.c
===================================================================
--- xen-3.2.1-testing.orig/xen/common/memory.c
+++ xen-3.2.1-testing/xen/common/memory.c
@@ -113,8 +113,11 @@ static void populate_physmap(struct memo
goto out;
}
- if ( unlikely(__copy_from_guest_offset(&gpfn, a->extent_list, i, 1)) )
+ if ( unlikely(__copy_from_guest_offset(&gpfn, a->extent_list, i << a->extent_order, 1)) )
+ {
+ printk("copy_from_guest failed.\n");
goto out;
+ }
page = __alloc_domheap_pages(d, cpu, a->extent_order, a->memflags);
if ( unlikely(page == NULL) )
@@ -129,11 +132,7 @@ static void populate_physmap(struct memo
mfn = page_to_mfn(page);
if ( unlikely(paging_mode_translate(d)) )
- {
- for ( j = 0; j < (1 << a->extent_order); j++ )
- if ( guest_physmap_add_page(d, gpfn + j, mfn + j) )
- goto out;
- }
+ guest_physmap_add_page(d, gpfn, mfn, a->extent_order);
else
{
for ( j = 0; j < (1 << a->extent_order); j++ )
@@ -175,7 +174,7 @@ int guest_remove_page(struct domain *d,
if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
put_page(page);
- guest_physmap_remove_page(d, gmfn, mfn);
+ guest_physmap_remove_page(d, gmfn, mfn, 0);
put_page(page);
@@ -416,7 +415,7 @@ static long memory_exchange(XEN_GUEST_HA
if ( !test_and_clear_bit(_PGC_allocated, &page->count_info) )
BUG();
mfn = page_to_mfn(page);
- guest_physmap_remove_page(d, mfn_to_gmfn(d, mfn), mfn);
+ guest_physmap_remove_page(d, mfn_to_gmfn(d, mfn), mfn, 0);
put_page(page);
}
@@ -438,8 +437,7 @@ static long memory_exchange(XEN_GUEST_HA
if ( unlikely(paging_mode_translate(d)) )
{
/* Ignore failure here. There's nothing we can do. */
- for ( k = 0; k < (1UL << exch.out.extent_order); k++ )
- (void)guest_physmap_add_page(d, gpfn + k, mfn + k);
+ (void)guest_physmap_add_page(d, gpfn, mfn, exch.out.extent_order);
}
else
{
Index: xen-3.2.1-testing/xen/include/asm-ia64/grant_table.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-ia64/grant_table.h
+++ xen-3.2.1-testing/xen/include/asm-ia64/grant_table.h
@@ -13,7 +13,7 @@ int create_grant_host_mapping(unsigned l
int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn, unsigned long new_gpaddr, unsigned int flags);
// for grant transfer
-int guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned long mfn);
+int guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned long mfn, int order);
/* XXX
* somewhere appropriate
Index: xen-3.2.1-testing/xen/include/asm-ia64/shadow.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-ia64/shadow.h
+++ xen-3.2.1-testing/xen/include/asm-ia64/shadow.h
@@ -40,8 +40,10 @@
* Utilities to change relationship of gpfn->mfn for designated domain,
* which is required by gnttab transfer, balloon, device model and etc.
*/
-int guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned long mfn);
-void guest_physmap_remove_page(struct domain *d, unsigned long gpfn, unsigned long mfn);
+int guest_physmap_add_page(struct domain *d, unsigned long gpfn,
+ unsigned long mfn, int order);
+void guest_physmap_remove_page(struct domain *d, unsigned long gpfn,
+ unsigned long mfn, int order);
static inline int
shadow_mode_enabled(struct domain *d)
Index: xen-3.2.1-testing/xen/include/asm-powerpc/mm.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-powerpc/mm.h
+++ xen-3.2.1-testing/xen/include/asm-powerpc/mm.h
@@ -278,9 +278,9 @@ extern int steal_page(struct domain *d,
extern int guest_physmap_max_mem_pages(struct domain *d, unsigned long new_max);
extern void guest_physmap_add_page(
- struct domain *d, unsigned long gpfn, unsigned long mfn);
+ struct domain *d, unsigned long gpfn, unsigned long mfn, int order);
extern void guest_physmap_remove_page(
- struct domain *d, unsigned long gpfn, unsigned long mfn);
+ struct domain *d, unsigned long gpfn, unsigned long mfn, int order);
#endif
Index: xen-3.2.1-testing/xen/include/asm-x86/domain.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/domain.h
@@ -166,7 +166,7 @@ struct p2m_domain {
void (*free_page )(struct domain *d,
struct page_info *pg);
int (*set_entry )(struct domain *d, unsigned long gfn,
- mfn_t mfn, p2m_type_t p2mt);
+ mfn_t mfn, int order, p2m_type_t p2mt);
mfn_t (*get_entry )(struct domain *d, unsigned long gfn,
p2m_type_t *p2mt);
mfn_t (*get_entry_fast)(unsigned long gfn, p2m_type_t *p2mt);
Index: xen-3.2.1-testing/xen/include/asm-x86/p2m.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/p2m.h
+++ xen-3.2.1-testing/xen/include/asm-x86/p2m.h
@@ -191,21 +191,32 @@ void p2m_teardown(struct domain *d);
/* Add a page to a domain's p2m table */
int guest_physmap_add_entry(struct domain *d, unsigned long gfn,
- unsigned long mfn, p2m_type_t t);
+ unsigned long mfn, int order, p2m_type_t t);
/* Untyped version for RAM only, for compatibility
*
* Return 0 for success
*/
static inline int guest_physmap_add_page(struct domain *d, unsigned long gfn,
- unsigned long mfn)
+ unsigned long mfn, int order)
{
- return guest_physmap_add_entry(d, gfn, mfn, p2m_ram_rw);
+ int ret;
+
+ for ( int i = 0; i < (1 << order); i++ )
+ {
+ ret = guest_physmap_add_entry(d, gfn+i, mfn+i, order, p2m_ram_rw);
+ if ( ret != 0 )
+ break;
+ }
+
+ /* TODO: fix exit path when failure */
+
+ return ret;
}
/* Remove a page from a domain's p2m table */
void guest_physmap_remove_page(struct domain *d, unsigned long gfn,
- unsigned long mfn);
+ unsigned long mfn, int order);
/* Change types across all p2m entries in a domain */
void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt);
Index: xen-3.2.1-testing/xen/include/xen/paging.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/xen/paging.h
+++ xen-3.2.1-testing/xen/include/xen/paging.h
@@ -18,8 +18,8 @@
#else
#define paging_mode_translate(d) (0)
-#define guest_physmap_add_page(d, p, m) (0)
-#define guest_physmap_remove_page(d, p, m) ((void)0)
+#define guest_physmap_add_page(d, p, m, order) (0)
+#define guest_physmap_remove_page(d, p, m, order) ((void)0)
#endif

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/libxc/xc_hvm_build.c
Index: xen-3.2.1-testing/tools/libxc/xc_hvm_build.c
===================================================================
--- xen-3.2-testing.orig/tools/libxc/xc_hvm_build.c
+++ xen-3.2-testing/tools/libxc/xc_hvm_build.c
--- xen-3.2.1-testing.orig/tools/libxc/xc_hvm_build.c
+++ xen-3.2.1-testing/tools/libxc/xc_hvm_build.c
@@ -20,6 +20,7 @@
#include <xen/libelf.h>
@ -10,7 +10,7 @@ Index: xen-3.2-testing/tools/libxc/xc_hvm_build.c
static void build_e820map(void *e820_page, unsigned long long mem_size)
{
@@ -154,6 +155,7 @@ static int setup_guest(int xc_handle,
@@ -160,6 +161,7 @@ static int setup_guest(int xc_handle,
struct xen_add_to_physmap xatp;
struct shared_info *shared_info;
void *e820_page;
@ -18,7 +18,7 @@ Index: xen-3.2-testing/tools/libxc/xc_hvm_build.c
struct elf_binary elf;
uint64_t v_start, v_end;
int rc;
@@ -254,6 +256,18 @@ static int setup_guest(int xc_handle,
@@ -269,6 +271,18 @@ static int setup_guest(int xc_handle,
xc_set_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN, shared_page_nr-2);
xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN, shared_page_nr);
@ -37,11 +37,11 @@ Index: xen-3.2-testing/tools/libxc/xc_hvm_build.c
/* Insert JMP <rel32> instruction at address 0x0 to reach entry point. */
entry_eip = elf_uval(&elf, elf.ehdr, e_entry);
if ( entry_eip != 0 )
Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/hvm.c
@@ -1969,6 +1969,10 @@ long do_hvm_op(unsigned long op, XEN_GUE
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
@@ -2011,6 +2011,10 @@ long do_hvm_op(unsigned long op, XEN_GUE
}
d->arch.hvm_domain.params[a.index] = a.value;
rc = 0;
@ -52,10 +52,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
}
else
{
Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmcs.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/vmx/vmcs.c
+++ xen-3.2-testing/xen/arch/x86/hvm/vmx/vmcs.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmcs.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
@@ -105,11 +105,23 @@ static void vmx_init_vmcs_config(void)
if ( _vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS )
@ -169,11 +169,11 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmcs.c
vmx_vmcs_exit(v);
}
Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -90,6 +90,8 @@ static int vmx_vcpu_initialise(struct vc
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -91,6 +91,8 @@ static int vmx_vcpu_initialise(struct vc
return rc;
}
@ -182,7 +182,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
vmx_install_vlapic_mapping(v);
#ifndef VMXASSIST
@@ -530,20 +532,23 @@ static int vmx_restore_cr0_cr3(
@@ -531,20 +533,23 @@ static int vmx_restore_cr0_cr3(
unsigned long mfn = 0;
p2m_type_t p2mt;
@ -215,7 +215,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
v->arch.hvm_vcpu.guest_cr[3] = cr3;
@@ -1014,6 +1019,45 @@ static enum hvm_intblk vmx_interrupt_blo
@@ -1020,6 +1025,45 @@ static enum hvm_intblk vmx_interrupt_blo
return hvm_intblk_none;
}
@ -261,9 +261,9 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
static void vmx_update_host_cr3(struct vcpu *v)
{
ASSERT((v == current) || !vcpu_runnable(v));
@@ -1039,21 +1083,57 @@ static void vmx_update_guest_cr(struct v
__vm_clear_bit(EXCEPTION_BITMAP, TRAP_no_device);
}
@@ -1051,21 +1095,57 @@ static void vmx_update_guest_cr(struct v
v->arch.hvm_vmx.vmxemul |= VMXEMUL_REALMODE;
#endif
+ if ( paging_mode_hap(v->domain) )
+ {
@ -322,7 +322,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
__vmwrite(GUEST_CR4, v->arch.hvm_vcpu.hw_cr[4]);
__vmwrite(CR4_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[4]);
break;
@@ -1121,6 +1201,7 @@ static int vmx_event_pending(struct vcpu
@@ -1133,6 +1213,7 @@ static int vmx_event_pending(struct vcpu
static struct hvm_function_table vmx_function_table = {
.name = "VMX",
@ -330,7 +330,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
.domain_initialise = vmx_domain_initialise,
.domain_destroy = vmx_domain_destroy,
.vcpu_initialise = vmx_vcpu_initialise,
@@ -1178,6 +1259,12 @@ void start_vmx(void)
@@ -1190,6 +1271,12 @@ void start_vmx(void)
return;
}
@ -343,7 +343,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
setup_vmcs_dump();
hvm_enable(&vmx_function_table);
@@ -2690,6 +2777,18 @@ void vmx_wbinvd_intercept(void)
@@ -2701,6 +2788,18 @@ void vmx_wbinvd_intercept(void)
wbinvd();
}
@ -362,7 +362,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
static void vmx_failed_vmentry(unsigned int exit_reason,
struct cpu_user_regs *regs)
{
@@ -2729,6 +2828,15 @@ asmlinkage void vmx_vmexit_handler(struc
@@ -2740,6 +2839,15 @@ asmlinkage void vmx_vmexit_handler(struc
unsigned long exit_qualification, inst_len = 0;
struct vcpu *v = current;
@ -378,7 +378,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
exit_reason = __vmread(VM_EXIT_REASON);
hvmtrace_vmexit(v, regs->eip, exit_reason);
@@ -2969,6 +3077,21 @@ asmlinkage void vmx_vmexit_handler(struc
@@ -2980,6 +3088,21 @@ asmlinkage void vmx_vmexit_handler(struc
break;
}
@ -400,19 +400,19 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
default:
exit_and_crash:
gdprintk(XENLOG_ERR, "Bad vmexit (reason %x)\n", exit_reason);
Index: xen-3.2-testing/xen/arch/x86/mm/Makefile
Index: xen-3.2.1-testing/xen/arch/x86/mm/Makefile
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/Makefile
+++ xen-3.2-testing/xen/arch/x86/mm/Makefile
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/Makefile
+++ xen-3.2.1-testing/xen/arch/x86/mm/Makefile
@@ -3,3 +3,4 @@ subdir-y += hap
obj-y += paging.o
obj-y += p2m.o
+obj-y += p2m-ept.o
Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
===================================================================
--- /dev/null
+++ xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
@@ -0,0 +1,177 @@
+/*
+ * ept-p2m.c: use the EPT page table as p2m
@ -591,10 +591,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
+ * indent-tabs-mode: nil
+ * End:
+ */
Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-3.2-testing/xen/arch/x86/mm/p2m.c
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
@@ -28,6 +28,7 @@
#include <asm/paging.h>
#include <asm/p2m.h>
@ -652,10 +652,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
/* Read another domain's p2m entries */
{
mfn_t mfn;
Index: xen-3.2-testing/xen/include/asm-x86/domain.h
Index: xen-3.2.1-testing/xen/include/asm-x86/domain.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/domain.h
+++ xen-3.2-testing/xen/include/asm-x86/domain.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/domain.h
@@ -131,6 +131,27 @@ struct hap_domain {
/************************************************/
/* p2m handling */
@ -696,10 +696,10 @@ Index: xen-3.2-testing/xen/include/asm-x86/domain.h
/* Highest guest frame that's ever been mapped in the p2m */
unsigned long max_mapped_pfn;
Index: xen-3.2-testing/xen/include/asm-x86/hvm/hvm.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/hvm.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/hvm/hvm.h
+++ xen-3.2-testing/xen/include/asm-x86/hvm/hvm.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/hvm.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/hvm.h
@@ -60,6 +60,9 @@ struct hvm_function_table {
/* Support Hardware-Assisted Paging? */
int hap_supported;
@ -723,11 +723,11 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/hvm.h
int hvm_domain_initialise(struct domain *d);
void hvm_domain_relinquish_resources(struct domain *d);
void hvm_domain_destroy(struct domain *d);
Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -57,6 +57,9 @@ struct vmx_msr_state {
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -56,6 +56,9 @@ struct vmx_msr_state {
unsigned long msrs[VMX_MSR_COUNT];
};
@ -737,7 +737,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
struct arch_vmx_struct {
/* Virtual address of VMCS. */
struct vmcs_struct *vmcs;
@@ -73,8 +76,19 @@ struct arch_vmx_struct {
@@ -72,8 +75,19 @@ struct arch_vmx_struct {
int active_cpu;
int launched;
@ -757,7 +757,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
#ifdef __x86_64__
struct vmx_msr_state msr_state;
@@ -111,6 +125,8 @@ void vmx_vmcs_exit(struct vcpu *v);
@@ -120,6 +134,8 @@ void vmx_vmcs_exit(struct vcpu *v);
#define CPU_BASED_MWAIT_EXITING 0x00000400
#define CPU_BASED_RDPMC_EXITING 0x00000800
#define CPU_BASED_RDTSC_EXITING 0x00001000
@ -766,7 +766,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
#define CPU_BASED_CR8_LOAD_EXITING 0x00080000
#define CPU_BASED_CR8_STORE_EXITING 0x00100000
#define CPU_BASED_TPR_SHADOW 0x00200000
@@ -139,6 +155,7 @@ extern u32 vmx_vmexit_control;
@@ -148,6 +164,7 @@ extern u32 vmx_vmexit_control;
extern u32 vmx_vmentry_control;
#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001
@ -774,7 +774,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
#define SECONDARY_EXEC_WBINVD_EXITING 0x00000040
extern u32 vmx_secondary_exec_control;
@@ -154,6 +171,10 @@ extern bool_t cpu_has_vmx_ins_outs_instr
@@ -163,6 +180,10 @@ extern bool_t cpu_has_vmx_ins_outs_instr
(vmx_pin_based_exec_control & PIN_BASED_VIRTUAL_NMIS)
#define cpu_has_vmx_msr_bitmap \
(vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_MSR_BITMAP)
@ -785,7 +785,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
/* GUEST_INTERRUPTIBILITY_INFO flags. */
#define VMX_INTR_SHADOW_STI 0x00000001
@@ -195,11 +216,23 @@ enum vmcs_field {
@@ -204,11 +225,23 @@ enum vmcs_field {
VIRTUAL_APIC_PAGE_ADDR = 0x00002012,
VIRTUAL_APIC_PAGE_ADDR_HIGH = 0x00002013,
APIC_ACCESS_ADDR = 0x00002014,
@ -810,10 +810,10 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
PIN_BASED_VM_EXEC_CONTROL = 0x00004000,
CPU_BASED_VM_EXEC_CONTROL = 0x00004002,
EXCEPTION_BITMAP = 0x00004004,
Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/hvm/vmx/vmx.h
+++ xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmx.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -23,9 +23,27 @@
#include <asm/types.h>
#include <asm/regs.h>
@ -843,7 +843,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
void vmx_asm_vmexit_handler(struct cpu_user_regs);
void vmx_asm_do_vmentry(void);
@@ -85,6 +103,8 @@ int vmx_realmode_io_complete(void);
@@ -88,6 +106,8 @@ int vmx_realmode_io_complete(void);
#define EXIT_REASON_MACHINE_CHECK 41
#define EXIT_REASON_TPR_BELOW_THRESHOLD 43
#define EXIT_REASON_APIC_ACCESS 44
@ -852,7 +852,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
#define EXIT_REASON_WBINVD 54
/*
@@ -151,12 +171,14 @@ int vmx_realmode_io_complete(void);
@@ -154,12 +174,14 @@ int vmx_realmode_io_complete(void);
#define VMREAD_OPCODE ".byte 0x0f,0x78\n"
#define VMRESUME_OPCODE ".byte 0x0f,0x01,0xc3\n"
#define VMWRITE_OPCODE ".byte 0x0f,0x79\n"
@ -868,7 +868,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
static inline void __vmptrld(u64 addr)
{
@@ -240,6 +262,21 @@ static inline void __vm_clear_bit(unsign
@@ -243,6 +265,21 @@ static inline void __vm_clear_bit(unsign
__vmwrite(field, __vmread(field) & ~(1UL << bit));
}
@ -890,7 +890,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
static inline void __vmxoff(void)
{
asm volatile (
@@ -269,6 +306,29 @@ static inline int __vmxon(u64 addr)
@@ -272,6 +309,29 @@ static inline int __vmxon(u64 addr)
return rc;
}
@ -920,17 +920,17 @@ Index: xen-3.2-testing/xen/include/asm-x86/hvm/vmx/vmx.h
static inline void __vmx_inject_exception(
struct vcpu *v, int trap, int type, int error_code)
{
@@ -314,4 +374,6 @@ static inline void vmx_inject_nmi(struct
@@ -317,4 +377,6 @@ static inline void vmx_inject_nmi(struct
HVM_DELIVER_NO_ERROR_CODE);
}
+void ept_p2m_init(struct domain *d);
+
#endif /* __ASM_X86_HVM_VMX_VMX_H__ */
Index: xen-3.2-testing/xen/include/asm-x86/p2m.h
Index: xen-3.2.1-testing/xen/include/asm-x86/p2m.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/p2m.h
+++ xen-3.2-testing/xen/include/asm-x86/p2m.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/p2m.h
+++ xen-3.2.1-testing/xen/include/asm-x86/p2m.h
@@ -43,27 +43,6 @@
*/
#define phys_to_machine_mapping ((l1_pgentry_t *)RO_MPT_VIRT_START)
@ -999,23 +999,17 @@ Index: xen-3.2-testing/xen/include/asm-x86/p2m.h
return gfn_to_mfn_foreign(d, gfn, t);
}
Index: xen-3.2-testing/xen/include/public/hvm/params.h
Index: xen-3.2.1-testing/xen/include/public/hvm/params.h
===================================================================
--- xen-3.2-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2-testing/xen/include/public/hvm/params.h
@@ -76,6 +76,7 @@
* Guest time always tracks wallclock (i.e., real) time.
*/
#define HVM_PARAM_TIMER_MODE 10
+#define HVM_PARAM_IDENT_PT 12
#define HVMPTM_delay_for_missed_ticks 0
#define HVMPTM_no_delay_for_missed_ticks 1
#define HVMPTM_no_missed_ticks_pending 2
@@ -84,6 +85,6 @@
--- xen-3.2.1-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2.1-testing/xen/include/public/hvm/params.h
@@ -87,6 +87,8 @@
/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
#define HVM_PARAM_HPET_ENABLED 11
#define HVM_PARAM_HPET_ENABLED 12
-#define HVM_NR_PARAMS 12
+#define HVM_NR_PARAMS 13
-#define HVM_NR_PARAMS 13
+#define HVM_PARAM_IDENT_PT 13
+
+#define HVM_NR_PARAMS 14
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */

View File

@ -1,16 +1,16 @@
Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -50,6 +50,7 @@
#include <asm/hvm/vpt.h>
#include <public/hvm/save.h>
#include <asm/hvm/trace.h>
#include <asm/hvm/hvm_extensions.h>
+#include <asm/hap.h>
enum handler_return { HNDL_done, HNDL_unhandled, HNDL_exception_raised };
@@ -2854,9 +2855,44 @@ void vmx_wbinvd_intercept(void)
@@ -2865,9 +2866,44 @@ void vmx_wbinvd_intercept(void)
static void ept_handle_violation(unsigned long qualification, paddr_t gpa)
{
@ -57,10 +57,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
return;
}
Index: xen-3.2-testing/xen/arch/x86/mm/hap/hap.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/hap/hap.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/hap/hap.c
+++ xen-3.2-testing/xen/arch/x86/mm/hap/hap.c
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/hap/hap.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/hap/hap.c
@@ -61,7 +61,7 @@ int hap_enable_log_dirty(struct domain *
hap_unlock(d);
@ -87,11 +87,11 @@ Index: xen-3.2-testing/xen/arch/x86/mm/hap/hap.c
flush_tlb_mask(d->domain_dirty_cpumask);
}
Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/p2m-ept.c
+++ xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
@@ -23,6 +23,27 @@
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/p2m-ept.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m-ept.c
@@ -24,6 +24,27 @@
#include <asm/types.h>
#include <asm/domain.h>
#include <asm/hvm/vmx/vmx.h>
@ -119,7 +119,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
static int ept_next_level(struct domain *d, bool_t read_only,
ept_entry_t **table, unsigned long *gfn_remainder,
@@ -100,6 +121,7 @@ ept_set_entry(struct domain *d, unsigned
@@ -132,6 +153,7 @@ ept_set_entry(struct domain *d, unsigned
ept_entry->avail2 = 0;
/* last step */
ept_entry->r = ept_entry->w = ept_entry->x = 1;
@ -127,24 +127,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
}
else
ept_entry->epte = 0;
@@ -140,13 +162,10 @@ static mfn_t ept_get_entry(struct domain
index = gfn_remainder;
ept_entry = table + index;
- if ( (ept_entry->epte & 0x7) == 0x7 )
+ if ( ept_entry->avail1 != p2m_invalid )
{
- if ( ept_entry->avail1 != p2m_invalid )
- {
- *t = ept_entry->avail1;
- mfn = _mfn(ept_entry->mfn);
- }
+ *t = ept_entry->avail1;
+ mfn = _mfn(ept_entry->mfn);
}
out:
@@ -159,11 +178,64 @@ static mfn_t ept_get_entry_fast(unsigned
@@ -202,11 +224,94 @@ static mfn_t ept_get_entry_fast(unsigned
return ept_get_entry(current->domain, gfn, t);
}
@ -154,50 +137,80 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
+
+static void ept_change_entry_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
+{
+ if ( pagetable_get_pfn(d->arch.phys_table) == 0 )
+ return;
+ if ( pagetable_get_pfn(d->arch.phys_table) == 0 )
+ return;
+
+ if ( EPT_DEFAULT_GAW == 3 )
+ {
+ ept_entry_t *l4e, *l3e, *l2e, *l1e;
+ int i4, i3, i2, i1;
+ if ( EPT_DEFAULT_GAW == 3 )
+ {
+ ept_entry_t *l4e, *l3e, *l2e, *l1e;
+ int i4, i3, i2, i1;
+
+ l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+ for (i4 = 0; i4 < EPT_PAGETABLE_ENTRIES; i4++ )
+ {
+ if ( !(l4e+i4)->epte || (l4e+i4)->sp_avail)
+ continue;
+ l3e = map_domain_page((l4e+i4)->mfn);
+ for ( i3 = 0; i3 < EPT_PAGETABLE_ENTRIES; i3++ )
+ {
+ if ( !(l3e+i3)->epte || (l3e+i3)->sp_avail )
+ continue;
+ l2e = map_domain_page((l3e+i3)->mfn);
+ for ( i2 = 0; i2 < EPT_PAGETABLE_ENTRIES; i2++ )
+ {
+ if ( !(l2e+i2)->epte || (l2e+i2)->sp_avail )
+ continue;
+ l1e = map_domain_page((l2e+i2)->mfn);
+ for ( i1 = 0; i1 < EPT_PAGETABLE_ENTRIES; i1++ )
+ {
+ if ( !(l1e+i1)->epte )
+ continue;
+ if ( (l1e+i1)->avail1 != ot )
+ continue;
+ (l1e+i1)->avail1 = nt;
+ ept_p2m_type_to_flags(l1e+i1, nt);
+ }
+ unmap_domain_page(l1e);
+ }
+ unmap_domain_page(l2e);
+ }
+ unmap_domain_page(l3e);
+ }
+ unmap_domain_page(l4e);
+ l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+ for (i4 = 0; i4 < EPT_PAGETABLE_ENTRIES; i4++ )
+ {
+ if ( !(l4e+i4)->epte )
+ continue;
+ if ( !(l4e+i4)->sp_avail )
+ {
+ l3e = map_domain_page((l4e+i4)->mfn);
+ for ( i3 = 0; i3 < EPT_PAGETABLE_ENTRIES; i3++ )
+ {
+ if ( !(l3e+i3)->epte )
+ continue;
+ if ( !(l3e+i3)->sp_avail )
+ {
+ l2e = map_domain_page((l3e+i3)->mfn);
+ for ( i2 = 0; i2 < EPT_PAGETABLE_ENTRIES; i2++ )
+ {
+ if ( !(l2e+i2)->epte )
+ continue;
+ if ( !(l2e+i2)->sp_avail )
+ {
+ l1e = map_domain_page((l2e+i2)->mfn);
+ for ( i1 = 0; i1 < EPT_PAGETABLE_ENTRIES; i1++ )
+ {
+ if ( !(l1e+i1)->epte )
+ continue;
+ if ( (l1e+i1)->avail1 != ot )
+ continue;
+ (l1e+i1)->avail1 = nt;
+ ept_p2m_type_to_flags(l1e+i1, nt);
+ }
+ unmap_domain_page(l1e);
+ }
+ else
+ {
+ if ( (l2e+i2)->avail1 != ot )
+ continue;
+ (l2e+i2)->avail1 = nt;
+ ept_p2m_type_to_flags(l2e+i2, nt);
+ }
+ }
+ unmap_domain_page(l2e);
+ }
+ else
+ {
+ if ( (l3e+i3)->avail1 != ot )
+ continue;
+ (l3e+i3)->avail1 = nt;
+ ept_p2m_type_to_flags(l3e+i3, nt);
+ }
+ }
+ unmap_domain_page(l3e);
+ }
+ else
+ {
+ if ( (l4e+i4)->avail1 != ot )
+ continue;
+ (l4e+i4)->avail1 = nt;
+ ept_p2m_type_to_flags(l4e+i4, nt);
+ }
+ }
+ unmap_domain_page(l4e);
+
+ if ( d->vcpu[0] )
+ ept_sync_domain(d->vcpu[0]);
+ }
+ if ( d->vcpu[0] )
+ ept_sync_domain(d->vcpu[0]);
+ }
+}
+
void ept_p2m_init(struct domain *d)
@ -209,10 +222,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c
}
/*
Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-3.2-testing/xen/arch/x86/mm/p2m.c
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/p2m.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/p2m.c
@@ -279,11 +279,19 @@ void p2m_init(struct domain *d)
d->arch.p2m.set_entry = p2m_set_entry;
d->arch.p2m.get_entry = p2m_gfn_to_mfn;
@ -231,9 +244,9 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
+}
+
static inline
int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, int order, p2m_type_t p2mt)
{
@@ -806,8 +814,6 @@ void p2m_change_type_global(struct domai
@@ -807,8 +815,6 @@ void p2m_change_type_global(struct domai
if ( pagetable_get_pfn(d->arch.phys_table) == 0 )
return;
@ -242,7 +255,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
#if CONFIG_PAGING_LEVELS == 4
l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
#elif CONFIG_PAGING_LEVELS == 3
@@ -878,7 +884,6 @@ void p2m_change_type_global(struct domai
@@ -879,7 +885,6 @@ void p2m_change_type_global(struct domai
unmap_domain_page(l2e);
#endif
@ -250,10 +263,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm/p2m.c
}
/* Modify the p2m type of a single gfn from ot to nt, returning the
Index: xen-3.2-testing/xen/include/asm-x86/domain.h
Index: xen-3.2.1-testing/xen/include/asm-x86/domain.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/domain.h
+++ xen-3.2-testing/xen/include/asm-x86/domain.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/domain.h
@@ -171,6 +171,8 @@ struct p2m_domain {
p2m_type_t *p2mt);
mfn_t (*get_entry_fast)(unsigned long gfn, p2m_type_t *p2mt);
@ -263,10 +276,10 @@ Index: xen-3.2-testing/xen/include/asm-x86/domain.h
/* Highest guest frame that's ever been mapped in the p2m */
unsigned long max_mapped_pfn;
};
Index: xen-3.2-testing/xen/include/asm-x86/hap.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hap.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/hap.h
+++ xen-3.2-testing/xen/include/asm-x86/hap.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hap.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hap.h
@@ -97,6 +97,49 @@ extern struct paging_mode hap_paging_pro
extern struct paging_mode hap_paging_pae_mode;
extern struct paging_mode hap_paging_long_mode;
@ -317,11 +330,11 @@ Index: xen-3.2-testing/xen/include/asm-x86/hap.h
#endif /* XEN_HAP_H */
/*
Index: xen-3.2-testing/xen/include/asm-x86/p2m.h
Index: xen-3.2.1-testing/xen/include/asm-x86/p2m.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/p2m.h
+++ xen-3.2-testing/xen/include/asm-x86/p2m.h
@@ -209,6 +209,7 @@ void guest_physmap_remove_page(struct do
--- xen-3.2.1-testing.orig/xen/include/asm-x86/p2m.h
+++ xen-3.2.1-testing/xen/include/asm-x86/p2m.h
@@ -220,6 +220,7 @@ void guest_physmap_remove_page(struct do
/* Change types across all p2m entries in a domain */
void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt);

16
migration-cpl-init.patch Normal file
View File

@ -0,0 +1,16 @@
Signed-off-by: Robert Plillips <rphillips@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <bguthro@xxxxxxxxxxxxxxxx>
Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/svm/svm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
@@ -642,7 +642,7 @@ static void svm_set_segment_register(str
break;
case x86_seg_ss:
memcpy(&vmcb->ss, reg, sizeof(*reg));
- vmcb->cpl = vmcb->ss.attr.fields.dpl;
+ vmcb->cpl = vmcb->cs.attr.fields.dpl;
break;
case x86_seg_tr:
memcpy(&vmcb->tr, reg, sizeof(*reg));

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
Index: xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/lowlevel/xc/xc.c
+++ xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
@@ -632,14 +632,14 @@ static PyObject *pyxc_hvm_build(XcObject
--- xen-3.2.1-testing.orig/tools/python/xen/lowlevel/xc/xc.c
+++ xen-3.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
@@ -638,14 +638,14 @@ static PyObject *pyxc_hvm_build(XcObject
int i;
#endif
char *image;
@ -21,7 +21,7 @@ Index: xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
return NULL;
if ( xc_hvm_build(self->xc_handle, dom, memsize, image) != 0 )
@@ -664,6 +664,7 @@ static PyObject *pyxc_hvm_build(XcObject
@@ -670,6 +670,7 @@ static PyObject *pyxc_hvm_build(XcObject
va_hvm->checksum = -sum;
munmap(va_map, XC_PAGE_SIZE);
#endif
@ -29,24 +29,23 @@ Index: xen-3.2-testing/tools/python/xen/lowlevel/xc/xc.c
return Py_BuildValue("{}");
}
Index: xen-3.2-testing/tools/python/xen/xend/XendConfig.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2-testing/tools/python/xen/xend/XendConfig.py
@@ -126,7 +126,7 @@ LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(
# Platform configuration keys.
XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display',
'fda', 'fdb', 'keymap', 'isa', 'localtime', 'monitor',
- 'nographic', 'pae', 'rtc_timeoffset', 'serial', 'sdl',
+ 'nographic', 'pae', 'extid', 'rtc_timeoffset', 'serial', 'sdl',
'soundhw','stdvga', 'usb', 'usbdevice', 'hpet', 'vnc',
'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode',
'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt',
Index: xen-3.2-testing/tools/python/xen/xend/image.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py
@@ -138,6 +138,7 @@ XENAPI_PLATFORM_CFG_TYPES = {
'monitor': int,
'nographic': int,
'pae' : int,
+ 'extid' : int,
'rtc_timeoffset': int,
'serial': str,
'sdl': int,
Index: xen-3.2.1-testing/tools/python/xen/xend/image.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2-testing/tools/python/xen/xend/image.py
@@ -432,6 +432,7 @@ class HVMImageHandler(ImageHandler):
--- xen-3.2.1-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2.1-testing/tools/python/xen/xend/image.py
@@ -438,6 +438,7 @@ class HVMImageHandler(ImageHandler):
self.apic = int(vmConfig['platform'].get('apic', 0))
self.acpi = int(vmConfig['platform'].get('acpi', 0))
@ -54,7 +53,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/image.py
self.guest_os_type = vmConfig['platform'].get('guest_os_type')
# Return a list of cmd line args to the device models based on the
@@ -522,6 +523,7 @@ class HVMImageHandler(ImageHandler):
@@ -528,6 +529,7 @@ class HVMImageHandler(ImageHandler):
log.debug("store_evtchn = %d", store_evtchn)
log.debug("memsize = %d", mem_mb)
log.debug("vcpus = %d", self.vm.getVCpuCount())
@ -62,7 +61,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/image.py
log.debug("acpi = %d", self.acpi)
log.debug("apic = %d", self.apic)
@@ -529,6 +531,7 @@ class HVMImageHandler(ImageHandler):
@@ -535,6 +537,7 @@ class HVMImageHandler(ImageHandler):
image = self.kernel,
memsize = mem_mb,
vcpus = self.vm.getVCpuCount(),
@ -70,10 +69,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/image.py
acpi = self.acpi,
apic = self.apic)
rc['notes'] = { 'SUSPEND_CANCEL': 1 }
Index: xen-3.2-testing/tools/python/xen/xm/create.py
Index: xen-3.2.1-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2-testing/tools/python/xen/xm/create.py
--- xen-3.2.1-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2.1-testing/tools/python/xen/xm/create.py
@@ -203,6 +203,10 @@ gopts.var('timer_mode', val='TIMER_MODE'
use="""Timer mode (0=delay virtual time when ticks are missed;
1=virtual time is always wallclock time.""")
@ -85,7 +84,7 @@ Index: xen-3.2-testing/tools/python/xen/xm/create.py
gopts.var('acpi', val='ACPI',
fn=set_int, default=1,
use="Disable or enable ACPI of HVM domain.")
@@ -729,7 +733,7 @@ def configure_vifs(config_devs, vals):
@@ -734,7 +738,7 @@ def configure_vifs(config_devs, vals):
def configure_hvm(config_image, vals):
"""Create the config for HVM devices.
"""

View File

@ -1,8 +1,8 @@
%patch
Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/svm/svm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/svm/svm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/svm/svm.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/svm/svm.c
@@ -50,6 +50,7 @@
#include <asm/hvm/vpt.h>
#include <asm/hvm/trace.h>
@ -28,7 +28,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
};
int start_svm(struct cpuinfo_x86 *c)
@@ -1044,6 +1046,7 @@ static void svm_vmexit_do_cpuid(struct v
@@ -1033,6 +1035,7 @@ static void svm_vmexit_do_cpuid(struct v
HVMTRACE_3D(CPUID, v, input,
((uint64_t)eax << 32) | ebx, ((uint64_t)ecx << 32) | edx);
@ -36,7 +36,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
inst_len = __get_instruction_length(v, INSTR_CPUID, NULL);
__update_guest_eip(regs, inst_len);
}
@@ -1739,6 +1742,11 @@ static void svm_do_msr_access(
@@ -1728,6 +1731,11 @@ static void svm_do_msr_access(
/* is it a read? */
if (vmcb->exitinfo1 == 0)
{
@ -48,7 +48,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
switch (ecx) {
case MSR_IA32_TSC:
msr_content = hvm_get_guest_time(v);
@@ -1829,6 +1837,11 @@ static void svm_do_msr_access(
@@ -1818,6 +1826,11 @@ static void svm_do_msr_access(
}
else
{
@ -60,7 +60,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
msr_content = (u32)regs->eax | ((u64)regs->edx << 32);
hvmtrace_msr_write(v, ecx, msr_content);
@@ -1889,6 +1902,7 @@ static void svm_do_msr_access(
@@ -1878,6 +1891,7 @@ static void svm_do_msr_access(
}
break;
}
@ -68,27 +68,27 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/svm.c
inst_len = __get_instruction_length(v, INSTR_WRMSR, NULL);
}
Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -50,6 +50,7 @@
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -49,6 +49,7 @@
#include <asm/hvm/vpt.h>
#include <public/hvm/save.h>
#include <asm/hvm/trace.h>
+#include <asm/hvm/hvm_extensions.h>
#include <asm/hap.h>
enum handler_return { HNDL_done, HNDL_unhandled, HNDL_exception_raised };
@@ -65,6 +66,7 @@ static void vmx_install_vlapic_mapping(s
@@ -61,6 +62,7 @@ static void vmx_install_vlapic_mapping(s
static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr);
static void vmx_update_guest_efer(struct vcpu *v);
+
static int vmx_domain_initialise(struct domain *d)
{
if ( vmx_alloc_vpid(d) == 0 )
@@ -1362,7 +1364,8 @@ void vmx_cpuid_intercept(
return vmx_alloc_vlapic_mapping(d);
@@ -1248,7 +1250,8 @@ void vmx_cpuid_intercept(
unsigned int count = *ecx;
#ifdef VMXASSIST
@ -98,7 +98,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
{
/*
* NB. Unsupported interface for private use of VMXASSIST only.
@@ -1443,12 +1446,13 @@ void vmx_cpuid_intercept(
@@ -1319,12 +1322,13 @@ void vmx_cpuid_intercept(
static void vmx_do_cpuid(struct cpu_user_regs *regs)
{
@ -113,7 +113,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
vmx_cpuid_intercept(&eax, &ebx, &ecx, &edx);
@@ -1456,6 +1460,7 @@ static void vmx_do_cpuid(struct cpu_user
@@ -1332,6 +1336,7 @@ static void vmx_do_cpuid(struct cpu_user
regs->ebx = ebx;
regs->ecx = ecx;
regs->edx = edx;
@ -121,7 +121,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
}
#define CASE_GET_REG_P(REG, reg) \
@@ -2440,6 +2445,9 @@ static int vmx_do_msr_read(struct cpu_us
@@ -2316,6 +2321,9 @@ int vmx_msr_read_intercept(struct cpu_us
HVM_DBG_LOG(DBG_LEVEL_1, "ecx=%x", ecx);
@ -131,7 +131,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
switch ( ecx )
{
case MSR_IA32_TSC:
@@ -2662,6 +2670,9 @@ static int vmx_do_msr_write(struct cpu_u
@@ -2499,6 +2507,9 @@ int vmx_msr_write_intercept(struct cpu_u
HVM_DBG_LOG(DBG_LEVEL_1, "ecx=%x, eax=%x, edx=%x",
ecx, (u32)regs->eax, (u32)regs->edx);
@ -141,25 +141,25 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/vmx.c
msr_content = (u32)regs->eax | ((u64)regs->edx << 32);
hvmtrace_msr_write(v, ecx, msr_content);
Index: xen-3.2-testing/xen/include/asm-x86/hvm/domain.h
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/hvm/domain.h
+++ xen-3.2-testing/xen/include/asm-x86/hvm/domain.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
@@ -74,6 +74,10 @@ struct hvm_domain {
/* Pass-through */
struct hvm_iommu hvm_iommu;
+ /* Hvm extension handle */
+ void *ext_handle; /* will be NULL on creation (memset)*/
+ struct extension_intercept_vector *ext_vector;
+
bool_t hap_enabled;
};
#endif /* __ASM_X86_HVM_DOMAIN_H__ */
Index: xen-3.2-testing/xen/include/public/hvm/params.h
Index: xen-3.2.1-testing/xen/include/public/hvm/params.h
===================================================================
--- xen-3.2-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2-testing/xen/include/public/hvm/params.h
--- xen-3.2.1-testing.orig/xen/include/public/hvm/params.h
+++ xen-3.2.1-testing/xen/include/public/hvm/params.h
@@ -50,10 +50,12 @@
#define HVM_PARAM_BUFIOREQ_PFN 6
@ -176,31 +176,52 @@ Index: xen-3.2-testing/xen/include/public/hvm/params.h
#endif
/*
@@ -75,7 +77,8 @@
@@ -75,15 +77,16 @@
* Missed interrupts are collapsed together and delivered as one 'late tick'.
* Guest time always tracks wallclock (i.e., real) time.
*/
-#define HVM_PARAM_TIMER_MODE 10
+//KYS Check the modifications done to this file
+#define HVM_PARAM_TIMER_MODE 11
#define HVM_PARAM_IDENT_PT 12
#define HVMPTM_delay_for_missed_ticks 0
#define HVMPTM_no_delay_for_missed_ticks 1
@@ -83,8 +86,8 @@
#define HVMPTM_no_missed_ticks_pending 2
#define HVMPTM_one_missed_tick_pending 3
/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
-#define HVM_PARAM_HPET_ENABLED 11
+#define HVM_PARAM_HPET_ENABLED 12
-#define HVM_NR_PARAMS 13
+#define HVM_NR_PARAMS 14
-#define HVM_NR_PARAMS 12
+#define HVM_NR_PARAMS 13
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
Index: xen-3.2-testing/xen/arch/x86/hvm/Makefile
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/Makefile
+++ xen-3.2-testing/xen/arch/x86/hvm/Makefile
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
@@ -43,11 +43,12 @@ HVM_PARAM_STORE_EVTCHN = 2
HVM_PARAM_PAE_ENABLED = 4
HVM_PARAM_IOREQ_PFN = 5
HVM_PARAM_BUFIOREQ_PFN = 6
-HVM_PARAM_NVRAM_FD = 7
-HVM_PARAM_VHPT_SIZE = 8
-HVM_PARAM_BUFPIOREQ_PFN = 9
-HVM_PARAM_TIMER_MODE = 10
-HVM_PARAM_HPET_ENABLED = 11
+HVM_PARAM_EXTEND_HYPERVISOR = 7
+HVM_PARAM_NVRAM_FD = 8
+HVM_PARAM_VHPT_SIZE = 9
+HVM_PARAM_BUFPIOREQ_PFN = 10
+HVM_PARAM_TIMER_MODE = 11
+HVM_PARAM_HPET_ENABLED = 12
restart_modes = [
"restart",
Index: xen-3.2.1-testing/xen/arch/x86/hvm/Makefile
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/Makefile
+++ xen-3.2.1-testing/xen/arch/x86/hvm/Makefile
@@ -1,5 +1,6 @@
subdir-y += svm
subdir-y += vmx
@ -208,10 +229,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/Makefile
obj-y += hvm.o
obj-y += i8254.o
Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2-testing/xen/arch/x86/hvm/hvm.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/hvm.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/hvm.c
@@ -42,6 +42,7 @@
#include <asm/mc146818rtc.h>
#include <asm/spinlock.h>
@ -220,7 +241,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
#include <asm/hvm/vpt.h>
#include <asm/hvm/support.h>
#include <asm/hvm/cacheattr.h>
@@ -118,6 +119,7 @@ void hvm_migrate_timers(struct vcpu *v)
@@ -103,6 +104,7 @@ void hvm_migrate_timers(struct vcpu *v)
rtc_migrate_timers(v);
hpet_migrate_timers(v);
pt_migrate(v);
@ -228,7 +249,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
}
void hvm_do_resume(struct vcpu *v)
@@ -281,6 +283,7 @@ void hvm_domain_relinquish_resources(str
@@ -266,6 +268,7 @@ void hvm_domain_relinquish_resources(str
void hvm_domain_destroy(struct domain *d)
{
@ -236,7 +257,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
hvm_funcs.domain_destroy(d);
vioapic_deinit(d);
hvm_destroy_cacheattr_region_list(d);
@@ -449,8 +452,14 @@ int hvm_vcpu_initialise(struct vcpu *v)
@@ -434,8 +437,14 @@ int hvm_vcpu_initialise(struct vcpu *v)
{
int rc;
@ -251,7 +272,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
if ( (rc = hvm_funcs.vcpu_initialise(v)) != 0 )
goto fail2;
@@ -498,12 +507,14 @@ int hvm_vcpu_initialise(struct vcpu *v)
@@ -483,12 +492,14 @@ int hvm_vcpu_initialise(struct vcpu *v)
hvm_funcs.vcpu_destroy(v);
fail2:
vlapic_destroy(v);
@ -266,7 +287,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
vlapic_destroy(v);
hvm_funcs.vcpu_destroy(v);
@@ -1575,6 +1586,10 @@ int hvm_do_hypercall(struct cpu_user_reg
@@ -1598,6 +1609,10 @@ int hvm_do_hypercall(struct cpu_user_reg
case 0:
break;
}
@ -277,7 +298,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
if ( (eax >= NR_hypercalls) || !hvm_hypercall32_table[eax] )
{
@@ -1729,6 +1744,7 @@ int hvm_bringup_ap(int vcpuid, int tramp
@@ -1752,6 +1767,7 @@ int hvm_bringup_ap(int vcpuid, int tramp
vcpu_wake(v);
gdprintk(XENLOG_INFO, "AP %d bringup succeeded.\n", vcpuid);
@ -285,7 +306,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
return 0;
}
@@ -1966,6 +1982,9 @@ long do_hvm_op(unsigned long op, XEN_GUE
@@ -1989,6 +2005,9 @@ long do_hvm_op(unsigned long op, XEN_GUE
if ( a.value > HVMPTM_one_missed_tick_pending )
goto param_fail;
break;
@ -295,11 +316,11 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c
}
d->arch.hvm_domain.params[a.index] = a.value;
rc = 0;
Index: xen-3.2-testing/xen/arch/x86/x86_64/asm-offsets.c
Index: xen-3.2.1-testing/xen/arch/x86/x86_64/asm-offsets.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_64/asm-offsets.c
+++ xen-3.2-testing/xen/arch/x86/x86_64/asm-offsets.c
@@ -146,4 +146,7 @@ void __dummy__(void)
--- xen-3.2.1-testing.orig/xen/arch/x86/x86_64/asm-offsets.c
+++ xen-3.2.1-testing/xen/arch/x86/x86_64/asm-offsets.c
@@ -148,4 +148,7 @@ void __dummy__(void)
BLANK();
OFFSET(CPUINFO_ext_features, struct cpuinfo_x86, x86_capability[1]);
@ -307,10 +328,10 @@ Index: xen-3.2-testing/xen/arch/x86/x86_64/asm-offsets.c
+
+ OFFSET(DOM_ext_vector, struct domain, arch.hvm_domain.ext_vector);
}
Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/x86_64/exits.S
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/x86_64/exits.S
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/vmx/x86_64/exits.S
+++ xen-3.2-testing/xen/arch/x86/hvm/vmx/x86_64/exits.S
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/x86_64/exits.S
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/x86_64/exits.S
@@ -112,6 +112,14 @@ vmx_process_softirqs:
ALIGN
ENTRY(vmx_asm_do_vmentry)
@ -326,10 +347,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/vmx/x86_64/exits.S
cli # tests must not race interrupts
movl VCPU_processor(%rbx),%eax
Index: xen-3.2-testing/xen/arch/x86/hvm/svm/x86_64/exits.S
Index: xen-3.2.1-testing/xen/arch/x86/hvm/svm/x86_64/exits.S
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/svm/x86_64/exits.S
+++ xen-3.2-testing/xen/arch/x86/hvm/svm/x86_64/exits.S
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/svm/x86_64/exits.S
+++ xen-3.2.1-testing/xen/arch/x86/hvm/svm/x86_64/exits.S
@@ -37,6 +37,14 @@
ENTRY(svm_asm_do_resume)
@ -345,10 +366,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/svm/x86_64/exits.S
CLGI
movl VCPU_processor(%rbx),%eax
Index: xen-3.2-testing/xen/arch/x86/hvm/save.c
Index: xen-3.2.1-testing/xen/arch/x86/hvm/save.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/hvm/save.c
+++ xen-3.2-testing/xen/arch/x86/hvm/save.c
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/save.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/save.c
@@ -23,6 +23,8 @@
#include <asm/hvm/support.h>
@ -378,10 +399,10 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/save.c
return 0;
}
Index: xen-3.2-testing/xen/include/public/arch-x86/hvm/save.h
Index: xen-3.2.1-testing/xen/include/public/arch-x86/hvm/save.h
===================================================================
--- xen-3.2-testing.orig/xen/include/public/arch-x86/hvm/save.h
+++ xen-3.2-testing/xen/include/public/arch-x86/hvm/save.h
--- xen-3.2.1-testing.orig/xen/include/public/arch-x86/hvm/save.h
+++ xen-3.2.1-testing/xen/include/public/arch-x86/hvm/save.h
@@ -38,7 +38,7 @@ struct hvm_save_header {
uint32_t version; /* File format version */
uint64_t changeset; /* Version of Xen that saved this file */

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/tools/ioemu/block.c
Index: xen-3.2.1-testing/tools/ioemu/block.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/block.c
+++ xen-3.2-testing/tools/ioemu/block.c
@@ -558,6 +558,9 @@ int bdrv_write(BlockDriverState *bs, int
--- xen-3.2.1-testing.orig/tools/ioemu/block.c
+++ xen-3.2.1-testing/tools/ioemu/block.c
@@ -583,6 +583,9 @@ int bdrv_write(BlockDriverState *bs, int
else
return 0;
} else {
@ -12,10 +12,10 @@ Index: xen-3.2-testing/tools/ioemu/block.c
return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
}
}
Index: xen-3.2-testing/tools/ioemu/hw/cirrus_vga.c
Index: xen-3.2.1-testing/tools/ioemu/hw/cirrus_vga.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/cirrus_vga.c
+++ xen-3.2-testing/tools/ioemu/hw/cirrus_vga.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/cirrus_vga.c
+++ xen-3.2.1-testing/tools/ioemu/hw/cirrus_vga.c
@@ -220,6 +220,20 @@
#define CIRRUS_HOOK_NOT_HANDLED 0
#define CIRRUS_HOOK_HANDLED 1
@ -143,10 +143,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/cirrus_vga.c
for (x = 0; x < 8; x++) {
if (val & 0x80) {
*dst = s->cirrus_shadow_gr1;
Index: xen-3.2-testing/tools/ioemu/hw/cirrus_vga_rop.h
Index: xen-3.2.1-testing/tools/ioemu/hw/cirrus_vga_rop.h
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/cirrus_vga_rop.h
+++ xen-3.2-testing/tools/ioemu/hw/cirrus_vga_rop.h
--- xen-3.2.1-testing.orig/tools/ioemu/hw/cirrus_vga_rop.h
+++ xen-3.2.1-testing/tools/ioemu/hw/cirrus_vga_rop.h
@@ -49,6 +49,12 @@ glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(C
src = src_ - src_base;
dstpitch -= bltwidth;
@ -160,10 +160,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/cirrus_vga_rop.h
for (y = 0; y < bltheight; y++) {
for (x = 0; x < bltwidth; x++) {
ROP_OP(*(dst_base + m(dst)), *(src_base + m(src)));
Index: xen-3.2-testing/tools/ioemu/hw/i8259.c
Index: xen-3.2.1-testing/tools/ioemu/hw/i8259.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/i8259.c
+++ xen-3.2-testing/tools/ioemu/hw/i8259.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/i8259.c
+++ xen-3.2.1-testing/tools/ioemu/hw/i8259.c
@@ -299,9 +299,11 @@ static void pic_ioport_write(void *opaqu
s->init_state = 1;
s->init4 = val & 1;
@ -178,10 +178,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/i8259.c
} else if (val & 0x08) {
if (val & 0x04)
s->poll = 1;
Index: xen-3.2-testing/tools/ioemu/hw/ne2000.c
Index: xen-3.2.1-testing/tools/ioemu/hw/ne2000.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/ne2000.c
+++ xen-3.2-testing/tools/ioemu/hw/ne2000.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/ne2000.c
+++ xen-3.2.1-testing/tools/ioemu/hw/ne2000.c
@@ -221,7 +221,7 @@ static int ne2000_can_receive(void *opaq
NE2000State *s = opaque;
@ -191,10 +191,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/ne2000.c
return !ne2000_buffer_full(s);
}
Index: xen-3.2-testing/tools/ioemu/hw/pc.c
Index: xen-3.2.1-testing/tools/ioemu/hw/pc.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/pc.c
+++ xen-3.2-testing/tools/ioemu/hw/pc.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/pc.c
+++ xen-3.2.1-testing/tools/ioemu/hw/pc.c
@@ -315,7 +315,8 @@ void bochs_bios_write(void *opaque, uint
case 0x400:
case 0x401:
@ -216,10 +216,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/pc.c
case 0x500:
case 0x503:
#ifdef DEBUG_BIOS
Index: xen-3.2-testing/tools/ioemu/target-i386/translate.c
Index: xen-3.2.1-testing/tools/ioemu/target-i386/translate.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/target-i386/translate.c
+++ xen-3.2-testing/tools/ioemu/target-i386/translate.c
--- xen-3.2.1-testing.orig/tools/ioemu/target-i386/translate.c
+++ xen-3.2.1-testing/tools/ioemu/target-i386/translate.c
@@ -5326,7 +5326,12 @@ static target_ulong disas_insn(DisasCont
if (CODE64(s))
goto illegal_op;
@ -250,11 +250,11 @@ Index: xen-3.2-testing/tools/ioemu/target-i386/translate.c
case 0xfa: /* cli */
if (!s->vm86) {
if (s->cpl <= s->iopl) {
Index: xen-3.2-testing/tools/ioemu/vl.c
Index: xen-3.2.1-testing/tools/ioemu/vl.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.c
+++ xen-3.2-testing/tools/ioemu/vl.c
@@ -3582,8 +3582,8 @@ typedef struct NetSocketState {
--- xen-3.2.1-testing.orig/tools/ioemu/vl.c
+++ xen-3.2.1-testing/tools/ioemu/vl.c
@@ -3602,8 +3602,8 @@ typedef struct NetSocketState {
VLANClientState *vc;
int fd;
int state; /* 0 = getting length, 1 = getting data */
@ -265,7 +265,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
uint8_t buf[4096];
struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
} NetSocketState;
@@ -3614,7 +3614,8 @@ static void net_socket_receive_dgram(voi
@@ -3634,7 +3634,8 @@ static void net_socket_receive_dgram(voi
static void net_socket_send(void *opaque)
{
NetSocketState *s = opaque;
@ -275,7 +275,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
uint8_t buf1[4096];
const uint8_t *buf;
@@ -3653,7 +3654,15 @@ static void net_socket_send(void *opaque
@@ -3673,7 +3674,15 @@ static void net_socket_send(void *opaque
l = s->packet_len - s->index;
if (l > size)
l = size;

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/ioemu/sdl_keysym.h
Index: xen-3.2.1-testing/tools/ioemu/sdl_keysym.h
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/sdl_keysym.h
+++ xen-3.2-testing/tools/ioemu/sdl_keysym.h
--- xen-3.2.1-testing.orig/tools/ioemu/sdl_keysym.h
+++ xen-3.2.1-testing/tools/ioemu/sdl_keysym.h
@@ -274,5 +274,27 @@ static name2keysym_t name2keysym[]={
{"Pause", SDLK_PAUSE},
{"Escape", SDLK_ESCAPE},
@ -30,10 +30,10 @@ Index: xen-3.2-testing/tools/ioemu/sdl_keysym.h
{0,0},
};
+
Index: xen-3.2-testing/tools/python/xen/xend/XendOptions.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendOptions.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendOptions.py
+++ xen-3.2-testing/tools/python/xen/xend/XendOptions.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendOptions.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendOptions.py
@@ -315,6 +315,9 @@ class XendOptions:
return self.get_config_string('vnc-x509-verify', self.xend_vnc_x509_verify)
@ -44,11 +44,11 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendOptions.py
class XendOptionsFile(XendOptions):
"""Default path to the config file."""
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1556,6 +1556,9 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1561,6 +1561,9 @@ class XendDomainInfo:
if devclass in XendDevices.valid_devices():
log.info("createDevice: %s : %s" % (devclass, scrub_password(config)))
dev_uuid = config.get('uuid')

342
vpid-novell-x64.patch Normal file
View File

@ -0,0 +1,342 @@
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmcs.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmcs.c
@@ -38,6 +38,9 @@
#include <asm/shadow.h>
#include <asm/tboot.h>
+static int opt_vpid_enabled = 1;
+boolean_param("vpid", opt_vpid_enabled);
+
/* Dynamic (run-time adjusted) execution control flags. */
u32 vmx_pin_based_exec_control __read_mostly;
u32 vmx_cpu_based_exec_control __read_mostly;
@@ -110,6 +113,8 @@ static void vmx_init_vmcs_config(void)
opt2 = SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
SECONDARY_EXEC_WBINVD_EXITING |
SECONDARY_EXEC_ENABLE_EPT;
+ if ( opt_vpid_enabled )
+ opt2 |= SECONDARY_EXEC_ENABLE_VPID;
_vmx_secondary_exec_control = adjust_vmx_controls(
min2, opt2, MSR_IA32_VMX_PROCBASED_CTLS2);
@@ -315,6 +320,8 @@ int vmx_cpu_up(void)
ept_sync_all();
+ vpid_sync_all();
+
return 1;
}
@@ -628,6 +635,13 @@ static int construct_vmcs(struct vcpu *v
#endif
}
+ if ( cpu_has_vmx_vpid )
+ {
+ v->arch.hvm_vmx.vpid = v->vcpu_id +
+ v->domain->arch.hvm_domain.vmx_vpid_base;
+ __vmwrite(VIRTUAL_PROCESSOR_ID, v->arch.hvm_vmx.vpid);
+ }
+
vmx_vmcs_exit(v);
paging_update_paging_modes(v); /* will update HOST & GUEST_CR3 as reqd */
@@ -821,6 +835,7 @@ void vmx_do_resume(struct vcpu *v)
vmx_load_vmcs(v);
hvm_migrate_timers(v);
vmx_set_host_env(v);
+ vpid_sync_vcpu_all(v);
}
debug_state = v->domain->debugger_attached;
@@ -975,6 +990,8 @@ void vmcs_dump_vcpu(struct vcpu *v)
(uint32_t)vmr(TPR_THRESHOLD));
printk("EPT pointer = 0x%08x%08x\n",
(uint32_t)vmr(EPT_POINTER_HIGH), (uint32_t)vmr(EPT_POINTER));
+ printk("virtual processor ID = 0x%04x\n",
+ (uint32_t)vmr(VIRTUAL_PROCESSOR_ID));
vmx_vmcs_exit(v);
}
Index: xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
+++ xen-3.2.1-testing/xen/arch/x86/hvm/vmx/vmx.c
@@ -58,6 +58,8 @@ static void vmx_ctxt_switch_to(struct vc
static int vmx_alloc_vlapic_mapping(struct domain *d);
static void vmx_free_vlapic_mapping(struct domain *d);
+static int vmx_alloc_vpid(struct domain *d);
+static void vmx_free_vpid(struct domain *d);
static void vmx_install_vlapic_mapping(struct vcpu *v);
static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr);
static void vmx_update_guest_efer(struct vcpu *v);
@@ -65,12 +67,15 @@ static void vmx_update_guest_efer(struct
static int vmx_domain_initialise(struct domain *d)
{
- return vmx_alloc_vlapic_mapping(d);
+ if ( vmx_alloc_vpid(d) == 0 )
+ return vmx_alloc_vlapic_mapping(d);
+ return -EBUSY;
}
static void vmx_domain_destroy(struct domain *d)
{
vmx_free_vlapic_mapping(d);
+ vmx_free_vpid(d);
}
static int vmx_vcpu_initialise(struct vcpu *v)
@@ -1134,6 +1139,7 @@ static void vmx_update_guest_cr(struct v
vmx_load_pdptrs(v);
}
__vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr[3]);
+ vpid_sync_vcpu_all(v);
break;
case 4:
v->arch.hvm_vcpu.hw_cr[4] = HVM_CR4_HOST_MASK;
@@ -1182,9 +1188,14 @@ static void vmx_update_guest_efer(struct
static void vmx_flush_guest_tlbs(void)
{
- /* No tagged TLB support on VMX yet. The fact that we're in Xen
- * at all means any guest will have a clean TLB when it's next run,
- * because VMRESUME will flush it for us. */
+ /* If VPID (i.e. tagged TLB support) is not enabled, the fact that
+ * we're in Xen at all means any guest will have a clean TLB when
+ * it's next run, because VMRESUME will flush it for us.
+ *
+ * If enabled, we invalidate all translations associated with all
+ * VPID values */
+ if (0)
+ vpid_sync_all();
}
static void vmx_inject_exception(
@@ -1238,6 +1249,11 @@ static struct hvm_function_table vmx_fun
.cpu_down = vmx_cpu_down,
};
+static int vpid_bitmap_size;
+static int vpid_bitmap_bytes;
+static void *vpid_bitmap;
+static spinlock_t vpid_lock;
+
void start_vmx(void)
{
static int bootstrapped;
@@ -1277,6 +1293,26 @@ void start_vmx(void)
vmx_function_table.hap_supported = 1;
}
+ if ( cpu_has_vmx_vpid )
+ {
+ printk("VMX: VPID is available.\n");
+
+ vpid_bitmap_size = (1 << VMCS_VPID_WIDTH) / MAX_VIRT_CPUS;
+ vpid_bitmap_bytes = vpid_bitmap_size / (BITS_PER_LONG / BYTES_PER_LONG);
+ vpid_bitmap = xmalloc_bytes(vpid_bitmap_bytes);
+ memset(vpid_bitmap, 0, vpid_bitmap_bytes);
+ if ( vpid_bitmap == NULL )
+ {
+ printk("VMX: failed to allocate VPID bitmap.\n");
+ return;
+ }
+
+ /* vpid 0 is used by hypervisor itself */
+ set_bit(0, vpid_bitmap);
+
+ spin_lock_init(&vpid_lock);
+ }
+
setup_vmcs_dump();
hvm_enable(&vmx_function_table);
@@ -2542,6 +2578,45 @@ static void vmx_free_vlapic_mapping(stru
free_xenheap_page(mfn_to_virt(mfn));
}
+static int vmx_alloc_vpid(struct domain *d)
+{
+ int vpid;
+
+ if ( !cpu_has_vmx_vpid )
+ return 0;
+
+ spin_lock(&vpid_lock);
+
+ vpid = find_first_zero_bit(vpid_bitmap, vpid_bitmap_size);
+ if ( vpid >= vpid_bitmap_size )
+ {
+ spin_unlock(&vpid_lock);
+ printk("VPID is used up.\n");
+ return -EBUSY;
+ }
+ if ( test_and_set_bit(vpid, vpid_bitmap) )
+ {
+ spin_unlock(&vpid_lock);
+ printk("VPID allocation bug, fix your code!\n");
+ return -EBUSY;
+ }
+
+ spin_unlock(&vpid_lock);
+
+ d->arch.hvm_domain.vmx_vpid_base = vpid * MAX_VIRT_CPUS;
+ return 0;
+}
+
+static void vmx_free_vpid(struct domain *d)
+{
+ if ( !cpu_has_vmx_vpid )
+ return;
+
+ spin_lock(&vpid_lock);
+ clear_bit(d->arch.hvm_domain.vmx_vpid_base / MAX_VIRT_CPUS, vpid_bitmap);
+ spin_unlock(&vpid_lock);
+}
+
static void vmx_install_vlapic_mapping(struct vcpu *v)
{
paddr_t virt_page_ma, apic_page_ma;
Index: xen-3.2.1-testing/xen/arch/x86/mm/shadow/multi.c
===================================================================
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/shadow/multi.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/shadow/multi.c
@@ -35,6 +35,7 @@
#include <asm/hvm/hvm.h>
#include <asm/hvm/cacheattr.h>
#include <asm/mtrr.h>
+#include <asm/hvm/vmx/vmx.h>
#include "private.h"
#include "types.h"
@@ -3102,6 +3103,7 @@ sh_invlpg(struct vcpu *v, unsigned long
== SH_type_fl1_shadow )
{
flush_tlb_local();
+ vpid_sync_vcpu_all(v);
return 0;
}
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/domain.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/domain.h
@@ -61,6 +61,7 @@ struct hvm_domain {
uint64_t params[HVM_NR_PARAMS];
unsigned long vmx_apic_access_mfn;
+ unsigned long vmx_vpid_base;
/* Memory ranges with pinned cache attributes. */
struct list_head pinned_cacheattr_ranges;
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -89,6 +89,8 @@ struct arch_vmx_struct {
u32 exec_control;
u32 secondary_exec_control;
+ u16 vpid;
+
#ifdef __x86_64__
struct vmx_msr_state msr_state;
unsigned long shadow_gs;
@@ -165,6 +167,7 @@ extern u32 vmx_vmentry_control;
#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001
#define SECONDARY_EXEC_ENABLE_EPT 0x00000002
+#define SECONDARY_EXEC_ENABLE_VPID 0x00000020
#define SECONDARY_EXEC_WBINVD_EXITING 0x00000040
extern u32 vmx_secondary_exec_control;
@@ -184,6 +187,8 @@ extern bool_t cpu_has_vmx_ins_outs_instr
(vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)
#define cpu_has_vmx_ept \
(vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT)
+#define cpu_has_vmx_vpid \
+ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VPID)
/* GUEST_INTERRUPTIBILITY_INFO flags. */
#define VMX_INTR_SHADOW_STI 0x00000001
@@ -193,6 +198,7 @@ extern bool_t cpu_has_vmx_ins_outs_instr
/* VMCS field encodings. */
enum vmcs_field {
+ VIRTUAL_PROCESSOR_ID = 0x00000000,
GUEST_ES_SELECTOR = 0x00000800,
GUEST_CS_SELECTOR = 0x00000802,
GUEST_SS_SELECTOR = 0x00000804,
@@ -332,6 +338,8 @@ enum vmcs_field {
HOST_RIP = 0x00006c16,
};
+#define VMCS_VPID_WIDTH (16)
+
void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr);
int vmx_read_guest_msr(struct vcpu *v, u32 msr, u64 *val);
int vmx_write_guest_msr(struct vcpu *v, u32 msr, u64 val);
Index: xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
===================================================================
--- xen-3.2.1-testing.orig/xen/include/asm-x86/hvm/vmx/vmx.h
+++ xen-3.2.1-testing/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -175,6 +175,7 @@ int vmx_realmode_io_complete(void);
#define VMRESUME_OPCODE ".byte 0x0f,0x01,0xc3\n"
#define VMWRITE_OPCODE ".byte 0x0f,0x79\n"
#define INVEPT_OPCODE ".byte 0x66,0x0f,0x38,0x80\n" /* m128,r64/32 */
+#define INVVPID_OPCODE ".byte 0x66,0x0f,0x38,0x81\n" /* m128,r64/32 */
#define VMXOFF_OPCODE ".byte 0x0f,0x01,0xc4\n"
#define VMXON_OPCODE ".byte 0xf3,0x0f,0xc7\n"
@@ -280,6 +281,23 @@ static inline void __invept(int ext, u64
: "memory");
}
+static inline void __invvpid(int ext, u16 vpid, u64 gva)
+{
+ struct {
+ u64 vpid:16;
+ u64 rsvd:48;
+ u64 gva;
+ } __attribute__ ((packed)) operand = {vpid, 0, gva};
+
+ __asm__ __volatile__ ( INVVPID_OPCODE
+ MODRM_EAX_08
+ /* CF==1 or ZF==1 --> rc = -1 */
+ "ja 1f ; ud2 ; 1:\n"
+ :
+ : "a" (&operand), "c" (ext)
+ : "memory");
+}
+
static inline void __vmxoff(void)
{
asm volatile (
@@ -332,6 +350,22 @@ static inline void ept_sync_all(void)
__invept(2, 0, 0);
}
+static inline void vpid_sync_vcpu_all(struct vcpu *v)
+{
+ if ( !cpu_has_vmx_vpid )
+ return;
+
+ __invvpid(1, v->arch.hvm_vmx.vpid, 0);
+}
+
+static inline void vpid_sync_all(void)
+{
+ if ( !cpu_has_vmx_vpid )
+ return;
+
+ __invvpid(2, 0, 0);
+}
+
static inline void __vmx_inject_exception(
struct vcpu *v, int trap, int type, int error_code)
{

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/xen/arch/x86/mm.c
Index: xen-3.2.1-testing/xen/arch/x86/mm.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm.c
+++ xen-3.2-testing/xen/arch/x86/mm.c
@@ -3586,6 +3586,7 @@ static int ptwr_emulated_cmpxchg(
--- xen-3.2.1-testing.orig/xen/arch/x86/mm.c
+++ xen-3.2.1-testing/xen/arch/x86/mm.c
@@ -3594,6 +3594,7 @@ static int ptwr_emulated_cmpxchg(
container_of(ctxt, struct ptwr_emulate_ctxt, ctxt));
}
@ -10,7 +10,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
static int ptwr_emulated_cmpxchg8b(
enum x86_segment seg,
unsigned long offset,
@@ -3601,13 +3602,16 @@ static int ptwr_emulated_cmpxchg8b(
@@ -3609,13 +3610,16 @@ static int ptwr_emulated_cmpxchg8b(
offset, ((u64)old_hi << 32) | old, ((u64)new_hi << 32) | new, 8, 1,
container_of(ctxt, struct ptwr_emulate_ctxt, ctxt));
}
@ -28,11 +28,11 @@ Index: xen-3.2-testing/xen/arch/x86/mm.c
};
/* Write page fault handler: check if guest is trying to modify a PTE. */
Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/shadow/common.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/shadow/common.c
+++ xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
@@ -251,6 +251,7 @@ hvm_emulate_cmpxchg(enum x86_segment seg
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/shadow/common.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/shadow/common.c
@@ -261,6 +261,7 @@ hvm_emulate_cmpxchg(enum x86_segment seg
v, addr, old, new, bytes, sh_ctxt);
}
@ -40,7 +40,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
static int
hvm_emulate_cmpxchg8b(enum x86_segment seg,
unsigned long offset,
@@ -274,13 +275,16 @@ hvm_emulate_cmpxchg8b(enum x86_segment s
@@ -287,13 +288,16 @@ hvm_emulate_cmpxchg8b(enum x86_segment s
return v->arch.paging.mode->shadow.x86_emulate_cmpxchg8b(
v, addr, old_lo, old_hi, new_lo, new_hi, sh_ctxt);
}
@ -58,7 +58,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
};
static int
@@ -331,6 +335,7 @@ pv_emulate_cmpxchg(enum x86_segment seg,
@@ -351,6 +355,7 @@ pv_emulate_cmpxchg(enum x86_segment seg,
v, offset, old, new, bytes, sh_ctxt);
}
@ -66,7 +66,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
static int
pv_emulate_cmpxchg8b(enum x86_segment seg,
unsigned long offset,
@@ -346,13 +351,16 @@ pv_emulate_cmpxchg8b(enum x86_segment se
@@ -368,13 +373,16 @@ pv_emulate_cmpxchg8b(enum x86_segment se
return v->arch.paging.mode->shadow.x86_emulate_cmpxchg8b(
v, offset, old_lo, old_hi, new_lo, new_hi, sh_ctxt);
}
@ -84,7 +84,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
};
struct x86_emulate_ops *shadow_init_emulation(
@@ -366,7 +374,12 @@ struct x86_emulate_ops *shadow_init_emul
@@ -388,7 +396,12 @@ struct x86_emulate_ops *shadow_init_emul
if ( !is_hvm_vcpu(v) )
{
@ -97,11 +97,11 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/common.c
return &pv_shadow_emulator_ops;
}
Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
Index: xen-3.2.1-testing/xen/arch/x86/mm/shadow/multi.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/mm/shadow/multi.c
+++ xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
@@ -4254,7 +4254,8 @@ sh_x86_emulate_cmpxchg(struct vcpu *v, u
--- xen-3.2.1-testing.orig/xen/arch/x86/mm/shadow/multi.c
+++ xen-3.2.1-testing/xen/arch/x86/mm/shadow/multi.c
@@ -4244,7 +4244,8 @@ sh_x86_emulate_cmpxchg(struct vcpu *v, u
return rv;
}
@ -111,7 +111,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
sh_x86_emulate_cmpxchg8b(struct vcpu *v, unsigned long vaddr,
unsigned long old_lo, unsigned long old_hi,
unsigned long new_lo, unsigned long new_hi,
@@ -4290,6 +4291,7 @@ sh_x86_emulate_cmpxchg8b(struct vcpu *v,
@@ -4280,6 +4281,7 @@ sh_x86_emulate_cmpxchg8b(struct vcpu *v,
shadow_unlock(v->domain);
return rv;
}
@ -119,7 +119,7 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
/**************************************************************************/
@@ -4576,7 +4578,9 @@ struct paging_mode sh_paging_mode = {
@@ -4566,7 +4568,9 @@ struct paging_mode sh_paging_mode = {
.shadow.detach_old_tables = sh_detach_old_tables,
.shadow.x86_emulate_write = sh_x86_emulate_write,
.shadow.x86_emulate_cmpxchg = sh_x86_emulate_cmpxchg,
@ -129,10 +129,10 @@ Index: xen-3.2-testing/xen/arch/x86/mm/shadow/multi.c
.shadow.make_monitor_table = sh_make_monitor_table,
.shadow.destroy_monitor_table = sh_destroy_monitor_table,
#if SHADOW_OPTIMIZATIONS & SHOPT_WRITABLE_HEURISTIC
Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
Index: xen-3.2.1-testing/xen/arch/x86/x86_emulate.c
===================================================================
--- xen-3.2-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2-testing/xen/arch/x86/x86_emulate.c
--- xen-3.2.1-testing.orig/xen/arch/x86/x86_emulate.c
+++ xen-3.2.1-testing/xen/arch/x86/x86_emulate.c
@@ -30,7 +30,10 @@
#include <xen/types.h>
#include <xen/lib.h>
@ -144,7 +144,7 @@ Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
#endif
#include <asm-x86/x86_emulate.h>
@@ -2986,60 +2989,64 @@ x86_emulate(
@@ -3306,60 +3309,64 @@ x86_emulate(
src.val = x86_seg_gs;
goto pop_seg;
@ -253,7 +253,7 @@ Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
case 0xc8 ... 0xcf: /* bswap */
dst.type = OP_REG;
@@ -3049,7 +3056,7 @@ x86_emulate(
@@ -3369,7 +3376,7 @@ x86_emulate(
{
default: /* case 2: */
/* Undefined behaviour. Writes zero on all tested CPUs. */
@ -262,10 +262,10 @@ Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c
break;
case 4:
#ifdef __x86_64__
Index: xen-3.2-testing/xen/include/asm-x86/cpufeature.h
Index: xen-3.2.1-testing/xen/include/asm-x86/cpufeature.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/cpufeature.h
+++ xen-3.2-testing/xen/include/asm-x86/cpufeature.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/cpufeature.h
+++ xen-3.2.1-testing/xen/include/asm-x86/cpufeature.h
@@ -145,6 +145,7 @@
#define cpu_has_cyrix_arr boot_cpu_has(X86_FEATURE_CYRIX_ARR)
#define cpu_has_centaur_mcr boot_cpu_has(X86_FEATURE_CENTAUR_MCR)
@ -282,11 +282,11 @@ Index: xen-3.2-testing/xen/include/asm-x86/cpufeature.h
#define cpu_has_page1gb boot_cpu_has(X86_FEATURE_PAGE1GB)
#define cpu_has_efer 1
#endif
Index: xen-3.2-testing/xen/include/asm-x86/x86_emulate.h
Index: xen-3.2.1-testing/xen/include/asm-x86/x86_emulate.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/x86_emulate.h
+++ xen-3.2-testing/xen/include/asm-x86/x86_emulate.h
@@ -95,8 +95,9 @@ struct segment_register {
--- xen-3.2.1-testing.orig/xen/include/asm-x86/x86_emulate.h
+++ xen-3.2.1-testing/xen/include/asm-x86/x86_emulate.h
@@ -104,8 +104,9 @@ struct segment_register {
* some out-of-band mechanism, unknown to the emulator. The memop signals
* failure by returning X86EMUL_EXCEPTION to the emulator, which will
* then immediately bail.
@ -298,7 +298,7 @@ Index: xen-3.2-testing/xen/include/asm-x86/x86_emulate.h
* 3. The emulator cannot handle 64-bit mode emulation on an x86/32 system.
*/
struct x86_emulate_ops
@@ -156,16 +157,17 @@ struct x86_emulate_ops
@@ -165,16 +166,17 @@ struct x86_emulate_ops
struct x86_emulate_ctxt *ctxt);
/*
@ -321,10 +321,10 @@ Index: xen-3.2-testing/xen/include/asm-x86/x86_emulate.h
enum x86_segment seg,
unsigned long offset,
unsigned long old_lo,
Index: xen-3.2-testing/xen/include/asm-x86/paging.h
Index: xen-3.2.1-testing/xen/include/asm-x86/paging.h
===================================================================
--- xen-3.2-testing.orig/xen/include/asm-x86/paging.h
+++ xen-3.2-testing/xen/include/asm-x86/paging.h
--- xen-3.2.1-testing.orig/xen/include/asm-x86/paging.h
+++ xen-3.2.1-testing/xen/include/asm-x86/paging.h
@@ -83,12 +83,14 @@ struct shadow_paging_mode {
unsigned long new,
unsigned int bytes,

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8861bb05830342cad2424e1c1d26ce002fbbbaffbb5c7bfcc08ffd6f52dbccfb
size 5460134

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:53d07207f8907ba02d152852ff216695c07be2e97b53bac025ac991542aef08f
size 5467794

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/python/xen/util/blkif.py
Index: xen-3.2.1-testing/tools/python/xen/util/blkif.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/util/blkif.py
+++ xen-3.2-testing/tools/python/xen/util/blkif.py
--- xen-3.2.1-testing.orig/tools/python/xen/util/blkif.py
+++ xen-3.2.1-testing/tools/python/xen/util/blkif.py
@@ -66,23 +66,24 @@ def blkdev_segment(name):
'type' : 'Disk' }
return val
@ -32,11 +32,11 @@ Index: xen-3.2-testing/tools/python/xen/util/blkif.py
def mount_mode(name):
mode = None
Index: xen-3.2-testing/tools/python/xen/xend/server/DevController.py
Index: xen-3.2.1-testing/tools/python/xen/xend/server/DevController.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/server/DevController.py
+++ xen-3.2-testing/tools/python/xen/xend/server/DevController.py
@@ -561,6 +561,31 @@ class DevController:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/server/DevController.py
+++ xen-3.2.1-testing/tools/python/xen/xend/server/DevController.py
@@ -562,6 +562,31 @@ class DevController:
return result['status']
@ -68,10 +68,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/server/DevController.py
def backendPath(self, backdom, devid):
"""Construct backend path given the backend domain and device id.
Index: xen-3.2-testing/tools/python/xen/xend/XendBootloader.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendBootloader.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendBootloader.py
+++ xen-3.2-testing/tools/python/xen/xend/XendBootloader.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendBootloader.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendBootloader.py
@@ -12,8 +12,9 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
@ -126,10 +126,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendBootloader.py
+ if m:
+ return vdisk == m.group(1) or vdisk == m.group(2)
+ return True
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -35,14 +35,14 @@ from types import StringTypes
import xen.lowlevel.xc
@ -147,7 +147,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
from xen.xend.XendError import XendError, VmError
from xen.xend.XendDevices import XendDevices
from xen.xend.XendTask import XendTask
@@ -1512,6 +1512,10 @@ class XendDomainInfo:
@@ -1517,6 +1517,10 @@ class XendDomainInfo:
deviceClass, config = self.info['devices'].get(dev_uuid)
self._waitForDevice(deviceClass, config['devid'])
@ -158,7 +158,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
def _waitForDevice_destroy(self, deviceClass, devid, backpath):
return self.getDeviceController(deviceClass).waitForDevice_destroy(
devid, backpath)
@@ -2050,8 +2054,11 @@ class XendDomainInfo:
@@ -2091,8 +2095,11 @@ class XendDomainInfo:
blexec = osdep.pygrub_path
blcfg = None
@ -172,7 +172,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
if not disks:
msg = "Had a bootloader specified, but no disks are bootable"
@@ -2062,13 +2069,10 @@ class XendDomainInfo:
@@ -2103,13 +2110,10 @@ class XendDomainInfo:
devtype = devinfo[0]
disk = devinfo[1]['uname']
@ -189,7 +189,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
log.info("Mounting %s on %s." %
(fn, BOOTLOADER_LOOPBACK_DEVICE))
@@ -2080,7 +2084,9 @@ class XendDomainInfo:
@@ -2121,7 +2125,9 @@ class XendDomainInfo:
from xen.xend import XendDomain
dom0 = XendDomain.instance().privilegedDomain()
@ -200,7 +200,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
fn = BOOTLOADER_LOOPBACK_DEVICE
try:
@@ -2091,7 +2097,7 @@ class XendDomainInfo:
@@ -2132,7 +2138,7 @@ class XendDomainInfo:
log.info("Unmounting %s from %s." %
(fn, BOOTLOADER_LOOPBACK_DEVICE))

View File

@ -144,7 +144,7 @@ Index: xen-3.2-testing/tools/python/xen/xm/create.py
gopts.var('sdl', val='',
fn=set_value, default=None,
use="""Should the device model use SDL?""")
@@ -626,7 +630,7 @@ def configure_vfbs(config_devs, vals):
@@ -631,7 +635,7 @@ def configure_vfbs(config_devs, vals):
d['type'] = 'sdl'
for (k,v) in d.iteritems():
if not k in [ 'vnclisten', 'vncunused', 'vncdisplay', 'display',

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/examples/xend-config.sxp
Index: xen-3.2.1-testing/tools/examples/xend-config.sxp
===================================================================
--- xen-3.2-testing.orig/tools/examples/xend-config.sxp
+++ xen-3.2-testing/tools/examples/xend-config.sxp
--- xen-3.2.1-testing.orig/tools/examples/xend-config.sxp
+++ xen-3.2.1-testing/tools/examples/xend-config.sxp
@@ -130,7 +130,8 @@
#
# (network-script 'network-bridge netdev=eth1')
@ -12,10 +12,10 @@ Index: xen-3.2-testing/tools/examples/xend-config.sxp
#
# (network-script 'network-bridge bridge=<name>')
#
Index: xen-3.2-testing/tools/ioemu/vl.c
Index: xen-3.2.1-testing/tools/ioemu/vl.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.c
+++ xen-3.2-testing/tools/ioemu/vl.c
--- xen-3.2.1-testing.orig/tools/ioemu/vl.c
+++ xen-3.2.1-testing/tools/ioemu/vl.c
@@ -102,8 +102,6 @@
#define DEFAULT_NETWORK_SCRIPT "/etc/xen/qemu-ifup"
#ifdef _BSD
@ -25,7 +25,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
#endif
#ifdef __sun__
#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
@@ -4129,10 +4127,10 @@ static int net_client_init(const char *s
@@ -4149,10 +4147,10 @@ static int net_client_init(const char *s
if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
}
@ -40,11 +40,11 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
}
} else
#endif
Index: xen-3.2-testing/tools/python/xen/xend/image.py
Index: xen-3.2.1-testing/tools/python/xen/xend/image.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2-testing/tools/python/xen/xend/image.py
@@ -491,13 +491,16 @@ class HVMImageHandler(ImageHandler):
--- xen-3.2.1-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2.1-testing/tools/python/xen/xend/image.py
@@ -497,13 +497,16 @@ class HVMImageHandler(ImageHandler):
mac = devinfo.get('mac')
if mac is None:
raise VmError("MAC address not specified or generated.")
@ -63,10 +63,10 @@ Index: xen-3.2-testing/tools/python/xen/xend/image.py
return ret
Index: xen-3.2-testing/tools/ioemu/target-i386-dm/qemu-ifup
Index: xen-3.2.1-testing/tools/ioemu/target-i386-dm/qemu-ifup
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/target-i386-dm/qemu-ifup
+++ xen-3.2-testing/tools/ioemu/target-i386-dm/qemu-ifup
--- xen-3.2.1-testing.orig/tools/ioemu/target-i386-dm/qemu-ifup
+++ xen-3.2.1-testing/tools/ioemu/target-i386-dm/qemu-ifup
@@ -1,11 +1,11 @@
#!/bin/sh

View File

@ -1,10 +1,10 @@
PAE must be on for 64-on-64 to work at all.
Index: xen-3.2-testing/tools/python/xen/xend/image.py
Index: xen-3.2.1-testing/tools/python/xen/xend/image.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2-testing/tools/python/xen/xend/image.py
@@ -586,7 +586,7 @@ class X86_HVM_ImageHandler(HVMImageHandl
--- xen-3.2.1-testing.orig/tools/python/xen/xend/image.py
+++ xen-3.2.1-testing/tools/python/xen/xend/image.py
@@ -592,7 +592,7 @@ class X86_HVM_ImageHandler(HVMImageHandl
def configure(self, vmConfig):
HVMImageHandler.configure(self, vmConfig)

View File

@ -1,7 +1,7 @@
Index: xen-3.2-testing/tools/ioemu/hw/ide.c
Index: xen-3.2.1-testing/tools/ioemu/hw/ide.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/ide.c
+++ xen-3.2-testing/tools/ioemu/hw/ide.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/ide.c
+++ xen-3.2.1-testing/tools/ioemu/hw/ide.c
@@ -395,6 +395,9 @@ typedef struct PCIIDEState {
int type; /* see IDE_TYPE_xxx */
} PCIIDEState;
@ -12,7 +12,7 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
#if defined(__ia64__)
#include <xen/hvm/ioreq.h>
@@ -2245,6 +2248,27 @@ static void ide_reset(IDEState *s)
@@ -2248,6 +2251,27 @@ static void ide_reset(IDEState *s)
ide_dummy_transfer_stop(s);
}
@ -40,7 +40,7 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
struct partition {
uint8_t boot_ind; /* 0x80 - active */
uint8_t head; /* starting head */
@@ -2646,6 +2670,9 @@ void pci_cmd646_ide_init(PCIBus *bus, Bl
@@ -2649,6 +2673,9 @@ void pci_cmd646_ide_init(PCIBus *bus, Bl
sizeof(PCIIDEState),
-1,
NULL, NULL);
@ -50,7 +50,7 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
d->type = IDE_TYPE_CMD646;
pci_conf = d->dev.config;
pci_conf[0x00] = 0x95; // CMD646
@@ -2820,6 +2847,9 @@ void pci_piix_ide_init(PCIBus *bus, Bloc
@@ -2823,6 +2850,9 @@ void pci_piix_ide_init(PCIBus *bus, Bloc
NULL, NULL);
d->type = IDE_TYPE_PIIX3;
@ -60,7 +60,7 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
pci_conf = d->dev.config;
pci_conf[0x00] = 0x86; // Intel
pci_conf[0x01] = 0x80;
@@ -2866,6 +2896,9 @@ void pci_piix3_ide_init(PCIBus *bus, Blo
@@ -2869,6 +2899,9 @@ void pci_piix3_ide_init(PCIBus *bus, Blo
NULL, NULL);
d->type = IDE_TYPE_PIIX3;
@ -70,10 +70,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/ide.c
pci_conf = d->dev.config;
pci_conf[0x00] = 0x86; // Intel
pci_conf[0x01] = 0x80;
Index: xen-3.2-testing/tools/ioemu/hw/pci.c
Index: xen-3.2.1-testing/tools/ioemu/hw/pci.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/pci.c
+++ xen-3.2-testing/tools/ioemu/hw/pci.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/pci.c
+++ xen-3.2.1-testing/tools/ioemu/hw/pci.c
@@ -573,6 +573,28 @@ void pci_nic_init(PCIBus *bus, NICInfo *
}
}
@ -103,10 +103,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/pci.c
typedef struct {
PCIDevice dev;
PCIBus *bus;
Index: xen-3.2-testing/tools/ioemu/hw/xen_platform.c
Index: xen-3.2.1-testing/tools/ioemu/hw/xen_platform.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/xen_platform.c
+++ xen-3.2-testing/tools/ioemu/hw/xen_platform.c
--- xen-3.2.1-testing.orig/tools/ioemu/hw/xen_platform.c
+++ xen-3.2.1-testing/tools/ioemu/hw/xen_platform.c
@@ -23,15 +23,53 @@
* THE SOFTWARE.
*/
@ -162,10 +162,10 @@ Index: xen-3.2-testing/tools/ioemu/hw/xen_platform.c
}
static uint32_t platform_mmio_read(void *opaque, target_phys_addr_t addr)
Index: xen-3.2-testing/tools/ioemu/vl.c
Index: xen-3.2.1-testing/tools/ioemu/vl.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.c
+++ xen-3.2-testing/tools/ioemu/vl.c
--- xen-3.2.1-testing.orig/tools/ioemu/vl.c
+++ xen-3.2.1-testing/tools/ioemu/vl.c
@@ -197,6 +197,20 @@ int xc_handle;
char domain_name[64] = "Xen-no-name";
extern int domid;
@ -187,7 +187,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
/***********************************************************/
/* x86 ISA bus support */
@@ -3404,6 +3418,7 @@ void net_slirp_smb(const char *exported_
@@ -3424,6 +3438,7 @@ void net_slirp_smb(const char *exported_
typedef struct TAPState {
VLANClientState *vc;
int fd;
@ -195,7 +195,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
} TAPState;
static void tap_receive(void *opaque, const uint8_t *buf, int size)
@@ -3431,6 +3446,36 @@ static void tap_send(void *opaque)
@@ -3451,6 +3466,36 @@ static void tap_send(void *opaque)
}
}
@ -232,7 +232,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
/* fd support */
static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
@@ -3442,6 +3487,8 @@ static TAPState *net_tap_fd_init(VLANSta
@@ -3462,6 +3507,8 @@ static TAPState *net_tap_fd_init(VLANSta
return NULL;
s->fd = fd;
s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
@ -241,7 +241,7 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
qemu_set_fd_handler(s->fd, tap_send, NULL, s);
snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
return s;
@@ -4412,20 +4459,6 @@ void dumb_display_init(DisplayState *ds)
@@ -4432,20 +4479,6 @@ void dumb_display_init(DisplayState *ds)
#define MAX_IO_HANDLERS 64
@ -262,11 +262,11 @@ Index: xen-3.2-testing/tools/ioemu/vl.c
/* XXX: fd_read_poll should be suppressed, but an API change is
necessary in the character devices to suppress fd_can_read(). */
int qemu_set_fd_handler2(int fd,
Index: xen-3.2-testing/tools/ioemu/vl.h
Index: xen-3.2.1-testing/tools/ioemu/vl.h
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/vl.h
+++ xen-3.2-testing/tools/ioemu/vl.h
@@ -1497,6 +1497,8 @@ void kqemu_record_dump(void);
--- xen-3.2.1-testing.orig/tools/ioemu/vl.h
+++ xen-3.2.1-testing/tools/ioemu/vl.h
@@ -1499,6 +1499,8 @@ void kqemu_record_dump(void);
extern char domain_name[];
void destroy_hvm_domain(void);

View File

@ -2,7 +2,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendNode.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendNode.py
+++ xen-3.2-testing/tools/python/xen/xend/XendNode.py
@@ -579,10 +579,34 @@ class XendNode:
@@ -593,11 +593,35 @@ class XendNode:
info['cpu_mhz'] = info['cpu_khz'] / 1000
@ -10,6 +10,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendNode.py
- info['total_memory'] = info['total_memory'] / 1024
- info['free_memory'] = info['free_memory'] / 1024
- info['node_to_cpu'] = self.format_node_to_cpu(info)
- info['node_to_memory'] = self.format_node_to_memory(info)
+ configured_floor = xendoptions().get_dom0_min_mem() * 1024
+ from xen.xend import balloon
+ try:
@ -29,6 +30,7 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendNode.py
+ info['free_memory'] = info['free_memory'] / 1024
+ info['max_free_memory'] = info['max_free_memory'] / 1024
+ info['node_to_cpu'] = self.format_node_to_cpu(info)
+ info['node_to_memory'] = self.format_node_to_memory(info)
+
+ # FIXME: These are hard-coded to be the inverse of the getXenMemory
+ # functions in image.py. Find a cleaner way.
@ -41,16 +43,16 @@ Index: xen-3.2-testing/tools/python/xen/xend/XendNode.py
ITEM_ORDER = ['nr_cpus',
'nr_nodes',
@@ -592,6 +616,9 @@ class XendNode:
@@ -607,6 +631,9 @@ class XendNode:
'hw_caps',
'total_memory',
'free_memory',
+ 'max_free_memory',
+ 'max_para_memory',
+ 'max_hvm_memory',
'node_to_cpu'
'node_to_cpu',
'node_to_memory'
]
Index: xen-3.2-testing/tools/python/xen/xend/balloon.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/balloon.py

View File

@ -2,7 +2,7 @@ Index: xen-3.2-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2-testing/tools/python/xen/xm/create.py
@@ -892,9 +892,8 @@ def preprocess_access_control(vals):
@@ -897,9 +897,8 @@ def preprocess_access_control(vals):
def preprocess_ip(vals):
if vals.ip or vals.dhcp != 'off':

View File

@ -2,7 +2,7 @@ Index: xen-3.2-testing/tools/python/xen/xm/create.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/create.py
+++ xen-3.2-testing/tools/python/xen/xm/create.py
@@ -986,8 +986,7 @@ def spawn_vnc(display):
@@ -991,8 +991,7 @@ def spawn_vnc(display):
returns the port that the vncviewer is listening on and sets the global
vncpid. On failure, returns 0. Note that vncviewer is daemonized.
"""

View File

@ -1,11 +1,11 @@
From: Charles Coffing <ccoffing@novell.com>
Upstream: no
Index: xen-3.2-testing/tools/python/xen/xm/main.py
Index: xen-3.2.1-testing/tools/python/xen/xm/main.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xm/main.py
+++ xen-3.2-testing/tools/python/xen/xm/main.py
@@ -1833,6 +1833,10 @@ def xm_debug_keys(args):
--- xen-3.2.1-testing.orig/tools/python/xen/xm/main.py
+++ xen-3.2.1-testing/tools/python/xen/xm/main.py
@@ -1830,6 +1830,10 @@ def xm_debug_keys(args):
def xm_top(args):
arg_check(args, "top", 0)

View File

@ -1,8 +1,42 @@
-------------------------------------------------------------------
Fri Mar 14 16:58:04 CET 2008 - carnold@novell.com
- Update to Xen 3.2.1 changeset 16805.
-------------------------------------------------------------------
Fri Mar 14 11:20:22 CET 2008 - coolo@suse.de
- ipcalc does not exist - and breaks pattern
-------------------------------------------------------------------
Wed Mar 12 12:28:34 MDT 2008 - jfehlig@novell.com
- Increased dom0-min-mem value to 512Mb in xend-config.sxp
bnc#370007
-------------------------------------------------------------------
Mon Mar 10 16:38:47 MDT 2008 - jfehlig@novell.com
- Fixed initialization of default VM config values when creating
VMs through Xen API. bnc#368273
-------------------------------------------------------------------
Mon Mar 10 14:11:52 MDT 2008 - jfehlig@novell.com
- Removed unused/untested xend-relocation script.
-------------------------------------------------------------------
Fri Mar 7 15:44:36 MST 2008 - jfehlig@novell.com
- Set device model when creating pvfb consoles via XenAPI.
bnc#367851
-------------------------------------------------------------------
Fri Mar 7 09:28:58 MST 2008 - jfehlig@novell.com
- Ensure dhcpcd is activated, if appropriate, on bridges created
by network-multinet. bnc#364633
-------------------------------------------------------------------
Fri Feb 29 09:58:06 MST 2008 - carnold@novell.com

116
xen.spec
View File

@ -1,5 +1,5 @@
#
# spec file for package xen (Version 3.2.0_16718_06)
# spec file for package xen (Version 3.2.1_16805_01)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@ -15,7 +15,7 @@ Name: xen
%define xvers 3.2
%define xvermaj 3
%define changeset 16718
%define xen_build_dir xen-3.2-testing
%define xen_build_dir xen-3.2.1-testing
%if %sles_version
%define with_kmp 1
%else
@ -33,14 +33,14 @@ BuildRequires: glibc-32bit glibc-devel-32bit
%if %{?with_kmp}0
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
%endif
Version: 3.2.0_16718_06
Release: 4
Version: 3.2.1_16805_01
Release: 1
License: GPL v2 only
Group: System/Kernel
AutoReqProv: on
PreReq: %insserv_prereq %fillup_prereq
Summary: Xen Virtualization: Hypervisor (aka VMM aka Microkernel)
Source0: xen-3.2-testing-src.tar.bz2
Source0: xen-3.2.1-testing-src.tar.bz2
Source2: README.SuSE
Source3: boot.xen
Source4: boot.local.xenU
@ -68,33 +68,25 @@ Source24: xenapiusers
Patch0: 16716-xend-version.patch
Patch1: 16718-batched-mmu-updates.patch
Patch2: 16769-pci-high-memory-resource.patch
Patch3: 16777-xend-block-attach.patch
Patch4: 16859-x86_emulate-clts-fix.patch
Patch5: 16873-net-nat.patch
Patch6: 16877-blktap.patch
Patch7: 16883-xend-crashed-state.patch
Patch8: 16884-xend-rename-restart.patch
Patch9: 16885-xend-config-comments.patch
Patch10: 16886-xenstore-leak.patch
Patch11: 16890-xenapi-version.patch
Patch12: 16929-hvm-guest-crash-fix.patch
Patch13: 16930-shadow-pinning-logic-fix.patch
Patch14: 16932-xend-hvm-localtime.patch
Patch15: 16945-blktap-strip.patch
Patch16: 16947-fvmachine-xenstore.patch
Patch17: 16962-cross-page-write-failure.patch
Patch18: 16965-xend-leak.patch
Patch19: 16976-x86_emulate-sahf-fix.patch
Patch20: 16977-xend-restart-count.patch
Patch21: 16980-x86_emulate-macro-fix.patch
Patch22: 16988-xm-reboot.patch
Patch23: 16989-xend-coredump.patch
Patch24: 16995-x86_emulate-mul-fix.patch
Patch25: 16998-x86_emulate-imul-fix.patch
Patch26: 17003-qemu-queue-mouse.patch
Patch27: 17017-hpet-configuration.patch
Patch28: 17036-mismatched-save-rest-fix.patch
Patch29: 17113-xend-restore.patch
Patch3: 16873-net-nat.patch
Patch4: 16877-blktap.patch
Patch5: 16883-xend-crashed-state.patch
Patch6: 16884-xend-rename-restart.patch
Patch7: 16885-xend-config-comments.patch
Patch8: 16886-xenstore-leak.patch
Patch9: 16890-xenapi-version.patch
Patch10: 16931-hvm-hap-param.patch
Patch11: 16933-hvm-hap-fix.patch
Patch12: 16939-hvm-hap-fix.patch
Patch13: 16947-fvmachine-xenstore.patch
Patch14: 16977-xend-restart-count.patch
Patch15: 16989-xend-coredump.patch
Patch16: 17017-hpet-configuration.patch
Patch17: 17124-numa-free-memory-size.patch
Patch18: 17131-numa-set-vcpu-affinity.patch
Patch19: 17190-remove-hap-boot-param.patch
Patch20: 17191-remove-hap-boot-param-doc.patch
Patch21: 17xxx-xenapi-defaults.patch
# Our patches
Patch100: xen-config.diff
Patch101: xend-config.diff
@ -142,6 +134,7 @@ Patch158: xen-qcow-realpath-buffer-overflow.patch
Patch159: xen-api-auth.patch
Patch160: pv_32_16_color_trans.patch
Patch161: hvm-ide-flush-o_direct.patch
Patch162: migration-cpl-init.patch
# Patches from Jan
Patch240: xenctx.patch
Patch241: const-callback-arg.patch
@ -155,17 +148,18 @@ Patch247: 32on64-extra-mem.patch
Patch350: pv-driver-build.patch
Patch351: xen-ioemu-hvm-pv-support.diff
Patch352: pvdrv_emulation_control.patch
# Intel EPT / VPID patches
Patch400: ept-novell-x64.patch
Patch401: vpid-novell.patch
Patch402: livemig-ept-novell-x64.patch
Patch403: livemig-ept-novell-i386.patch
%ifarch x86_64
# novell_shim patches
Patch500: ns_tools.patch
Patch501: ns_xen_base.patch
Patch502: ns_xen_extension.patch
%endif
Patch400: ns_tools.patch
Patch401: ns_xen_base.patch
Patch402: ns_xen_extension.patch
# Intel EPT / VPID patches
Patch500: ept-novell-x64.patch
Patch501: vpid-novell-x64.patch
Patch502: ept-novell-x64-2m.patch
Patch503: ept-with-livemgr-2m.diff
Patch504: ept-novell-i386.patch
Patch505: vpid-novell-i386.patch
Patch506: livemig-ept-novell-i386.patch
Url: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%define pysite %(python -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib()")
@ -511,14 +505,6 @@ Authors:
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch100 -p1
%patch101 -p1
%patch102 -p1
@ -564,7 +550,8 @@ Authors:
%patch158 -p1
%patch159 -p1
%patch160 -p1
%patch161 -p1
#%patch161 -p1
#%patch162 -p1
%patch240 -p1
%patch241 -p1
%patch242 -p1
@ -576,17 +563,18 @@ Authors:
%patch350 -p1
%patch351 -p1
%patch352 -p1
%ifarch x86_64
%patch400 -p1
%patch401 -p1
%ifarch x86_64
%patch402 -p1
%else
%patch403 -p1
%endif
%ifarch x86_64
%patch500 -p1
%patch501 -p1
%patch502 -p1
%patch503 -p1
%else
%patch504 -p1
%patch505 -p1
%patch506 -p1
%endif
%build
@ -907,8 +895,24 @@ rm -f $RPM_BUILD_ROOT/%pysite/*.egg-info
/sbin/ldconfig
%changelog
* Fri Mar 14 2008 carnold@novell.com
- Update to Xen 3.2.1 changeset 16805.
* Fri Mar 14 2008 coolo@suse.de
- ipcalc does not exist - and breaks pattern
* Wed Mar 12 2008 jfehlig@novell.com
- Increased dom0-min-mem value to 512Mb in xend-config.sxp
bnc#370007
* Tue Mar 11 2008 jfehlig@novell.com
- Fixed initialization of default VM config values when creating
VMs through Xen API. bnc#368273
* Mon Mar 10 2008 jfehlig@novell.com
- Removed unused/untested xend-relocation script.
* Sat Mar 08 2008 jfehlig@novell.com
- Set device model when creating pvfb consoles via XenAPI.
bnc#367851
* Fri Mar 07 2008 jfehlig@novell.com
- Ensure dhcpcd is activated, if appropriate, on bridges created
by network-multinet. bnc#364633
* Fri Feb 29 2008 carnold@novell.com
- bnc#357966 - VT-D dosen't work for HVM guest.
* Fri Feb 29 2008 plc@novell.com

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -2732,6 +2732,14 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -2773,6 +2773,14 @@ class XendDomainInfo:
if not config.has_key('backend'):
config['backend'] = "00000000-0000-0000-0000-000000000000"

View File

@ -111,3 +111,12 @@ Index: xen-3.2-testing/tools/examples/xend-config.sxp
# The script used to control virtual interfaces. This can be overridden on a
# per-vif basis when creating a domain or a configuring a new vif. The
@@ -169,7 +219,7 @@
# Dom0 will balloon out when needed to free memory for domU.
# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
# If dom0-min-mem=0, dom0 will never balloon out.
-(dom0-min-mem 196)
+(dom0-min-mem 512)
# In SMP system, dom0 will use dom0-cpus # of CPUS
# If dom0-cpus = 0, dom0 will take all cpus available

View File

@ -1,8 +1,8 @@
Index: xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
===================================================================
--- xen-3.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1504,7 +1504,7 @@ class XendDomainInfo:
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
@@ -1509,7 +1509,7 @@ class XendDomainInfo:
try:
if not corefile:
this_time = time.strftime("%Y-%m%d-%H%M.%S", time.localtime())