sync with dfa59dade20b7bd14fff98536750be50
OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=137
This commit is contained in:
parent
6d3d103fd9
commit
2d4e82ad73
65
23685-libxl-segfault-fix.patch
Normal file
65
23685-libxl-segfault-fix.patch
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||||
|
# Date 1310654989 -3600
|
||||||
|
# Node ID 5239811f92e1ffb185a50172fdcf47372e71ba7e
|
||||||
|
# Parent 98701b1276c034b2bbbc8c7a975cf4c361caaa63
|
||||||
|
libxl: Fix segfault in get_all_assigned_devices
|
||||||
|
|
||||||
|
pcidevs is an array of ndev elements (ndev is the number of pci devices
|
||||||
|
assigend to a specific domain), but we access pcidevs + *num
|
||||||
|
where *num is the global number of pci devices assigned so far to all
|
||||||
|
domains in the system.
|
||||||
|
|
||||||
|
Fix the issue removing pcidevs and just realloc'ing *list every time we
|
||||||
|
want to add a new pci device to the array.
|
||||||
|
|
||||||
|
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||||
|
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/tools/libxl/libxl_pci.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/libxl/libxl_pci.c
|
||||||
|
+++ xen-4.1.1-testing/tools/libxl/libxl_pci.c
|
||||||
|
@@ -434,7 +434,6 @@ retry_transaction2:
|
||||||
|
|
||||||
|
static int get_all_assigned_devices(libxl__gc *gc, libxl_device_pci **list, int *num)
|
||||||
|
{
|
||||||
|
- libxl_device_pci *pcidevs = NULL;
|
||||||
|
char **domlist;
|
||||||
|
unsigned int nd = 0, i;
|
||||||
|
|
||||||
|
@@ -451,8 +450,7 @@ static int get_all_assigned_devices(libx
|
||||||
|
int ndev = atoi(num_devs), j;
|
||||||
|
char *devpath, *bdf;
|
||||||
|
|
||||||
|
- pcidevs = libxl__calloc(gc, sizeof(*pcidevs), ndev);
|
||||||
|
- for(j = (pcidevs) ? 0 : ndev; j < ndev; j++) {
|
||||||
|
+ for(j = 0; j < ndev; j++) {
|
||||||
|
devpath = libxl__sprintf(gc, "/local/domain/0/backend/pci/%s/0/dev-%u",
|
||||||
|
domlist[i], j);
|
||||||
|
bdf = libxl__xs_read(gc, XBT_NULL, devpath);
|
||||||
|
@@ -461,19 +459,16 @@ static int get_all_assigned_devices(libx
|
||||||
|
if ( sscanf(bdf, PCI_BDF, &dom, &bus, &dev, &func) != 4 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- pcidev_init(pcidevs + *num, dom, bus, dev, func, 0);
|
||||||
|
+ *list = realloc(*list, sizeof(libxl_device_pci) * ((*num) + 1));
|
||||||
|
+ if (*list == NULL)
|
||||||
|
+ return ERROR_NOMEM;
|
||||||
|
+ pcidev_init(*list + *num, dom, bus, dev, func, 0);
|
||||||
|
(*num)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if ( 0 == *num ) {
|
||||||
|
- free(pcidevs);
|
||||||
|
- pcidevs = NULL;
|
||||||
|
- }else{
|
||||||
|
- *list = pcidevs;
|
||||||
|
- }
|
||||||
|
+ libxl__ptr_add(gc, *list);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
60
23732-sedf.patch
Normal file
60
23732-sedf.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User George Dunlap <george.dunlap@eu.citrix.com>
|
||||||
|
# Date 1311255331 -3600
|
||||||
|
# Node ID 3795d79c740b2aa50aacb7bf7e3503862a7b436c
|
||||||
|
# Parent 48f72b389b04cfa8d44924577a69ed59e48fbe77
|
||||||
|
xen: Fix sedf scheduler
|
||||||
|
|
||||||
|
Update the sedf scheduler to be compatible with the most recent
|
||||||
|
generic scheduler interface changes.
|
||||||
|
|
||||||
|
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||||||
|
|
||||||
|
--- a/xen/common/sched_sedf.c
|
||||||
|
+++ b/xen/common/sched_sedf.c
|
||||||
|
@@ -331,6 +331,19 @@ static inline void __add_to_runqueue_sor
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static void sedf_insert_vcpu(const struct scheduler *ops, struct vcpu *v)
|
||||||
|
+{
|
||||||
|
+ if ( !is_idle_vcpu(v) )
|
||||||
|
+ {
|
||||||
|
+ extraq_check(v);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ EDOM_INFO(v)->deadl_abs = 0;
|
||||||
|
+ EDOM_INFO(v)->status &= ~SEDF_ASLEEP;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void *sedf_alloc_vdata(const struct scheduler *ops, struct vcpu *v, void *dd)
|
||||||
|
{
|
||||||
|
struct sedf_vcpu_info *inf;
|
||||||
|
@@ -365,16 +378,6 @@ static void *sedf_alloc_vdata(const stru
|
||||||
|
INIT_LIST_HEAD(&(inf->list));
|
||||||
|
INIT_LIST_HEAD(&(inf->extralist[EXTRA_PEN_Q]));
|
||||||
|
INIT_LIST_HEAD(&(inf->extralist[EXTRA_UTIL_Q]));
|
||||||
|
-
|
||||||
|
- if ( !is_idle_vcpu(v) )
|
||||||
|
- {
|
||||||
|
- extraq_check(v);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- inf->deadl_abs = 0;
|
||||||
|
- inf->status &= ~SEDF_ASLEEP;
|
||||||
|
- }
|
||||||
|
|
||||||
|
return inf;
|
||||||
|
}
|
||||||
|
@@ -1498,6 +1501,8 @@ const struct scheduler sched_sedf_def =
|
||||||
|
.init_domain = sedf_init_domain,
|
||||||
|
.destroy_domain = sedf_destroy_domain,
|
||||||
|
|
||||||
|
+ .insert_vcpu = sedf_insert_vcpu,
|
||||||
|
+
|
||||||
|
.alloc_vdata = sedf_alloc_vdata,
|
||||||
|
.free_vdata = sedf_free_vdata,
|
||||||
|
.alloc_pdata = sedf_alloc_pdata,
|
234
23735-guest-dom0-cap.patch
Normal file
234
23735-guest-dom0-cap.patch
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
References: bnc#702407
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1311407355 -3600
|
||||||
|
# Node ID 537918f518eec3d8e2e2dad403fce40303321523
|
||||||
|
# Parent 42edf1481c5704c8ce1eb171a713b5411df0551a
|
||||||
|
add privileged (dom0) kernel feature indication
|
||||||
|
|
||||||
|
With our switching away from supporting 32-bit Dom0 operation, users
|
||||||
|
complained that attempts (perhaps due to lack of knowledge of that
|
||||||
|
change) to boot the no longer privileged kernel in Dom0 resulted in
|
||||||
|
apparently silent failure. To make the mismatch explicit and visible,
|
||||||
|
add dom0 feature flag that the kernel can set to indicate operation as
|
||||||
|
dom0 is supported.
|
||||||
|
|
||||||
|
Due to the way elf_xen_parse_features() worked up to now (getting
|
||||||
|
fixed here), adding features indications to the old, string based ELF
|
||||||
|
note would make the respective kernel unusable on older hypervisors.
|
||||||
|
For that reason, a new ELF Note is being introduced that allows
|
||||||
|
specifying supported features as a bit array instead (with features
|
||||||
|
unknown to the hypervisor simply ignored, as now also done by
|
||||||
|
elf_xen_parse_features(), whereas here unknown kernel-required
|
||||||
|
features still keep the kernel [and hence VM] from booting).
|
||||||
|
|
||||||
|
Introduce and use elf_note_numeric_array() to be forward
|
||||||
|
compatible (or else an old hypervisor wouldn't be able to parse kernel
|
||||||
|
specified features occupying more than 64 bits - thanks, Ian!).
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1311598088 -3600
|
||||||
|
# Node ID 50ddc200a60cad3929a79a992f09145fd39af49d
|
||||||
|
# Parent d8725d9fb8657874011d2f2772f5e970b24dfe9b
|
||||||
|
fix regression from c/s 23735:537918f518ee
|
||||||
|
|
||||||
|
This was checking presence of the wrong (old) ELF note. I don't really
|
||||||
|
understand how this failed consistently only for one of the xen-boot
|
||||||
|
tests...
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/tools/libxc/xc_dom_elfloader.c
|
||||||
|
+++ b/tools/libxc/xc_dom_elfloader.c
|
||||||
|
@@ -286,6 +286,13 @@ static int xc_dom_parse_elf_kernel(struc
|
||||||
|
if ( (rc = elf_xen_parse(elf, &dom->parms)) != 0 )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
+ if ( elf_xen_feature_get(XENFEAT_dom0, dom->parms.f_required) )
|
||||||
|
+ {
|
||||||
|
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: Kernel does not"
|
||||||
|
+ " support unprivileged (DomU) operation", __FUNCTION__);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* find kernel segment */
|
||||||
|
dom->kernel_seg.vstart = dom->parms.virt_kstart;
|
||||||
|
dom->kernel_seg.vend = dom->parms.virt_kend;
|
||||||
|
--- a/xen/arch/ia64/xen/domain.c
|
||||||
|
+++ b/xen/arch/ia64/xen/domain.c
|
||||||
|
@@ -2164,6 +2164,13 @@ int __init construct_dom0(struct domain
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (parms.elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type != XEN_ENT_NONE &&
|
||||||
|
+ !test_bit(XENFEAT_dom0, parms.f_supported))
|
||||||
|
+ {
|
||||||
|
+ printk("Kernel does not support Dom0 operation\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
p_start = parms.virt_base;
|
||||||
|
pkern_start = parms.virt_kstart;
|
||||||
|
pkern_end = parms.virt_kend;
|
||||||
|
--- a/xen/arch/x86/domain_build.c
|
||||||
|
+++ b/xen/arch/x86/domain_build.c
|
||||||
|
@@ -415,6 +415,13 @@ int __init construct_dom0(
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if ( parms.elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type != XEN_ENT_NONE &&
|
||||||
|
+ !test_bit(XENFEAT_dom0, parms.f_supported) )
|
||||||
|
+ {
|
||||||
|
+ printk("Kernel does not support Dom0 operation\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#if defined(__x86_64__)
|
||||||
|
if ( compat32 )
|
||||||
|
{
|
||||||
|
--- a/xen/common/kernel.c
|
||||||
|
+++ b/xen/common/kernel.c
|
||||||
|
@@ -287,6 +287,8 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL
|
||||||
|
(1U << XENFEAT_auto_translated_physmap);
|
||||||
|
if ( supervisor_mode_kernel )
|
||||||
|
fi.submap |= 1U << XENFEAT_supervisor_mode_kernel;
|
||||||
|
+ if ( current->domain == dom0 )
|
||||||
|
+ fi.submap |= 1U << XENFEAT_dom0;
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
if ( !is_hvm_vcpu(current) )
|
||||||
|
fi.submap |= (1U << XENFEAT_mmu_pt_update_preserve_ad) |
|
||||||
|
--- a/xen/common/libelf/libelf-dominfo.c
|
||||||
|
+++ b/xen/common/libelf/libelf-dominfo.c
|
||||||
|
@@ -26,7 +26,8 @@ static const char *const elf_xen_feature
|
||||||
|
[XENFEAT_writable_descriptor_tables] = "writable_descriptor_tables",
|
||||||
|
[XENFEAT_auto_translated_physmap] = "auto_translated_physmap",
|
||||||
|
[XENFEAT_supervisor_mode_kernel] = "supervisor_mode_kernel",
|
||||||
|
- [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb"
|
||||||
|
+ [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb",
|
||||||
|
+ [XENFEAT_dom0] = "dom0"
|
||||||
|
};
|
||||||
|
static const int elf_xen_features =
|
||||||
|
sizeof(elf_xen_feature_names) / sizeof(elf_xen_feature_names[0]);
|
||||||
|
@@ -82,7 +83,7 @@ int elf_xen_parse_features(const char *f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- if ( i == elf_xen_features )
|
||||||
|
+ if ( i == elf_xen_features && required && feature[0] == '!' )
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -113,6 +114,7 @@ int elf_xen_parse_note(struct elf_binary
|
||||||
|
[XEN_ELFNOTE_LOADER] = { "LOADER", 1},
|
||||||
|
[XEN_ELFNOTE_PAE_MODE] = { "PAE_MODE", 1},
|
||||||
|
[XEN_ELFNOTE_FEATURES] = { "FEATURES", 1},
|
||||||
|
+ [XEN_ELFNOTE_SUPPORTED_FEATURES] = { "SUPPORTED_FEATURES", 0},
|
||||||
|
[XEN_ELFNOTE_BSD_SYMTAB] = { "BSD_SYMTAB", 1},
|
||||||
|
[XEN_ELFNOTE_SUSPEND_CANCEL] = { "SUSPEND_CANCEL", 0 },
|
||||||
|
[XEN_ELFNOTE_MOD_START_PFN] = { "MOD_START_PFN", 0 },
|
||||||
|
@@ -121,6 +123,7 @@ int elf_xen_parse_note(struct elf_binary
|
||||||
|
|
||||||
|
const char *str = NULL;
|
||||||
|
uint64_t val = 0;
|
||||||
|
+ unsigned int i;
|
||||||
|
int type = elf_uval(elf, note, type);
|
||||||
|
|
||||||
|
if ( (type >= sizeof(note_desc) / sizeof(note_desc[0])) ||
|
||||||
|
@@ -199,6 +202,12 @@ int elf_xen_parse_note(struct elf_binary
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case XEN_ELFNOTE_SUPPORTED_FEATURES:
|
||||||
|
+ for ( i = 0; i < XENFEAT_NR_SUBMAPS; ++i )
|
||||||
|
+ parms->f_supported[i] |= elf_note_numeric_array(
|
||||||
|
+ elf, note, sizeof(*parms->f_supported), i);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- a/xen/common/libelf/libelf-tools.c
|
||||||
|
+++ b/xen/common/libelf/libelf-tools.c
|
||||||
|
@@ -227,6 +227,27 @@ uint64_t elf_note_numeric(struct elf_bin
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+uint64_t elf_note_numeric_array(struct elf_binary *elf, const elf_note *note,
|
||||||
|
+ unsigned int unitsz, unsigned int idx)
|
||||||
|
+{
|
||||||
|
+ const void *desc = elf_note_desc(elf, note);
|
||||||
|
+ int descsz = elf_uval(elf, note, descsz);
|
||||||
|
+
|
||||||
|
+ if ( descsz % unitsz || idx >= descsz / unitsz )
|
||||||
|
+ return 0;
|
||||||
|
+ switch (unitsz)
|
||||||
|
+ {
|
||||||
|
+ case 1:
|
||||||
|
+ case 2:
|
||||||
|
+ case 4:
|
||||||
|
+ case 8:
|
||||||
|
+ return elf_access_unsigned(elf, desc, idx * unitsz, unitsz);
|
||||||
|
+ default:
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note)
|
||||||
|
{
|
||||||
|
int namesz = (elf_uval(elf, note, namesz) + 3) & ~3;
|
||||||
|
--- a/xen/include/public/elfnote.h
|
||||||
|
+++ b/xen/include/public/elfnote.h
|
||||||
|
@@ -179,9 +179,22 @@
|
||||||
|
#define XEN_ELFNOTE_MOD_START_PFN 16
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * The features supported by this kernel (numeric).
|
||||||
|
+ *
|
||||||
|
+ * Other than XEN_ELFNOTE_FEATURES on pre-4.2 Xen, this note allows a
|
||||||
|
+ * kernel to specify support for features that older hypervisors don't
|
||||||
|
+ * know about. The set of features 4.2 and newer hypervisors will
|
||||||
|
+ * consider supported by the kernel is the combination of the sets
|
||||||
|
+ * specified through this and the string note.
|
||||||
|
+ *
|
||||||
|
+ * LEGACY: FEATURES
|
||||||
|
+ */
|
||||||
|
+#define XEN_ELFNOTE_SUPPORTED_FEATURES 17
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* The number of the highest elfnote defined.
|
||||||
|
*/
|
||||||
|
-#define XEN_ELFNOTE_MAX XEN_ELFNOTE_MOD_START_PFN
|
||||||
|
+#define XEN_ELFNOTE_MAX XEN_ELFNOTE_SUPPORTED_FEATURES
|
||||||
|
|
||||||
|
/*
|
||||||
|
* System information exported through crash notes.
|
||||||
|
--- a/xen/include/public/features.h
|
||||||
|
+++ b/xen/include/public/features.h
|
||||||
|
@@ -75,7 +75,10 @@
|
||||||
|
#define XENFEAT_hvm_safe_pvclock 9
|
||||||
|
|
||||||
|
/* x86: pirq can be used by HVM guests */
|
||||||
|
-#define XENFEAT_hvm_pirqs 10
|
||||||
|
+#define XENFEAT_hvm_pirqs 10
|
||||||
|
+
|
||||||
|
+/* operation as Dom0 is supported */
|
||||||
|
+#define XENFEAT_dom0 11
|
||||||
|
|
||||||
|
#define XENFEAT_NR_SUBMAPS 1
|
||||||
|
|
||||||
|
--- a/xen/include/xen/libelf.h
|
||||||
|
+++ b/xen/include/xen/libelf.h
|
||||||
|
@@ -179,6 +179,8 @@ const elf_sym *elf_sym_by_index(struct e
|
||||||
|
const char *elf_note_name(struct elf_binary *elf, const elf_note * note);
|
||||||
|
const void *elf_note_desc(struct elf_binary *elf, const elf_note * note);
|
||||||
|
uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note);
|
||||||
|
+uint64_t elf_note_numeric_array(struct elf_binary *, const elf_note *,
|
||||||
|
+ unsigned int unitsz, unsigned int idx);
|
||||||
|
const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note);
|
||||||
|
|
||||||
|
int elf_is_elfbinary(const void *image);
|
43
23746-vtd-cleanup-timers.patch
Normal file
43
23746-vtd-cleanup-timers.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Tim Deegan <Tim.Deegan@citrix.com>
|
||||||
|
# Date 1311608493 -3600
|
||||||
|
# Node ID aa54b8175954bd6ffeb3bcf72e782e133896b388
|
||||||
|
# Parent 9dbbf1631193bb6df679f5eaaee192ef4ef91fd9
|
||||||
|
VT-d: always clean up dpci timers.
|
||||||
|
|
||||||
|
If a VM has all its PCI devices deassigned, need_iommu(d) becomes
|
||||||
|
false but it might still have DPCI EOI timers that were init_timer()d
|
||||||
|
but not yet kill_timer()d. That causes xen to crash later because the
|
||||||
|
linked list of inactive timers gets corrupted, e.g.:
|
||||||
|
|
||||||
|
(XEN) Xen call trace:
|
||||||
|
(XEN) [<ffff82c480126256>] set_timer+0x1c2/0x24f
|
||||||
|
(XEN) [<ffff82c48011fbf8>] schedule+0x129/0x5dd
|
||||||
|
(XEN) [<ffff82c480122c1e>] __do_softirq+0x7e/0x89
|
||||||
|
(XEN) [<ffff82c480122c9d>] do_softirq+0x26/0x28
|
||||||
|
(XEN) [<ffff82c480153c85>] idle_loop+0x5a/0x5c
|
||||||
|
(XEN)
|
||||||
|
(XEN)
|
||||||
|
(XEN) ****************************************
|
||||||
|
(XEN) Panic on CPU 0:
|
||||||
|
(XEN) Assertion 'entry->next->prev == entry' failed at
|
||||||
|
/local/scratch/tdeegan/xen-unstable.hg/xen/include:172
|
||||||
|
(XEN) ****************************************
|
||||||
|
|
||||||
|
The following patch makes sure that the domain destruction path always
|
||||||
|
clears up the DPCI state even if !needs_iommu(d).
|
||||||
|
|
||||||
|
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
|
||||||
|
|
||||||
|
--- a/xen/drivers/passthrough/pci.c
|
||||||
|
+++ b/xen/drivers/passthrough/pci.c
|
||||||
|
@@ -252,9 +252,6 @@ static void pci_clean_dpci_irqs(struct d
|
||||||
|
if ( !iommu_enabled )
|
||||||
|
return;
|
||||||
|
|
||||||
|
- if ( !need_iommu(d) )
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
spin_lock(&d->event_lock);
|
||||||
|
hvm_irq_dpci = domain_get_irq_dpci(d);
|
||||||
|
if ( hvm_irq_dpci != NULL )
|
64
23747-mmcfg-base-address.patch
Normal file
64
23747-mmcfg-base-address.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1311608539 -3600
|
||||||
|
# Node ID b07b6fa766562c990b1d1e59af032feda15c2edb
|
||||||
|
# Parent aa54b8175954bd6ffeb3bcf72e782e133896b388
|
||||||
|
x86-64/MMCFG: correct base address computation for regions not starting at bus 0
|
||||||
|
|
||||||
|
As per the specification, the base address reported by ACPI is the one
|
||||||
|
that would be used if the region started at bus 0. Hence the
|
||||||
|
start_bus_number offset needs to be added not only to the virtual
|
||||||
|
address, but also the physical one when establishing the mapping, and
|
||||||
|
it then needs to be subtracted when obtaining the virtual address for
|
||||||
|
doing accesses.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/x86_64/mmconfig_64.c
|
||||||
|
+++ b/xen/arch/x86/x86_64/mmconfig_64.c
|
||||||
|
@@ -25,7 +25,7 @@ struct mmcfg_virt {
|
||||||
|
static struct mmcfg_virt *pci_mmcfg_virt;
|
||||||
|
static int __initdata mmcfg_pci_segment_shift;
|
||||||
|
|
||||||
|
-static char __iomem *get_virt(unsigned int seg, unsigned bus)
|
||||||
|
+static char __iomem *get_virt(unsigned int seg, unsigned int *bus)
|
||||||
|
{
|
||||||
|
struct acpi_mcfg_allocation *cfg;
|
||||||
|
int cfg_num;
|
||||||
|
@@ -33,9 +33,11 @@ static char __iomem *get_virt(unsigned i
|
||||||
|
for (cfg_num = 0; cfg_num < pci_mmcfg_config_num; cfg_num++) {
|
||||||
|
cfg = pci_mmcfg_virt[cfg_num].cfg;
|
||||||
|
if (cfg->pci_segment == seg &&
|
||||||
|
- (cfg->start_bus_number <= bus) &&
|
||||||
|
- (cfg->end_bus_number >= bus))
|
||||||
|
+ (cfg->start_bus_number <= *bus) &&
|
||||||
|
+ (cfg->end_bus_number >= *bus)) {
|
||||||
|
+ *bus -= cfg->start_bus_number;
|
||||||
|
return pci_mmcfg_virt[cfg_num].virt;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fall back to type 0 */
|
||||||
|
@@ -46,7 +48,7 @@ static char __iomem *pci_dev_base(unsign
|
||||||
|
{
|
||||||
|
char __iomem *addr;
|
||||||
|
|
||||||
|
- addr = get_virt(seg, bus);
|
||||||
|
+ addr = get_virt(seg, &bus);
|
||||||
|
if (!addr)
|
||||||
|
return NULL;
|
||||||
|
return addr + ((bus << 20) | (devfn << 12));
|
||||||
|
@@ -121,8 +123,11 @@ static void __iomem * __init mcfg_iorema
|
||||||
|
if (virt + size < virt || virt + size > PCI_MCFG_VIRT_END)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- map_pages_to_xen(virt, cfg->address >> PAGE_SHIFT,
|
||||||
|
- size >> PAGE_SHIFT, PAGE_HYPERVISOR_NOCACHE);
|
||||||
|
+ if (map_pages_to_xen(virt,
|
||||||
|
+ (cfg->address >> PAGE_SHIFT) +
|
||||||
|
+ (cfg->start_bus_number << (20 - PAGE_SHIFT)),
|
||||||
|
+ size >> PAGE_SHIFT, PAGE_HYPERVISOR_NOCACHE))
|
||||||
|
+ return NULL;
|
||||||
|
|
||||||
|
return (void __iomem *) virt;
|
||||||
|
}
|
389
23749-mmcfg-reservation.patch
Normal file
389
23749-mmcfg-reservation.patch
Normal file
@ -0,0 +1,389 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1311608606 -3600
|
||||||
|
# Node ID e8d1c8f074babcb0e4511393106e80a918a38204
|
||||||
|
# Parent e1717d180897e6e7a04d83a41d86b35ac16912b9
|
||||||
|
x86-64/MMCFG: pass down firmware (ACPI) reservation status of used memory space
|
||||||
|
|
||||||
|
Reserving the MMCFG address range(s) in E820 is specified to only be
|
||||||
|
optional for the firmware to do. The requirement is to have them
|
||||||
|
reserved in ACPI resources. Those, however, aren't directly visible to
|
||||||
|
Xen as they require the ACPI interpreter to be active. Thus, if a
|
||||||
|
range isn't reserved in E820, we should not completely disable use of
|
||||||
|
MMCFG on the respective bus range, but rather keep it disabled until
|
||||||
|
Dom0 can pass down information on the ACPI reservation status (though
|
||||||
|
a new physdevop hypercall).
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/physdev.c
|
||||||
|
+++ b/xen/arch/x86/physdev.c
|
||||||
|
@@ -16,6 +16,10 @@
|
||||||
|
#include <xsm/xsm.h>
|
||||||
|
#include <asm/p2m.h>
|
||||||
|
|
||||||
|
+#ifdef CONFIG_X86_64
|
||||||
|
+#include "x86_64/mmconfig.h"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifndef COMPAT
|
||||||
|
typedef long ret_t;
|
||||||
|
#endif
|
||||||
|
@@ -515,6 +519,24 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef __x86_64__
|
||||||
|
+ case PHYSDEVOP_pci_mmcfg_reserved: {
|
||||||
|
+ struct physdev_pci_mmcfg_reserved info;
|
||||||
|
+
|
||||||
|
+ ret = -EPERM;
|
||||||
|
+ if ( !IS_PRIV(current->domain) )
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ ret = -EFAULT;
|
||||||
|
+ if ( copy_from_guest(&info, arg, 1) )
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ ret = pci_mmcfg_reserved(info.address, info.segment,
|
||||||
|
+ info.start_bus, info.end_bus, info.flags);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
case PHYSDEVOP_restore_msi: {
|
||||||
|
struct physdev_restore_msi restore_msi;
|
||||||
|
struct pci_dev *pdev;
|
||||||
|
--- a/xen/arch/x86/x86_64/mmconfig.h
|
||||||
|
+++ b/xen/arch/x86/x86_64/mmconfig.h
|
||||||
|
@@ -84,6 +84,11 @@ extern int pci_mmcfg_config_num;
|
||||||
|
extern struct acpi_mcfg_allocation *pci_mmcfg_config;
|
||||||
|
|
||||||
|
/* function prototypes */
|
||||||
|
+struct acpi_table_header;
|
||||||
|
int acpi_parse_mcfg(struct acpi_table_header *header);
|
||||||
|
+int pci_mmcfg_reserved(uint64_t address, unsigned int segment,
|
||||||
|
+ unsigned int start_bus, unsigned int end_bus,
|
||||||
|
+ unsigned int flags);
|
||||||
|
int pci_mmcfg_arch_init(void);
|
||||||
|
-void pci_mmcfg_arch_free(void);
|
||||||
|
+int pci_mmcfg_arch_enable(unsigned int);
|
||||||
|
+void pci_mmcfg_arch_disable(unsigned int);
|
||||||
|
--- a/xen/arch/x86/x86_64/mmconfig-shared.c
|
||||||
|
+++ b/xen/arch/x86/x86_64/mmconfig-shared.c
|
||||||
|
@@ -22,10 +22,10 @@
|
||||||
|
#include <asm/e820.h>
|
||||||
|
#include <asm/msr.h>
|
||||||
|
#include <asm/msr-index.h>
|
||||||
|
+#include <public/physdev.h>
|
||||||
|
|
||||||
|
#include "mmconfig.h"
|
||||||
|
|
||||||
|
-static int __initdata known_bridge;
|
||||||
|
unsigned int pci_probe = PCI_PROBE_CONF1 | PCI_PROBE_MMCONF;
|
||||||
|
|
||||||
|
static void __init parse_mmcfg(char *s)
|
||||||
|
@@ -316,26 +316,21 @@ static int __init pci_mmcfg_check_hostbr
|
||||||
|
return name != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
|
||||||
|
-
|
||||||
|
static int __init is_mmconf_reserved(
|
||||||
|
- check_reserved_t is_reserved,
|
||||||
|
u64 addr, u64 size, int i,
|
||||||
|
- typeof(pci_mmcfg_config[0]) *cfg, int with_e820)
|
||||||
|
+ typeof(pci_mmcfg_config[0]) *cfg)
|
||||||
|
{
|
||||||
|
u64 old_size = size;
|
||||||
|
int valid = 0;
|
||||||
|
|
||||||
|
- while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
|
||||||
|
+ while (!e820_all_mapped(addr, addr + size - 1, E820_RESERVED)) {
|
||||||
|
size >>= 1;
|
||||||
|
if (size < (16UL<<20))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size >= (16UL<<20) || size == old_size) {
|
||||||
|
- printk(KERN_NOTICE
|
||||||
|
- "PCI: MCFG area at %lx reserved in %s\n",
|
||||||
|
- addr, with_e820?"E820":"ACPI motherboard resources");
|
||||||
|
+ printk(KERN_NOTICE "PCI: MCFG area at %lx reserved in E820\n", addr);
|
||||||
|
valid = 1;
|
||||||
|
|
||||||
|
if (old_size != size) {
|
||||||
|
@@ -352,15 +347,16 @@ static int __init is_mmconf_reserved(
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void __init pci_mmcfg_reject_broken(void)
|
||||||
|
+static bool_t __init pci_mmcfg_reject_broken(void)
|
||||||
|
{
|
||||||
|
typeof(pci_mmcfg_config[0]) *cfg;
|
||||||
|
int i;
|
||||||
|
+ bool_t valid = 1;
|
||||||
|
|
||||||
|
if ((pci_mmcfg_config_num == 0) ||
|
||||||
|
(pci_mmcfg_config == NULL) ||
|
||||||
|
(pci_mmcfg_config[0].address == 0))
|
||||||
|
- return;
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
cfg = &pci_mmcfg_config[0];
|
||||||
|
|
||||||
|
@@ -374,27 +370,25 @@ static void __init pci_mmcfg_reject_brok
|
||||||
|
size = cfg->end_bus_number + 1 - cfg->start_bus_number;
|
||||||
|
size <<= 20;
|
||||||
|
printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
|
||||||
|
- "segment %hu buses %u - %u\n",
|
||||||
|
+ "segment %04x buses %02x - %02x\n",
|
||||||
|
i, (unsigned long)cfg->address, cfg->pci_segment,
|
||||||
|
(unsigned int)cfg->start_bus_number,
|
||||||
|
(unsigned int)cfg->end_bus_number);
|
||||||
|
|
||||||
|
- if (!is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1))
|
||||||
|
- goto reject;
|
||||||
|
+ if (!is_mmconf_reserved(addr, size, i, cfg) ||
|
||||||
|
+ pci_mmcfg_arch_enable(i)) {
|
||||||
|
+ pci_mmcfg_arch_disable(i);
|
||||||
|
+ valid = 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
-reject:
|
||||||
|
- printk(KERN_INFO "PCI: Not using MMCONFIG.\n");
|
||||||
|
- pci_mmcfg_arch_free();
|
||||||
|
- xfree(pci_mmcfg_config);
|
||||||
|
- pci_mmcfg_config = NULL;
|
||||||
|
- pci_mmcfg_config_num = 0;
|
||||||
|
+ return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init acpi_mmcfg_init(void)
|
||||||
|
{
|
||||||
|
+ bool_t valid = 1;
|
||||||
|
+
|
||||||
|
/* MMCONFIG disabled */
|
||||||
|
if ((pci_probe & PCI_PROBE_MMCONF) == 0)
|
||||||
|
return;
|
||||||
|
@@ -403,16 +397,17 @@ void __init acpi_mmcfg_init(void)
|
||||||
|
if (!(pci_probe & PCI_PROBE_MASK & ~PCI_PROBE_MMCONF))
|
||||||
|
return;
|
||||||
|
|
||||||
|
- /* for late to exit */
|
||||||
|
- if (known_bridge)
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- if (pci_mmcfg_check_hostbridge())
|
||||||
|
- known_bridge = 1;
|
||||||
|
+ if (pci_mmcfg_check_hostbridge()) {
|
||||||
|
+ unsigned int i;
|
||||||
|
|
||||||
|
- if (!known_bridge) {
|
||||||
|
+ pci_mmcfg_arch_init();
|
||||||
|
+ for (i = 0; i < pci_mmcfg_config_num; ++i)
|
||||||
|
+ if (pci_mmcfg_arch_enable(i))
|
||||||
|
+ valid = 0;
|
||||||
|
+ } else {
|
||||||
|
acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
|
||||||
|
- pci_mmcfg_reject_broken();
|
||||||
|
+ pci_mmcfg_arch_init();
|
||||||
|
+ valid = pci_mmcfg_reject_broken();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((pci_mmcfg_config_num == 0) ||
|
||||||
|
@@ -420,9 +415,41 @@ void __init acpi_mmcfg_init(void)
|
||||||
|
(pci_mmcfg_config[0].address == 0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
- if (pci_mmcfg_arch_init()) {
|
||||||
|
+ if (valid)
|
||||||
|
pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int pci_mmcfg_reserved(uint64_t address, unsigned int segment,
|
||||||
|
+ unsigned int start_bus, unsigned int end_bus,
|
||||||
|
+ unsigned int flags)
|
||||||
|
+{
|
||||||
|
+ unsigned int i;
|
||||||
|
+
|
||||||
|
+ if (flags & ~XEN_PCI_MMCFG_RESERVED)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < pci_mmcfg_config_num; ++i) {
|
||||||
|
+ const typeof(pci_mmcfg_config[0]) *cfg = &pci_mmcfg_config[i];
|
||||||
|
+
|
||||||
|
+ if (cfg->pci_segment == segment &&
|
||||||
|
+ cfg->start_bus_number == start_bus &&
|
||||||
|
+ cfg->end_bus_number == end_bus) {
|
||||||
|
+ if (cfg->address != address) {
|
||||||
|
+ printk(KERN_WARNING
|
||||||
|
+ "Base address presented for segment %04x bus %02x-%02x"
|
||||||
|
+ " (%08" PRIx64 ") does not match previously obtained"
|
||||||
|
+ " one (%08" PRIx64 ")\n",
|
||||||
|
+ segment, start_bus, end_bus, address, cfg->address);
|
||||||
|
+ return -EIO;
|
||||||
|
+ }
|
||||||
|
+ if (flags & XEN_PCI_MMCFG_RESERVED)
|
||||||
|
+ return pci_mmcfg_arch_enable(i);
|
||||||
|
+ pci_mmcfg_arch_disable(i);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
--- a/xen/arch/x86/x86_64/mmconfig_64.c
|
||||||
|
+++ b/xen/arch/x86/x86_64/mmconfig_64.c
|
||||||
|
@@ -112,7 +112,8 @@ int pci_mmcfg_write(unsigned int seg, un
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg)
|
||||||
|
+static void __iomem *mcfg_ioremap(const struct acpi_mcfg_allocation *cfg,
|
||||||
|
+ unsigned int prot)
|
||||||
|
{
|
||||||
|
unsigned long virt, size;
|
||||||
|
|
||||||
|
@@ -126,19 +127,55 @@ static void __iomem * __init mcfg_iorema
|
||||||
|
if (map_pages_to_xen(virt,
|
||||||
|
(cfg->address >> PAGE_SHIFT) +
|
||||||
|
(cfg->start_bus_number << (20 - PAGE_SHIFT)),
|
||||||
|
- size >> PAGE_SHIFT, PAGE_HYPERVISOR_NOCACHE))
|
||||||
|
+ size >> PAGE_SHIFT, prot))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return (void __iomem *) virt;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int pci_mmcfg_arch_enable(unsigned int idx)
|
||||||
|
+{
|
||||||
|
+ const typeof(pci_mmcfg_config[0]) *cfg = pci_mmcfg_virt[idx].cfg;
|
||||||
|
+
|
||||||
|
+ if (pci_mmcfg_virt[idx].virt)
|
||||||
|
+ return 0;
|
||||||
|
+ pci_mmcfg_virt[idx].virt = mcfg_ioremap(cfg, PAGE_HYPERVISOR_NOCACHE);
|
||||||
|
+ if (!pci_mmcfg_virt[idx].virt) {
|
||||||
|
+ printk(KERN_ERR "PCI: Cannot map MCFG aperture for segment %04x\n",
|
||||||
|
+ cfg->pci_segment);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+ printk(KERN_INFO "PCI: Using MCFG for segment %04x bus %02x-%02x\n",
|
||||||
|
+ cfg->pci_segment, cfg->start_bus_number, cfg->end_bus_number);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void pci_mmcfg_arch_disable(unsigned int idx)
|
||||||
|
+{
|
||||||
|
+ const typeof(pci_mmcfg_config[0]) *cfg = pci_mmcfg_virt[idx].cfg;
|
||||||
|
+
|
||||||
|
+ pci_mmcfg_virt[idx].virt = NULL;
|
||||||
|
+ /*
|
||||||
|
+ * Don't use destroy_xen_mappings() here, or make sure that at least
|
||||||
|
+ * the necessary L4 entries get populated (so that they get properly
|
||||||
|
+ * propagated to guest domains' page tables).
|
||||||
|
+ */
|
||||||
|
+ mcfg_ioremap(cfg, 0);
|
||||||
|
+ printk(KERN_WARNING "PCI: Not using MCFG for segment %04x bus %02x-%02x\n",
|
||||||
|
+ cfg->pci_segment, cfg->start_bus_number, cfg->end_bus_number);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int __init pci_mmcfg_arch_init(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
+ if (pci_mmcfg_virt)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
pci_mmcfg_virt = xmalloc_array(struct mmcfg_virt, pci_mmcfg_config_num);
|
||||||
|
if (pci_mmcfg_virt == NULL) {
|
||||||
|
printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n");
|
||||||
|
+ pci_mmcfg_config_num = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(pci_mmcfg_virt, 0, sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num);
|
||||||
|
@@ -149,34 +186,5 @@ int __init pci_mmcfg_arch_init(void)
|
||||||
|
++mmcfg_pci_segment_shift;
|
||||||
|
}
|
||||||
|
mmcfg_pci_segment_shift += 20;
|
||||||
|
- for (i = 0; i < pci_mmcfg_config_num; ++i) {
|
||||||
|
- pci_mmcfg_virt[i].virt = mcfg_ioremap(&pci_mmcfg_config[i]);
|
||||||
|
- if (!pci_mmcfg_virt[i].virt) {
|
||||||
|
- printk(KERN_ERR "PCI: Cannot map mmconfig aperture for "
|
||||||
|
- "segment %d\n",
|
||||||
|
- pci_mmcfg_config[i].pci_segment);
|
||||||
|
- pci_mmcfg_arch_free();
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-void __init pci_mmcfg_arch_free(void)
|
||||||
|
-{
|
||||||
|
- int i;
|
||||||
|
-
|
||||||
|
- if (pci_mmcfg_virt == NULL)
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- for (i = 0; i < pci_mmcfg_config_num; ++i) {
|
||||||
|
- if (pci_mmcfg_virt[i].virt) {
|
||||||
|
- iounmap(pci_mmcfg_virt[i].virt);
|
||||||
|
- pci_mmcfg_virt[i].virt = NULL;
|
||||||
|
- pci_mmcfg_virt[i].cfg = NULL;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- xfree(pci_mmcfg_virt);
|
||||||
|
- pci_mmcfg_virt = NULL;
|
||||||
|
-}
|
||||||
|
--- a/xen/arch/x86/x86_64/physdev.c
|
||||||
|
+++ b/xen/arch/x86/x86_64/physdev.c
|
||||||
|
@@ -54,6 +54,10 @@
|
||||||
|
#define physdev_get_free_pirq compat_physdev_get_free_pirq
|
||||||
|
#define physdev_get_free_pirq_t physdev_get_free_pirq_compat_t
|
||||||
|
|
||||||
|
+#define xen_physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved
|
||||||
|
+CHECK_physdev_pci_mmcfg_reserved;
|
||||||
|
+#undef xen_physdev_pci_mmcfg_reserved
|
||||||
|
+
|
||||||
|
#define COMPAT
|
||||||
|
#undef guest_handle_okay
|
||||||
|
#define guest_handle_okay compat_handle_okay
|
||||||
|
--- a/xen/include/public/physdev.h
|
||||||
|
+++ b/xen/include/public/physdev.h
|
||||||
|
@@ -255,6 +255,19 @@ struct physdev_get_free_pirq {
|
||||||
|
typedef struct physdev_get_free_pirq physdev_get_free_pirq_t;
|
||||||
|
DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t);
|
||||||
|
|
||||||
|
+#define XEN_PCI_MMCFG_RESERVED 0x1
|
||||||
|
+
|
||||||
|
+#define PHYSDEVOP_pci_mmcfg_reserved 24
|
||||||
|
+struct physdev_pci_mmcfg_reserved {
|
||||||
|
+ uint64_t address;
|
||||||
|
+ uint16_t segment;
|
||||||
|
+ uint8_t start_bus;
|
||||||
|
+ uint8_t end_bus;
|
||||||
|
+ uint32_t flags;
|
||||||
|
+};
|
||||||
|
+typedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t;
|
||||||
|
+DEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Notify that some PIRQ-bound event channels have been unmasked.
|
||||||
|
* ** This command is obsolete since interface version 0x00030202 and is **
|
||||||
|
--- a/xen/include/xlat.lst
|
||||||
|
+++ b/xen/include/xlat.lst
|
||||||
|
@@ -60,6 +60,7 @@
|
||||||
|
! memory_map memory.h
|
||||||
|
! memory_reservation memory.h
|
||||||
|
! pod_target memory.h
|
||||||
|
+? physdev_pci_mmcfg_reserved physdev.h
|
||||||
|
! sched_poll sched.h
|
||||||
|
? sched_remote_shutdown sched.h
|
||||||
|
? sched_shutdown sched.h
|
74
23762-CVE-2011-3131.patch
Normal file
74
23762-CVE-2011-3131.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Tim Deegan <Tim.Deegan@citrix.com>
|
||||||
|
# Date 1313145221 -3600
|
||||||
|
# Node ID 84e3706df07a1963e23cd3875d8603917657d462
|
||||||
|
# Parent cb22fa57ff252893b6adb1481e09b1287eacd990
|
||||||
|
Passthrough: disable bus-mastering on any card that causes an IOMMU fault.
|
||||||
|
|
||||||
|
This stops the card from raising back-to-back faults and live-locking
|
||||||
|
the CPU that handles them.
|
||||||
|
|
||||||
|
Signed-off-by: Tim Deegan <tim@xen.org>
|
||||||
|
Acked-by: Wei Wang2 <wei.wang2@amd.com>
|
||||||
|
Acked-by: Allen M Kay <allen.m.kay@intel.com>
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/xen/drivers/passthrough/amd/iommu_init.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/xen/drivers/passthrough/amd/iommu_init.c
|
||||||
|
+++ xen-4.1.1-testing/xen/drivers/passthrough/amd/iommu_init.c
|
||||||
|
@@ -462,7 +462,7 @@ static hw_irq_controller iommu_msi_type
|
||||||
|
|
||||||
|
static void parse_event_log_entry(u32 entry[])
|
||||||
|
{
|
||||||
|
- u16 domain_id, device_id;
|
||||||
|
+ u16 domain_id, device_id, bdf, cword;
|
||||||
|
u32 code;
|
||||||
|
u64 *addr;
|
||||||
|
char * event_str[] = {"ILLEGAL_DEV_TABLE_ENTRY",
|
||||||
|
@@ -497,6 +497,18 @@ static void parse_event_log_entry(u32 en
|
||||||
|
"%s: domain = %d, device id = 0x%04x, "
|
||||||
|
"fault address = 0x%"PRIx64"\n",
|
||||||
|
event_str[code-1], domain_id, device_id, *addr);
|
||||||
|
+
|
||||||
|
+ /* Tell the device to stop DMAing; we can't rely on the guest to
|
||||||
|
+ * control it for us. */
|
||||||
|
+ for ( bdf = 0; bdf < ivrs_bdf_entries; bdf++ )
|
||||||
|
+ if ( get_dma_requestor_id(bdf) == device_id )
|
||||||
|
+ {
|
||||||
|
+ cword = pci_conf_read16(PCI_BUS(bdf), PCI_SLOT(bdf),
|
||||||
|
+ PCI_FUNC(bdf), PCI_COMMAND);
|
||||||
|
+ pci_conf_write16(PCI_BUS(bdf), PCI_SLOT(bdf),
|
||||||
|
+ PCI_FUNC(bdf), PCI_COMMAND,
|
||||||
|
+ cword & ~PCI_COMMAND_MASTER);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Index: xen-4.1.1-testing/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
+++ xen-4.1.1-testing/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
@@ -887,7 +887,7 @@ static void iommu_page_fault(int irq, vo
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
u8 fault_reason;
|
||||||
|
- u16 source_id;
|
||||||
|
+ u16 source_id, cword;
|
||||||
|
u32 data;
|
||||||
|
u64 guest_addr;
|
||||||
|
int type;
|
||||||
|
@@ -920,6 +920,14 @@ static void iommu_page_fault(int irq, vo
|
||||||
|
iommu_page_fault_do_one(iommu, type, fault_reason,
|
||||||
|
source_id, guest_addr);
|
||||||
|
|
||||||
|
+ /* Tell the device to stop DMAing; we can't rely on the guest to
|
||||||
|
+ * control it for us. */
|
||||||
|
+ cword = pci_conf_read16(PCI_BUS(source_id), PCI_SLOT(source_id),
|
||||||
|
+ PCI_FUNC(source_id), PCI_COMMAND);
|
||||||
|
+ pci_conf_write16(PCI_BUS(source_id), PCI_SLOT(source_id),
|
||||||
|
+ PCI_FUNC(source_id), PCI_COMMAND,
|
||||||
|
+ cword & ~PCI_COMMAND_MASTER);
|
||||||
|
+
|
||||||
|
fault_index++;
|
||||||
|
if ( fault_index > cap_num_fault_regs(iommu->cap) )
|
||||||
|
fault_index = 0;
|
@ -2,7 +2,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2927,7 +2927,7 @@ class XendDomainInfo:
|
@@ -2926,7 +2926,7 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self.guest_bitsize = self.image.getBitSize()
|
self.guest_bitsize = self.image.getBitSize()
|
||||||
# Make sure there's enough RAM available for the domain
|
# Make sure there's enough RAM available for the domain
|
||||||
|
@ -63,7 +63,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1489,6 +1489,20 @@ class XendDomainInfo:
|
@@ -1488,6 +1488,20 @@ class XendDomainInfo:
|
||||||
target = max_target
|
target = max_target
|
||||||
self.setMemoryTarget(target)
|
self.setMemoryTarget(target)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3130,6 +3130,11 @@ class XendDomainInfo:
|
@@ -3129,6 +3129,11 @@ class XendDomainInfo:
|
||||||
self._cleanup_phantom_devs(paths)
|
self._cleanup_phantom_devs(paths)
|
||||||
self._cleanupVm()
|
self._cleanupVm()
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1297,8 +1297,15 @@ class XendDomainInfo:
|
@@ -1296,8 +1296,15 @@ class XendDomainInfo:
|
||||||
frontpath = self.getDeviceController(deviceClass).frontendPath(dev)
|
frontpath = self.getDeviceController(deviceClass).frontendPath(dev)
|
||||||
backpath = xstransact.Read(frontpath, "backend")
|
backpath = xstransact.Read(frontpath, "backend")
|
||||||
thread.start_new_thread(self.getDeviceController(deviceClass).finishDeviceCleanup, (backpath, path))
|
thread.start_new_thread(self.getDeviceController(deviceClass).finishDeviceCleanup, (backpath, path))
|
||||||
|
74
disable-xl-when-using-xend.patch
Normal file
74
disable-xl-when-using-xend.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
Print a warning and exit xl if xend is running. It is not
|
||||||
|
recommened to use libxenlight in conjunction with legacy xend
|
||||||
|
toolstack.
|
||||||
|
|
||||||
|
xl could be useful even when xend is running, e.g. to debug
|
||||||
|
xend itself, so add a '-f' option to override the exit.
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/tools/libxl/xl.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/libxl/xl.c
|
||||||
|
+++ xen-4.1.1-testing/tools/libxl/xl.c
|
||||||
|
@@ -88,12 +88,16 @@ int main(int argc, char **argv)
|
||||||
|
char *config_file;
|
||||||
|
void *config_data = 0;
|
||||||
|
int config_len = 0;
|
||||||
|
+ int force = 0;
|
||||||
|
|
||||||
|
- while ((opt = getopt(argc, argv, "+v")) >= 0) {
|
||||||
|
+ while ((opt = getopt(argc, argv, "+vf")) >= 0) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'v':
|
||||||
|
if (minmsglevel > 0) minmsglevel--;
|
||||||
|
break;
|
||||||
|
+ case 'f':
|
||||||
|
+ force = 1;
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "unknown global option\n");
|
||||||
|
exit(2);
|
||||||
|
@@ -107,6 +111,22 @@ int main(int argc, char **argv)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
opterr = 0;
|
||||||
|
+ /*
|
||||||
|
+ * On SUSE, if xend is running (and user isn't asking for help),
|
||||||
|
+ * print a warning and exit unless forced.
|
||||||
|
+ */
|
||||||
|
+ if ((system("/usr/sbin/xend status") == 0) && strcmp(cmd, "help")) {
|
||||||
|
+ if (force == 0) {
|
||||||
|
+ fprintf(stderr, "WARNING: xend is running! It is not recommended "
|
||||||
|
+ "using libxenlight in\nconjunction with the legacy xend "
|
||||||
|
+ "toolstack. Use -f (force) to override\n");
|
||||||
|
+ exit(1);
|
||||||
|
+ } else {
|
||||||
|
+ fprintf(stderr, "WARNING: xend is running! It is not recommended "
|
||||||
|
+ "using libxenlight in\nconjunction with the legacy xend "
|
||||||
|
+ "toolstack.\n\n");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
logger = xtl_createlogger_stdiostream(stderr, minmsglevel, 0);
|
||||||
|
if (!logger) exit(1);
|
||||||
|
Index: xen-4.1.1-testing/tools/libxl/xl_cmdimpl.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||||
|
+++ xen-4.1.1-testing/tools/libxl/xl_cmdimpl.c
|
||||||
|
@@ -1725,7 +1725,7 @@ void help(const char *command)
|
||||||
|
struct cmd_spec *cmd;
|
||||||
|
|
||||||
|
if (!command || !strcmp(command, "help")) {
|
||||||
|
- printf("Usage xl [-v] <subcommand> [args]\n\n");
|
||||||
|
+ printf("Usage xl [-v] [-f] <subcommand> [args]\n\n");
|
||||||
|
printf("xl full list of subcommands:\n\n");
|
||||||
|
for (i = 0; i < cmdtable_len; i++)
|
||||||
|
printf(" %-20s%s\n",
|
||||||
|
@@ -1733,7 +1733,7 @@ void help(const char *command)
|
||||||
|
} else {
|
||||||
|
cmd = cmdtable_lookup(command);
|
||||||
|
if (cmd) {
|
||||||
|
- printf("Usage: xl [-v] %s %s\n\n%s.\n\n",
|
||||||
|
+ printf("Usage: xl [-v] [-f] %s %s\n\n%s.\n\n",
|
||||||
|
cmd->cmd_name,
|
||||||
|
cmd->cmd_usage,
|
||||||
|
cmd->cmd_desc);
|
@ -18,7 +18,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
xc = xen.lowlevel.xc.xc()
|
xc = xen.lowlevel.xc.xc()
|
||||||
xoptions = XendOptions.instance()
|
xoptions = XendOptions.instance()
|
||||||
@@ -3299,33 +3299,38 @@ class XendDomainInfo:
|
@@ -3298,33 +3298,38 @@ class XendDomainInfo:
|
||||||
# This is a file, not a device. pygrub can cope with a
|
# This is a file, not a device. pygrub can cope with a
|
||||||
# file if it's raw, but if it's QCOW or other such formats
|
# file if it's raw, but if it's QCOW or other such formats
|
||||||
# used through blktap, then we need to mount it first.
|
# used through blktap, then we need to mount it first.
|
||||||
|
@ -690,15 +690,16 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -508,7 +508,6 @@ class XendDomainInfo:
|
@@ -508,8 +508,6 @@ class XendDomainInfo:
|
||||||
self._setSchedParams()
|
self._setSchedParams()
|
||||||
self._storeVmDetails()
|
self._storeVmDetails()
|
||||||
self._createChannels()
|
self._createChannels()
|
||||||
- self._createDevices()
|
- self._createDevices()
|
||||||
self._storeDomDetails()
|
- self._storeDomDetails()
|
||||||
self._endRestore()
|
self._endRestore()
|
||||||
except:
|
except:
|
||||||
@@ -2368,7 +2367,7 @@ class XendDomainInfo:
|
log.exception('VM resume failed')
|
||||||
|
@@ -2368,7 +2366,7 @@ class XendDomainInfo:
|
||||||
return self.getDeviceController(deviceClass).reconfigureDevice(
|
return self.getDeviceController(deviceClass).reconfigureDevice(
|
||||||
devid, devconfig)
|
devid, devconfig)
|
||||||
|
|
||||||
@ -707,7 +708,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
"""Create the devices for a vm.
|
"""Create the devices for a vm.
|
||||||
|
|
||||||
@raise: VmError for invalid devices
|
@raise: VmError for invalid devices
|
||||||
@@ -2417,7 +2416,7 @@ class XendDomainInfo:
|
@@ -2417,7 +2415,7 @@ class XendDomainInfo:
|
||||||
|
|
||||||
|
|
||||||
if self.image:
|
if self.image:
|
||||||
@ -716,7 +717,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
#if have pass-through devs, need the virtual pci slots info from qemu
|
#if have pass-through devs, need the virtual pci slots info from qemu
|
||||||
self.pci_device_configure_boot()
|
self.pci_device_configure_boot()
|
||||||
@@ -3043,7 +3042,7 @@ class XendDomainInfo:
|
@@ -3043,7 +3041,7 @@ class XendDomainInfo:
|
||||||
self._introduceDomain()
|
self._introduceDomain()
|
||||||
self.image = image.create(self, self.info)
|
self.image = image.create(self, self.info)
|
||||||
if self.image:
|
if self.image:
|
||||||
|
@ -2,7 +2,7 @@ Index: xen-4.1.1-testing/tools/hotplug/Linux/init.d/xencommons
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
--- xen-4.1.1-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
||||||
+++ xen-4.1.1-testing/tools/hotplug/Linux/init.d/xencommons
|
+++ xen-4.1.1-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
@@ -45,6 +45,18 @@ do_start () {
|
@@ -57,6 +57,18 @@ do_start () {
|
||||||
local time=0
|
local time=0
|
||||||
local timeout=30
|
local timeout=30
|
||||||
|
|
||||||
|
58
xen.changes
58
xen.changes
@ -1,3 +1,61 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Aug 15 12:12:06 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- bnc#710035 - update xen_pvdrivers.conf to load pv drivers only
|
||||||
|
when running in a hvm guest
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Aug 15 11:54:08 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- Include gcc46 only when its available (>11.4 && >sles11sp1)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Aug 12 10:50:13 MDT 2011 - carnold@novell.com
|
||||||
|
|
||||||
|
- bnc#712051 - VUL-1: xen: IOMMU fault livelock
|
||||||
|
23762-CVE-2011-3131.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Aug 12 09:43:23 MDT 2011 - carnold@novell.com
|
||||||
|
|
||||||
|
- bnc#711943 - [xl] Fail to create multi-guests with NIC assigned
|
||||||
|
23685-libxl-segfault-fix.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Aug 11 00:36:17 MDT 2011 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- libxenlight and legacy xend toolstack should not be used
|
||||||
|
together. If xend is running, print a warning and exit
|
||||||
|
xl. Add a '-f' (force) option to xl to override this
|
||||||
|
behavior.
|
||||||
|
disable-xl-when-using-xend.patch
|
||||||
|
bnc#707664
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Aug 10 09:08:28 MDT 2011 - carnold@novell.com
|
||||||
|
|
||||||
|
- Upstream patches from Jan
|
||||||
|
23732-sedf.patch
|
||||||
|
23735-guest-dom0-cap.patch
|
||||||
|
23746-vtd-cleanup-timers.patch
|
||||||
|
23747-mmcfg-base-address.patch
|
||||||
|
23749-mmcfg-reservation.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Aug 9 13:38:09 CST 2011 - cyliu@novell.com
|
||||||
|
|
||||||
|
- bnc#704160 - crm resource migrate fails with xen machines
|
||||||
|
update snapshot-xend.patch
|
||||||
|
- bnc#706574 - xm console DomUName hang after "xm save/restore" of
|
||||||
|
PVM on the latest Xen
|
||||||
|
xend-console-port-restore.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Aug 9 16:42:23 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- update xencommons script to run only when needed
|
||||||
|
xencommons-proc-xen.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Jul 22 09:34:34 MDT 2011 - carnold@novell.com
|
Fri Jul 22 09:34:34 MDT 2011 - carnold@novell.com
|
||||||
|
|
||||||
|
79
xen.spec
79
xen.spec
@ -26,6 +26,13 @@ ExclusiveArch: %ix86 x86_64
|
|||||||
%define xen_build_dir xen-4.1.1-testing
|
%define xen_build_dir xen-4.1.1-testing
|
||||||
%define with_kmp 1
|
%define with_kmp 1
|
||||||
%define with_stubdom 1
|
%define with_stubdom 1
|
||||||
|
# EFI requires gcc46 or newer
|
||||||
|
# its available in 12.1 or >= sles11sp2
|
||||||
|
%if %suse_version > 1140 || %suse_version == 1110
|
||||||
|
%define with_gcc46 1
|
||||||
|
%else
|
||||||
|
%define with_gcc46 0
|
||||||
|
%endif
|
||||||
%ifarch x86_64
|
%ifarch x86_64
|
||||||
%define with_dom0_support 1
|
%define with_dom0_support 1
|
||||||
%else
|
%else
|
||||||
@ -72,9 +79,10 @@ BuildRequires: te_latex
|
|||||||
BuildRequires: tetex
|
BuildRequires: tetex
|
||||||
%endif
|
%endif
|
||||||
%ifarch x86_64
|
%ifarch x86_64
|
||||||
# EFI requires gcc45 or newer
|
%if %{?with_gcc46}0
|
||||||
BuildRequires: gcc46
|
BuildRequires: gcc46
|
||||||
BuildRequires: libgcc46 libgcc46-32bit
|
BuildRequires: libgcc46 libgcc46-32bit
|
||||||
|
%endif
|
||||||
BuildRequires: glibc-32bit glibc-devel-32bit
|
BuildRequires: glibc-32bit glibc-devel-32bit
|
||||||
BuildRequires: gcc-32bit
|
BuildRequires: gcc-32bit
|
||||||
BuildRequires: gcc43-32bit
|
BuildRequires: gcc43-32bit
|
||||||
@ -88,8 +96,8 @@ BuildRequires: glibc-devel
|
|||||||
%if %{?with_kmp}0
|
%if %{?with_kmp}0
|
||||||
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
|
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
|
||||||
%endif
|
%endif
|
||||||
Version: 4.1.1_02
|
Version: 4.1.1_05
|
||||||
Release: 3
|
Release: 1
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
Group: System/Kernel
|
Group: System/Kernel
|
||||||
AutoReqProv: on
|
AutoReqProv: on
|
||||||
@ -174,10 +182,17 @@ Patch40: 23614-x86_64-EFI-boot.patch
|
|||||||
Patch41: 23615-x86_64-EFI-runtime.patch
|
Patch41: 23615-x86_64-EFI-runtime.patch
|
||||||
Patch42: 23616-x86_64-EFI-MPS.patch
|
Patch42: 23616-x86_64-EFI-MPS.patch
|
||||||
Patch43: 23676-x86_64-image-map-bounds.patch
|
Patch43: 23676-x86_64-image-map-bounds.patch
|
||||||
Patch44: 23706-fix-20892.patch
|
Patch44: 23685-libxl-segfault-fix.patch
|
||||||
Patch45: 23723-x86-CMOS-lock.patch
|
Patch45: 23706-fix-20892.patch
|
||||||
Patch46: 23724-x86-smpboot-x2apic.patch
|
Patch46: 23723-x86-CMOS-lock.patch
|
||||||
Patch47: 23726-x86-intel-flexmigration.patch
|
Patch47: 23724-x86-smpboot-x2apic.patch
|
||||||
|
Patch48: 23726-x86-intel-flexmigration.patch
|
||||||
|
Patch49: 23732-sedf.patch
|
||||||
|
Patch50: 23735-guest-dom0-cap.patch
|
||||||
|
Patch51: 23746-vtd-cleanup-timers.patch
|
||||||
|
Patch52: 23747-mmcfg-base-address.patch
|
||||||
|
Patch53: 23749-mmcfg-reservation.patch
|
||||||
|
Patch54: 23762-CVE-2011-3131.patch
|
||||||
# Upstream qemu patches
|
# Upstream qemu patches
|
||||||
# Our patches
|
# Our patches
|
||||||
Patch300: xen-config.diff
|
Patch300: xen-config.diff
|
||||||
@ -223,16 +238,17 @@ Patch356: ioemu-vnc-resize.patch
|
|||||||
Patch357: ioemu-debuginfo.patch
|
Patch357: ioemu-debuginfo.patch
|
||||||
Patch358: vif-bridge-no-iptables.patch
|
Patch358: vif-bridge-no-iptables.patch
|
||||||
Patch359: xenconsole-no-multiple-connections.patch
|
Patch359: xenconsole-no-multiple-connections.patch
|
||||||
|
Patch360: disable-xl-when-using-xend.patch
|
||||||
# Needs to go upstream
|
# Needs to go upstream
|
||||||
Patch360: checkpoint-rename.patch
|
Patch370: checkpoint-rename.patch
|
||||||
Patch361: xm-save-check-file.patch
|
Patch371: xm-save-check-file.patch
|
||||||
Patch362: xm-create-xflag.patch
|
Patch372: xm-create-xflag.patch
|
||||||
Patch370: xend-sysconfig.patch
|
Patch373: xend-sysconfig.patch
|
||||||
Patch371: domu-usb-controller.patch
|
Patch374: domu-usb-controller.patch
|
||||||
Patch372: usb-list.patch
|
Patch375: usb-list.patch
|
||||||
Patch373: xend-devid-or-name.patch
|
Patch376: xend-devid-or-name.patch
|
||||||
Patch374: suspend_evtchn_lock.patch
|
Patch377: suspend_evtchn_lock.patch
|
||||||
Patch375: log-guest-console.patch
|
Patch378: log-guest-console.patch
|
||||||
# Patches for snapshot support
|
# Patches for snapshot support
|
||||||
Patch400: snapshot-ioemu-save.patch
|
Patch400: snapshot-ioemu-save.patch
|
||||||
Patch401: snapshot-ioemu-restore.patch
|
Patch401: snapshot-ioemu-restore.patch
|
||||||
@ -276,6 +292,8 @@ Patch450: ioemu-watchdog-support.patch
|
|||||||
Patch451: ioemu-watchdog-linkage.patch
|
Patch451: ioemu-watchdog-linkage.patch
|
||||||
Patch452: ioemu-watchdog-ib700-timer.patch
|
Patch452: ioemu-watchdog-ib700-timer.patch
|
||||||
Patch453: tools-watchdog-support.patch
|
Patch453: tools-watchdog-support.patch
|
||||||
|
Patch454: xend-console-port-restore.patch
|
||||||
|
Patch455: xencommons-proc-xen.patch
|
||||||
# Jim's domain lock patch
|
# Jim's domain lock patch
|
||||||
Patch480: xend-domain-lock.patch
|
Patch480: xend-domain-lock.patch
|
||||||
Patch481: xend-domain-lock-sfex.patch
|
Patch481: xend-domain-lock-sfex.patch
|
||||||
@ -710,6 +728,13 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch45 -p1
|
%patch45 -p1
|
||||||
%patch46 -p1
|
%patch46 -p1
|
||||||
%patch47 -p1
|
%patch47 -p1
|
||||||
|
%patch48 -p1
|
||||||
|
%patch49 -p1
|
||||||
|
%patch50 -p1
|
||||||
|
%patch51 -p1
|
||||||
|
%patch52 -p1
|
||||||
|
%patch53 -p1
|
||||||
|
%patch54 -p1
|
||||||
%patch300 -p1
|
%patch300 -p1
|
||||||
%patch301 -p1
|
%patch301 -p1
|
||||||
%patch302 -p1
|
%patch302 -p1
|
||||||
@ -754,14 +779,15 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch358 -p1
|
%patch358 -p1
|
||||||
%patch359 -p1
|
%patch359 -p1
|
||||||
%patch360 -p1
|
%patch360 -p1
|
||||||
%patch361 -p1
|
|
||||||
%patch362 -p1
|
|
||||||
%patch370 -p1
|
%patch370 -p1
|
||||||
%patch371 -p1
|
%patch371 -p1
|
||||||
%patch372 -p1
|
%patch372 -p1
|
||||||
%patch373 -p1
|
%patch373 -p1
|
||||||
#%patch374 -p1 suspend_evtchn_lock, buildservice build problem
|
%patch374 -p1
|
||||||
%patch375 -p1
|
%patch375 -p1
|
||||||
|
%patch376 -p1
|
||||||
|
#%patch377 -p1 suspend_evtchn_lock, buildservice build problem
|
||||||
|
%patch378 -p1
|
||||||
%patch400 -p1
|
%patch400 -p1
|
||||||
%patch401 -p1
|
%patch401 -p1
|
||||||
%patch402 -p1
|
%patch402 -p1
|
||||||
@ -802,6 +828,8 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch451 -p1
|
%patch451 -p1
|
||||||
%patch452 -p1
|
%patch452 -p1
|
||||||
%patch453 -p1
|
%patch453 -p1
|
||||||
|
%patch454 -p1
|
||||||
|
%patch455 -p1
|
||||||
%patch480 -p1
|
%patch480 -p1
|
||||||
%patch481 -p1
|
%patch481 -p1
|
||||||
%patch500 -p1
|
%patch500 -p1
|
||||||
@ -928,6 +956,12 @@ make -C tools/misc/serial-split install \
|
|||||||
mkdir -p $RPM_BUILD_ROOT/${_libdir}/xen/bin/
|
mkdir -p $RPM_BUILD_ROOT/${_libdir}/xen/bin/
|
||||||
ln -s /usr/lib/xen/bin/qemu-dm $RPM_BUILD_ROOT/%{_libdir}/xen/bin/qemu-dm
|
ln -s /usr/lib/xen/bin/qemu-dm $RPM_BUILD_ROOT/%{_libdir}/xen/bin/qemu-dm
|
||||||
%endif
|
%endif
|
||||||
|
# efi depends on gcc46
|
||||||
|
echo > xen.files.txt
|
||||||
|
if test -d $RPM_BUILD_ROOT%{_libdir}/efi
|
||||||
|
then
|
||||||
|
echo %{_libdir}/efi >> xen.files.txt
|
||||||
|
fi
|
||||||
cp -avL xenalyze.hg/dump-raw $RPM_BUILD_ROOT/%{_bindir}/xenalyze.dump-raw
|
cp -avL xenalyze.hg/dump-raw $RPM_BUILD_ROOT/%{_bindir}/xenalyze.dump-raw
|
||||||
cp -avL xenalyze.hg/xenalyze $RPM_BUILD_ROOT/%{_bindir}
|
cp -avL xenalyze.hg/xenalyze $RPM_BUILD_ROOT/%{_bindir}
|
||||||
%else
|
%else
|
||||||
@ -1072,7 +1106,7 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons
|
|||||||
|
|
||||||
%if %{?with_dom0_support}0
|
%if %{?with_dom0_support}0
|
||||||
|
|
||||||
%files
|
%files -f xen.files.txt
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
/boot/xen-%{version}-%{release}.gz
|
/boot/xen-%{version}-%{release}.gz
|
||||||
/boot/xen-%{xvermaj}.gz
|
/boot/xen-%{xvermaj}.gz
|
||||||
@ -1086,11 +1120,6 @@ rm -f $RPM_BUILD_ROOT/%{_bindir}/xencons
|
|||||||
/boot/xen-syms-dbg
|
/boot/xen-syms-dbg
|
||||||
/boot/xen-syms-dbg-%{version}-%{release}
|
/boot/xen-syms-dbg-%{version}-%{release}
|
||||||
/boot/xen.gz
|
/boot/xen.gz
|
||||||
# EFI
|
|
||||||
%ifarch x86_64
|
|
||||||
%dir %{_libdir}/efi
|
|
||||||
%{_libdir}/efi/xen*.efi
|
|
||||||
%endif
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%files libs
|
%files libs
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# Install the paravirtualized drivers
|
# Install the paravirtualized drivers before native drivers
|
||||||
install libata /sbin/modprobe xen-vbd 2>&1 |:; /sbin/modprobe --ignore-install libata
|
# Use module aliases instead of module names
|
||||||
|
install libata { if test -f /sys/class/dmi/id/product_name -a -f /sys/class/dmi/id/sys_vendor ; then if grep -q "HVM domU" /sys/class/dmi/id/product_name && grep -q "Xen" /sys/class/dmi/id/sys_vendor ; then /sbin/modprobe xen:vbd ; fi ; fi ; } ; /sbin/modprobe --ignore-install libata $CMDLINE_OPTS
|
||||||
|
|
||||||
install 8139cp /sbin/modprobe xen-vnif 2>&1 |:; /sbin/modprobe --ignore-install 8139cp
|
install 8139cp { if test -f /sys/class/dmi/id/product_name -a -f /sys/class/dmi/id/sys_vendor ; then if grep -q "HVM domU" /sys/class/dmi/id/product_name && grep -q "Xen" /sys/class/dmi/id/sys_vendor ; then /sbin/modprobe xen:vif ; fi ; fi ; } ; /sbin/modprobe --ignore-install 8139cp $CMDLINE_OPTS
|
||||||
|
|
||||||
install 8139too /sbin/modprobe xen-vnif 2>&1 |:; /sbin/modprobe --ignore-install 8139too
|
install 8139too { if test -f /sys/class/dmi/id/product_name -a -f /sys/class/dmi/id/sys_vendor ; then if grep -q "HVM domU" /sys/class/dmi/id/product_name && grep -q "Xen" /sys/class/dmi/id/sys_vendor ; then /sbin/modprobe xen:vif ; fi ; fi ; } ; /sbin/modprobe --ignore-install 8139too $CMDLINE_OPTS
|
||||||
|
|
||||||
|
55
xencommons-proc-xen.patch
Normal file
55
xencommons-proc-xen.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# Parent ea18090ab6e3cb3c69d232ec0865589688db3f81
|
||||||
|
hotplug: update xencommons script to run only when needed
|
||||||
|
|
||||||
|
Update the xencommons script to run only when needed:
|
||||||
|
- do not run if /proc/xen does not exist
|
||||||
|
- check if /proc/xen/capabilities exists before doing the grep for dom0
|
||||||
|
- use variable for /proc/xen/capabilities
|
||||||
|
- use grep -q instead of stdout redirection when looking for xenfs,
|
||||||
|
its already used later
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
---
|
||||||
|
tools/hotplug/Linux/init.d/xencommons | 20 ++++++++++++++++----
|
||||||
|
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
+++ xen-4.1.1-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
@@ -27,17 +27,29 @@ fi
|
||||||
|
test -f $xencommons_config/xencommons && . $xencommons_config/xencommons
|
||||||
|
|
||||||
|
XENCONSOLED_PIDFILE=/var/run/xenconsoled.pid
|
||||||
|
+XEN_CAPABILITIES=/proc/xen/capabilities
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
+# not running in Xen dom0 or domU
|
||||||
|
+if ! test -d /proc/xen ; then
|
||||||
|
+ exit 0
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# mount xenfs in dom0 or domU with a pv_ops kernel
|
||||||
|
if test "x$1" = xstart && \
|
||||||
|
- test -d /proc/xen && \
|
||||||
|
- ! test -f /proc/xen/capabilities && \
|
||||||
|
- ! grep '^xenfs ' /proc/mounts >/dev/null;
|
||||||
|
+ ! test -f $XEN_CAPABILITIES && \
|
||||||
|
+ ! grep -q '^xenfs ' /proc/mounts ;
|
||||||
|
then
|
||||||
|
mount -t xenfs xenfs /proc/xen
|
||||||
|
fi
|
||||||
|
|
||||||
|
-if ! grep -q "control_d" /proc/xen/capabilities ; then
|
||||||
|
+# run this script only in dom0:
|
||||||
|
+# no capabilities file in xenlinux kernel
|
||||||
|
+if ! test -f $XEN_CAPABILITIES ; then
|
||||||
|
+ exit 0
|
||||||
|
+fi
|
||||||
|
+# empty capabilities file in pv_ops kernel
|
||||||
|
+if ! grep -q "control_d" $XEN_CAPABILITIES ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
40
xend-console-port-restore.patch
Normal file
40
xend-console-port-restore.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
Pass console_port to completeRestore() so that console/port is written to
|
||||||
|
xenstore. See bnc#706574
|
||||||
|
|
||||||
|
From: Chunyan Liu <cyliu@novell.com>
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
@@ -402,8 +402,7 @@ def restore(xd, fd, dominfo = None, paus
|
||||||
|
restore_image.setCpuid()
|
||||||
|
|
||||||
|
# xc_restore will wait for source to close connection
|
||||||
|
-
|
||||||
|
- dominfo.completeRestore(handler.store_mfn, handler.console_mfn)
|
||||||
|
+ dominfo.completeRestore(handler.store_mfn, handler.console_mfn, console_port)
|
||||||
|
|
||||||
|
wait_devs(dominfo)
|
||||||
|
|
||||||
|
Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
@@ -3052,7 +3052,7 @@ class XendDomainInfo:
|
||||||
|
# TODO: recategorise - called from XendCheckpoint
|
||||||
|
#
|
||||||
|
|
||||||
|
- def completeRestore(self, store_mfn, console_mfn):
|
||||||
|
+ def completeRestore(self, store_mfn, console_mfn, console_port):
|
||||||
|
|
||||||
|
log.debug("XendDomainInfo.completeRestore")
|
||||||
|
|
||||||
|
@@ -3063,6 +3063,7 @@ class XendDomainInfo:
|
||||||
|
self.image = image.create(self, self.info)
|
||||||
|
if self.image:
|
||||||
|
self._createDevices(True)
|
||||||
|
+ self.console_port = console_port
|
||||||
|
self._storeDomDetails()
|
||||||
|
self._registerWatches()
|
||||||
|
self.refreshShutdown()
|
@ -237,7 +237,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
|||||||
dominfo.migrateDevices(network, dst, DEV_MIGRATE_STEP2,
|
dominfo.migrateDevices(network, dst, DEV_MIGRATE_STEP2,
|
||||||
domain_name)
|
domain_name)
|
||||||
log.info("Domain %d suspended.", dominfo.getDomid())
|
log.info("Domain %d suspended.", dominfo.getDomid())
|
||||||
@@ -410,6 +412,7 @@ def restore(xd, fd, dominfo = None, paus
|
@@ -409,6 +411,7 @@ def restore(xd, fd, dominfo = None, paus
|
||||||
if not paused:
|
if not paused:
|
||||||
dominfo.unpause()
|
dominfo.unpause()
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
XendTask.log_progress(0, 30, self._constructDomain)
|
XendTask.log_progress(0, 30, self._constructDomain)
|
||||||
XendTask.log_progress(31, 60, self._initDomain)
|
XendTask.log_progress(31, 60, self._initDomain)
|
||||||
|
|
||||||
@@ -2998,6 +2999,11 @@ class XendDomainInfo:
|
@@ -2997,6 +2998,11 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self._stateSet(DOM_STATE_HALTED)
|
self._stateSet(DOM_STATE_HALTED)
|
||||||
self.domid = None # Do not push into _stateSet()!
|
self.domid = None # Do not push into _stateSet()!
|
||||||
|
@ -123,7 +123,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2291,6 +2291,8 @@ class XendDomainInfo:
|
@@ -2290,6 +2290,8 @@ class XendDomainInfo:
|
||||||
self.info['name_label'], self.domid, self.info['uuid'],
|
self.info['name_label'], self.domid, self.info['uuid'],
|
||||||
new_name, new_uuid)
|
new_name, new_uuid)
|
||||||
self._unwatchVm()
|
self._unwatchVm()
|
||||||
@ -132,7 +132,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._releaseDevices()
|
self._releaseDevices()
|
||||||
# Remove existing vm node in xenstore
|
# Remove existing vm node in xenstore
|
||||||
self._removeVm()
|
self._removeVm()
|
||||||
@@ -2962,6 +2964,9 @@ class XendDomainInfo:
|
@@ -2961,6 +2963,9 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self._createDevices()
|
self._createDevices()
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self.image.cleanupTmpImages()
|
self.image.cleanupTmpImages()
|
||||||
|
|
||||||
self.info['start_time'] = time.time()
|
self.info['start_time'] = time.time()
|
||||||
@@ -2986,6 +2991,8 @@ class XendDomainInfo:
|
@@ -2985,6 +2990,8 @@ class XendDomainInfo:
|
||||||
self.refresh_shutdown_lock.acquire()
|
self.refresh_shutdown_lock.acquire()
|
||||||
try:
|
try:
|
||||||
self.unwatchShutdown()
|
self.unwatchShutdown()
|
||||||
@ -151,14 +151,14 @@ Index: xen-4.1.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._releaseDevices()
|
self._releaseDevices()
|
||||||
bootloader_tidy(self)
|
bootloader_tidy(self)
|
||||||
|
|
||||||
@@ -3070,6 +3077,7 @@ class XendDomainInfo:
|
@@ -3069,6 +3076,7 @@ class XendDomainInfo:
|
||||||
self.image = image.create(self, self.info)
|
self.image = image.create(self, self.info)
|
||||||
if self.image:
|
if self.image:
|
||||||
self._createDevices(True)
|
self._createDevices(True)
|
||||||
+ self.image.createXenPaging()
|
+ self.image.createXenPaging()
|
||||||
|
self.console_port = console_port
|
||||||
self._storeDomDetails()
|
self._storeDomDetails()
|
||||||
self._registerWatches()
|
self._registerWatches()
|
||||||
self.refreshShutdown()
|
|
||||||
@@ -3210,6 +3218,8 @@ class XendDomainInfo:
|
@@ -3210,6 +3218,8 @@ class XendDomainInfo:
|
||||||
# could also fetch a parsed note from xenstore
|
# could also fetch a parsed note from xenstore
|
||||||
fast = self.info.get_notes().get('SUSPEND_CANCEL') and 1 or 0
|
fast = self.info.get_notes().get('SUSPEND_CANCEL') and 1 or 0
|
||||||
|
Loading…
Reference in New Issue
Block a user