From 9c16971e0e22e5a08c472d9cb2ae8ffeca95580a19062d997b6902a08cb3ebe1 Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Fri, 14 Mar 2008 23:07:14 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xen?expand=0&rev=41 --- 16718-batched-mmu-updates.patch | 80 +- 16777-xend-block-attach.patch | 31 - 16859-x86_emulate-clts-fix.patch | 21 - 16883-xend-crashed-state.patch | 56 +- 16884-xend-rename-restart.patch | 12 +- 16886-xenstore-leak.patch | 22 +- 16929-hvm-guest-crash-fix.patch | 26 - 16930-shadow-pinning-logic-fix.patch | 34 - 16931-hvm-hap-param.patch | 285 +++++ 16932-xend-hvm-localtime.patch | 87 -- 16933-hvm-hap-fix.patch | 53 + 16939-hvm-hap-fix.patch | 21 + 16945-blktap-strip.patch | 49 - 16947-fvmachine-xenstore.patch | 30 +- 16962-cross-page-write-failure.patch | 21 - 16965-xend-leak.patch | 24 - 16976-x86_emulate-sahf-fix.patch | 22 - 16977-xend-restart-count.patch | 14 +- 16980-x86_emulate-macro-fix.patch | 36 - 16988-xm-reboot.patch | 62 - 16989-xend-coredump.patch | 66 +- 16995-x86_emulate-mul-fix.patch | 35 - 16998-x86_emulate-imul-fix.patch | 20 - 17003-qemu-queue-mouse.patch | 197 ---- 17017-hpet-configuration.patch | 78 +- 17036-mismatched-save-rest-fix.patch | 235 ---- 17113-xend-restore.patch | 27 - 17124-numa-free-memory-size.patch | 85 ++ 17131-numa-set-vcpu-affinity.patch | 52 + 17190-remove-hap-boot-param.patch | 44 + 17191-remove-hap-boot-param-doc.patch | 22 + 17xxx-xenapi-defaults.patch | 152 +++ 32on64-extra-mem.patch | 8 +- blktap.patch | 20 +- block-losetup-retry.diff | 2 +- cdrom-removable.patch | 48 +- const-set-trap-table-arg.patch | 20 +- ept-novell-i386.patch | 1015 +++++++++++++++++ ept-novell-x64-2m.patch | 602 ++++++++++ ept-novell-x64.patch | 144 ++- ...vell-x64.patch => ept-with-livemgr-2m.diff | 189 +-- migration-cpl-init.patch | 16 + ns_tools.patch | 53 +- ns_xen_base.patch | 143 ++- qemu-security-etch1.diff | 56 +- vnc-i18n-keys.diff | 20 +- vpid-novell.patch => vpid-novell-i386.patch | 0 vpid-novell-x64.patch | 342 ++++++ x86_emulate.patch | 70 +- xen-3.2-testing-src.tar.bz2 | 3 - xen-3.2.1-testing-src.tar.bz2 | 3 + xen-domUloader.diff | 36 +- xen-fbback-resize.patch | 2 +- xen-hvm-default-bridge.diff | 28 +- xen-hvm-default-pae.diff | 8 +- xen-ioemu-hvm-pv-support.diff | 48 +- xen-max-free-mem.diff | 10 +- xen-no-dummy-nfs-ip.diff | 2 +- xen-tightvnc-args.diff | 2 +- xen-xm-top-needs-root.diff | 8 +- xen.changes | 34 + xen.spec | 116 +- xenapi-console-protocol.patch | 8 +- xend-config.diff | 9 + xend-core-dump-loc.diff | 8 +- 65 files changed, 3459 insertions(+), 1613 deletions(-) delete mode 100644 16777-xend-block-attach.patch delete mode 100644 16859-x86_emulate-clts-fix.patch delete mode 100644 16929-hvm-guest-crash-fix.patch delete mode 100644 16930-shadow-pinning-logic-fix.patch create mode 100644 16931-hvm-hap-param.patch delete mode 100644 16932-xend-hvm-localtime.patch create mode 100644 16933-hvm-hap-fix.patch create mode 100644 16939-hvm-hap-fix.patch delete mode 100644 16945-blktap-strip.patch delete mode 100644 16962-cross-page-write-failure.patch delete mode 100644 16965-xend-leak.patch delete mode 100644 16976-x86_emulate-sahf-fix.patch delete mode 100644 16980-x86_emulate-macro-fix.patch delete mode 100644 16988-xm-reboot.patch delete mode 100644 16995-x86_emulate-mul-fix.patch delete mode 100644 16998-x86_emulate-imul-fix.patch delete mode 100644 17003-qemu-queue-mouse.patch delete mode 100644 17036-mismatched-save-rest-fix.patch delete mode 100644 17113-xend-restore.patch create mode 100644 17124-numa-free-memory-size.patch create mode 100644 17131-numa-set-vcpu-affinity.patch create mode 100644 17190-remove-hap-boot-param.patch create mode 100644 17191-remove-hap-boot-param-doc.patch create mode 100644 17xxx-xenapi-defaults.patch create mode 100644 ept-novell-i386.patch create mode 100644 ept-novell-x64-2m.patch rename livemig-ept-novell-x64.patch => ept-with-livemgr-2m.diff (70%) create mode 100644 migration-cpl-init.patch rename vpid-novell.patch => vpid-novell-i386.patch (100%) create mode 100644 vpid-novell-x64.patch delete mode 100644 xen-3.2-testing-src.tar.bz2 create mode 100644 xen-3.2.1-testing-src.tar.bz2 diff --git a/16718-batched-mmu-updates.patch b/16718-batched-mmu-updates.patch index 1216a29..6d8a34b 100644 --- a/16718-batched-mmu-updates.patch +++ b/16718-batched-mmu-updates.patch @@ -7,10 +7,10 @@ x86: Allow batched mmu updates which preserve accessed/dirty pte bits. Signed-off-by: Bruce Rogers Signed-off-by: Keir Fraser -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. diff --git a/16777-xend-block-attach.patch b/16777-xend-block-attach.patch deleted file mode 100644 index 9f7550d..0000000 --- a/16777-xend-block-attach.patch +++ /dev/null @@ -1,31 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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 diff --git a/16859-x86_emulate-clts-fix.patch b/16859-x86_emulate-clts-fix.patch deleted file mode 100644 index c2b0918..0000000 --- a/16859-x86_emulate-clts-fix.patch +++ /dev/null @@ -1,21 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1201096764 0 -# Node ID 7f940c605893749225a5605fb8a1fa38972bdeb6 -# Parent c364f80eb4b591f8ecd9dd803081923b94a8c688 -x86_emulate: Fix CLTS emulation. -Signed-off-by: Keir Fraser - -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 */ diff --git a/16883-xend-crashed-state.patch b/16883-xend-crashed-state.patch index 4cff753..3f28e9b 100644 --- a/16883-xend-crashed-state.patch +++ b/16883-xend-crashed-state.patch @@ -10,10 +10,10 @@ crashed but preserved VM and renaming/restarting a crashed VM. Signed-off-by: Jim Fehlig -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 diff --git a/16884-xend-rename-restart.patch b/16884-xend-rename-restart.patch index 4d42424..a5cef61 100644 --- a/16884-xend-rename-restart.patch +++ b/16884-xend-rename-restart.patch @@ -21,11 +21,11 @@ construct the restarted domain. Signed-off-by: Jim Fehlig -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() diff --git a/16886-xenstore-leak.patch b/16886-xenstore-leak.patch index 7baf8b5..f3bb0e3 100644 --- a/16886-xenstore-leak.patch +++ b/16886-xenstore-leak.patch @@ -7,11 +7,11 @@ Fix leaking of /vm/ path in xenstore on various VM lifecycle events. Signed-off-by: Jim Fehlig -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() diff --git a/16929-hvm-guest-crash-fix.patch b/16929-hvm-guest-crash-fix.patch deleted file mode 100644 index 177911b..0000000 --- a/16929-hvm-guest-crash-fix.patch +++ /dev/null @@ -1,26 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1201607262 0 -# Node ID 128f7bc0a277375571b4817fc65bfcd14e00a7ec -# Parent 7aa2149a3b0e94eb01b39ae8cf4a41bc225be94e -x86: Fix HVM hypercall preemption causing guest crash. -Signed-off-by: Yu Zhao - -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) ? diff --git a/16930-shadow-pinning-logic-fix.patch b/16930-shadow-pinning-logic-fix.patch deleted file mode 100644 index 9be4b0e..0000000 --- a/16930-shadow-pinning-logic-fix.patch +++ /dev/null @@ -1,34 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1201607430 0 -# Node ID 193afcdb85b211d72f940e086397490ce72f06e6 -# Parent 128f7bc0a277375571b4817fc65bfcd14e00a7ec -x86: Fix shadow pinning logic (for PV live relo). -From: Tim Deegan -Signed-off-by: Keir Fraser - -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); -+ } - } - - diff --git a/16931-hvm-hap-param.patch b/16931-hvm-hap-param.patch new file mode 100644 index 0000000..df61ff3 --- /dev/null +++ b/16931-hvm-hap-param.patch @@ -0,0 +1,285 @@ +# HG changeset patch +# User Keir Fraser +# 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 + +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 + #include + +-#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, diff --git a/16932-xend-hvm-localtime.patch b/16932-xend-hvm-localtime.patch deleted file mode 100644 index 9f3fbe2..0000000 --- a/16932-xend-hvm-localtime.patch +++ /dev/null @@ -1,87 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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() diff --git a/16933-hvm-hap-fix.patch b/16933-hvm-hap-fix.patch new file mode 100644 index 0000000..c234597 --- /dev/null +++ b/16933-hvm-hap-fix.patch @@ -0,0 +1,53 @@ +# HG changeset patch +# User Keir Fraser +# 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 + +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(): diff --git a/16939-hvm-hap-fix.patch b/16939-hvm-hap-fix.patch new file mode 100644 index 0000000..006501f --- /dev/null +++ b/16939-hvm-hap-fix.patch @@ -0,0 +1,21 @@ +# HG changeset patch +# User Keir Fraser +# Date 1201685890 0 +# Node ID 47b7ec3b4055d59a09a1af26a29e8ef90e0d8d9c +# Parent 92aa029e7cb19ac32c7e3ff2a3d78bd67af047f3 +xend: Small fix for hvm/hap flags. +Signed-off-by: Yosuke Iwamatsu + +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(): diff --git a/16945-blktap-strip.patch b/16945-blktap-strip.patch deleted file mode 100644 index 30c582f..0000000 --- a/16945-blktap-strip.patch +++ /dev/null @@ -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); - } diff --git a/16947-fvmachine-xenstore.patch b/16947-fvmachine-xenstore.patch index a9d3e07..0af05d5 100644 --- a/16947-fvmachine-xenstore.patch +++ b/16947-fvmachine-xenstore.patch @@ -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; diff --git a/16962-cross-page-write-failure.patch b/16962-cross-page-write-failure.patch deleted file mode 100644 index dacc47e..0000000 --- a/16962-cross-page-write-failure.patch +++ /dev/null @@ -1,21 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1201864887 0 -# Node ID 3787e70b2ab219de50dff7417917fd9f9ccfcc35 -# Parent 396ab902b02daf14deed0f3261c1c179b7378b4d -x86 shadow: Fix cross-page write emulation failure. -Signed-off-by: Disheng Su - -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 */ diff --git a/16965-xend-leak.patch b/16965-xend-leak.patch deleted file mode 100644 index 86278a7..0000000 --- a/16965-xend-leak.patch +++ /dev/null @@ -1,24 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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) diff --git a/16976-x86_emulate-sahf-fix.patch b/16976-x86_emulate-sahf-fix.patch deleted file mode 100644 index 9bf981f..0000000 --- a/16976-x86_emulate-sahf-fix.patch +++ /dev/null @@ -1,22 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1202207359 0 -# Node ID 32e9c52fc6d9a6104afb2dbd84a89395b16f0e34 -# Parent 99b8ffe250888d0c3fe86b726edf18f620072045 -x86_emulate: Fix SAHF emulation. -Signed-off-by: Xiaohui Xin -Signed-off-by: Kevin Tian - -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 */ diff --git a/16977-xend-restart-count.patch b/16977-xend-restart-count.patch index 1f853d6..9307299 100644 --- a/16977-xend-restart-count.patch +++ b/16977-xend-restart-count.patch @@ -13,11 +13,11 @@ domains, not previous domains. Signed-off-by: Masaki Kanno -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() diff --git a/16980-x86_emulate-macro-fix.patch b/16980-x86_emulate-macro-fix.patch deleted file mode 100644 index 8687e33..0000000 --- a/16980-x86_emulate-macro-fix.patch +++ /dev/null @@ -1,36 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1202226659 0 -# Node ID bf4a24c172d23ae9839ee564225d49ed95167de3 -# Parent 92734271810aaa32d27fce777684649995fb1665 -x86_emulate: fix side-effect macro call. -Signed-off-by: Samuel Thibault - -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; diff --git a/16988-xm-reboot.patch b/16988-xm-reboot.patch deleted file mode 100644 index b6669aa..0000000 --- a/16988-xm-reboot.patch +++ /dev/null @@ -1,62 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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) diff --git a/16989-xend-coredump.patch b/16989-xend-coredump.patch index 4659e58..2b8b0c9 100644 --- a/16989-xend-coredump.patch +++ b/16989-xend-coredump.patch @@ -11,10 +11,10 @@ config files and through the xm tool as well. Signed-off-by: Jim Fehlig -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. """) diff --git a/16995-x86_emulate-mul-fix.patch b/16995-x86_emulate-mul-fix.patch deleted file mode 100644 index 8e9c449..0000000 --- a/16995-x86_emulate-mul-fix.patch +++ /dev/null @@ -1,35 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1202407244 0 -# Node ID 445edf4089a3ccaca977665423e903b5300832cb -# Parent e6cf98edf0c573d86c59863c6b861f9a4d6350c3 -x86_emulate: Fix MUL emulation. -Signed-off-by: Keir Fraser - -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; diff --git a/16998-x86_emulate-imul-fix.patch b/16998-x86_emulate-imul-fix.patch deleted file mode 100644 index 3b37ef0..0000000 --- a/16998-x86_emulate-imul-fix.patch +++ /dev/null @@ -1,20 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# Date 1202412636 0 -# Node ID 1b750b9cf4319c076bb831d26dcdcffbd5cfb913 -# Parent 8e4cd0658c4152a02576892e895e63772bd9df1c -x86_emulate: Fix IMUL r/m8 emulation. -Signed-off-by: Keir Fraser - -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 * diff --git a/17003-qemu-queue-mouse.patch b/17003-qemu-queue-mouse.patch deleted file mode 100644 index 063875c..0000000 --- a/17003-qemu-queue-mouse.patch +++ /dev/null @@ -1,197 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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; diff --git a/17017-hpet-configuration.patch b/17017-hpet-configuration.patch index 216e5c7..4621c75 100644 --- a/17017-hpet-configuration.patch +++ b/17017-hpet-configuration.patch @@ -13,10 +13,10 @@ timer_mode adjustments). Signed-off-by: Dan Magenheimer Signed-off-by: Keir Fraser -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 diff --git a/17036-mismatched-save-rest-fix.patch b/17036-mismatched-save-rest-fix.patch deleted file mode 100644 index 4f6de1f..0000000 --- a/17036-mismatched-save-rest-fix.patch +++ /dev/null @@ -1,235 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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<= 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< 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)); \ diff --git a/17113-xend-restore.patch b/17113-xend-restore.patch deleted file mode 100644 index 777fbd5..0000000 --- a/17113-xend-restore.patch +++ /dev/null @@ -1,27 +0,0 @@ -# HG changeset patch -# User Keir Fraser -# 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 - -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() diff --git a/17124-numa-free-memory-size.patch b/17124-numa-free-memory-size.patch new file mode 100644 index 0000000..2b19ace --- /dev/null +++ b/17124-numa-free-memory-size.patch @@ -0,0 +1,85 @@ +# HG changeset patch +# User Keir Fraser +# 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 + +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] diff --git a/17131-numa-set-vcpu-affinity.patch b/17131-numa-set-vcpu-affinity.patch new file mode 100644 index 0000000..41786f5 --- /dev/null +++ b/17131-numa-set-vcpu-affinity.patch @@ -0,0 +1,52 @@ +# HG changeset patch +# User Keir Fraser +# Date 1204118269 0 +# Node ID b58180cf8ab8c69def4129f7152f136daf5e1596 +# Parent 2b940e46857c0ddf5ef1e255e201a42caf310df6 +xend: Set default vcpu affinity for better performance in NUMA systems. +Signed-off-by: Duan Ronghui + +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 diff --git a/17190-remove-hap-boot-param.patch b/17190-remove-hap-boot-param.patch new file mode 100644 index 0000000..6a457b3 --- /dev/null +++ b/17190-remove-hap-boot-param.patch @@ -0,0 +1,44 @@ +# HG changeset patch +# User Keir Fraser +# 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 + +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 + #include + +-/* +- * 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) diff --git a/17191-remove-hap-boot-param-doc.patch b/17191-remove-hap-boot-param-doc.patch new file mode 100644 index 0000000..e903b76 --- /dev/null +++ b/17191-remove-hap-boot-param-doc.patch @@ -0,0 +1,22 @@ +# HG changeset patch +# User Keir Fraser +# Date 1204715870 0 +# Node ID 1166ee0f476539a2cd5830854b7a22d5004ed291 +# Parent f85b379fa9436be0ecd733d7bedbebdf1838a310 +docs: Remove 'hap' boot parameter from the user manual. +Signed-off-by: Keir Fraser + +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 diff --git a/17xxx-xenapi-defaults.patch b/17xxx-xenapi-defaults.patch new file mode 100644 index 0000000..40f272f --- /dev/null +++ b/17xxx-xenapi-defaults.patch @@ -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 diff --git a/32on64-extra-mem.patch b/32on64-extra-mem.patch index e90c31a..bcca9ea 100644 --- a/32on64-extra-mem.patch +++ b/32on64-extra-mem.patch @@ -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 diff --git a/blktap.patch b/blktap.patch index 22eb296..84879c0 100644 --- a/blktap.patch +++ b/blktap.patch @@ -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); diff --git a/block-losetup-retry.diff b/block-losetup-retry.diff index 6cc3890..222bb48 100644 --- a/block-losetup-retry.diff +++ b/block-losetup-retry.diff @@ -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 diff --git a/cdrom-removable.patch b/cdrom-removable.patch index d5dea42..0d93f4d 100644 --- a/cdrom-removable.patch +++ b/cdrom-removable.patch @@ -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)) { diff --git a/const-set-trap-table-arg.patch b/const-set-trap-table-arg.patch index b4bfdd1..0668053 100644 --- a/const-set-trap-table-arg.patch +++ b/const-set-trap-table-arg.patch @@ -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 #include @@ -10,7 +10,7 @@ Index: 2008-01-18/xen/arch/x86/traps.c #include #include #include -@@ -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 */ }; diff --git a/ept-novell-i386.patch b/ept-novell-i386.patch new file mode 100644 index 0000000..75423be --- /dev/null +++ b/ept-novell-i386.patch @@ -0,0 +1,1015 @@ +Index: xen-3.2-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 +@@ -20,6 +20,7 @@ + #include + + #define SCRATCH_PFN 0xFFFFF ++#define HVM_IDENT_PT_PAGE 0xE8000 + + static void build_e820map(void *e820_page, unsigned long long mem_size) + { +@@ -154,6 +155,7 @@ static int setup_guest(int xc_handle, + struct xen_add_to_physmap xatp; + struct shared_info *shared_info; + void *e820_page; ++ uint32_t *ident_pt; + struct elf_binary elf; + uint64_t v_start, v_end; + int rc; +@@ -254,6 +256,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); + ++ /* Fill it with 32-bit, non-PAE superpage entries, each mapping 4MB ++ * of virtual address space onto the same physical address range */ ++ if ( (ident_pt = xc_map_foreign_range( ++ xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, ++ HVM_IDENT_PT_PAGE >> PAGE_SHIFT)) == NULL ) ++ goto error_out; ++ for ( i = 0; i < PAGE_SIZE / sizeof(*ident_pt); i++ ) ++ ident_pt[i] = (i << 22) | _PAGE_PRESENT | _PAGE_RW | _PAGE_USER ++ | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_PSE; ++ munmap(ident_pt , PAGE_SIZE); ++ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT, HVM_IDENT_PT_PAGE); ++ + /* Insert JMP 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 +=================================================================== +--- xen-3.2-testing.orig/xen/arch/x86/hvm/hvm.c ++++ xen-3.2-testing/xen/arch/x86/hvm/hvm.c +@@ -1954,6 +1954,10 @@ long do_hvm_op(unsigned long op, XEN_GUE + } + d->arch.hvm_domain.params[a.index] = a.value; + rc = 0; ++ ++ if ( paging_mode_hap(d) && (a.index == HVM_PARAM_IDENT_PT) ) ++ for_each_vcpu(d, v) ++ paging_update_cr3(v); + } + else + { +Index: xen-3.2-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 +@@ -105,11 +105,23 @@ static void vmx_init_vmcs_config(void) + + if ( _vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS ) + { +- min = 0; +- opt = (SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | +- SECONDARY_EXEC_WBINVD_EXITING); ++ u32 min2 = 0, opt2; ++ ++ opt2 = SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | ++ SECONDARY_EXEC_WBINVD_EXITING | ++ SECONDARY_EXEC_ENABLE_EPT; + _vmx_secondary_exec_control = adjust_vmx_controls( +- min, opt, MSR_IA32_VMX_PROCBASED_CTLS2); ++ min2, opt2, MSR_IA32_VMX_PROCBASED_CTLS2); ++ ++ if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT ) ++ { ++ /* INVLPG and CR3 accesses don't need to cause VMExits */ ++ min &= ~(CPU_BASED_INVLPG_EXITING | ++ CPU_BASED_CR3_LOAD_EXITING | ++ CPU_BASED_CR3_STORE_EXITING); ++ _vmx_cpu_based_exec_control = adjust_vmx_controls( ++ min, opt, MSR_IA32_VMX_PROCBASED_CTLS); ++ } + } + + #if defined(__i386__) +@@ -301,6 +313,8 @@ int vmx_cpu_up(void) + return 0; + } + ++ ept_sync_all(); ++ + return 1; + } + +@@ -439,6 +453,7 @@ void vmx_disable_intercept_for_msr(struc + + static int construct_vmcs(struct vcpu *v) + { ++ struct domain *d = v->domain; + uint16_t sysenter_cs; + unsigned long sysenter_eip; + +@@ -448,10 +463,23 @@ static int construct_vmcs(struct vcpu *v + __vmwrite(PIN_BASED_VM_EXEC_CONTROL, vmx_pin_based_exec_control); + __vmwrite(VM_EXIT_CONTROLS, vmx_vmexit_control); + __vmwrite(VM_ENTRY_CONTROLS, vmx_vmentry_control); +- __vmwrite(CPU_BASED_VM_EXEC_CONTROL, vmx_cpu_based_exec_control); ++ + v->arch.hvm_vmx.exec_control = vmx_cpu_based_exec_control; +- if ( vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS ) +- __vmwrite(SECONDARY_VM_EXEC_CONTROL, vmx_secondary_exec_control); ++ v->arch.hvm_vmx.secondary_exec_control = vmx_secondary_exec_control; ++ ++ if ( paging_mode_shadow(d) ) ++ { ++ v->arch.hvm_vmx.exec_control |= CPU_BASED_INVLPG_EXITING | ++ CPU_BASED_CR3_LOAD_EXITING | ++ CPU_BASED_CR3_STORE_EXITING; ++ v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_EPT; ++ } ++ ++ if ( cpu_has_vmx_secondary_exec_control ) ++ __vmwrite(SECONDARY_VM_EXEC_CONTROL, ++ v->arch.hvm_vmx.secondary_exec_control); ++ ++ __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control); + + /* MSR access bitmap. */ + if ( cpu_has_vmx_msr_bitmap ) +@@ -569,7 +597,10 @@ static int construct_vmcs(struct vcpu *v + __vmwrite(VMCS_LINK_POINTER_HIGH, ~0UL); + #endif + +- __vmwrite(EXCEPTION_BITMAP, HVM_TRAP_MASK | (1U << TRAP_page_fault)); ++ if ( paging_mode_hap(d) ) ++ __vmwrite(EXCEPTION_BITMAP, HVM_TRAP_MASK); ++ else ++ __vmwrite(EXCEPTION_BITMAP, HVM_TRAP_MASK | (1U << TRAP_page_fault)); + + v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET; + hvm_update_guest_cr(v, 0); +@@ -584,6 +615,19 @@ static int construct_vmcs(struct vcpu *v + __vmwrite(TPR_THRESHOLD, 0); + } + ++ if ( paging_mode_hap(d) ) ++ { ++ v->arch.hvm_vmx.ept_control.etmt = EPT_DEFAULT_MT; ++ v->arch.hvm_vmx.ept_control.gaw = EPT_DEFAULT_GAW; ++ v->arch.hvm_vmx.ept_control.asr = ++ pagetable_get_pfn(d->arch.phys_table); ++ ++ __vmwrite(EPT_POINTER, v->arch.hvm_vmx.ept_control.eptp); ++#ifdef CONFIG_X86_PAE ++ __vmwrite(EPT_POINTER_HIGH, v->arch.hvm_vmx.ept_control.eptp >> 32); ++#endif ++ } ++ + vmx_vmcs_exit(v); + + paging_update_paging_modes(v); /* will update HOST & GUEST_CR3 as reqd */ +@@ -929,6 +973,8 @@ void vmcs_dump_vcpu(struct vcpu *v) + (uint32_t)vmr(IDT_VECTORING_ERROR_CODE)); + printk("TPR Threshold = 0x%02x\n", + (uint32_t)vmr(TPR_THRESHOLD)); ++ printk("EPT pointer = 0x%08x%08x\n", ++ (uint32_t)vmr(EPT_POINTER_HIGH), (uint32_t)vmr(EPT_POINTER)); + + vmx_vmcs_exit(v); + } +Index: xen-3.2-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 + return rc; + } + ++ ept_sync_domain(v); ++ + vmx_install_vlapic_mapping(v); + + #ifndef VMXASSIST +@@ -530,20 +532,23 @@ static int vmx_restore_cr0_cr3( + unsigned long mfn = 0; + p2m_type_t p2mt; + +- if ( cr0 & X86_CR0_PG ) ++ if ( paging_mode_shadow(v->domain) ) + { +- mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt)); +- if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) ) ++ if ( cr0 & X86_CR0_PG ) + { +- gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3); +- return -EINVAL; ++ mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt)); ++ if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) ) ++ { ++ gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3); ++ return -EINVAL; ++ } + } +- } + +- if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG ) +- put_page(pagetable_get_page(v->arch.guest_table)); ++ if ( hvm_paging_enabled(v) ) ++ put_page(pagetable_get_page(v->arch.guest_table)); + +- v->arch.guest_table = pagetable_from_pfn(mfn); ++ v->arch.guest_table = pagetable_from_pfn(mfn); ++ } + + 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 + return hvm_intblk_none; + } + ++/* the caller needs to check if the guest is switching to PAE mode */ ++static void vmx_load_pdptrs(struct vcpu *v) ++{ ++ unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3], mfn; ++ p2m_type_t p2mt; ++ char *p; ++ u64 *guest_pdptrs; ++ ++ if ( cr3 & 0x1fUL ) ++ { ++ domain_crash(v->domain); ++ return; ++ } ++ ++ mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt)); ++ p = map_domain_page(mfn); ++ ++ guest_pdptrs = (u64 *)(p + (cr3 & ~PAGE_MASK)); ++ ++ /* TODO: check if guest PDPTRS are valid */ ++ ++ vmx_vmcs_enter(v); ++ ++ __vmwrite(GUEST_PDPTR0, guest_pdptrs[0]); ++ __vmwrite(GUEST_PDPTR1, guest_pdptrs[1]); ++ __vmwrite(GUEST_PDPTR2, guest_pdptrs[2]); ++ __vmwrite(GUEST_PDPTR3, guest_pdptrs[3]); ++#ifdef CONFIG_X86_PAE ++ __vmwrite(GUEST_PDPTR0_HIGH, guest_pdptrs[0] >> 32); ++ __vmwrite(GUEST_PDPTR1_HIGH, guest_pdptrs[1] >> 32); ++ __vmwrite(GUEST_PDPTR2_HIGH, guest_pdptrs[2] >> 32); ++ __vmwrite(GUEST_PDPTR3_HIGH, guest_pdptrs[3] >> 32); ++#endif ++ ++ vmx_vmcs_exit(v); ++ ++ unmap_domain_page(p); ++} ++ + 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); + } + ++ if ( paging_mode_hap(v->domain) ) ++ { ++ if ( hvm_paging_enabled(v) ) ++ v->arch.hvm_vmx.exec_control &= ~(CPU_BASED_CR3_LOAD_EXITING | ++ CPU_BASED_CR3_STORE_EXITING); ++ else ++ v->arch.hvm_vmx.exec_control |= CPU_BASED_CR3_LOAD_EXITING | ++ CPU_BASED_CR3_STORE_EXITING; ++ __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control); ++ } ++ + v->arch.hvm_vcpu.hw_cr[0] = + v->arch.hvm_vcpu.guest_cr[0] | +- X86_CR0_NE | X86_CR0_PG | X86_CR0_WP | X86_CR0_PE; ++ X86_CR0_NE | X86_CR0_PG | X86_CR0_PE; ++ ++ if ( paging_mode_shadow(v->domain) ) ++ v->arch.hvm_vcpu.hw_cr[0] |= X86_CR0_WP; ++ + __vmwrite(GUEST_CR0, v->arch.hvm_vcpu.hw_cr[0]); + __vmwrite(CR0_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[0]); ++ vmx_update_guest_cr(v, 4); ++ + break; + case 2: + /* CR2 is updated in exit stub. */ + break; + case 3: ++ if ( paging_mode_hap(v->domain) ) ++ { ++ if ( !hvm_paging_enabled(v) ) ++ v->arch.hvm_vcpu.hw_cr[3] = ++ v->domain->arch.hvm_domain.params[HVM_PARAM_IDENT_PT]; ++ ++ /* EPT needs to load PDPTRS into VMCS for PAE. */ ++ if ( hvm_pae_enabled(v) && ++ !(v->arch.hvm_vcpu.guest_efer & EFER_LMA) ) ++ vmx_load_pdptrs(v); ++ } + __vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr[3]); + break; + case 4: +- v->arch.hvm_vcpu.hw_cr[4] = +- v->arch.hvm_vcpu.guest_cr[4] | HVM_CR4_HOST_MASK; ++ v->arch.hvm_vcpu.hw_cr[4] = HVM_CR4_HOST_MASK; ++ if ( paging_mode_hap(v->domain) ) ++ v->arch.hvm_vcpu.hw_cr[4] &= ~X86_CR4_PAE; ++ v->arch.hvm_vcpu.hw_cr[4] |= v->arch.hvm_vcpu.guest_cr[4]; ++ if ( paging_mode_hap(v->domain) && !hvm_paging_enabled(v) ) ++ { ++ v->arch.hvm_vcpu.hw_cr[4] |= X86_CR4_PSE; ++ if ( v->arch.hvm_vcpu.guest_cr[4] & X86_CR4_PAE ) ++ v->arch.hvm_vcpu.hw_cr[4] &= ~X86_CR4_PAE; ++ } + __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 + + static struct hvm_function_table vmx_function_table = { + .name = "VMX", ++ .p2m_init = ept_p2m_init, + .domain_initialise = vmx_domain_initialise, + .domain_destroy = vmx_domain_destroy, + .vcpu_initialise = vmx_vcpu_initialise, +@@ -1178,6 +1259,12 @@ void start_vmx(void) + return; + } + ++ if ( cpu_has_vmx_ept ) ++ { ++ printk("VMX: EPT is available.\n"); ++ vmx_function_table.hap_supported = 1; ++ } ++ + setup_vmcs_dump(); + + hvm_enable(&vmx_function_table); +@@ -2690,6 +2777,18 @@ void vmx_wbinvd_intercept(void) + wbinvd(); + } + ++static void ept_handle_violation(unsigned long qualification, paddr_t gpa) ++{ ++ if ( unlikely(((qualification >> 7) & 0x3) != 0x3) ) ++ { ++ domain_crash(current->domain); ++ return; ++ } ++ ++ /* must be MMIO */ ++ handle_mmio(gpa); ++} ++ + static void vmx_failed_vmentry(unsigned int exit_reason, + struct cpu_user_regs *regs) + { +@@ -2729,6 +2828,15 @@ asmlinkage void vmx_vmexit_handler(struc + unsigned long exit_qualification, inst_len = 0; + struct vcpu *v = current; + ++ if ( paging_mode_hap(v->domain) && hvm_paging_enabled(v) ) ++ { ++ __asm__ __volatile__ ("mov"__OS" %%cr2, %0" ++ : "=r"(v->arch.hvm_vcpu.guest_cr[2])); ++ ++ /* __hvm_copy() need this when paging is enabled. */ ++ v->arch.hvm_vcpu.guest_cr[3] = __vmread(GUEST_CR3); ++ } ++ + exit_reason = __vmread(VM_EXIT_REASON); + + hvmtrace_vmexit(v, regs->eip, exit_reason); +@@ -2969,6 +3077,21 @@ asmlinkage void vmx_vmexit_handler(struc + break; + } + ++ case EXIT_REASON_EPT_VIOLATION: ++ { ++ paddr_t gpa = __vmread(GUEST_PHYSICAL_ADDRESS); ++#ifdef CONFIG_X86_PAE ++ gpa |= (paddr_t)__vmread(GUEST_PHYSICAL_ADDRESS_HIGH) << 32; ++#endif ++ exit_qualification = __vmread(EXIT_QUALIFICATION); ++ ept_handle_violation(exit_qualification, gpa); ++ break; ++ } ++ ++ case EXIT_REASON_EPT_MISCONFIG: ++ domain_crash(current->domain); ++ break; ++ + default: + exit_and_crash: + gdprintk(XENLOG_ERR, "Bad vmexit (reason %x)\n", exit_reason); +Index: xen-3.2-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 +@@ -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 +=================================================================== +--- /dev/null ++++ xen-3.2-testing/xen/arch/x86/mm/p2m-ept.c +@@ -0,0 +1,177 @@ ++/* ++ * ept-p2m.c: use the EPT page table as p2m ++ * Copyright (c) 2007, Intel Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple ++ * Place - Suite 330, Boston, MA 02111-1307 USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ept_next_level(struct domain *d, bool_t read_only, ++ ept_entry_t **table, unsigned long *gfn_remainder, ++ u32 shift) ++{ ++ ept_entry_t *ept_entry, *next; ++ u32 index; ++ ++ index = *gfn_remainder >> shift; ++ *gfn_remainder &= (1UL << shift) - 1; ++ ++ ept_entry = (*table) + index; ++ ++ if ( !(ept_entry->epte & 0x7) ) ++ { ++ struct page_info *pg; ++ ++ if ( read_only ) ++ return 0; ++ ++ pg = d->arch.p2m.alloc_page(d); ++ if ( pg == NULL ) ++ return 0; ++ pg->count_info = 1; ++ pg->u.inuse.type_info = 1 | PGT_validated; ++ list_add_tail(&pg->list, &d->arch.p2m.pages); ++ ++ ept_entry->emt = 0; ++ ept_entry->sp_avail = 0; ++ ept_entry->avail1 = 0; ++ ept_entry->mfn = page_to_mfn(pg); ++ ept_entry->rsvd = 0; ++ ept_entry->avail2 = 0; ++ /* 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; ++} ++ ++static int ++ept_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, 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; ++ ept_entry_t *ept_entry; ++ u32 index; ++ int i, rv = 0; ++ ++ /* 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) ) ++ goto out; ++ ++ index = gfn_remainder; ++ ept_entry = table + index; ++ ++ if ( mfn_valid(mfn_x(mfn)) ) ++ { ++ /* Track the highest gfn for which we have ever had a valid mapping */ ++ if ( gfn > d->arch.p2m.max_mapped_pfn ) ++ d->arch.p2m.max_mapped_pfn = gfn; ++ ++ ept_entry->emt = EPT_DEFAULT_MT; ++ ept_entry->sp_avail = 0; ++ ept_entry->avail1 = p2mt; ++ ept_entry->mfn = mfn_x(mfn); ++ ept_entry->rsvd = 0; ++ ept_entry->avail2 = 0; ++ /* last step */ ++ ept_entry->r = ept_entry->w = ept_entry->x = 1; ++ } ++ else ++ ept_entry->epte = 0; ++ ++ /* Success */ ++ rv = 1; ++ ++ out: ++ unmap_domain_page(table); ++ if ( d->vcpu[0] ) ++ ept_sync_domain(d->vcpu[0]); ++ return rv; ++} ++ ++/* Read ept p2m entries */ ++static mfn_t ept_get_entry(struct domain *d, unsigned long gfn, p2m_type_t *t) ++{ ++ ept_entry_t *table = ++ map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table))); ++ unsigned long gfn_remainder = gfn; ++ ept_entry_t *ept_entry; ++ u32 index; ++ int i; ++ mfn_t mfn = _mfn(INVALID_MFN); ++ ++ *t = p2m_mmio_dm; ++ ++ /* This pfn is higher than the highest the p2m map currently holds */ ++ if ( gfn > d->arch.p2m.max_mapped_pfn ) ++ goto out; ++ ++ /* 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) ) ++ goto out; ++ ++ index = gfn_remainder; ++ ept_entry = table + index; ++ ++ if ( (ept_entry->epte & 0x7) == 0x7 ) ++ { ++ if ( ept_entry->avail1 != p2m_invalid ) ++ { ++ *t = ept_entry->avail1; ++ mfn = _mfn(ept_entry->mfn); ++ } ++ } ++ ++ out: ++ unmap_domain_page(table); ++ return mfn; ++} ++ ++static mfn_t ept_get_entry_fast(unsigned long gfn, p2m_type_t *t) ++{ ++ return ept_get_entry(current->domain, gfn, t); ++} ++ ++void ept_p2m_init(struct domain *d) ++{ ++ d->arch.p2m.set_entry = ept_set_entry; ++ d->arch.p2m.get_entry = ept_get_entry; ++ d->arch.p2m.get_entry_fast = ept_get_entry_fast; ++} ++ ++/* ++ * Local variables: ++ * mode: C ++ * c-set-style: "BSD" ++ * c-basic-offset: 4 ++ * tab-width: 4 ++ * indent-tabs-mode: nil ++ * End: ++ */ +Index: xen-3.2-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 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + /* Debugging and auditing of the P2M code? */ + #define P2M_AUDIT 0 +@@ -202,7 +203,7 @@ p2m_next_level(struct domain *d, mfn_t * + + // Returns 0 on error (out of memory) + static int +-set_p2m_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, 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); +@@ -266,14 +267,28 @@ set_p2m_entry(struct domain *d, unsigned + return rv; + } + ++static mfn_t ++p2m_gfn_to_mfn(struct domain *d, unsigned long gfn, p2m_type_t *t); + + /* Init the datastructures for later use by the p2m code */ + void p2m_init(struct domain *d) + { + p2m_lock_init(d); + INIT_LIST_HEAD(&d->arch.p2m.pages); ++ ++ d->arch.p2m.set_entry = p2m_set_entry; ++ d->arch.p2m.get_entry = p2m_gfn_to_mfn; ++ d->arch.p2m.get_entry_fast = p2m_gfn_to_mfn_fast; ++ ++ if ( is_hvm_domain(d) ) ++ hvm_p2m_init(d); + } + ++static inline ++int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt) ++{ ++ return d->arch.p2m.set_entry(d, gfn, mfn, p2mt); ++} + + // Allocate a new p2m table for a domain. + // +@@ -392,8 +407,8 @@ void p2m_teardown(struct domain *d) + p2m_unlock(d); + } + +-mfn_t +-gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t) ++static mfn_t ++p2m_gfn_to_mfn(struct domain *d, unsigned long gfn, p2m_type_t *t) + /* Read another domain's p2m entries */ + { + mfn_t mfn; +Index: xen-3.2-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 +@@ -131,6 +131,27 @@ struct hap_domain { + /************************************************/ + /* p2m handling */ + /************************************************/ ++/* ++ * The upper levels of the p2m pagetable always contain full rights; all ++ * variation in the access control bits is made in the level-1 PTEs. ++ * ++ * In addition to the phys-to-machine translation, each p2m PTE contains ++ * *type* information about the gfn it translates, helping Xen to decide ++ * on the correct course of action when handling a page-fault to that ++ * guest frame. We store the type in the "available" bits of the PTEs ++ * in the table, which gives us 8 possible types on 32-bit systems. ++ * Further expansions of the type system will only be supported on ++ * 64-bit Xen. ++ */ ++typedef enum { ++ p2m_invalid = 0, /* Nothing mapped here */ ++ p2m_ram_rw = 1, /* Normal read/write guest RAM */ ++ p2m_ram_logdirty = 2, /* Temporarily read-only for log-dirty */ ++ p2m_ram_ro = 3, /* Read-only; writes go to the device model */ ++ p2m_mmio_dm = 4, /* Reads and write go to the device model */ ++ p2m_mmio_direct = 5, /* Read/write mapping of genuine MMIO area */ ++} p2m_type_t; ++ + struct p2m_domain { + /* Lock that protects updates to the p2m */ + spinlock_t lock; +@@ -144,6 +165,11 @@ struct p2m_domain { + struct page_info * (*alloc_page )(struct domain *d); + 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 (*get_entry )(struct domain *d, unsigned long gfn, ++ p2m_type_t *p2mt); ++ mfn_t (*get_entry_fast)(unsigned long gfn, p2m_type_t *p2mt); + + /* 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 +=================================================================== +--- xen-3.2-testing.orig/xen/include/asm-x86/hvm/hvm.h ++++ xen-3.2-testing/xen/include/asm-x86/hvm/hvm.h +@@ -60,6 +60,9 @@ struct hvm_function_table { + /* Support Hardware-Assisted Paging? */ + int hap_supported; + ++ /* Initialise p2m resources */ ++ void (*p2m_init)(struct domain *d); ++ + /* + * Initialise/destroy HVM domain/vcpu resources + */ +@@ -127,6 +130,12 @@ struct hvm_function_table { + extern struct hvm_function_table hvm_funcs; + extern int hvm_enabled; + ++static inline void hvm_p2m_init(struct domain *d) ++{ ++ if ( hvm_funcs.p2m_init ) ++ return hvm_funcs.p2m_init(d); ++} ++ + 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 +=================================================================== +--- 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 { + unsigned long msrs[VMX_MSR_COUNT]; + }; + ++#define EPT_DEFAULT_MT 6 ++#define EPT_DEFAULT_GAW 3 ++ + struct arch_vmx_struct { + /* Virtual address of VMCS. */ + struct vmcs_struct *vmcs; +@@ -73,8 +76,19 @@ struct arch_vmx_struct { + int active_cpu; + int launched; + ++ union { ++ struct { ++ u64 etmt :3, ++ gaw :3, ++ rsvd :6, ++ asr :52; ++ }; ++ u64 eptp; ++ } ept_control; ++ + /* Cache of cpu execution control. */ + u32 exec_control; ++ u32 secondary_exec_control; + + #ifdef __x86_64__ + struct vmx_msr_state msr_state; +@@ -111,6 +125,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 ++#define CPU_BASED_CR3_LOAD_EXITING 0x00008000 ++#define CPU_BASED_CR3_STORE_EXITING 0x00010000 + #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; + extern u32 vmx_vmentry_control; + + #define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001 ++#define SECONDARY_EXEC_ENABLE_EPT 0x00000002 + #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 + (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) ++#define cpu_has_vmx_secondary_exec_control \ ++ (vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) ++#define cpu_has_vmx_ept \ ++ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) + + /* GUEST_INTERRUPTIBILITY_INFO flags. */ + #define VMX_INTR_SHADOW_STI 0x00000001 +@@ -195,11 +216,23 @@ enum vmcs_field { + VIRTUAL_APIC_PAGE_ADDR = 0x00002012, + VIRTUAL_APIC_PAGE_ADDR_HIGH = 0x00002013, + APIC_ACCESS_ADDR = 0x00002014, +- APIC_ACCESS_ADDR_HIGH = 0x00002015, ++ APIC_ACCESS_ADDR_HIGH = 0x00002015, ++ EPT_POINTER = 0x0000201a, ++ EPT_POINTER_HIGH = 0x0000201b, ++ GUEST_PHYSICAL_ADDRESS = 0x00002400, ++ GUEST_PHYSICAL_ADDRESS_HIGH = 0x00002401, + VMCS_LINK_POINTER = 0x00002800, + VMCS_LINK_POINTER_HIGH = 0x00002801, + GUEST_IA32_DEBUGCTL = 0x00002802, + GUEST_IA32_DEBUGCTL_HIGH = 0x00002803, ++ GUEST_PDPTR0 = 0x0000280a, ++ GUEST_PDPTR0_HIGH = 0x0000280b, ++ GUEST_PDPTR1 = 0x0000280c, ++ GUEST_PDPTR1_HIGH = 0x0000280d, ++ GUEST_PDPTR2 = 0x0000280e, ++ GUEST_PDPTR2_HIGH = 0x0000280f, ++ GUEST_PDPTR3 = 0x00002810, ++ GUEST_PDPTR3_HIGH = 0x00002811, + 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 +=================================================================== +--- 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 +@@ -23,9 +23,27 @@ + #include + #include + #include +-#include + #include ++#include + #include ++#include ++ ++typedef union { ++ struct { ++ u64 r : 1, ++ w : 1, ++ x : 1, ++ emt : 4, ++ sp_avail : 1, ++ avail1 : 4, ++ mfn : 45, ++ rsvd : 5, ++ avail2 : 2; ++ }; ++ u64 epte; ++} ept_entry_t; ++ ++#define EPT_TABLE_ORDER 9 + + 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); + #define EXIT_REASON_MACHINE_CHECK 41 + #define EXIT_REASON_TPR_BELOW_THRESHOLD 43 + #define EXIT_REASON_APIC_ACCESS 44 ++#define EXIT_REASON_EPT_VIOLATION 48 ++#define EXIT_REASON_EPT_MISCONFIG 49 + #define EXIT_REASON_WBINVD 54 + + /* +@@ -151,12 +171,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" ++#define INVEPT_OPCODE ".byte 0x66,0x0f,0x38,0x80\n" /* m128,r64/32 */ + #define VMXOFF_OPCODE ".byte 0x0f,0x01,0xc4\n" + #define VMXON_OPCODE ".byte 0xf3,0x0f,0xc7\n" + ++#define MODRM_EAX_08 ".byte 0x08\n" /* ECX, [EAX] */ + #define MODRM_EAX_06 ".byte 0x30\n" /* [EAX], with reg/opcode: /6 */ + #define MODRM_EAX_07 ".byte 0x38\n" /* [EAX], with reg/opcode: /7 */ +-#define MODRM_EAX_ECX ".byte 0xc1\n" /* [EAX], [ECX] */ ++#define MODRM_EAX_ECX ".byte 0xc1\n" /* EAX, ECX */ + + static inline void __vmptrld(u64 addr) + { +@@ -240,6 +262,21 @@ static inline void __vm_clear_bit(unsign + __vmwrite(field, __vmread(field) & ~(1UL << bit)); + } + ++static inline void __invept(int ext, u64 eptp, u64 gpa) ++{ ++ struct { ++ u64 eptp, gpa; ++ } operand = {eptp, gpa}; ++ ++ __asm__ __volatile__ ( INVEPT_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 ( +@@ -269,6 +306,29 @@ static inline int __vmxon(u64 addr) + return rc; + } + ++static inline void __ept_sync_domain(void *info) ++{ ++ struct vcpu *v = info; ++ if ( !hvm_funcs.hap_supported ) ++ return; ++ ++ __invept(1, v->arch.hvm_vmx.ept_control.eptp, 0); ++} ++ ++static inline void ept_sync_domain(struct vcpu *v) ++{ ++ __ept_sync_domain(v); ++ smp_call_function(__ept_sync_domain, v, 1, 0); ++} ++ ++static inline void ept_sync_all(void) ++{ ++ if ( !hvm_funcs.hap_supported ) ++ return; ++ ++ __invept(2, 0, 0); ++} ++ + 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 + 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 +=================================================================== +--- xen-3.2-testing.orig/xen/include/asm-x86/p2m.h ++++ xen-3.2-testing/xen/include/asm-x86/p2m.h +@@ -43,27 +43,6 @@ + */ + #define phys_to_machine_mapping ((l1_pgentry_t *)RO_MPT_VIRT_START) + +-/* +- * The upper levels of the p2m pagetable always contain full rights; all +- * variation in the access control bits is made in the level-1 PTEs. +- * +- * In addition to the phys-to-machine translation, each p2m PTE contains +- * *type* information about the gfn it translates, helping Xen to decide +- * on the correct course of action when handling a page-fault to that +- * guest frame. We store the type in the "available" bits of the PTEs +- * in the table, which gives us 8 possible types on 32-bit systems. +- * Further expansions of the type system will only be supported on +- * 64-bit Xen. +- */ +-typedef enum { +- p2m_invalid = 0, /* Nothing mapped here */ +- p2m_ram_rw = 1, /* Normal read/write guest RAM */ +- p2m_ram_logdirty = 2, /* Temporarily read-only for log-dirty */ +- p2m_ram_ro = 3, /* Read-only; writes go to the device model */ +- p2m_mmio_dm = 4, /* Reads and write go to the device model */ +- p2m_mmio_direct = 5, /* Read/write mapping of genuine MMIO area */ +-} p2m_type_t; +- + /* We use bitmaps and maks to handle groups of types */ + #define p2m_to_mask(_t) (1UL << (_t)) + +@@ -92,10 +71,16 @@ static inline p2m_type_t p2m_flags_to_ty + /* Type is stored in the "available" bits, 9, 10 and 11 */ + return (flags >> 9) & 0x7; + } +- ++ + /* Read the current domain's p2m table (through the linear mapping). */ + static inline mfn_t gfn_to_mfn_current(unsigned long gfn, p2m_type_t *t) + { ++ return current->domain->arch.p2m.get_entry_fast(gfn, t); ++} ++ ++/* Read the current domain's p2m table (through the linear mapping). */ ++static inline mfn_t p2m_gfn_to_mfn_fast(unsigned long gfn, p2m_type_t *t) ++{ + mfn_t mfn = _mfn(INVALID_MFN); + p2m_type_t p2mt = p2m_mmio_dm; + /* XXX This is for compatibility with the old model, where anything not +@@ -133,7 +118,11 @@ static inline mfn_t gfn_to_mfn_current(u + } + + /* Read another domain's P2M table, mapping pages as we go */ +-mfn_t gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t); ++static inline ++mfn_t gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t) ++{ ++ return d->arch.p2m.get_entry(d, gfn, t); ++} + + /* General conversion function from gfn to mfn */ + #define gfn_to_mfn(d, g, t) _gfn_to_mfn((d), (g), (t)) +@@ -149,7 +138,7 @@ static inline mfn_t _gfn_to_mfn(struct d + } + if ( likely(current->domain == d) ) + return gfn_to_mfn_current(gfn, t); +- else ++ else + return gfn_to_mfn_foreign(d, gfn, t); + } + +Index: xen-3.2-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 +@@ -83,7 +83,8 @@ + + /* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */ + #define HVM_PARAM_HPET_ENABLED 11 ++#define HVM_PARAM_IDENT_PT 12 + +-#define HVM_NR_PARAMS 12 ++#define HVM_NR_PARAMS 13 + + #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ diff --git a/ept-novell-x64-2m.patch b/ept-novell-x64-2m.patch new file mode 100644 index 0000000..fdc7f80 --- /dev/null +++ b/ept-novell-x64-2m.patch @@ -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 + #include + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/ept-novell-x64.patch b/ept-novell-x64.patch index 4cf97d8..1ccf583 100644 --- a/ept-novell-x64.patch +++ b/ept-novell-x64.patch @@ -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 @@ -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 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 #include @@ -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 #include @@ -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__ */ diff --git a/livemig-ept-novell-x64.patch b/ept-with-livemgr-2m.diff similarity index 70% rename from livemig-ept-novell-x64.patch rename to ept-with-livemgr-2m.diff index b40dbe8..ffd3709 100644 --- a/livemig-ept-novell-x64.patch +++ b/ept-with-livemgr-2m.diff @@ -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 #include #include + #include +#include 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 #include #include @@ -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); diff --git a/migration-cpl-init.patch b/migration-cpl-init.patch new file mode 100644 index 0000000..a00cfe6 --- /dev/null +++ b/migration-cpl-init.patch @@ -0,0 +1,16 @@ +Signed-off-by: Robert Plillips +Signed-off-by: Ben Guthro + +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)); diff --git a/ns_tools.patch b/ns_tools.patch index 314bc6f..ad2b51f 100644 --- a/ns_tools.patch +++ b/ns_tools.patch @@ -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. """ diff --git a/ns_xen_base.patch b/ns_xen_base.patch index f30bcb7..3926c00 100644 --- a/ns_xen_base.patch +++ b/ns_xen_base.patch @@ -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 #include @@ -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 #include #include +#include - #include 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 #include @@ -220,7 +241,7 @@ Index: xen-3.2-testing/xen/arch/x86/hvm/hvm.c #include #include #include -@@ -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 @@ -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 */ diff --git a/qemu-security-etch1.diff b/qemu-security-etch1.diff index f820e2c..e2f1eea 100644 --- a/qemu-security-etch1.diff +++ b/qemu-security-etch1.diff @@ -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; diff --git a/vnc-i18n-keys.diff b/vnc-i18n-keys.diff index 0be1881..7941f84 100644 --- a/vnc-i18n-keys.diff +++ b/vnc-i18n-keys.diff @@ -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') diff --git a/vpid-novell.patch b/vpid-novell-i386.patch similarity index 100% rename from vpid-novell.patch rename to vpid-novell-i386.patch diff --git a/vpid-novell-x64.patch b/vpid-novell-x64.patch new file mode 100644 index 0000000..f7b7e77 --- /dev/null +++ b/vpid-novell-x64.patch @@ -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 + #include + ++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 + #include + #include ++#include + #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) + { diff --git a/x86_emulate.patch b/x86_emulate.patch index 31d07ca..548c989 100644 --- a/x86_emulate.patch +++ b/x86_emulate.patch @@ -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 #include @@ -144,7 +144,7 @@ Index: xen-3.2-testing/xen/arch/x86/x86_emulate.c #endif #include -@@ -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, diff --git a/xen-3.2-testing-src.tar.bz2 b/xen-3.2-testing-src.tar.bz2 deleted file mode 100644 index e3140ac..0000000 --- a/xen-3.2-testing-src.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8861bb05830342cad2424e1c1d26ce002fbbbaffbb5c7bfcc08ffd6f52dbccfb -size 5460134 diff --git a/xen-3.2.1-testing-src.tar.bz2 b/xen-3.2.1-testing-src.tar.bz2 new file mode 100644 index 0000000..098393f --- /dev/null +++ b/xen-3.2.1-testing-src.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53d07207f8907ba02d152852ff216695c07be2e97b53bac025ac991542aef08f +size 5467794 diff --git a/xen-domUloader.diff b/xen-domUloader.diff index 62e92ec..b499168 100644 --- a/xen-domUloader.diff +++ b/xen-domUloader.diff @@ -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)) diff --git a/xen-fbback-resize.patch b/xen-fbback-resize.patch index 939df20..9051b70 100644 --- a/xen-fbback-resize.patch +++ b/xen-fbback-resize.patch @@ -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', diff --git a/xen-hvm-default-bridge.diff b/xen-hvm-default-bridge.diff index cfef793..e8a10c1 100644 --- a/xen-hvm-default-bridge.diff +++ b/xen-hvm-default-bridge.diff @@ -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=') # -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 diff --git a/xen-hvm-default-pae.diff b/xen-hvm-default-pae.diff index c804751..1444329 100644 --- a/xen-hvm-default-pae.diff +++ b/xen-hvm-default-pae.diff @@ -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) diff --git a/xen-ioemu-hvm-pv-support.diff b/xen-ioemu-hvm-pv-support.diff index 538aa8a..108d28d 100644 --- a/xen-ioemu-hvm-pv-support.diff +++ b/xen-ioemu-hvm-pv-support.diff @@ -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 -@@ -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); diff --git a/xen-max-free-mem.diff b/xen-max-free-mem.diff index bc049b2..d670a9f 100644 --- a/xen-max-free-mem.diff +++ b/xen-max-free-mem.diff @@ -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 diff --git a/xen-no-dummy-nfs-ip.diff b/xen-no-dummy-nfs-ip.diff index 5e747dd..b2e325a 100644 --- a/xen-no-dummy-nfs-ip.diff +++ b/xen-no-dummy-nfs-ip.diff @@ -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': diff --git a/xen-tightvnc-args.diff b/xen-tightvnc-args.diff index 1775ba1..1e0a26e 100644 --- a/xen-tightvnc-args.diff +++ b/xen-tightvnc-args.diff @@ -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. """ diff --git a/xen-xm-top-needs-root.diff b/xen-xm-top-needs-root.diff index fa4c366..ad1dd0c 100644 --- a/xen-xm-top-needs-root.diff +++ b/xen-xm-top-needs-root.diff @@ -1,11 +1,11 @@ From: Charles Coffing 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) diff --git a/xen.changes b/xen.changes index 3bb13d3..a6825bc 100644 --- a/xen.changes +++ b/xen.changes @@ -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 diff --git a/xen.spec b/xen.spec index 39f0fcd..bf36834 100644 --- a/xen.spec +++ b/xen.spec @@ -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 diff --git a/xenapi-console-protocol.patch b/xenapi-console-protocol.patch index b2408c8..2528dfe 100644 --- a/xenapi-console-protocol.patch +++ b/xenapi-console-protocol.patch @@ -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" diff --git a/xend-config.diff b/xend-config.diff index d32c200..b60112c 100644 --- a/xend-config.diff +++ b/xend-config.diff @@ -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 diff --git a/xend-core-dump-loc.diff b/xend-core-dump-loc.diff index ace271b..0b31012 100644 --- a/xend-core-dump-loc.diff +++ b/xend-core-dump-loc.diff @@ -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())