- Update to Xen 4.5.0 FCS
- Include systemd presets in 13.2 and older - bnc#897352 - Enable xencommons/xendomains only during fresh install - disable restart on upgrade because the toolstack is not restartable - adjust seabios, vgabios, stubdom and hvmloader build to reduce build-compare noise xen.build-compare.mini-os.patch xen.build-compare.smbiosdate.patch xen.build-compare.ipxe.patch xen.build-compare.vgabios.patch xen.build-compare.seabios.patch xen.build-compare.man.patch - Update to Xen 4.5.0 RC4 - Remove xend specific if-up scripts Recording bridge slaves is a generic task which should be handled by generic network code - Use systemd features from upstream requires updated systemd-presets-branding package - Update to Xen 4.5.0 RC3 - Set GIT, WGET and FTP to /bin/false - Use new configure features instead of make variables OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=337
This commit is contained in:
parent
d7a64b648a
commit
abf8af324b
@ -1,59 +0,0 @@
|
||||
# Commit 8db22866dbbcabf30ad6e3814489c730b53d1cf4
|
||||
# Date 2014-03-04 10:58:19 +0100
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86: don't propagate acpi_skip_timer_override do Dom0
|
||||
|
||||
It's unclear why c/s 4850:923dd9975981 added this - Dom0 isn't
|
||||
controlling the timer interrupt, and hence has no need to know.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Keir Fraser <keir@xen.org>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
--- a/xen/arch/x86/acpi/boot.c
|
||||
+++ b/xen/arch/x86/acpi/boot.c
|
||||
@@ -56,7 +56,9 @@ bool_t __initdata acpi_ht = 1; /* enable
|
||||
bool_t __initdata acpi_lapic;
|
||||
bool_t __initdata acpi_ioapic;
|
||||
|
||||
-bool_t acpi_skip_timer_override __initdata;
|
||||
+/* acpi_skip_timer_override: Skip IRQ0 overrides. */
|
||||
+static bool_t acpi_skip_timer_override __initdata;
|
||||
+boolean_param("acpi_skip_timer_override", acpi_skip_timer_override);
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
|
||||
--- a/xen/arch/x86/setup.c
|
||||
+++ b/xen/arch/x86/setup.c
|
||||
@@ -71,10 +71,6 @@ static void parse_acpi_param(char *s);
|
||||
custom_param("acpi", parse_acpi_param);
|
||||
|
||||
/* **** Linux config option: propagated to domain0. */
|
||||
-/* acpi_skip_timer_override: Skip IRQ0 overrides. */
|
||||
-boolean_param("acpi_skip_timer_override", acpi_skip_timer_override);
|
||||
-
|
||||
-/* **** Linux config option: propagated to domain0. */
|
||||
/* noapic: Disable IOAPIC setup. */
|
||||
boolean_param("noapic", skip_ioapic_setup);
|
||||
|
||||
@@ -1365,9 +1361,6 @@ void __init __start_xen(unsigned long mb
|
||||
/* Append any extra parameters. */
|
||||
if ( skip_ioapic_setup && !strstr(dom0_cmdline, "noapic") )
|
||||
safe_strcat(dom0_cmdline, " noapic");
|
||||
- if ( acpi_skip_timer_override &&
|
||||
- !strstr(dom0_cmdline, "acpi_skip_timer_override") )
|
||||
- safe_strcat(dom0_cmdline, " acpi_skip_timer_override");
|
||||
if ( (strlen(acpi_param) == 0) && acpi_disabled )
|
||||
{
|
||||
printk("ACPI is disabled, notifying Domain 0 (acpi=off)\n");
|
||||
--- a/xen/include/asm-x86/acpi.h
|
||||
+++ b/xen/include/asm-x86/acpi.h
|
||||
@@ -80,7 +80,6 @@ int __acpi_release_global_lock(unsigned
|
||||
|
||||
extern bool_t acpi_lapic, acpi_ioapic, acpi_noirq;
|
||||
extern bool_t acpi_force, acpi_ht, acpi_disabled;
|
||||
-extern bool_t acpi_skip_timer_override;
|
||||
extern u32 acpi_smi_cmd;
|
||||
extern u8 acpi_enable_value, acpi_disable_value;
|
||||
void acpi_pic_sci_set_trigger(unsigned int, u16);
|
@ -1,32 +0,0 @@
|
||||
# Commit 7acf827b951b4e8501a777676ddf050d200103a4
|
||||
# Date 2014-03-04 11:00:26 +0100
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/ACPI: also print address space for PM1x fields
|
||||
|
||||
At least one vendor is in the process of making systems available where
|
||||
these live in MMIO, not in I/O port space.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Keir Fraser <keir@xen.org>
|
||||
|
||||
--- a/xen/arch/x86/acpi/boot.c
|
||||
+++ b/xen/arch/x86/acpi/boot.c
|
||||
@@ -404,11 +404,15 @@ acpi_fadt_parse_sleep_info(struct acpi_t
|
||||
acpi_fadt_copy_address(pm1b_evt, pm1b_event, pm1_event);
|
||||
|
||||
printk(KERN_INFO PREFIX
|
||||
- "SLEEP INFO: pm1x_cnt[%"PRIx64",%"PRIx64"], "
|
||||
- "pm1x_evt[%"PRIx64",%"PRIx64"]\n",
|
||||
+ "SLEEP INFO: pm1x_cnt[%d:%"PRIx64",%d:%"PRIx64"], "
|
||||
+ "pm1x_evt[%d:%"PRIx64",%d:%"PRIx64"]\n",
|
||||
+ acpi_sinfo.pm1a_cnt_blk.space_id,
|
||||
acpi_sinfo.pm1a_cnt_blk.address,
|
||||
+ acpi_sinfo.pm1b_cnt_blk.space_id,
|
||||
acpi_sinfo.pm1b_cnt_blk.address,
|
||||
+ acpi_sinfo.pm1a_evt_blk.space_id,
|
||||
acpi_sinfo.pm1a_evt_blk.address,
|
||||
+ acpi_sinfo.pm1b_evt_blk.space_id,
|
||||
acpi_sinfo.pm1b_evt_blk.address);
|
||||
|
||||
/* Now FACS... */
|
@ -1,54 +0,0 @@
|
||||
Subject: tools/console: reset tty when xenconsole fails
|
||||
From: Ian Jackson ian.jackson@eu.citrix.com Mon Feb 24 15:16:19 2014 +0000
|
||||
Date: Wed Mar 19 13:37:19 2014 +0000:
|
||||
Git: 111931f36885874103d65685ab15ea3d25d93da7
|
||||
|
||||
If xenconsole (the client program) fails, it calls err. This would
|
||||
previously neglect to reset the user's terminal to sanity. Use atexit
|
||||
to do so.
|
||||
|
||||
This routinely happens in Xen 4.4 RC5 with pygrub because libxl
|
||||
writes the value "" to the tty xenstore key when using xenconsole.
|
||||
After this patch this just results in a harmless error message.
|
||||
|
||||
Reported-by: M A Young <m.a.young@durham.ac.uk>
|
||||
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
||||
CC: M A Young <m.a.young@durham.ac.uk>
|
||||
CC: Ian Campbell <Ian.Campbell@citrix.com>
|
||||
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
---
|
||||
v2: Fix whitespace error (reintroduce hard tab)
|
||||
Fix commit message not to claim ignorance about root cause
|
||||
|
||||
Index: xen-4.4.0-testing/tools/console/client/main.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/console/client/main.c
|
||||
+++ xen-4.4.0-testing/tools/console/client/main.c
|
||||
@@ -258,6 +258,13 @@ typedef enum {
|
||||
CONSOLE_SERIAL,
|
||||
} console_type;
|
||||
|
||||
+static struct termios stdin_old_attr;
|
||||
+
|
||||
+static void restore_term_stdin(void)
|
||||
+{
|
||||
+ restore_term(STDIN_FILENO, &stdin_old_attr);
|
||||
+}
|
||||
+
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct termios attr;
|
||||
@@ -384,9 +391,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
init_term(spty, &attr);
|
||||
- init_term(STDIN_FILENO, &attr);
|
||||
+ init_term(STDIN_FILENO, &stdin_old_attr);
|
||||
+ atexit(restore_term_stdin); /* if this fails, oh dear */
|
||||
console_loop(spty, xs, path);
|
||||
- restore_term(STDIN_FILENO, &attr);
|
||||
|
||||
free(path);
|
||||
free(dom_path);
|
@ -1,49 +0,0 @@
|
||||
Subject: tools/console: xenconsole tolerate tty errors
|
||||
From: Ian Jackson ian.jackson@eu.citrix.com Thu Feb 27 17:46:49 2014 +0000
|
||||
Date: Wed Mar 19 13:37:19 2014 +0000:
|
||||
Git: 39ba2989b10b6a1852e253b204eb010f8e7026f1
|
||||
|
||||
Since 28d386fc4341 (XSA-57), libxl writes an empty value for the
|
||||
console tty node, with read-only permission for the guest, when
|
||||
setting up pv console "frontends". (The actual tty value is later set
|
||||
by xenconsoled.) Writing an empty node is not strictly necessary to
|
||||
stop the frontend from writing dangerous values here, but it is a good
|
||||
belt-and-braces approach.
|
||||
|
||||
Unfortunately this confuses xenconsole. It reads the empty value, and
|
||||
tries to open it as the tty. xenconsole then exits.
|
||||
|
||||
Fix this by having xenconsole treat an empty value the same way as no
|
||||
value at all.
|
||||
|
||||
Also, make the error opening the tty be nonfatal: we just print a
|
||||
warning, but do not exit. I think this is helpful in theoretical
|
||||
situations where xenconsole is racing with libxl and/or xenconsoled.
|
||||
|
||||
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
||||
Acked-by: Ian Campbell <Ian.Campbell@citrix.com>
|
||||
CC: George Dunlap <george.dunlap@eu.citrix.com>
|
||||
|
||||
---
|
||||
v2: Combine two conditions and move the free
|
||||
|
||||
Index: xen-4.4.0-testing/tools/console/client/main.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/console/client/main.c
|
||||
+++ xen-4.4.0-testing/tools/console/client/main.c
|
||||
@@ -115,12 +115,12 @@ static int get_pty_fd(struct xs_handle *
|
||||
/* We only watch for one thing, so no need to
|
||||
* disambiguate: just read the pty path */
|
||||
pty_path = xs_read(xs, XBT_NULL, path, &len);
|
||||
- if (pty_path != NULL) {
|
||||
+ if (pty_path != NULL && pty_path[0] != '\0') {
|
||||
pty_fd = open(pty_path, O_RDWR | O_NOCTTY);
|
||||
if (pty_fd == -1)
|
||||
- err(errno, "Could not open tty `%s'", pty_path);
|
||||
- free(pty_path);
|
||||
+ warn("Could not open tty `%s'", pty_path);
|
||||
}
|
||||
+ free(pty_path);
|
||||
}
|
||||
} while (pty_fd == -1 && (now = time(NULL)) < start + seconds);
|
||||
|
@ -1,175 +0,0 @@
|
||||
# Commit e74de9c0b19f9bd16d658a96bf6c9ab9a2a639e9
|
||||
# Date 2014-04-10 16:16:00 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/AMD: support further feature masking MSRs
|
||||
|
||||
Newer AMD CPUs also allow masking CPUID leaf 6 ECX and CPUID leaf 7
|
||||
sub-leaf 0 EAX and EBX.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Aravind Gopalakrishnan<aravind.gopalakrishnan@amd.com>
|
||||
|
||||
--- a/docs/misc/xen-command-line.markdown
|
||||
+++ b/docs/misc/xen-command-line.markdown
|
||||
@@ -320,24 +320,42 @@ Indicate where the responsibility for dr
|
||||
### cpuid\_mask\_cpu (AMD only)
|
||||
> `= fam_0f_rev_c | fam_0f_rev_d | fam_0f_rev_e | fam_0f_rev_f | fam_0f_rev_g | fam_10_rev_b | fam_10_rev_c | fam_11_rev_b`
|
||||
|
||||
-If the other **cpuid\_mask\_{,ext\_}e{c,d}x** options are fully set
|
||||
-(unspecified on the command line), specify a pre-canned cpuid mask to
|
||||
-mask the current processor down to appear as the specified processor.
|
||||
-It is important to ensure that all hosts in a pool appear the same to
|
||||
-guests to allow successful live migration.
|
||||
+If the other **cpuid\_mask\_{,ext\_,thermal\_,l7s0\_}e{a,b,c,d}x**
|
||||
+options are fully set (unspecified on the command line), specify a
|
||||
+pre-canned cpuid mask to mask the current processor down to appear as
|
||||
+the specified processor. It is important to ensure that all hosts in a
|
||||
+pool appear the same to guests to allow successful live migration.
|
||||
|
||||
-### cpuid\_mask\_ ecx,edx,ext\_ecx,ext\_edx,xsave_eax
|
||||
+### cpuid\_mask\_{{,ext\_}ecx,edx}
|
||||
> `= <integer>`
|
||||
|
||||
> Default: `~0` (all bits set)
|
||||
|
||||
-These five command line parameters are used to specify cpuid masks to
|
||||
+These four command line parameters are used to specify cpuid masks to
|
||||
help with cpuid levelling across a pool of hosts. Setting a bit in
|
||||
the mask indicates that the feature should be enabled, while clearing
|
||||
a bit in the mask indicates that the feature should be disabled. It
|
||||
is important to ensure that all hosts in a pool appear the same to
|
||||
guests to allow successful live migration.
|
||||
|
||||
+### cpuid\_mask\_xsave\_eax (Intel only)
|
||||
+> `= <integer>`
|
||||
+
|
||||
+> Default: `~0` (all bits set)
|
||||
+
|
||||
+This command line parameter is also used to specify a cpuid mask to
|
||||
+help with cpuid levelling across a pool of hosts. See the description
|
||||
+of the other respective options above.
|
||||
+
|
||||
+### cpuid\_mask\_{l7s0\_{eax,ebx},thermal\_ecx} (AMD only)
|
||||
+> `= <integer>`
|
||||
+
|
||||
+> Default: `~0` (all bits set)
|
||||
+
|
||||
+These three command line parameters are also used to specify cpuid
|
||||
+masks to help with cpuid levelling across a pool of hosts. See the
|
||||
+description of the other respective options above.
|
||||
+
|
||||
### cpuidle
|
||||
> `= <boolean>`
|
||||
|
||||
--- a/xen/arch/x86/cpu/amd.c
|
||||
+++ b/xen/arch/x86/cpu/amd.c
|
||||
@@ -30,9 +30,17 @@
|
||||
* "fam_10_rev_c"
|
||||
* "fam_11_rev_b"
|
||||
*/
|
||||
-static char opt_famrev[14];
|
||||
+static char __initdata opt_famrev[14];
|
||||
string_param("cpuid_mask_cpu", opt_famrev);
|
||||
|
||||
+static unsigned int __initdata opt_cpuid_mask_l7s0_eax = ~0u;
|
||||
+integer_param("cpuid_mask_l7s0_eax", opt_cpuid_mask_l7s0_eax);
|
||||
+static unsigned int __initdata opt_cpuid_mask_l7s0_ebx = ~0u;
|
||||
+integer_param("cpuid_mask_l7s0_ebx", opt_cpuid_mask_l7s0_ebx);
|
||||
+
|
||||
+static unsigned int __initdata opt_cpuid_mask_thermal_ecx = ~0u;
|
||||
+integer_param("cpuid_mask_thermal_ecx", opt_cpuid_mask_thermal_ecx);
|
||||
+
|
||||
/* 1 = allow, 0 = don't allow guest creation, -1 = don't allow boot */
|
||||
s8 __read_mostly opt_allow_unsafe;
|
||||
boolean_param("allow_unsafe", opt_allow_unsafe);
|
||||
@@ -96,7 +104,11 @@ static void __devinit set_cpuidmask(cons
|
||||
{
|
||||
static unsigned int feat_ecx, feat_edx;
|
||||
static unsigned int extfeat_ecx, extfeat_edx;
|
||||
+ static unsigned int l7s0_eax, l7s0_ebx;
|
||||
+ static unsigned int thermal_ecx;
|
||||
+ static bool_t skip_l7s0_eax_ebx, skip_thermal_ecx;
|
||||
static enum { not_parsed, no_mask, set_mask } status;
|
||||
+ unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
if (status == no_mask)
|
||||
return;
|
||||
@@ -104,7 +116,7 @@ static void __devinit set_cpuidmask(cons
|
||||
if (status == set_mask)
|
||||
goto setmask;
|
||||
|
||||
- ASSERT((status == not_parsed) && (smp_processor_id() == 0));
|
||||
+ ASSERT((status == not_parsed) && (c == &boot_cpu_data));
|
||||
status = no_mask;
|
||||
|
||||
/* Fam11 doesn't support masking at all. */
|
||||
@@ -112,11 +124,16 @@ static void __devinit set_cpuidmask(cons
|
||||
return;
|
||||
|
||||
if (~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
|
||||
- opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) {
|
||||
+ opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx &
|
||||
+ opt_cpuid_mask_l7s0_eax & opt_cpuid_mask_l7s0_ebx &
|
||||
+ opt_cpuid_mask_thermal_ecx)) {
|
||||
feat_ecx = opt_cpuid_mask_ecx;
|
||||
feat_edx = opt_cpuid_mask_edx;
|
||||
extfeat_ecx = opt_cpuid_mask_ext_ecx;
|
||||
extfeat_edx = opt_cpuid_mask_ext_edx;
|
||||
+ l7s0_eax = opt_cpuid_mask_l7s0_eax;
|
||||
+ l7s0_ebx = opt_cpuid_mask_l7s0_ebx;
|
||||
+ thermal_ecx = opt_cpuid_mask_thermal_ecx;
|
||||
} else if (*opt_famrev == '\0') {
|
||||
return;
|
||||
} else if (!strcmp(opt_famrev, "fam_0f_rev_c")) {
|
||||
@@ -179,11 +196,39 @@ static void __devinit set_cpuidmask(cons
|
||||
printk("Writing CPUID extended feature mask ECX:EDX -> %08Xh:%08Xh\n",
|
||||
extfeat_ecx, extfeat_edx);
|
||||
|
||||
+ if (c->cpuid_level >= 7)
|
||||
+ cpuid_count(7, 0, &eax, &ebx, &ecx, &edx);
|
||||
+ else
|
||||
+ ebx = eax = 0;
|
||||
+ if ((eax | ebx) && ~(l7s0_eax & l7s0_ebx)) {
|
||||
+ if (l7s0_eax > eax)
|
||||
+ l7s0_eax = eax;
|
||||
+ l7s0_ebx &= ebx;
|
||||
+ printk("Writing CPUID leaf 7 subleaf 0 feature mask EAX:EBX -> %08Xh:%08Xh\n",
|
||||
+ l7s0_eax, l7s0_ebx);
|
||||
+ } else
|
||||
+ skip_l7s0_eax_ebx = 1;
|
||||
+
|
||||
+ /* Only Fam15 has the respective MSR. */
|
||||
+ ecx = c->x86 == 0x15 && c->cpuid_level >= 6 ? cpuid_ecx(6) : 0;
|
||||
+ if (ecx && ~thermal_ecx) {
|
||||
+ thermal_ecx &= ecx;
|
||||
+ printk("Writing CPUID thermal/power feature mask ECX -> %08Xh\n",
|
||||
+ thermal_ecx);
|
||||
+ } else
|
||||
+ skip_thermal_ecx = 1;
|
||||
+
|
||||
setmask:
|
||||
/* AMD processors prior to family 10h required a 32-bit password */
|
||||
if (c->x86 >= 0x10) {
|
||||
wrmsr(MSR_K8_FEATURE_MASK, feat_edx, feat_ecx);
|
||||
wrmsr(MSR_K8_EXT_FEATURE_MASK, extfeat_edx, extfeat_ecx);
|
||||
+ if (!skip_l7s0_eax_ebx)
|
||||
+ wrmsr(MSR_AMD_L7S0_FEATURE_MASK, l7s0_ebx, l7s0_eax);
|
||||
+ if (!skip_thermal_ecx) {
|
||||
+ rdmsr(MSR_AMD_THRM_FEATURE_MASK, eax, edx);
|
||||
+ wrmsr(MSR_AMD_THRM_FEATURE_MASK, thermal_ecx, edx);
|
||||
+ }
|
||||
} else {
|
||||
wrmsr_amd(MSR_K8_FEATURE_MASK, feat_edx, feat_ecx);
|
||||
wrmsr_amd(MSR_K8_EXT_FEATURE_MASK, extfeat_edx, extfeat_ecx);
|
||||
--- a/xen/include/asm-x86/msr-index.h
|
||||
+++ b/xen/include/asm-x86/msr-index.h
|
||||
@@ -204,6 +204,8 @@
|
||||
#define MSR_AMD_FAM15H_EVNTSEL5 0xc001020a
|
||||
#define MSR_AMD_FAM15H_PERFCTR5 0xc001020b
|
||||
|
||||
+#define MSR_AMD_L7S0_FEATURE_MASK 0xc0011002
|
||||
+#define MSR_AMD_THRM_FEATURE_MASK 0xc0011003
|
||||
#define MSR_K8_FEATURE_MASK 0xc0011004
|
||||
#define MSR_K8_EXT_FEATURE_MASK 0xc0011005
|
||||
|
@ -1,82 +0,0 @@
|
||||
# Commit 061eebe0e99ad45c9c3b1a778b06140de4a91f25
|
||||
# Date 2014-04-22 12:04:20 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/MSI: drop workaround for insecure Dom0 kernels
|
||||
|
||||
Considering that
|
||||
- the workaround is expensive (iterating through the entire P2M space
|
||||
of a domain),
|
||||
- the planned elimination of the expensiveness (by propagating the type
|
||||
change step by step to the individual P2M leaves) wouldn't address
|
||||
the IOMMU side of things (as for it to obey to the changed
|
||||
permissions the adjustments must be pushed down immediately through
|
||||
the entire tree)
|
||||
- the proper solution (PHYSDEVOP_msix_prepare) should by now be
|
||||
implemented by all security conscious Dom0 kernels
|
||||
remove the workaround, killing eventual guests that would be known to
|
||||
become a security risk instead.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Kevin Tian <kevin.tian@intel.com>
|
||||
|
||||
--- a/xen/arch/x86/mm/p2m-ept.c
|
||||
+++ b/xen/arch/x86/mm/p2m-ept.c
|
||||
@@ -679,7 +679,7 @@ static void ept_change_entry_type_global
|
||||
return;
|
||||
|
||||
BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
|
||||
- BUG_ON(ot != nt && (ot == p2m_mmio_direct || nt == p2m_mmio_direct));
|
||||
+ BUG_ON(p2m_is_mmio(ot) || p2m_is_mmio(nt));
|
||||
|
||||
ept_change_entry_type_page(_mfn(ept_get_asr(ept)),
|
||||
ept_get_wl(ept), ot, nt);
|
||||
--- a/xen/arch/x86/msi.c
|
||||
+++ b/xen/arch/x86/msi.c
|
||||
@@ -825,32 +825,22 @@ static int msix_capability_init(struct p
|
||||
msix->pba.last) )
|
||||
WARN();
|
||||
|
||||
- if ( dev->domain )
|
||||
- p2m_change_entry_type_global(dev->domain,
|
||||
- p2m_mmio_direct, p2m_mmio_direct);
|
||||
- if ( desc && (!dev->domain || !paging_mode_translate(dev->domain)) )
|
||||
+ if ( desc )
|
||||
{
|
||||
- struct domain *d = dev->domain;
|
||||
+ struct domain *currd = current->domain;
|
||||
+ struct domain *d = dev->domain ?: currd;
|
||||
|
||||
- if ( !d )
|
||||
- for_each_domain(d)
|
||||
- if ( !paging_mode_translate(d) &&
|
||||
- (iomem_access_permitted(d, msix->table.first,
|
||||
- msix->table.last) ||
|
||||
- iomem_access_permitted(d, msix->pba.first,
|
||||
- msix->pba.last)) )
|
||||
- break;
|
||||
- if ( d )
|
||||
- {
|
||||
- if ( !is_hardware_domain(d) && msix->warned != d->domain_id )
|
||||
- {
|
||||
- msix->warned = d->domain_id;
|
||||
- printk(XENLOG_ERR
|
||||
- "Potentially insecure use of MSI-X on %04x:%02x:%02x.%u by Dom%d\n",
|
||||
- seg, bus, slot, func, d->domain_id);
|
||||
- }
|
||||
- /* XXX How to deal with existing mappings? */
|
||||
- }
|
||||
+ if ( !is_hardware_domain(currd) || d != currd )
|
||||
+ printk("%s use of MSI-X on %04x:%02x:%02x.%u by Dom%d\n",
|
||||
+ is_hardware_domain(currd)
|
||||
+ ? XENLOG_WARNING "Potentially insecure"
|
||||
+ : XENLOG_ERR "Insecure",
|
||||
+ seg, bus, slot, func, d->domain_id);
|
||||
+ if ( !is_hardware_domain(d) &&
|
||||
+ /* Assume a domain without memory has no mappings yet. */
|
||||
+ (!is_hardware_domain(currd) || d->tot_pages) )
|
||||
+ domain_crash(d);
|
||||
+ /* XXX How to deal with existing mappings? */
|
||||
}
|
||||
}
|
||||
WARN_ON(msix->nr_entries != nr_entries);
|
@ -1,274 +0,0 @@
|
||||
# Commit d06886694328a31369addc1f614cf326728d65a6
|
||||
# Date 2014-05-21 18:13:36 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
hvmloader: also cover PCI MMIO ranges above 4G with UC MTRR ranges
|
||||
|
||||
When adding support for BAR assignments to addresses above 4G, the MTRR
|
||||
side of things was left out.
|
||||
|
||||
Additionally the MMIO ranges in the DSDT's \_SB.PCI0._CRS were having
|
||||
memory types not matching the ones put into MTRRs: The legacy VGA range
|
||||
is supposed to be WC, and the other ones should be UC.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
# Commit 119d8a42d3bfe6ebc1785720e1a7260e5c698632
|
||||
# Date 2014-05-22 14:20:19 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
hvmloader: fix build with certain iasl versions
|
||||
|
||||
While most of them support what we have now, Wheezy's dislikes the
|
||||
empty range. Put a fake one in place - it's getting overwritten upon
|
||||
evaluation of _CRS anyway.
|
||||
|
||||
The range could be grown (downwards) if necessary; the way it is now
|
||||
it is
|
||||
- the highest possible one below the 36-bit boundary (with 36 bits
|
||||
being the lowest common denominator for all supported systems),
|
||||
- the smallest possible one that said iasl accepts.
|
||||
|
||||
Reported-by: Sander Eikelenboom <linux@eikelenboom.it>
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
# Commit 7f8d8abcf6dfb85fae591a547b24f9b27d92272c
|
||||
# Date 2014-05-28 10:57:18 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
hvmloader: don't use AML operations on 64-bit fields
|
||||
|
||||
WinXP and Win2K3, while having no problem with the QWordMemory resource
|
||||
(there was another one there before), don't like operations on 64-bit
|
||||
fields. Split the fields d0688669 ("hvmloader: also cover PCI MMIO
|
||||
ranges above 4G with UC MTRR ranges") added to 32-bit ones, handling
|
||||
carry over explicitly.
|
||||
|
||||
Sadly the constructs needed to create the sub-fields - nominally
|
||||
|
||||
CreateDWordField(PRT0, \_SB.PCI0._CRS._Y02._MIN, MINL)
|
||||
CreateDWordField(PRT0, Add(\_SB.PCI0._CRS._Y02._MIN, 4), MINH)
|
||||
|
||||
- can't be used: The former gets warned upon by newer iasl, i.e. would
|
||||
need to be replaced by the latter just with the addend changed to 0,
|
||||
and the latter doesn't translate properly with recent iasl). Hence,
|
||||
short of having an ASL/iasl expert at hand, we need to work around the
|
||||
shortcomings of various iasl versions. See the code comment.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
--- a/tools/firmware/hvmloader/acpi/build.c
|
||||
+++ b/tools/firmware/hvmloader/acpi/build.c
|
||||
@@ -51,6 +51,7 @@ struct acpi_info {
|
||||
uint32_t madt_csum_addr; /* 12 - Address of MADT checksum */
|
||||
uint32_t madt_lapic0_addr; /* 16 - Address of first MADT LAPIC struct */
|
||||
uint32_t vm_gid_addr; /* 20 - Address of VM generation id buffer */
|
||||
+ uint64_t pci_hi_min, pci_hi_len; /* 24, 32 - PCI I/O hole boundaries */
|
||||
};
|
||||
|
||||
/* Number of processor objects in the chosen DSDT. */
|
||||
@@ -525,6 +526,11 @@ void acpi_build_tables(struct acpi_confi
|
||||
acpi_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS);
|
||||
acpi_info->pci_min = pci_mem_start;
|
||||
acpi_info->pci_len = pci_mem_end - pci_mem_start;
|
||||
+ if ( pci_hi_mem_end > pci_hi_mem_start )
|
||||
+ {
|
||||
+ acpi_info->pci_hi_min = pci_hi_mem_start;
|
||||
+ acpi_info->pci_hi_len = pci_hi_mem_end - pci_hi_mem_start;
|
||||
+ }
|
||||
|
||||
return;
|
||||
|
||||
--- a/tools/firmware/hvmloader/acpi/dsdt.asl
|
||||
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl
|
||||
@@ -45,7 +45,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||
Scope (\_SB)
|
||||
{
|
||||
/* ACPI_INFO_PHYSICAL_ADDRESS == 0xFC000000 */
|
||||
- OperationRegion(BIOS, SystemMemory, 0xFC000000, 24)
|
||||
+ OperationRegion(BIOS, SystemMemory, 0xFC000000, 40)
|
||||
Field(BIOS, ByteAcc, NoLock, Preserve) {
|
||||
UAR1, 1,
|
||||
UAR2, 1,
|
||||
@@ -56,7 +56,11 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||
PLEN, 32,
|
||||
MSUA, 32, /* MADT checksum address */
|
||||
MAPA, 32, /* MADT LAPIC0 address */
|
||||
- VGIA, 32 /* VM generation id address */
|
||||
+ VGIA, 32, /* VM generation id address */
|
||||
+ LMIN, 32,
|
||||
+ HMIN, 32,
|
||||
+ LLEN, 32,
|
||||
+ HLEN, 32
|
||||
}
|
||||
|
||||
/* Fix HCT test for 0x400 pci memory:
|
||||
@@ -136,7 +140,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||
/* reserve memory for pci devices */
|
||||
DWordMemory(
|
||||
ResourceProducer, PosDecode, MinFixed, MaxFixed,
|
||||
- Cacheable, ReadWrite,
|
||||
+ WriteCombining, ReadWrite,
|
||||
0x00000000,
|
||||
0x000A0000,
|
||||
0x000BFFFF,
|
||||
@@ -145,13 +149,24 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||
|
||||
DWordMemory(
|
||||
ResourceProducer, PosDecode, MinFixed, MaxFixed,
|
||||
- Cacheable, ReadWrite,
|
||||
+ NonCacheable, ReadWrite,
|
||||
0x00000000,
|
||||
0xF0000000,
|
||||
0xF4FFFFFF,
|
||||
0x00000000,
|
||||
0x05000000,
|
||||
,, _Y01)
|
||||
+
|
||||
+ QWordMemory (
|
||||
+ ResourceProducer, PosDecode, MinFixed, MaxFixed,
|
||||
+ NonCacheable, ReadWrite,
|
||||
+ 0x0000000000000000,
|
||||
+ 0x0000000FFFFFFFF0,
|
||||
+ 0x0000000FFFFFFFFF,
|
||||
+ 0x0000000000000000,
|
||||
+ 0x0000000000000010,
|
||||
+ ,, _Y02)
|
||||
+
|
||||
})
|
||||
|
||||
CreateDWordField(PRT0, \_SB.PCI0._CRS._Y01._MIN, MMIN)
|
||||
@@ -163,6 +178,43 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||
Add(MMIN, MLEN, MMAX)
|
||||
Subtract(MMAX, One, MMAX)
|
||||
|
||||
+ /*
|
||||
+ * WinXP / Win2K3 blue-screen for operations on 64-bit values.
|
||||
+ * Therefore we need to split the 64-bit calculations needed
|
||||
+ * here, but different iasl versions evaluate name references
|
||||
+ * to integers differently:
|
||||
+ * Year (approximate) 2006 2008 2012
|
||||
+ * \_SB.PCI0._CRS._Y02 zero valid valid
|
||||
+ * \_SB.PCI0._CRS._Y02._MIN valid valid huge
|
||||
+ */
|
||||
+ If(LEqual(Zero, \_SB.PCI0._CRS._Y02)) {
|
||||
+ Subtract(\_SB.PCI0._CRS._Y02._MIN, 14, Local0)
|
||||
+ } Else {
|
||||
+ Store(\_SB.PCI0._CRS._Y02, Local0)
|
||||
+ }
|
||||
+ CreateDWordField(PRT0, Add(Local0, 14), MINL)
|
||||
+ CreateDWordField(PRT0, Add(Local0, 18), MINH)
|
||||
+ CreateDWordField(PRT0, Add(Local0, 22), MAXL)
|
||||
+ CreateDWordField(PRT0, Add(Local0, 26), MAXH)
|
||||
+ CreateDWordField(PRT0, Add(Local0, 38), LENL)
|
||||
+ CreateDWordField(PRT0, Add(Local0, 42), LENH)
|
||||
+
|
||||
+ Store(\_SB.LMIN, MINL)
|
||||
+ Store(\_SB.HMIN, MINH)
|
||||
+ Store(\_SB.LLEN, LENL)
|
||||
+ Store(\_SB.HLEN, LENH)
|
||||
+ Add(MINL, LENL, MAXL)
|
||||
+ Add(MINH, LENH, MAXH)
|
||||
+ If(LLess(MAXL, MINL)) {
|
||||
+ Add(MAXH, One, MAXH)
|
||||
+ }
|
||||
+ If(LOr(MINH, LENL)) {
|
||||
+ If(LEqual(MAXL, 0)) {
|
||||
+ Subtract(MAXH, One, MAXH)
|
||||
+ }
|
||||
+ Subtract(MAXL, One, MAXL)
|
||||
+ }
|
||||
+
|
||||
Return (PRT0)
|
||||
}
|
||||
|
||||
--- a/tools/firmware/hvmloader/cacheattr.c
|
||||
+++ b/tools/firmware/hvmloader/cacheattr.c
|
||||
@@ -97,8 +97,7 @@ void cacheattr_init(void)
|
||||
nr_var_ranges = (uint8_t)mtrr_cap;
|
||||
if ( nr_var_ranges != 0 )
|
||||
{
|
||||
- unsigned long base = pci_mem_start, size;
|
||||
- int i;
|
||||
+ uint64_t base = pci_mem_start, size;
|
||||
|
||||
for ( i = 0; (base != pci_mem_end) && (i < nr_var_ranges); i++ )
|
||||
{
|
||||
@@ -109,8 +108,22 @@ void cacheattr_init(void)
|
||||
size >>= 1;
|
||||
|
||||
wrmsr(MSR_MTRRphysBase(i), base);
|
||||
- wrmsr(MSR_MTRRphysMask(i),
|
||||
- (~(uint64_t)(size-1) & addr_mask) | (1u << 11));
|
||||
+ wrmsr(MSR_MTRRphysMask(i), (~(size - 1) & addr_mask) | (1u << 11));
|
||||
+
|
||||
+ base += size;
|
||||
+ }
|
||||
+
|
||||
+ for ( base = pci_hi_mem_start;
|
||||
+ (base != pci_hi_mem_end) && (i < nr_var_ranges); i++ )
|
||||
+ {
|
||||
+ size = PAGE_SIZE;
|
||||
+ while ( !(base & size) )
|
||||
+ size <<= 1;
|
||||
+ while ( (base + size < base) || (base + size > pci_hi_mem_end) )
|
||||
+ size >>= 1;
|
||||
+
|
||||
+ wrmsr(MSR_MTRRphysBase(i), base);
|
||||
+ wrmsr(MSR_MTRRphysMask(i), (~(size - 1) & addr_mask) | (1u << 11));
|
||||
|
||||
base += size;
|
||||
}
|
||||
--- a/tools/firmware/hvmloader/config.h
|
||||
+++ b/tools/firmware/hvmloader/config.h
|
||||
@@ -57,7 +57,7 @@ extern struct bios_config ovmf_config;
|
||||
#define PCI_MEM_END 0xfc000000
|
||||
|
||||
extern unsigned long pci_mem_start, pci_mem_end;
|
||||
-
|
||||
+extern uint64_t pci_hi_mem_start, pci_hi_mem_end;
|
||||
|
||||
/* Memory map. */
|
||||
#define SCRATCH_PHYSICAL_ADDRESS 0x00010000
|
||||
--- a/tools/firmware/hvmloader/pci.c
|
||||
+++ b/tools/firmware/hvmloader/pci.c
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
unsigned long pci_mem_start = PCI_MEM_START;
|
||||
unsigned long pci_mem_end = PCI_MEM_END;
|
||||
+uint64_t pci_hi_mem_start = 0, pci_hi_mem_end = 0;
|
||||
|
||||
enum virtual_vga virtual_vga = VGA_none;
|
||||
unsigned long igd_opregion_pgbase = 0;
|
||||
@@ -345,9 +346,8 @@ void pci_setup(void)
|
||||
if ( high_mem_resource.base & (bar_sz - 1) )
|
||||
high_mem_resource.base = high_mem_resource.base -
|
||||
(high_mem_resource.base & (bar_sz - 1)) + bar_sz;
|
||||
- else
|
||||
- high_mem_resource.base = high_mem_resource.base -
|
||||
- (high_mem_resource.base & (bar_sz - 1));
|
||||
+ if ( !pci_hi_mem_start )
|
||||
+ pci_hi_mem_start = high_mem_resource.base;
|
||||
resource = &high_mem_resource;
|
||||
bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
|
||||
}
|
||||
@@ -398,6 +398,16 @@ void pci_setup(void)
|
||||
pci_writew(devfn, PCI_COMMAND, cmd);
|
||||
}
|
||||
|
||||
+ if ( pci_hi_mem_start )
|
||||
+ {
|
||||
+ /*
|
||||
+ * Make end address alignment match the start address one's so that
|
||||
+ * fewer variable range MTRRs are needed to cover the range.
|
||||
+ */
|
||||
+ pci_hi_mem_end = ((high_mem_resource.base - 1) |
|
||||
+ ((pci_hi_mem_start & -pci_hi_mem_start) - 1)) + 1;
|
||||
+ }
|
||||
+
|
||||
if ( vga_devfn != 256 )
|
||||
{
|
||||
/*
|
@ -1,34 +0,0 @@
|
||||
# Commit c22bd567ce22f6ad9bd93318ad0d7fd1c2eadb0d
|
||||
# Date 2014-05-21 18:14:04 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
hvmloader: PA range 0xfc000000-0xffffffff should be UC
|
||||
|
||||
Rather than leaving the range from PCI_MEM_END (0xfc000000) to 4G
|
||||
uncovered, we should include this in the UC range created for the (low)
|
||||
PCI range. Besides being more correct, this also has the advantage that
|
||||
with the way pci_setup() currently works the range will always be
|
||||
mappable with a single variable range MTRR (rather than from 2 to 5
|
||||
depending on how much the lower boundary gets shifted down to
|
||||
accommodate all devices).
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
--- a/tools/firmware/hvmloader/cacheattr.c
|
||||
+++ b/tools/firmware/hvmloader/cacheattr.c
|
||||
@@ -99,12 +99,12 @@ void cacheattr_init(void)
|
||||
{
|
||||
uint64_t base = pci_mem_start, size;
|
||||
|
||||
- for ( i = 0; (base != pci_mem_end) && (i < nr_var_ranges); i++ )
|
||||
+ for ( i = 0; !(base >> 32) && (i < nr_var_ranges); i++ )
|
||||
{
|
||||
size = PAGE_SIZE;
|
||||
while ( !(base & size) )
|
||||
size <<= 1;
|
||||
- while ( ((base + size) < base) || ((base + size) > pci_mem_end) )
|
||||
+ while ( ((base + size) < base) || ((base + size - 1) >> 32) )
|
||||
size >>= 1;
|
||||
|
||||
wrmsr(MSR_MTRRphysBase(i), base);
|
@ -1,61 +0,0 @@
|
||||
# Commit ebbb51dc8c1790e5187442a808003298b6796762
|
||||
# Date 2014-06-16 11:52:34 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/EFI: improve boot time diagnostics
|
||||
|
||||
To aid analysis of eventual errors, print EFI status codes with error
|
||||
messages where available. Also remove a case where the status gets
|
||||
stored into a local variable without being used examined (which mis-
|
||||
guided me to add an error check there in try 1 of this patch).
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
--- a/xen/arch/x86/efi/boot.c
|
||||
+++ b/xen/arch/x86/efi/boot.c
|
||||
@@ -344,11 +344,12 @@ static EFI_FILE_HANDLE __init get_parent
|
||||
ret = efi_bs->HandleProtocol(loaded_image->DeviceHandle,
|
||||
&fs_protocol, (void **)&fio);
|
||||
if ( EFI_ERROR(ret) )
|
||||
- blexit(L"Couldn't obtain the File System Protocol Interface");
|
||||
+ PrintErrMesg(L"Couldn't obtain the File System Protocol Interface",
|
||||
+ ret);
|
||||
ret = fio->OpenVolume(fio, &dir_handle);
|
||||
} while ( ret == EFI_MEDIA_CHANGED );
|
||||
if ( ret != EFI_SUCCESS )
|
||||
- blexit(L"OpenVolume failure");
|
||||
+ PrintErrMesg(L"OpenVolume failure", ret);
|
||||
|
||||
#define buffer ((CHAR16 *)keyhandler_scratch)
|
||||
#define BUFFERSIZE sizeof(keyhandler_scratch)
|
||||
@@ -967,8 +968,8 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SY
|
||||
|
||||
if ( !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL,
|
||||
(void **)&shim_lock)) &&
|
||||
- shim_lock->Verify(kernel.ptr, kernel.size) != EFI_SUCCESS )
|
||||
- blexit(L"Dom0 kernel image could not be verified.");
|
||||
+ (status = shim_lock->Verify(kernel.ptr, kernel.size)) != EFI_SUCCESS )
|
||||
+ PrintErrMesg(L"Dom0 kernel image could not be verified", status);
|
||||
|
||||
name.s = get_value(&cfg, section.s, "ramdisk");
|
||||
if ( name.s )
|
||||
@@ -1379,8 +1380,8 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SY
|
||||
}
|
||||
}
|
||||
|
||||
- status = efi_bs->GetMemoryMap(&efi_memmap_size, NULL, &map_key,
|
||||
- &efi_mdesc_size, &mdesc_ver);
|
||||
+ efi_bs->GetMemoryMap(&efi_memmap_size, NULL, &map_key,
|
||||
+ &efi_mdesc_size, &mdesc_ver);
|
||||
mbi.mem_upper -= efi_memmap_size;
|
||||
mbi.mem_upper &= -__alignof__(EFI_MEMORY_DESCRIPTOR);
|
||||
if ( mbi.mem_upper < xen_phys_start )
|
||||
@@ -1389,7 +1390,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SY
|
||||
status = efi_bs->GetMemoryMap(&efi_memmap_size, efi_memmap, &map_key,
|
||||
&efi_mdesc_size, &mdesc_ver);
|
||||
if ( EFI_ERROR(status) )
|
||||
- blexit(L"Cannot obtain memory map");
|
||||
+ PrintErrMesg(L"Cannot obtain memory map", status);
|
||||
|
||||
/* Populate E820 table and check trampoline area availability. */
|
||||
e = e820map - 1;
|
@ -1,169 +0,0 @@
|
||||
# Commit dab11417da4e21f43625f4ebbb68158f07003d04
|
||||
# Date 2014-06-25 14:40:34 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/HVM: consolidate and sanitize CR4 guest reserved bit determination
|
||||
|
||||
First of all, this is needed by just a single source file, so it gets
|
||||
moved there instead of getting fed to the compiler for most other
|
||||
source files too. With that it becomes sensible for this to no longer
|
||||
be a macro, allowing elimination of the mostly redundant helpers
|
||||
hvm_vcpu_has_{smep,smap}(). And finally, following the model SMEP and
|
||||
SMAP already used, tie the determination of reserved bits to the
|
||||
features the guest is shown rather than the host's.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
Index: xen-4.4.1-testing/xen/arch/x86/hvm/hvm.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/xen/arch/x86/hvm/hvm.c
|
||||
+++ xen-4.4.1-testing/xen/arch/x86/hvm/hvm.c
|
||||
@@ -827,6 +827,73 @@ static bool_t hvm_efer_valid(struct doma
|
||||
((value & (EFER_LME|EFER_LMA)) == EFER_LMA));
|
||||
}
|
||||
|
||||
+/* These reserved bits in lower 32 remain 0 after any load of CR0 */
|
||||
+#define HVM_CR0_GUEST_RESERVED_BITS \
|
||||
+ (~((unsigned long) \
|
||||
+ (X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | \
|
||||
+ X86_CR0_TS | X86_CR0_ET | X86_CR0_NE | \
|
||||
+ X86_CR0_WP | X86_CR0_AM | X86_CR0_NW | \
|
||||
+ X86_CR0_CD | X86_CR0_PG)))
|
||||
+
|
||||
+/* These bits in CR4 cannot be set by the guest. */
|
||||
+static unsigned long hvm_cr4_guest_reserved_bits(const struct vcpu *v,
|
||||
+ bool_t restore)
|
||||
+{
|
||||
+ unsigned int leaf1_ecx = 0, leaf1_edx = 0;
|
||||
+ unsigned int leaf7_0_ebx = 0, leaf7_0_ecx = 0;
|
||||
+
|
||||
+ if ( likely(!restore) )
|
||||
+ {
|
||||
+ unsigned int level;
|
||||
+
|
||||
+ ASSERT(v == current);
|
||||
+ hvm_cpuid(0, &level, NULL, NULL, NULL);
|
||||
+ if ( level >= 1 )
|
||||
+ hvm_cpuid(1, NULL, NULL, &leaf1_ecx, &leaf1_edx);
|
||||
+ if ( level >= 7 )
|
||||
+ hvm_cpuid(7, NULL, &leaf7_0_ebx, &leaf7_0_ecx, NULL);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ leaf1_edx = boot_cpu_data.x86_capability[X86_FEATURE_VME / 32];
|
||||
+ leaf1_ecx = boot_cpu_data.x86_capability[X86_FEATURE_PCID / 32];
|
||||
+ leaf7_0_ebx = boot_cpu_data.x86_capability[X86_FEATURE_FSGSBASE / 32];
|
||||
+ }
|
||||
+
|
||||
+ return ~(unsigned long)
|
||||
+ ((leaf1_edx & cpufeat_mask(X86_FEATURE_VME) ?
|
||||
+ X86_CR4_VME | X86_CR4_PVI : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_TSC) ?
|
||||
+ X86_CR4_TSD : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_DE) ?
|
||||
+ X86_CR4_DE : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_PSE) ?
|
||||
+ X86_CR4_PSE : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_PAE) ?
|
||||
+ X86_CR4_PAE : 0) |
|
||||
+ (leaf1_edx & (cpufeat_mask(X86_FEATURE_MCE) |
|
||||
+ cpufeat_mask(X86_FEATURE_MCA)) ?
|
||||
+ X86_CR4_MCE : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_PGE) ?
|
||||
+ X86_CR4_PGE : 0) |
|
||||
+ X86_CR4_PCE |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_FXSR) ?
|
||||
+ X86_CR4_OSFXSR : 0) |
|
||||
+ (leaf1_edx & cpufeat_mask(X86_FEATURE_XMM) ?
|
||||
+ X86_CR4_OSXMMEXCPT : 0) |
|
||||
+ ((restore || nestedhvm_enabled(v->domain)) &&
|
||||
+ (leaf1_ecx & cpufeat_mask(X86_FEATURE_VMXE)) ?
|
||||
+ X86_CR4_VMXE : 0) |
|
||||
+ (leaf7_0_ebx & cpufeat_mask(X86_FEATURE_FSGSBASE) ?
|
||||
+ X86_CR4_FSGSBASE : 0) |
|
||||
+ (leaf1_ecx & cpufeat_mask(X86_FEATURE_PCID) ?
|
||||
+ X86_CR4_PCIDE : 0) |
|
||||
+ (leaf1_ecx & cpufeat_mask(X86_FEATURE_XSAVE) ?
|
||||
+ X86_CR4_OSXSAVE : 0) |
|
||||
+ (leaf7_0_ebx & cpufeat_mask(X86_FEATURE_SMEP) ?
|
||||
+ X86_CR4_SMEP : 0));
|
||||
+}
|
||||
+
|
||||
static int hvm_load_cpu_ctxt(struct domain *d, hvm_domain_context_t *h)
|
||||
{
|
||||
int vcpuid;
|
||||
@@ -857,7 +924,7 @@ static int hvm_load_cpu_ctxt(struct doma
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if ( ctxt.cr4 & HVM_CR4_GUEST_RESERVED_BITS(v, 1) )
|
||||
+ if ( ctxt.cr4 & hvm_cr4_guest_reserved_bits(v, 1) )
|
||||
{
|
||||
printk(XENLOG_G_ERR "HVM%d restore: bad CR4 %#" PRIx64 "\n",
|
||||
d->domain_id, ctxt.cr4);
|
||||
@@ -1981,7 +2048,7 @@ int hvm_set_cr4(unsigned long value)
|
||||
struct vcpu *v = current;
|
||||
unsigned long old_cr;
|
||||
|
||||
- if ( value & HVM_CR4_GUEST_RESERVED_BITS(v, 0) )
|
||||
+ if ( value & hvm_cr4_guest_reserved_bits(v, 0) )
|
||||
{
|
||||
HVM_DBG_LOG(DBG_LEVEL_1,
|
||||
"Guest attempts to set reserved bit in CR4: %lx",
|
||||
Index: xen-4.4.1-testing/xen/include/asm-x86/hvm/hvm.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/xen/include/asm-x86/hvm/hvm.h
|
||||
+++ xen-4.4.1-testing/xen/include/asm-x86/hvm/hvm.h
|
||||
@@ -347,51 +347,10 @@ static inline int hvm_event_pending(stru
|
||||
return hvm_funcs.event_pending(v);
|
||||
}
|
||||
|
||||
-static inline bool_t hvm_vcpu_has_smep(void)
|
||||
-{
|
||||
- unsigned int eax, ebx;
|
||||
-
|
||||
- hvm_cpuid(0, &eax, NULL, NULL, NULL);
|
||||
-
|
||||
- if ( eax < 7 )
|
||||
- return 0;
|
||||
-
|
||||
- hvm_cpuid(7, NULL, &ebx, NULL, NULL);
|
||||
- return !!(ebx & cpufeat_mask(X86_FEATURE_SMEP));
|
||||
-}
|
||||
-
|
||||
-/* These reserved bits in lower 32 remain 0 after any load of CR0 */
|
||||
-#define HVM_CR0_GUEST_RESERVED_BITS \
|
||||
- (~((unsigned long) \
|
||||
- (X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | \
|
||||
- X86_CR0_TS | X86_CR0_ET | X86_CR0_NE | \
|
||||
- X86_CR0_WP | X86_CR0_AM | X86_CR0_NW | \
|
||||
- X86_CR0_CD | X86_CR0_PG)))
|
||||
-
|
||||
/* These bits in CR4 are owned by the host. */
|
||||
#define HVM_CR4_HOST_MASK (mmu_cr4_features & \
|
||||
(X86_CR4_VMXE | X86_CR4_PAE | X86_CR4_MCE))
|
||||
|
||||
-/* These bits in CR4 cannot be set by the guest. */
|
||||
-#define HVM_CR4_GUEST_RESERVED_BITS(v, restore) ({ \
|
||||
- const struct vcpu *_v = (v); \
|
||||
- bool_t _restore = !!(restore); \
|
||||
- ASSERT((_restore) || _v == current); \
|
||||
- (~((unsigned long) \
|
||||
- (X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | \
|
||||
- X86_CR4_DE | X86_CR4_PSE | X86_CR4_PAE | \
|
||||
- X86_CR4_MCE | X86_CR4_PGE | X86_CR4_PCE | \
|
||||
- X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT | \
|
||||
- (((_restore) ? cpu_has_smep : \
|
||||
- hvm_vcpu_has_smep()) ? \
|
||||
- X86_CR4_SMEP : 0) | \
|
||||
- (cpu_has_fsgsbase ? X86_CR4_FSGSBASE : 0) | \
|
||||
- ((nestedhvm_enabled(_v->domain) && cpu_has_vmx) \
|
||||
- ? X86_CR4_VMXE : 0) | \
|
||||
- (cpu_has_pcid ? X86_CR4_PCIDE : 0) | \
|
||||
- (cpu_has_xsave ? X86_CR4_OSXSAVE : 0)))); \
|
||||
-})
|
||||
-
|
||||
/* These exceptions must always be intercepted. */
|
||||
#define HVM_TRAP_MASK ((1U << TRAP_machine_check) | (1U << TRAP_invalid_op))
|
||||
|
@ -1,39 +0,0 @@
|
||||
Subject: xl: 'xl vncviewer' accesses port 0 by any invalid domid
|
||||
From: Chunyan Liu cyliu@suse.com Fri Jul 18 14:18:04 2014 +0800
|
||||
Date: Fri Jul 18 13:37:47 2014 +0100:
|
||||
Git: 2a8cc1a55329ead252ed323ec4bbee534d5c0f23
|
||||
|
||||
Currently, with command:
|
||||
xl vncviewer invalid_domid
|
||||
it always brings user to the domU using vncport 5900.
|
||||
The invalid domid could be an non-existing one or Dom0.
|
||||
It's better to report error in this case.
|
||||
|
||||
Correct libxl_vncviewer_exec:
|
||||
In existing code, when vncport is NULL, it still continues
|
||||
and will show vncport 5900. So, with 'xl vncviewer 0' it also
|
||||
wrongly shows domU using vncport 5900. Correct it to report error
|
||||
if vncport is NULL.
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
@@ -1635,8 +1635,12 @@ int libxl_vncviewer_exec(libxl_ctx *ctx,
|
||||
vnc_port = libxl__xs_read(gc, XBT_NULL,
|
||||
libxl__sprintf(gc,
|
||||
"/local/domain/%d/console/vnc-port", domid));
|
||||
- if ( vnc_port )
|
||||
- port = atoi(vnc_port) - 5900;
|
||||
+ if (!vnc_port) {
|
||||
+ LOG(ERROR, "Cannot get vnc-port of domain %d", domid);
|
||||
+ goto x_fail;
|
||||
+ }
|
||||
+
|
||||
+ port = atoi(vnc_port) - 5900;
|
||||
|
||||
vnc_listen = libxl__xs_read(gc, XBT_NULL,
|
||||
libxl__sprintf(gc,
|
@ -1,43 +0,0 @@
|
||||
From ef8cf0d4902c90595a0b0766e2a9a6ecbcbc4581 Mon Sep 17 00:00:00 2001
|
||||
From: Chunyan Liu <cyliu@suse.com>
|
||||
Date: Wed, 23 Jul 2014 17:42:09 +0800
|
||||
Subject: [PATCH] fix list_domain_details: check config data length=0
|
||||
|
||||
If domain is created through virsh, then in xl, one could see it
|
||||
with 'xl list', but with 'xl list --long domU', it reports:
|
||||
"Domain name must be specified."
|
||||
The reason is xl config data does not exist but it still tries
|
||||
to parse_config_data in current code.
|
||||
|
||||
Improve list_domain_details:
|
||||
If len of config data is 0, just pass, do not go forward to
|
||||
parse_config_data, otherwise, it will meet error like
|
||||
"Domain name not specified" and exit. This error is not expected,
|
||||
since if code enters list_domain_details, domain name validness
|
||||
is already checked and domain does exist.
|
||||
|
||||
Length of config data is 0 may means: config data does not exist due
|
||||
to some reason, like: domain is created by libvirt, or in destroying
|
||||
domain process config data is cleared but domain fails to clean up.
|
||||
No matter in which case, list_domain_details could just show empty
|
||||
info, but not error like "Domain name not specified".
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||||
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||
---
|
||||
tools/libxl/xl_cmdimpl.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -3198,6 +3198,8 @@ static void list_domains_details(const l
|
||||
rc = libxl_userdata_retrieve(ctx, info[i].domid, "xl", &data, &len);
|
||||
if (rc)
|
||||
continue;
|
||||
+ if (len == 0)
|
||||
+ continue;
|
||||
CHK_SYSCALL(asprintf(&config_source, "<domid %d data>", info[i].domid));
|
||||
libxl_domain_config_init(&d_config);
|
||||
parse_config_data(config_source, (char *)data, len, &d_config, NULL);
|
@ -1,166 +0,0 @@
|
||||
References: bnc#883112
|
||||
|
||||
# Commit e9425f05b90811458a08355a55a0b0d608c440cf
|
||||
# Date 2014-08-01 16:29:27 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/ACPI: allow CMOS RTC use even when ACPI says there is none
|
||||
|
||||
HP is setting the ACPI_FADT_NO_CMOS_RTC flag on newer systems,
|
||||
regardless of whether they're being booted from UEFI. Add a command
|
||||
line option to allow probing for a working RTC in that case.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
--- a/docs/misc/xen-command-line.markdown
|
||||
+++ b/docs/misc/xen-command-line.markdown
|
||||
@@ -207,6 +207,14 @@ If set, override Xen's calculation of th
|
||||
|
||||
If set, override Xen's default choice for the platform timer.
|
||||
|
||||
+### cmos-rtc-probe
|
||||
+> `= <boolean>`
|
||||
+
|
||||
+> Default: `false`
|
||||
+
|
||||
+Flag to indicate whether to probe for a CMOS Real Time Clock irrespective of
|
||||
+ACPI indicating none to be there.
|
||||
+
|
||||
### com1,com2
|
||||
> `= <baud>[/<clock_hz>][,[DPS][,[<io-base>|pci|amt][,[<irq>][,[<port-bdf>][,[<bridge-bdf>]]]]]]`
|
||||
|
||||
--- a/xen/arch/x86/time.c
|
||||
+++ b/xen/arch/x86/time.c
|
||||
@@ -651,37 +651,40 @@ mktime (unsigned int year, unsigned int
|
||||
)*60 + sec; /* finally seconds */
|
||||
}
|
||||
|
||||
-static unsigned long __get_cmos_time(void)
|
||||
-{
|
||||
+struct rtc_time {
|
||||
unsigned int year, mon, day, hour, min, sec;
|
||||
+};
|
||||
|
||||
- sec = CMOS_READ(RTC_SECONDS);
|
||||
- min = CMOS_READ(RTC_MINUTES);
|
||||
- hour = CMOS_READ(RTC_HOURS);
|
||||
- day = CMOS_READ(RTC_DAY_OF_MONTH);
|
||||
- mon = CMOS_READ(RTC_MONTH);
|
||||
- year = CMOS_READ(RTC_YEAR);
|
||||
+static void __get_cmos_time(struct rtc_time *rtc)
|
||||
+{
|
||||
+ rtc->sec = CMOS_READ(RTC_SECONDS);
|
||||
+ rtc->min = CMOS_READ(RTC_MINUTES);
|
||||
+ rtc->hour = CMOS_READ(RTC_HOURS);
|
||||
+ rtc->day = CMOS_READ(RTC_DAY_OF_MONTH);
|
||||
+ rtc->mon = CMOS_READ(RTC_MONTH);
|
||||
+ rtc->year = CMOS_READ(RTC_YEAR);
|
||||
|
||||
if ( !(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD )
|
||||
{
|
||||
- BCD_TO_BIN(sec);
|
||||
- BCD_TO_BIN(min);
|
||||
- BCD_TO_BIN(hour);
|
||||
- BCD_TO_BIN(day);
|
||||
- BCD_TO_BIN(mon);
|
||||
- BCD_TO_BIN(year);
|
||||
+ BCD_TO_BIN(rtc->sec);
|
||||
+ BCD_TO_BIN(rtc->min);
|
||||
+ BCD_TO_BIN(rtc->hour);
|
||||
+ BCD_TO_BIN(rtc->day);
|
||||
+ BCD_TO_BIN(rtc->mon);
|
||||
+ BCD_TO_BIN(rtc->year);
|
||||
}
|
||||
|
||||
- if ( (year += 1900) < 1970 )
|
||||
- year += 100;
|
||||
-
|
||||
- return mktime(year, mon, day, hour, min, sec);
|
||||
+ if ( (rtc->year += 1900) < 1970 )
|
||||
+ rtc->year += 100;
|
||||
}
|
||||
|
||||
static unsigned long get_cmos_time(void)
|
||||
{
|
||||
unsigned long res, flags;
|
||||
- int i;
|
||||
+ struct rtc_time rtc;
|
||||
+ unsigned int seconds = 60;
|
||||
+ static bool_t __read_mostly cmos_rtc_probe;
|
||||
+ boolean_param("cmos-rtc-probe", cmos_rtc_probe);
|
||||
|
||||
if ( efi_enabled )
|
||||
{
|
||||
@@ -690,23 +693,58 @@ static unsigned long get_cmos_time(void)
|
||||
return res;
|
||||
}
|
||||
|
||||
- if ( unlikely(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC) )
|
||||
- panic("System without CMOS RTC must be booted from EFI");
|
||||
-
|
||||
- spin_lock_irqsave(&rtc_lock, flags);
|
||||
-
|
||||
- /* read RTC exactly on falling edge of update flag */
|
||||
- for ( i = 0 ; i < 1000000 ; i++ ) /* may take up to 1 second... */
|
||||
- if ( (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) )
|
||||
+ if ( likely(!(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC)) )
|
||||
+ cmos_rtc_probe = 0;
|
||||
+ else if ( system_state < SYS_STATE_active && !cmos_rtc_probe )
|
||||
+ panic("System with no CMOS RTC advertised must be booted from EFI"
|
||||
+ " (or with command line option \"cmos-rtc-probe\")");
|
||||
+
|
||||
+ for ( ; ; )
|
||||
+ {
|
||||
+ s_time_t start, t1, t2;
|
||||
+
|
||||
+ spin_lock_irqsave(&rtc_lock, flags);
|
||||
+
|
||||
+ /* read RTC exactly on falling edge of update flag */
|
||||
+ start = NOW();
|
||||
+ do { /* may take up to 1 second... */
|
||||
+ t1 = NOW() - start;
|
||||
+ } while ( !(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) &&
|
||||
+ t1 <= SECONDS(1) );
|
||||
+
|
||||
+ start = NOW();
|
||||
+ do { /* must try at least 2.228 ms */
|
||||
+ t2 = NOW() - start;
|
||||
+ } while ( (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) &&
|
||||
+ t2 < MILLISECS(3) );
|
||||
+
|
||||
+ __get_cmos_time(&rtc);
|
||||
+
|
||||
+ spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
+
|
||||
+ if ( likely(!cmos_rtc_probe) ||
|
||||
+ t1 > SECONDS(1) || t2 >= MILLISECS(3) ||
|
||||
+ rtc.sec >= 60 || rtc.min >= 60 || rtc.hour >= 24 ||
|
||||
+ !rtc.day || rtc.day > 31 ||
|
||||
+ !rtc.mon || rtc.mon > 12 )
|
||||
break;
|
||||
- for ( i = 0 ; i < 1000000 ; i++ ) /* must try at least 2.228 ms */
|
||||
- if ( !(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) )
|
||||
+
|
||||
+ if ( seconds < 60 )
|
||||
+ {
|
||||
+ if ( rtc.sec != seconds )
|
||||
+ cmos_rtc_probe = 0;
|
||||
break;
|
||||
+ }
|
||||
+
|
||||
+ process_pending_softirqs();
|
||||
+
|
||||
+ seconds = rtc.sec;
|
||||
+ }
|
||||
|
||||
- res = __get_cmos_time();
|
||||
+ if ( unlikely(cmos_rtc_probe) )
|
||||
+ panic("No CMOS RTC found - system must be booted from EFI");
|
||||
|
||||
- spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
- return res;
|
||||
+ return mktime(rtc.year, rtc.mon, rtc.day, rtc.hour, rtc.min, rtc.sec);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
@ -1,112 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit fd1863847af15c3676348447755e1a1801f9d394
|
||||
# Date 2014-08-04 13:46:03 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/HVM: extend LAPIC shortcuts around P2M lookups
|
||||
|
||||
... to all internally handled MMIO regions. It is in particular the
|
||||
HPET page that, e.g. on Windows Server 2012 R2, can get heavily
|
||||
accessed, and hence avoiding the unnecessary lookups is rather
|
||||
beneficial (in the reported case a 40+-vCPU guest would previously not
|
||||
have booted at all while with hvm_hap_nested_page_fault() shortcut
|
||||
alone it was able to boot up in 18 minutes [i.e. still room for
|
||||
improvement]).
|
||||
|
||||
Note the apparently unrelated addition of a is_hvm_vcpu() check to the
|
||||
__hvm_copy() code: Afaict for PVH this shortcut should never have taken
|
||||
effect (since there's no LAPIC in that case).
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Tim Deegan <tim@xen.org>
|
||||
|
||||
|
||||
--- a/xen/arch/x86/hvm/hvm.c
|
||||
+++ b/xen/arch/x86/hvm/hvm.c
|
||||
@@ -1521,11 +1521,14 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
}
|
||||
}
|
||||
|
||||
- /* For the benefit of 32-bit WinXP (& older Windows) on AMD CPUs,
|
||||
- * a fast path for LAPIC accesses, skipping the p2m lookup. */
|
||||
+ /*
|
||||
+ * No need to do the P2M lookup for internally handled MMIO, benefiting
|
||||
+ * - 32-bit WinXP (& older Windows) on AMD CPUs for LAPIC accesses,
|
||||
+ * - newer Windows (like Server 2012) for HPET accesses.
|
||||
+ */
|
||||
if ( !nestedhvm_vcpu_in_guestmode(v)
|
||||
&& is_hvm_vcpu(v)
|
||||
- && gfn == PFN_DOWN(vlapic_base_address(vcpu_vlapic(v))) )
|
||||
+ && hvm_mmio_internal(gpa) )
|
||||
{
|
||||
if ( !handle_mmio() )
|
||||
hvm_inject_hw_exception(TRAP_gp_fault, 0);
|
||||
@@ -2644,7 +2647,9 @@ static enum hvm_copy_result __hvm_copy(
|
||||
|
||||
while ( todo > 0 )
|
||||
{
|
||||
- count = min_t(int, PAGE_SIZE - (addr & ~PAGE_MASK), todo);
|
||||
+ paddr_t gpa = addr & ~PAGE_MASK;
|
||||
+
|
||||
+ count = min_t(int, PAGE_SIZE - gpa, todo);
|
||||
|
||||
if ( flags & HVMCOPY_virt )
|
||||
{
|
||||
@@ -2659,16 +2664,22 @@ static enum hvm_copy_result __hvm_copy(
|
||||
hvm_inject_page_fault(pfec, addr);
|
||||
return HVMCOPY_bad_gva_to_gfn;
|
||||
}
|
||||
+ gpa |= (paddr_t)gfn << PAGE_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
gfn = addr >> PAGE_SHIFT;
|
||||
+ gpa = addr;
|
||||
}
|
||||
|
||||
- /* For the benefit of 32-bit WinXP (& older Windows) on AMD CPUs,
|
||||
- * a fast path for LAPIC accesses, skipping the p2m lookup. */
|
||||
+ /*
|
||||
+ * No need to do the P2M lookup for internally handled MMIO, benefiting
|
||||
+ * - 32-bit WinXP (& older Windows) on AMD CPUs for LAPIC accesses,
|
||||
+ * - newer Windows (like Server 2012) for HPET accesses.
|
||||
+ */
|
||||
if ( !nestedhvm_vcpu_in_guestmode(curr)
|
||||
- && gfn == PFN_DOWN(vlapic_base_address(vcpu_vlapic(curr))) )
|
||||
+ && is_hvm_vcpu(curr)
|
||||
+ && hvm_mmio_internal(gpa) )
|
||||
return HVMCOPY_bad_gfn_to_mfn;
|
||||
|
||||
page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
|
||||
--- a/xen/arch/x86/hvm/intercept.c
|
||||
+++ b/xen/arch/x86/hvm/intercept.c
|
||||
@@ -163,6 +163,18 @@ static int hvm_mmio_access(struct vcpu *
|
||||
return rc;
|
||||
}
|
||||
|
||||
+bool_t hvm_mmio_internal(paddr_t gpa)
|
||||
+{
|
||||
+ struct vcpu *curr = current;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for ( i = 0; i < HVM_MMIO_HANDLER_NR; ++i )
|
||||
+ if ( hvm_mmio_handlers[i]->check_handler(curr, gpa) )
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int hvm_mmio_intercept(ioreq_t *p)
|
||||
{
|
||||
struct vcpu *v = current;
|
||||
--- a/xen/include/asm-x86/hvm/io.h
|
||||
+++ b/xen/include/asm-x86/hvm/io.h
|
||||
@@ -91,6 +91,7 @@ static inline int hvm_buffered_io_interc
|
||||
return hvm_io_intercept(p, HVM_BUFFERED_IO);
|
||||
}
|
||||
|
||||
+bool_t hvm_mmio_internal(paddr_t gpa);
|
||||
int hvm_mmio_intercept(ioreq_t *p);
|
||||
int hvm_buffered_io_send(ioreq_t *p);
|
||||
|
@ -1,194 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit ded2100990d1688b96c2edc7221887c56c1a8e04
|
||||
# Date 2014-08-11 15:00:15 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/vHPET: use rwlock instead of simple one
|
||||
|
||||
This namely benefits guests heavily reading the main counter, but not
|
||||
touching the HPET much otherwise. Note that due to the way
|
||||
hpet_get_comparator() works hpet_read() has to special cases reads from
|
||||
the comparator registers and use a write lock there instead of the read
|
||||
one used for all other registers.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
--- a/xen/arch/x86/hvm/hpet.c
|
||||
+++ b/xen/arch/x86/hvm/hpet.c
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
static inline uint64_t hpet_read_maincounter(HPETState *h)
|
||||
{
|
||||
- ASSERT(spin_is_locked(&h->lock));
|
||||
+ ASSERT(rw_is_locked(&h->lock));
|
||||
|
||||
if ( hpet_enabled(h) )
|
||||
return guest_time_hpet(h) + h->mc_offset;
|
||||
@@ -88,6 +88,8 @@ static uint64_t hpet_get_comparator(HPET
|
||||
uint64_t comparator;
|
||||
uint64_t elapsed;
|
||||
|
||||
+ ASSERT(rw_is_write_locked(&h->lock));
|
||||
+
|
||||
comparator = h->hpet.comparator64[tn];
|
||||
if ( timer_is_periodic(h, tn) )
|
||||
{
|
||||
@@ -172,16 +174,24 @@ static int hpet_read(
|
||||
goto out;
|
||||
}
|
||||
|
||||
- spin_lock(&h->lock);
|
||||
+ result = addr < HPET_Tn_CMP(0) ||
|
||||
+ ((addr - HPET_Tn_CMP(0)) % (HPET_Tn_CMP(1) - HPET_Tn_CMP(0))) > 7;
|
||||
+ if ( result )
|
||||
+ read_lock(&h->lock);
|
||||
+ else
|
||||
+ write_lock(&h->lock);
|
||||
|
||||
val = hpet_read64(h, addr);
|
||||
|
||||
+ if ( result )
|
||||
+ read_unlock(&h->lock);
|
||||
+ else
|
||||
+ write_unlock(&h->lock);
|
||||
+
|
||||
result = val;
|
||||
if ( length != 8 )
|
||||
result = (val >> ((addr & 7) * 8)) & ((1ULL << (length * 8)) - 1);
|
||||
|
||||
- spin_unlock(&h->lock);
|
||||
-
|
||||
out:
|
||||
*pval = result;
|
||||
return X86EMUL_OKAY;
|
||||
@@ -190,7 +200,7 @@ static int hpet_read(
|
||||
static void hpet_stop_timer(HPETState *h, unsigned int tn)
|
||||
{
|
||||
ASSERT(tn < HPET_TIMER_NUM);
|
||||
- ASSERT(spin_is_locked(&h->lock));
|
||||
+ ASSERT(rw_is_write_locked(&h->lock));
|
||||
destroy_periodic_time(&h->pt[tn]);
|
||||
/* read the comparator to get it updated so a read while stopped will
|
||||
* return the expected value. */
|
||||
@@ -208,7 +218,7 @@ static void hpet_set_timer(HPETState *h,
|
||||
unsigned int oneshot;
|
||||
|
||||
ASSERT(tn < HPET_TIMER_NUM);
|
||||
- ASSERT(spin_is_locked(&h->lock));
|
||||
+ ASSERT(rw_is_write_locked(&h->lock));
|
||||
|
||||
if ( (tn == 0) && (h->hpet.config & HPET_CFG_LEGACY) )
|
||||
{
|
||||
@@ -289,7 +299,7 @@ static int hpet_write(
|
||||
if ( hpet_check_access_length(addr, length) != 0 )
|
||||
goto out;
|
||||
|
||||
- spin_lock(&h->lock);
|
||||
+ write_lock(&h->lock);
|
||||
|
||||
old_val = hpet_read64(h, addr);
|
||||
new_val = val;
|
||||
@@ -448,7 +458,7 @@ static int hpet_write(
|
||||
#undef set_start_timer
|
||||
#undef set_restart_timer
|
||||
|
||||
- spin_unlock(&h->lock);
|
||||
+ write_unlock(&h->lock);
|
||||
|
||||
out:
|
||||
return X86EMUL_OKAY;
|
||||
@@ -473,7 +483,7 @@ static int hpet_save(struct domain *d, h
|
||||
HPETState *hp = domain_vhpet(d);
|
||||
int rc;
|
||||
|
||||
- spin_lock(&hp->lock);
|
||||
+ write_lock(&hp->lock);
|
||||
|
||||
/* Write the proper value into the main counter */
|
||||
hp->hpet.mc64 = hp->mc_offset + guest_time_hpet(hp);
|
||||
@@ -507,7 +517,7 @@ static int hpet_save(struct domain *d, h
|
||||
rec->timers[2].cmp = hp->hpet.comparator64[2];
|
||||
}
|
||||
|
||||
- spin_unlock(&hp->lock);
|
||||
+ write_unlock(&hp->lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -519,12 +529,12 @@ static int hpet_load(struct domain *d, h
|
||||
uint64_t cmp;
|
||||
int i;
|
||||
|
||||
- spin_lock(&hp->lock);
|
||||
+ write_lock(&hp->lock);
|
||||
|
||||
/* Reload the HPET registers */
|
||||
if ( _hvm_check_entry(h, HVM_SAVE_CODE(HPET), HVM_SAVE_LENGTH(HPET), 1) )
|
||||
{
|
||||
- spin_unlock(&hp->lock);
|
||||
+ write_unlock(&hp->lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -564,7 +574,7 @@ static int hpet_load(struct domain *d, h
|
||||
if ( timer_enabled(hp, i) )
|
||||
hpet_set_timer(hp, i);
|
||||
|
||||
- spin_unlock(&hp->lock);
|
||||
+ write_unlock(&hp->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -578,7 +588,7 @@ void hpet_init(struct vcpu *v)
|
||||
|
||||
memset(h, 0, sizeof(HPETState));
|
||||
|
||||
- spin_lock_init(&h->lock);
|
||||
+ rwlock_init(&h->lock);
|
||||
|
||||
h->stime_freq = S_TO_NS;
|
||||
|
||||
@@ -607,14 +617,14 @@ void hpet_deinit(struct domain *d)
|
||||
int i;
|
||||
HPETState *h = domain_vhpet(d);
|
||||
|
||||
- spin_lock(&h->lock);
|
||||
+ write_lock(&h->lock);
|
||||
|
||||
if ( hpet_enabled(h) )
|
||||
for ( i = 0; i < HPET_TIMER_NUM; i++ )
|
||||
if ( timer_enabled(h, i) )
|
||||
hpet_stop_timer(h, i);
|
||||
|
||||
- spin_unlock(&h->lock);
|
||||
+ write_unlock(&h->lock);
|
||||
}
|
||||
|
||||
void hpet_reset(struct domain *d)
|
||||
--- a/xen/arch/x86/hvm/vpt.c
|
||||
+++ b/xen/arch/x86/hvm/vpt.c
|
||||
@@ -508,10 +508,10 @@ void pt_adjust_global_vcpu_target(struct
|
||||
pt_adjust_vcpu(&pl_time->vrtc.pt, v);
|
||||
spin_unlock(&pl_time->vrtc.lock);
|
||||
|
||||
- spin_lock(&pl_time->vhpet.lock);
|
||||
+ write_lock(&pl_time->vhpet.lock);
|
||||
for ( i = 0; i < HPET_TIMER_NUM; i++ )
|
||||
pt_adjust_vcpu(&pl_time->vhpet.pt[i], v);
|
||||
- spin_unlock(&pl_time->vhpet.lock);
|
||||
+ write_unlock(&pl_time->vhpet.lock);
|
||||
}
|
||||
|
||||
|
||||
--- a/xen/include/asm-x86/hvm/vpt.h
|
||||
+++ b/xen/include/asm-x86/hvm/vpt.h
|
||||
@@ -96,7 +96,7 @@ typedef struct HPETState {
|
||||
uint64_t hpet_to_ns_limit; /* max hpet ticks convertable to ns */
|
||||
uint64_t mc_offset;
|
||||
struct periodic_time pt[HPET_TIMER_NUM];
|
||||
- spinlock_t lock;
|
||||
+ rwlock_t lock;
|
||||
} HPETState;
|
||||
|
||||
typedef struct RTCState {
|
@ -1,39 +0,0 @@
|
||||
# Commit dfa625e15f3d6c374637f2bb789e1f444c2781c3
|
||||
# Date 2014-08-22 14:29:37 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
VMX: fix DebugCtl MSR clearing
|
||||
|
||||
The previous shortcut was wrong, as it bypassed the necessary vmwrite:
|
||||
All we really want to avoid if the guest writes zero is to add the MSR
|
||||
to the host-load list.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Acked-by: Kevin Tian <kevin.tian@intel.com>
|
||||
|
||||
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||||
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||||
@@ -2170,8 +2170,6 @@ static int vmx_msr_write_intercept(unsig
|
||||
int i, rc = 0;
|
||||
uint64_t supported = IA32_DEBUGCTLMSR_LBR | IA32_DEBUGCTLMSR_BTF;
|
||||
|
||||
- if ( !msr_content )
|
||||
- break;
|
||||
if ( msr_content & ~supported )
|
||||
{
|
||||
/* Perhaps some other bits are supported in vpmu. */
|
||||
@@ -2191,12 +2189,10 @@ static int vmx_msr_write_intercept(unsig
|
||||
}
|
||||
|
||||
if ( (rc < 0) ||
|
||||
- (vmx_add_host_load_msr(msr) < 0) )
|
||||
+ (msr_content && (vmx_add_host_load_msr(msr) < 0)) )
|
||||
hvm_inject_hw_exception(TRAP_machine_check, 0);
|
||||
else
|
||||
- {
|
||||
__vmwrite(GUEST_IA32_DEBUGCTL, msr_content);
|
||||
- }
|
||||
|
||||
break;
|
||||
}
|
@ -1,119 +0,0 @@
|
||||
# Commit e13b3203990706db1313ec2aadd9a30b249ee793
|
||||
# Date 2014-08-22 14:32:45 +0200
|
||||
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/irq: process softirqs in irq keyhandlers
|
||||
|
||||
Large machines with lots of interrupts can trip over the Xen watchdog.
|
||||
|
||||
Suggested-by: Santosh Jodh <Santosh.Jodh@citrix.com>
|
||||
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Tested-by: Santosh Jodh <Santosh.Jodh@citrix.com>
|
||||
|
||||
# Commit bd083922f9e78ed19ef98e7de372e5f568402ed3
|
||||
# Date 2014-08-26 17:56:52 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/IO-APIC: don't process softirqs during early boot
|
||||
|
||||
Commit e13b320399 ("x86/irq: process softirqs in irq keyhandlers")
|
||||
made this unconditional, but the boot time use of __print_IO_APIC()
|
||||
(when "apic_verbosity=debug" was given) can't tolerate that.
|
||||
|
||||
Reported-by: Sander Eikelenboom <linux@eikelenboom.it>
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Tested-by: Sander Eikelenboom <linux@eikelenboom.it>
|
||||
|
||||
--- a/xen/arch/x86/io_apic.c
|
||||
+++ b/xen/arch/x86/io_apic.c
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <xen/sched.h>
|
||||
#include <xen/acpi.h>
|
||||
#include <xen/keyhandler.h>
|
||||
+#include <xen/softirq.h>
|
||||
#include <asm/mc146818rtc.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/desc.h>
|
||||
@@ -1091,7 +1092,7 @@ static inline void UNEXPECTED_IO_APIC(vo
|
||||
{
|
||||
}
|
||||
|
||||
-static void /*__init*/ __print_IO_APIC(void)
|
||||
+static void /*__init*/ __print_IO_APIC(bool_t boot)
|
||||
{
|
||||
int apic, i;
|
||||
union IO_APIC_reg_00 reg_00;
|
||||
@@ -1112,6 +1113,9 @@ static void /*__init*/ __print_IO_APIC(v
|
||||
printk(KERN_INFO "testing the IO APIC.......................\n");
|
||||
|
||||
for (apic = 0; apic < nr_ioapics; apic++) {
|
||||
+ if ( !boot )
|
||||
+ process_pending_softirqs();
|
||||
+
|
||||
if (!nr_ioapic_entries[apic])
|
||||
continue;
|
||||
|
||||
@@ -1215,6 +1219,10 @@ static void /*__init*/ __print_IO_APIC(v
|
||||
printk(KERN_DEBUG "IRQ to pin mappings:\n");
|
||||
for (i = 0; i < nr_irqs_gsi; i++) {
|
||||
struct irq_pin_list *entry = irq_2_pin + i;
|
||||
+
|
||||
+ if ( !boot && !(i & 0x1f) )
|
||||
+ process_pending_softirqs();
|
||||
+
|
||||
if (entry->pin < 0)
|
||||
continue;
|
||||
printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
|
||||
@@ -1235,12 +1243,12 @@ static void /*__init*/ __print_IO_APIC(v
|
||||
static void __init print_IO_APIC(void)
|
||||
{
|
||||
if (apic_verbosity != APIC_QUIET)
|
||||
- __print_IO_APIC();
|
||||
+ __print_IO_APIC(1);
|
||||
}
|
||||
|
||||
static void _print_IO_APIC_keyhandler(unsigned char key)
|
||||
{
|
||||
- __print_IO_APIC();
|
||||
+ __print_IO_APIC(0);
|
||||
}
|
||||
static struct keyhandler print_IO_APIC_keyhandler = {
|
||||
.diagnostic = 1,
|
||||
@@ -2454,6 +2462,9 @@ void dump_ioapic_irq_info(void)
|
||||
|
||||
for ( irq = 0; irq < nr_irqs_gsi; irq++ )
|
||||
{
|
||||
+ if ( !(irq & 0x1f) )
|
||||
+ process_pending_softirqs();
|
||||
+
|
||||
entry = &irq_2_pin[irq];
|
||||
if ( entry->pin == -1 )
|
||||
continue;
|
||||
--- a/xen/arch/x86/irq.c
|
||||
+++ b/xen/arch/x86/irq.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <xen/iommu.h>
|
||||
#include <xen/symbols.h>
|
||||
#include <xen/trace.h>
|
||||
+#include <xen/softirq.h>
|
||||
#include <xsm/xsm.h>
|
||||
#include <asm/msi.h>
|
||||
#include <asm/current.h>
|
||||
@@ -2231,6 +2232,8 @@ static void dump_irqs(unsigned char key)
|
||||
|
||||
for ( irq = 0; irq < nr_irqs; irq++ )
|
||||
{
|
||||
+ if ( !(irq & 0x1f) )
|
||||
+ process_pending_softirqs();
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
|
||||
@@ -2284,6 +2287,7 @@ static void dump_irqs(unsigned char key)
|
||||
xfree(ssid);
|
||||
}
|
||||
|
||||
+ process_pending_softirqs();
|
||||
printk("Direct vector information:\n");
|
||||
for ( i = FIRST_DYNAMIC_VECTOR; i < NR_VECTORS; ++i )
|
||||
if ( direct_apic_vector[i] )
|
@ -1,335 +0,0 @@
|
||||
Subject: xen: pass kernel initrd to qemu
|
||||
From: Chunyan Liu cyliu@suse.com Mon Jul 7 14:34:33 2014 +0800
|
||||
Date: Tue Aug 26 21:18:51 2014 +0100:
|
||||
Git: 11dffa2359e8a2629490c14c029c7c7c777b3e47
|
||||
|
||||
xen side patch to support xen HVM direct kernel boot:
|
||||
support 'kernel', 'ramdisk', 'cmdline' (and 'root', 'extra' as well
|
||||
which would be deprecated later) in HVM config file, parse config file,
|
||||
pass -kernel, -initrd, -append parameters to qemu.
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5
|
||||
+++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
@@ -296,6 +296,37 @@ Action to take if the domain crashes. D
|
||||
|
||||
=back
|
||||
|
||||
+=head3 Direct Kernel Boot
|
||||
+
|
||||
+Direct kernel boot allows booting directly from a kernel and initrd
|
||||
+stored in the host physical machine OS, allowing command line arguments
|
||||
+to be passed directly. PV guest direct kernel boot is supported. HVM
|
||||
+guest direct kernel boot is supported with limitation (it's supported
|
||||
+when using qemu-xen and default BIOS 'seabios'; not supported in case of
|
||||
+stubdom-dm and old rombios.)
|
||||
+
|
||||
+=over 4
|
||||
+
|
||||
+=item B<kernel="PATHNAME">
|
||||
+
|
||||
+Load the specified file as the kernel image.
|
||||
+
|
||||
+=item B<ramdisk="PATHNAME">
|
||||
+
|
||||
+Load the specified file as the ramdisk.
|
||||
+
|
||||
+=item B<root="STRING">
|
||||
+
|
||||
+Append B<root="STRING"> to the kernel command line (Note: it is guest
|
||||
+specific what meaning this has).
|
||||
+
|
||||
+=item B<extra="STRING">
|
||||
+
|
||||
+Append B<STRING> to the kernel command line. (Note: it is guest
|
||||
+specific what meaning this has).
|
||||
+
|
||||
+=back
|
||||
+
|
||||
=head3 Other Options
|
||||
|
||||
=over 4
|
||||
@@ -625,20 +656,12 @@ The following options apply only to Para
|
||||
|
||||
=over 4
|
||||
|
||||
-=item B<kernel="PATHNAME">
|
||||
-
|
||||
-Load the specified file as the kernel image. Either B<kernel> or
|
||||
-B<bootloader> must be specified for PV guests.
|
||||
-
|
||||
-=item B<ramdisk="PATHNAME">
|
||||
-
|
||||
-Load the specified file as the ramdisk.
|
||||
-
|
||||
=item B<bootloader="PROGRAM">
|
||||
|
||||
Run C<PROGRAM> to find the kernel image and ramdisk to use. Normally
|
||||
C<PROGRAM> would be C<pygrub>, which is an emulation of
|
||||
-grub/grub2/syslinux.
|
||||
+grub/grub2/syslinux. Either B<kernel> or B<bootloader> must be specified
|
||||
+for PV guests.
|
||||
|
||||
=item B<bootloader_args=[ "ARG", "ARG", ...]>
|
||||
|
||||
@@ -646,16 +669,6 @@ Append B<ARG>s to the arguments to the B
|
||||
program. Alternatively if the argument is a simple string then it will
|
||||
be split into words at whitespace (this second option is deprecated).
|
||||
|
||||
-=item B<root="STRING">
|
||||
-
|
||||
-Append B<root="STRING"> to the kernel command line (Note: it is guest
|
||||
-specific what meaning this has).
|
||||
-
|
||||
-=item B<extra="STRING">
|
||||
-
|
||||
-Append B<STRING> to the kernel command line. Note: it is guest
|
||||
-specific what meaning this has).
|
||||
-
|
||||
=item B<e820_host=BOOLEAN>
|
||||
|
||||
Selects whether to expose the host e820 (memory map) to the guest via
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
@@ -445,6 +445,21 @@
|
||||
#define LIBXL_HAVE_NO_SUSPEND_RESUME 1
|
||||
#endif
|
||||
|
||||
+/*
|
||||
+ * LIBXL_HAVE_BUILDINFO_KERNEL
|
||||
+ *
|
||||
+ * If this is defined, then the libxl_domain_build_info structure will
|
||||
+ * contain 'kernel', 'ramdisk', 'cmdline' fields. 'kernel' is a string
|
||||
+ * to indicate kernel image location, 'ramdisk' is a string to indicate
|
||||
+ * ramdisk location, 'cmdline' is a string to indicate the paramters which
|
||||
+ * would be appended to kernel image.
|
||||
+ *
|
||||
+ * Both PV guest and HVM guest can use these fields for direct kernel boot.
|
||||
+ * But for compatibility reason, u.pv.kernel, u.pv.ramdisk and u.pv.cmdline
|
||||
+ * still exist.
|
||||
+ */
|
||||
+#define LIBXL_HAVE_BUILDINFO_KERNEL 1
|
||||
+
|
||||
/* Functions annotated with LIBXL_EXTERNAL_CALLERS_ONLY may not be
|
||||
* called from within libxl itself. Callers outside libxl, who
|
||||
* do not #include libxl_internal.h, are fine. */
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_bootloader.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_bootloader.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_bootloader.c
|
||||
@@ -56,12 +56,12 @@ static void make_bootloader_args(libxl__
|
||||
|
||||
ARG(bootloader_path);
|
||||
|
||||
- if (info->u.pv.kernel)
|
||||
- ARG(libxl__sprintf(gc, "--kernel=%s", info->u.pv.kernel));
|
||||
- if (info->u.pv.ramdisk)
|
||||
- ARG(libxl__sprintf(gc, "--ramdisk=%s", info->u.pv.ramdisk));
|
||||
- if (info->u.pv.cmdline && *info->u.pv.cmdline != '\0')
|
||||
- ARG(libxl__sprintf(gc, "--args=%s", info->u.pv.cmdline));
|
||||
+ if (info->kernel)
|
||||
+ ARG(libxl__sprintf(gc, "--kernel=%s", info->kernel));
|
||||
+ if (info->ramdisk)
|
||||
+ ARG(libxl__sprintf(gc, "--ramdisk=%s", info->ramdisk));
|
||||
+ if (info->cmdline && *info->cmdline != '\0')
|
||||
+ ARG(libxl__sprintf(gc, "--args=%s", info->cmdline));
|
||||
|
||||
ARG(libxl__sprintf(gc, "--output=%s", bl->outputpath));
|
||||
ARG("--output-format=simple0");
|
||||
@@ -325,9 +325,9 @@ void libxl__bootloader_run(libxl__egc *e
|
||||
|
||||
if (!info->u.pv.bootloader) {
|
||||
LOG(DEBUG, "no bootloader configured, using user supplied kernel");
|
||||
- bl->kernel->path = bl->info->u.pv.kernel;
|
||||
- bl->ramdisk->path = bl->info->u.pv.ramdisk;
|
||||
- bl->cmdline = bl->info->u.pv.cmdline;
|
||||
+ bl->kernel->path = bl->info->kernel;
|
||||
+ bl->ramdisk->path = bl->info->ramdisk;
|
||||
+ bl->cmdline = bl->info->cmdline;
|
||||
rc = 0;
|
||||
goto out_ok;
|
||||
}
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_create.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_create.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_create.c
|
||||
@@ -337,6 +337,25 @@ int libxl__domain_build_info_setdefault(
|
||||
b_info->shadow_memkb = 0;
|
||||
if (b_info->u.pv.slack_memkb == LIBXL_MEMKB_DEFAULT)
|
||||
b_info->u.pv.slack_memkb = 0;
|
||||
+
|
||||
+ /* For compatibility, fill in b_info->kernel|ramdisk|cmdline
|
||||
+ * with the value in u.pv, later processing will use
|
||||
+ * b_info->kernel|ramdisk|cmdline only.
|
||||
+ * User with old APIs that passes u.pv.kernel|ramdisk|cmdline
|
||||
+ * is not affected.
|
||||
+ */
|
||||
+ if (!b_info->kernel && b_info->u.pv.kernel) {
|
||||
+ b_info->kernel = b_info->u.pv.kernel;
|
||||
+ b_info->u.pv.kernel = NULL;
|
||||
+ }
|
||||
+ if (!b_info->ramdisk && b_info->u.pv.ramdisk) {
|
||||
+ b_info->ramdisk = b_info->u.pv.ramdisk;
|
||||
+ b_info->u.pv.ramdisk = NULL;
|
||||
+ }
|
||||
+ if (!b_info->cmdline && b_info->u.pv.cmdline) {
|
||||
+ b_info->cmdline = b_info->u.pv.cmdline;
|
||||
+ b_info->u.pv.cmdline = NULL;
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_dm.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_dm.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_dm.c
|
||||
@@ -196,6 +196,12 @@ static char ** libxl__build_device_model
|
||||
int nr_set_cpus = 0;
|
||||
char *s;
|
||||
|
||||
+ if (b_info->kernel) {
|
||||
+ LOG(ERROR, "HVM direct kernel boot is not supported by "
|
||||
+ "qemu-xen-traditional");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
if (b_info->u.hvm.serial) {
|
||||
flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL);
|
||||
}
|
||||
@@ -481,6 +487,15 @@ static char ** libxl__build_device_model
|
||||
if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
|
||||
int ioemu_nics = 0;
|
||||
|
||||
+ if (b_info->kernel)
|
||||
+ flexarray_vappend(dm_args, "-kernel", b_info->kernel, NULL);
|
||||
+
|
||||
+ if (b_info->ramdisk)
|
||||
+ flexarray_vappend(dm_args, "-initrd", b_info->ramdisk, NULL);
|
||||
+
|
||||
+ if (b_info->cmdline)
|
||||
+ flexarray_vappend(dm_args, "-append", b_info->cmdline, NULL);
|
||||
+
|
||||
if (b_info->u.hvm.serial) {
|
||||
flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL);
|
||||
}
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
@@ -333,6 +333,9 @@ libxl_domain_build_info = Struct("domain
|
||||
("iomem", Array(libxl_iomem_range, "num_iomem")),
|
||||
("claim_mode", libxl_defbool),
|
||||
("event_channels", uint32),
|
||||
+ ("kernel", string),
|
||||
+ ("cmdline", string),
|
||||
+ ("ramdisk", string),
|
||||
("u", KeyedUnion(None, libxl_domain_type, "type",
|
||||
[("hvm", Struct(None, [("firmware", string),
|
||||
("bios", libxl_bios_type),
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -721,6 +721,29 @@ static void parse_top_level_vnc_options(
|
||||
xlu_cfg_get_defbool(config, "vncunused", &vnc->findunused, 0);
|
||||
}
|
||||
|
||||
+static char *parse_cmdline(XLU_Config *config)
|
||||
+{
|
||||
+ char *cmdline = NULL;
|
||||
+ const char *root = NULL, *extra = "";
|
||||
+
|
||||
+ xlu_cfg_get_string (config, "root", &root, 0);
|
||||
+ xlu_cfg_get_string (config, "extra", &extra, 0);
|
||||
+
|
||||
+ if (root) {
|
||||
+ if (asprintf(&cmdline, "root=%s %s", root, extra) == -1)
|
||||
+ cmdline = NULL;
|
||||
+ } else {
|
||||
+ cmdline = strdup(extra);
|
||||
+ }
|
||||
+
|
||||
+ if ((root || extra) && !cmdline) {
|
||||
+ fprintf(stderr, "Failed to allocate memory for cmdline\n");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ return cmdline;
|
||||
+}
|
||||
+
|
||||
static void parse_config_data(const char *config_source,
|
||||
const char *config_data,
|
||||
int config_len,
|
||||
@@ -998,13 +1021,21 @@ static void parse_config_data(const char
|
||||
if (!xlu_cfg_get_long(config, "max_event_channels", &l, 0))
|
||||
b_info->event_channels = l;
|
||||
|
||||
+ xlu_cfg_replace_string (config, "kernel", &b_info->kernel, 0);
|
||||
+ xlu_cfg_replace_string (config, "ramdisk", &b_info->ramdisk, 0);
|
||||
+ b_info->cmdline = parse_cmdline(config);
|
||||
+
|
||||
xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0);
|
||||
|
||||
switch(b_info->type) {
|
||||
case LIBXL_DOMAIN_TYPE_HVM:
|
||||
- if (!xlu_cfg_get_string (config, "kernel", &buf, 0))
|
||||
- fprintf(stderr, "WARNING: ignoring \"kernel\" directive for HVM guest. "
|
||||
- "Use \"firmware_override\" instead if you really want a non-default firmware\n");
|
||||
+ if (!strcmp(libxl_basename(b_info->kernel), "hvmloader")) {
|
||||
+ fprintf(stderr, "WARNING: you seem to be using \"kernel\" "
|
||||
+ "directive to override HVM guest firmware. Ignore "
|
||||
+ "that. Use \"firmware_override\" instead if you "
|
||||
+ "really want a non-default firmware\n");
|
||||
+ b_info->kernel = NULL;
|
||||
+ }
|
||||
|
||||
xlu_cfg_replace_string (config, "firmware_override",
|
||||
&b_info->u.hvm.firmware, 0);
|
||||
@@ -1056,26 +1087,6 @@ static void parse_config_data(const char
|
||||
break;
|
||||
case LIBXL_DOMAIN_TYPE_PV:
|
||||
{
|
||||
- char *cmdline = NULL;
|
||||
- const char *root = NULL, *extra = "";
|
||||
-
|
||||
- xlu_cfg_replace_string (config, "kernel", &b_info->u.pv.kernel, 0);
|
||||
-
|
||||
- xlu_cfg_get_string (config, "root", &root, 0);
|
||||
- xlu_cfg_get_string (config, "extra", &extra, 0);
|
||||
-
|
||||
- if (root) {
|
||||
- if (asprintf(&cmdline, "root=%s %s", root, extra) == -1)
|
||||
- cmdline = NULL;
|
||||
- } else {
|
||||
- cmdline = strdup(extra);
|
||||
- }
|
||||
-
|
||||
- if ((root || extra) && !cmdline) {
|
||||
- fprintf(stderr, "Failed to allocate memory for cmdline\n");
|
||||
- exit(1);
|
||||
- }
|
||||
-
|
||||
xlu_cfg_replace_string (config, "bootloader", &b_info->u.pv.bootloader, 0);
|
||||
switch (xlu_cfg_get_list_as_string_list(config, "bootloader_args",
|
||||
&b_info->u.pv.bootloader_args, 1))
|
||||
@@ -1098,13 +1109,11 @@ static void parse_config_data(const char
|
||||
exit(-ERROR_FAIL);
|
||||
}
|
||||
|
||||
- if (!b_info->u.pv.bootloader && !b_info->u.pv.kernel) {
|
||||
+ if (!b_info->u.pv.bootloader && !b_info->kernel) {
|
||||
fprintf(stderr, "Neither kernel nor bootloader specified\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
- b_info->u.pv.cmdline = cmdline;
|
||||
- xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk, 0);
|
||||
break;
|
||||
}
|
||||
default:
|
@ -1,331 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit 3d4d4f9336159f3f77a7b480ce9984fd3ff7949f
|
||||
# Date 2014-08-28 16:02:01 +0200
|
||||
# Author Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86: consolidate boolean inputs in hvm and p2m into a shared bitmap
|
||||
|
||||
This patch consolidates the boolean input parameters of
|
||||
hvm_hap_nested_page_fault and p2m_mem_access_check into a common bitmap
|
||||
and defines the bitmap members accordingly.
|
||||
|
||||
Signed-off-by: Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Kevin Tian <kevin.tian@intel.com>
|
||||
Reviewed-by: Tim Deegan <tim@xen.org>
|
||||
|
||||
# Commit 24857896a30105b7947e2cd36d63768054538bbc
|
||||
# Date 2014-09-03 15:06:06 +0200
|
||||
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/hvm: fix operator precedence bug introduced by 3d4d4f9336
|
||||
|
||||
Bitwise or has greater precedence than the ternary operator, making the result
|
||||
of the expression a constant P2M_UNSHARE.
|
||||
|
||||
Coverity-ID: 1234633
|
||||
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Don Slutz <dslutz@verizon.com>
|
||||
|
||||
--- a/xen/arch/x86/hvm/hvm.c
|
||||
+++ b/xen/arch/x86/hvm/hvm.c
|
||||
@@ -1464,12 +1464,8 @@ void hvm_inject_page_fault(int errcode,
|
||||
hvm_inject_trap(&trap);
|
||||
}
|
||||
|
||||
-int hvm_hap_nested_page_fault(paddr_t gpa,
|
||||
- bool_t gla_valid,
|
||||
- unsigned long gla,
|
||||
- bool_t access_r,
|
||||
- bool_t access_w,
|
||||
- bool_t access_x)
|
||||
+int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
|
||||
+ struct npfec npfec)
|
||||
{
|
||||
unsigned long gfn = gpa >> PAGE_SHIFT;
|
||||
p2m_type_t p2mt;
|
||||
@@ -1498,8 +1494,11 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
* into l1 guest if not fixable. The algorithm is
|
||||
* the same as for shadow paging.
|
||||
*/
|
||||
- rv = nestedhvm_hap_nested_page_fault(v, &gpa,
|
||||
- access_r, access_w, access_x);
|
||||
+
|
||||
+ rv = nestedhvm_hap_nested_page_fault(v, &gpa,
|
||||
+ npfec.read_access,
|
||||
+ npfec.write_access,
|
||||
+ npfec.insn_fetch);
|
||||
switch (rv) {
|
||||
case NESTEDHVM_PAGEFAULT_DONE:
|
||||
case NESTEDHVM_PAGEFAULT_RETRY:
|
||||
@@ -1538,47 +1537,49 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
|
||||
p2m = p2m_get_hostp2m(v->domain);
|
||||
mfn = get_gfn_type_access(p2m, gfn, &p2mt, &p2ma,
|
||||
- P2M_ALLOC | (access_w ? P2M_UNSHARE : 0), NULL);
|
||||
+ P2M_ALLOC | (npfec.write_access ? P2M_UNSHARE : 0),
|
||||
+ NULL);
|
||||
|
||||
/* Check access permissions first, then handle faults */
|
||||
if ( mfn_x(mfn) != INVALID_MFN )
|
||||
{
|
||||
- int violation = 0;
|
||||
+ bool_t violation;
|
||||
+
|
||||
/* If the access is against the permissions, then send to mem_event */
|
||||
- switch (p2ma)
|
||||
+ switch (p2ma)
|
||||
{
|
||||
case p2m_access_n:
|
||||
case p2m_access_n2rwx:
|
||||
default:
|
||||
- violation = access_r || access_w || access_x;
|
||||
+ violation = npfec.read_access || npfec.write_access || npfec.insn_fetch;
|
||||
break;
|
||||
case p2m_access_r:
|
||||
- violation = access_w || access_x;
|
||||
+ violation = npfec.write_access || npfec.insn_fetch;
|
||||
break;
|
||||
case p2m_access_w:
|
||||
- violation = access_r || access_x;
|
||||
+ violation = npfec.read_access || npfec.insn_fetch;
|
||||
break;
|
||||
case p2m_access_x:
|
||||
- violation = access_r || access_w;
|
||||
+ violation = npfec.read_access || npfec.write_access;
|
||||
break;
|
||||
case p2m_access_rx:
|
||||
case p2m_access_rx2rw:
|
||||
- violation = access_w;
|
||||
+ violation = npfec.write_access;
|
||||
break;
|
||||
case p2m_access_wx:
|
||||
- violation = access_r;
|
||||
+ violation = npfec.read_access;
|
||||
break;
|
||||
case p2m_access_rw:
|
||||
- violation = access_x;
|
||||
+ violation = npfec.insn_fetch;
|
||||
break;
|
||||
case p2m_access_rwx:
|
||||
+ violation = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( violation )
|
||||
{
|
||||
- if ( p2m_mem_access_check(gpa, gla_valid, gla, access_r,
|
||||
- access_w, access_x, &req_ptr) )
|
||||
+ if ( p2m_mem_access_check(gpa, gla, npfec, &req_ptr) )
|
||||
{
|
||||
fall_through = 1;
|
||||
} else {
|
||||
@@ -1594,7 +1595,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
* to the mmio handler.
|
||||
*/
|
||||
if ( (p2mt == p2m_mmio_dm) ||
|
||||
- (access_w && (p2mt == p2m_ram_ro)) )
|
||||
+ (npfec.write_access && (p2mt == p2m_ram_ro)) )
|
||||
{
|
||||
put_gfn(p2m->domain, gfn);
|
||||
|
||||
@@ -1613,7 +1614,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
paged = 1;
|
||||
|
||||
/* Mem sharing: unshare the page and try again */
|
||||
- if ( access_w && (p2mt == p2m_ram_shared) )
|
||||
+ if ( npfec.write_access && (p2mt == p2m_ram_shared) )
|
||||
{
|
||||
ASSERT(!p2m_is_nestedp2m(p2m));
|
||||
sharing_enomem =
|
||||
@@ -1630,7 +1631,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
* a large page, we do not change other pages type within that large
|
||||
* page.
|
||||
*/
|
||||
- if ( access_w )
|
||||
+ if ( npfec.write_access )
|
||||
{
|
||||
paging_mark_dirty(v->domain, mfn_x(mfn));
|
||||
p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
|
||||
@@ -1640,7 +1641,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
}
|
||||
|
||||
/* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */
|
||||
- if ( access_w && (p2mt == p2m_grant_map_ro) )
|
||||
+ if ( npfec.write_access && (p2mt == p2m_grant_map_ro) )
|
||||
{
|
||||
gdprintk(XENLOG_WARNING,
|
||||
"trying to write to read-only grant mapping\n");
|
||||
--- a/xen/arch/x86/hvm/svm/svm.c
|
||||
+++ b/xen/arch/x86/hvm/svm/svm.c
|
||||
@@ -1289,7 +1289,7 @@ const struct hvm_function_table * __init
|
||||
}
|
||||
|
||||
static void svm_do_nested_pgfault(struct vcpu *v,
|
||||
- struct cpu_user_regs *regs, uint32_t npfec, paddr_t gpa)
|
||||
+ struct cpu_user_regs *regs, uint32_t pfec, paddr_t gpa)
|
||||
{
|
||||
int ret;
|
||||
unsigned long gfn = gpa >> PAGE_SHIFT;
|
||||
@@ -1298,10 +1298,13 @@ static void svm_do_nested_pgfault(struct
|
||||
p2m_access_t p2ma;
|
||||
struct p2m_domain *p2m = NULL;
|
||||
|
||||
- ret = hvm_hap_nested_page_fault(gpa, 0, ~0ul,
|
||||
- 1, /* All NPFs count as reads */
|
||||
- npfec & PFEC_write_access,
|
||||
- npfec & PFEC_insn_fetch);
|
||||
+ struct npfec npfec = {
|
||||
+ .read_access = 1, /* All NPFs count as reads */
|
||||
+ .write_access = !!(pfec & PFEC_write_access),
|
||||
+ .insn_fetch = !!(pfec & PFEC_insn_fetch)
|
||||
+ };
|
||||
+
|
||||
+ ret = hvm_hap_nested_page_fault(gpa, ~0ul, npfec);
|
||||
|
||||
if ( tb_init_done )
|
||||
{
|
||||
@@ -1329,7 +1332,7 @@ static void svm_do_nested_pgfault(struct
|
||||
case -1:
|
||||
ASSERT(nestedhvm_enabled(v->domain) && nestedhvm_vcpu_in_guestmode(v));
|
||||
/* inject #VMEXIT(NPF) into guest. */
|
||||
- nestedsvm_vmexit_defer(v, VMEXIT_NPF, npfec, gpa);
|
||||
+ nestedsvm_vmexit_defer(v, VMEXIT_NPF, pfec, gpa);
|
||||
return;
|
||||
}
|
||||
|
||||
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||||
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||||
@@ -2278,6 +2278,11 @@ static void ept_handle_violation(unsigne
|
||||
p2m_type_t p2mt;
|
||||
int ret;
|
||||
struct domain *d = current->domain;
|
||||
+ struct npfec npfec = {
|
||||
+ .read_access = !!(qualification & EPT_READ_VIOLATION),
|
||||
+ .write_access = !!(qualification & EPT_WRITE_VIOLATION),
|
||||
+ .insn_fetch = !!(qualification & EPT_EXEC_VIOLATION)
|
||||
+ };
|
||||
|
||||
if ( tb_init_done )
|
||||
{
|
||||
@@ -2296,14 +2301,14 @@ static void ept_handle_violation(unsigne
|
||||
}
|
||||
|
||||
if ( qualification & EPT_GLA_VALID )
|
||||
+ {
|
||||
__vmread(GUEST_LINEAR_ADDRESS, &gla);
|
||||
+ npfec.gla_valid = 1;
|
||||
+ }
|
||||
else
|
||||
gla = ~0ull;
|
||||
- ret = hvm_hap_nested_page_fault(gpa,
|
||||
- !!(qualification & EPT_GLA_VALID), gla,
|
||||
- !!(qualification & EPT_READ_VIOLATION),
|
||||
- !!(qualification & EPT_WRITE_VIOLATION),
|
||||
- !!(qualification & EPT_EXEC_VIOLATION));
|
||||
+
|
||||
+ ret = hvm_hap_nested_page_fault(gpa, gla, npfec);
|
||||
switch ( ret )
|
||||
{
|
||||
case 0: // Unhandled L1 EPT violation
|
||||
--- a/xen/arch/x86/mm/p2m.c
|
||||
+++ b/xen/arch/x86/mm/p2m.c
|
||||
@@ -1261,9 +1261,9 @@ void p2m_mem_paging_resume(struct domain
|
||||
}
|
||||
}
|
||||
|
||||
-bool_t p2m_mem_access_check(paddr_t gpa, bool_t gla_valid, unsigned long gla,
|
||||
- bool_t access_r, bool_t access_w, bool_t access_x,
|
||||
- mem_event_request_t **req_ptr)
|
||||
+bool_t p2m_mem_access_check(paddr_t gpa, unsigned long gla,
|
||||
+ struct npfec npfec,
|
||||
+ mem_event_request_t **req_ptr)
|
||||
{
|
||||
struct vcpu *v = current;
|
||||
unsigned long gfn = gpa >> PAGE_SHIFT;
|
||||
@@ -1281,7 +1281,7 @@ bool_t p2m_mem_access_check(paddr_t gpa,
|
||||
gfn_lock(p2m, gfn, 0);
|
||||
mfn = p2m->get_entry(p2m, gfn, &p2mt, &p2ma, 0, NULL);
|
||||
|
||||
- if ( access_w && p2ma == p2m_access_rx2rw )
|
||||
+ if ( npfec.write_access && p2ma == p2m_access_rx2rw )
|
||||
{
|
||||
rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rw);
|
||||
ASSERT(rc);
|
||||
@@ -1290,7 +1290,7 @@ bool_t p2m_mem_access_check(paddr_t gpa,
|
||||
}
|
||||
else if ( p2ma == p2m_access_n2rwx )
|
||||
{
|
||||
- ASSERT(access_w || access_r || access_x);
|
||||
+ ASSERT(npfec.write_access || npfec.read_access || npfec.insn_fetch);
|
||||
rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
|
||||
p2mt, p2m_access_rwx);
|
||||
ASSERT(rc);
|
||||
@@ -1341,11 +1341,11 @@ bool_t p2m_mem_access_check(paddr_t gpa,
|
||||
/* Send request to mem event */
|
||||
req->gfn = gfn;
|
||||
req->offset = gpa & ((1 << PAGE_SHIFT) - 1);
|
||||
- req->gla_valid = gla_valid;
|
||||
+ req->gla_valid = npfec.gla_valid;
|
||||
req->gla = gla;
|
||||
- req->access_r = access_r;
|
||||
- req->access_w = access_w;
|
||||
- req->access_x = access_x;
|
||||
+ req->access_r = npfec.read_access;
|
||||
+ req->access_w = npfec.write_access;
|
||||
+ req->access_x = npfec.insn_fetch;
|
||||
|
||||
req->vcpu_id = v->vcpu_id;
|
||||
}
|
||||
--- a/xen/include/asm-x86/hvm/hvm.h
|
||||
+++ b/xen/include/asm-x86/hvm/hvm.h
|
||||
@@ -435,11 +435,8 @@ static inline void hvm_invalidate_regs_f
|
||||
#endif
|
||||
}
|
||||
|
||||
-int hvm_hap_nested_page_fault(paddr_t gpa,
|
||||
- bool_t gla_valid, unsigned long gla,
|
||||
- bool_t access_r,
|
||||
- bool_t access_w,
|
||||
- bool_t access_x);
|
||||
+int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
|
||||
+ struct npfec npfec);
|
||||
|
||||
#define hvm_msr_tsc_aux(v) ({ \
|
||||
struct domain *__d = (v)->domain; \
|
||||
--- a/xen/include/asm-x86/mm.h
|
||||
+++ b/xen/include/asm-x86/mm.h
|
||||
@@ -551,6 +551,16 @@ void audit_domains(void);
|
||||
|
||||
#endif
|
||||
|
||||
+/*
|
||||
+ * Nested page fault exception codes.
|
||||
+ */
|
||||
+struct npfec {
|
||||
+ unsigned int read_access:1;
|
||||
+ unsigned int write_access:1;
|
||||
+ unsigned int insn_fetch:1;
|
||||
+ unsigned int gla_valid:1;
|
||||
+};
|
||||
+
|
||||
int new_guest_cr3(unsigned long pfn);
|
||||
void make_cr3(struct vcpu *v, unsigned long mfn);
|
||||
void update_cr3(struct vcpu *v);
|
||||
--- a/xen/include/asm-x86/p2m.h
|
||||
+++ b/xen/include/asm-x86/p2m.h
|
||||
@@ -568,9 +568,9 @@ void p2m_mem_paging_resume(struct domain
|
||||
* been promoted with no underlying vcpu pause. If the req_ptr has been populated,
|
||||
* then the caller must put the event in the ring (once having released get_gfn*
|
||||
* locks -- caller must also xfree the request. */
|
||||
-bool_t p2m_mem_access_check(paddr_t gpa, bool_t gla_valid, unsigned long gla,
|
||||
- bool_t access_r, bool_t access_w, bool_t access_x,
|
||||
- mem_event_request_t **req_ptr);
|
||||
+bool_t p2m_mem_access_check(paddr_t gpa, unsigned long gla,
|
||||
+ struct npfec npfec,
|
||||
+ mem_event_request_t **req_ptr);
|
||||
/* Resumes the running of the VCPU, restarting the last instruction */
|
||||
void p2m_mem_access_resume(struct domain *d);
|
||||
|
@ -1,69 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit 401d5c5cc5a780cad160aa0e3c282c11ac11dd0c
|
||||
# Date 2014-08-28 16:03:26 +0200
|
||||
# Author Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/hvm: treat non-instruction fetch nested page faults also as read violations
|
||||
|
||||
As pointed out by Jan Beulich in
|
||||
http://lists.xen.org/archives/html/xen-devel/2014-08/msg01269.html:
|
||||
"Read-modify-write instructions absolutely need to be treated as read
|
||||
accesses, yet hardware doesn't guarantee to tell us so (they may
|
||||
surface as just write accesses)." This patch addresses the issue in
|
||||
both the VMX and the SVM side.
|
||||
|
||||
VMX: Treat all write data access violations also as read violations (in
|
||||
addition to those that were already reported as read violations).
|
||||
SVM: Refine the meaning of read data access violations to distinguish
|
||||
between read/write and instruction fetch access violations.
|
||||
|
||||
With this patch both VMX and SVM specific nested page fault handling code reports violations the same way, thus abstracting the hardware specific behaviour from the layers above.
|
||||
|
||||
Suggested-by: Jan Beulich <JBeulich@suse.com>
|
||||
Signed-off-by: Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
||||
Reviewed-by: Tim Deegan <tim@xen.org>
|
||||
|
||||
--- a/xen/arch/x86/hvm/svm/svm.c
|
||||
+++ b/xen/arch/x86/hvm/svm/svm.c
|
||||
@@ -1298,8 +1298,13 @@ static void svm_do_nested_pgfault(struct
|
||||
p2m_access_t p2ma;
|
||||
struct p2m_domain *p2m = NULL;
|
||||
|
||||
+ /*
|
||||
+ * Since HW doesn't explicitly provide a read access bit and we need to
|
||||
+ * somehow describe read-modify-write instructions we will conservatively
|
||||
+ * set read_access for all memory accesses that are not instruction fetches.
|
||||
+ */
|
||||
struct npfec npfec = {
|
||||
- .read_access = 1, /* All NPFs count as reads */
|
||||
+ .read_access = !(pfec & PFEC_insn_fetch),
|
||||
.write_access = !!(pfec & PFEC_write_access),
|
||||
.insn_fetch = !!(pfec & PFEC_insn_fetch)
|
||||
};
|
||||
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||||
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||||
@@ -2278,8 +2278,21 @@ static void ept_handle_violation(unsigne
|
||||
p2m_type_t p2mt;
|
||||
int ret;
|
||||
struct domain *d = current->domain;
|
||||
+
|
||||
+ /*
|
||||
+ * We treat all write violations also as read violations.
|
||||
+ * The reason why this is required is the following warning:
|
||||
+ * "An EPT violation that occurs during as a result of execution of a
|
||||
+ * read-modify-write operation sets bit 1 (data write). Whether it also
|
||||
+ * sets bit 0 (data read) is implementation-specific and, for a given
|
||||
+ * implementation, may differ for different kinds of read-modify-write
|
||||
+ * operations."
|
||||
+ * - Intel(R) 64 and IA-32 Architectures Software Developer's Manual
|
||||
+ * Volume 3C: System Programming Guide, Part 3
|
||||
+ */
|
||||
struct npfec npfec = {
|
||||
- .read_access = !!(qualification & EPT_READ_VIOLATION),
|
||||
+ .read_access = !!(qualification & EPT_READ_VIOLATION) ||
|
||||
+ !!(qualification & EPT_WRITE_VIOLATION),
|
||||
.write_access = !!(qualification & EPT_WRITE_VIOLATION),
|
||||
.insn_fetch = !!(qualification & EPT_EXEC_VIOLATION)
|
||||
};
|
@ -1,133 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit 692f3cc7dd05b80dbd027e46372b1c25d7975332
|
||||
# Date 2014-08-28 16:04:05 +0200
|
||||
# Author Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/mem_event: deliver gla fault EPT violation information
|
||||
|
||||
On Intel EPT the exit qualification generated by a violation also
|
||||
includes a bit (EPT_GLA_FAULT) which describes the following
|
||||
information: Set if the access causing the EPT violation is to a
|
||||
guest-physical address that is the translation of a linear address.
|
||||
Clear if the access causing the EPT violation is to a paging-structure
|
||||
entry as part of a page walk or the update of an accessed or dirty bit.
|
||||
|
||||
For more information see Table 27-7 in the Intel SDM.
|
||||
|
||||
This patch extends the mem_event system to deliver this extra
|
||||
information, which could be useful for determining the cause of a
|
||||
violation.
|
||||
|
||||
Signed-off-by: Tamas K Lengyel <tamas.lengyel@zentific.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Kevin Tian <kevin.tian@intel.com>
|
||||
Acked-by: Tim Deegan <tim@xen.org>
|
||||
|
||||
--- a/xen/arch/x86/hvm/svm/svm.c
|
||||
+++ b/xen/arch/x86/hvm/svm/svm.c
|
||||
@@ -1289,7 +1289,7 @@ const struct hvm_function_table * __init
|
||||
}
|
||||
|
||||
static void svm_do_nested_pgfault(struct vcpu *v,
|
||||
- struct cpu_user_regs *regs, uint32_t pfec, paddr_t gpa)
|
||||
+ struct cpu_user_regs *regs, uint64_t pfec, paddr_t gpa)
|
||||
{
|
||||
int ret;
|
||||
unsigned long gfn = gpa >> PAGE_SHIFT;
|
||||
@@ -1309,6 +1309,12 @@ static void svm_do_nested_pgfault(struct
|
||||
.insn_fetch = !!(pfec & PFEC_insn_fetch)
|
||||
};
|
||||
|
||||
+ /* These bits are mutually exclusive */
|
||||
+ if ( pfec & NPT_PFEC_with_gla )
|
||||
+ npfec.kind = npfec_kind_with_gla;
|
||||
+ else if ( pfec & NPT_PFEC_in_gpt )
|
||||
+ npfec.kind = npfec_kind_in_gpt;
|
||||
+
|
||||
ret = hvm_hap_nested_page_fault(gpa, ~0ul, npfec);
|
||||
|
||||
if ( tb_init_done )
|
||||
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||||
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||||
@@ -2317,6 +2317,10 @@ static void ept_handle_violation(unsigne
|
||||
{
|
||||
__vmread(GUEST_LINEAR_ADDRESS, &gla);
|
||||
npfec.gla_valid = 1;
|
||||
+ if( qualification & EPT_GLA_FAULT )
|
||||
+ npfec.kind = npfec_kind_with_gla;
|
||||
+ else
|
||||
+ npfec.kind = npfec_kind_in_gpt;
|
||||
}
|
||||
else
|
||||
gla = ~0ull;
|
||||
--- a/xen/arch/x86/mm/p2m.c
|
||||
+++ b/xen/arch/x86/mm/p2m.c
|
||||
@@ -1343,10 +1343,13 @@ bool_t p2m_mem_access_check(paddr_t gpa,
|
||||
req->offset = gpa & ((1 << PAGE_SHIFT) - 1);
|
||||
req->gla_valid = npfec.gla_valid;
|
||||
req->gla = gla;
|
||||
+ if ( npfec.kind == npfec_kind_with_gla )
|
||||
+ req->fault_with_gla = 1;
|
||||
+ else if ( npfec.kind == npfec_kind_in_gpt )
|
||||
+ req->fault_in_gpt = 1;
|
||||
req->access_r = npfec.read_access;
|
||||
req->access_w = npfec.write_access;
|
||||
req->access_x = npfec.insn_fetch;
|
||||
-
|
||||
req->vcpu_id = v->vcpu_id;
|
||||
}
|
||||
|
||||
--- a/xen/include/asm-x86/hvm/svm/svm.h
|
||||
+++ b/xen/include/asm-x86/hvm/svm/svm.h
|
||||
@@ -105,4 +105,10 @@ extern u32 svm_feature_flags;
|
||||
extern void svm_host_osvw_reset(void);
|
||||
extern void svm_host_osvw_init(void);
|
||||
|
||||
+/* EXITINFO1 fields on NPT faults */
|
||||
+#define _NPT_PFEC_with_gla 32
|
||||
+#define NPT_PFEC_with_gla (1UL<<_NPT_PFEC_with_gla)
|
||||
+#define _NPT_PFEC_in_gpt 33
|
||||
+#define NPT_PFEC_in_gpt (1UL<<_NPT_PFEC_in_gpt)
|
||||
+
|
||||
#endif /* __ASM_X86_HVM_SVM_H__ */
|
||||
--- a/xen/include/asm-x86/mm.h
|
||||
+++ b/xen/include/asm-x86/mm.h
|
||||
@@ -552,6 +552,16 @@ void audit_domains(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
+ * Extra fault info types which are used to further describe
|
||||
+ * the source of an access violation.
|
||||
+ */
|
||||
+typedef enum {
|
||||
+ npfec_kind_unknown, /* must be first */
|
||||
+ npfec_kind_in_gpt, /* violation in guest page table */
|
||||
+ npfec_kind_with_gla /* violation with guest linear address */
|
||||
+} npfec_kind_t;
|
||||
+
|
||||
+/*
|
||||
* Nested page fault exception codes.
|
||||
*/
|
||||
struct npfec {
|
||||
@@ -559,6 +569,7 @@ struct npfec {
|
||||
unsigned int write_access:1;
|
||||
unsigned int insn_fetch:1;
|
||||
unsigned int gla_valid:1;
|
||||
+ unsigned int kind:2; /* npfec_kind_t */
|
||||
};
|
||||
|
||||
int new_guest_cr3(unsigned long pfn);
|
||||
--- a/xen/include/public/mem_event.h
|
||||
+++ b/xen/include/public/mem_event.h
|
||||
@@ -62,7 +62,9 @@ typedef struct mem_event_st {
|
||||
uint16_t access_w:1;
|
||||
uint16_t access_x:1;
|
||||
uint16_t gla_valid:1;
|
||||
- uint16_t available:12;
|
||||
+ uint16_t fault_with_gla:1;
|
||||
+ uint16_t fault_in_gpt:1;
|
||||
+ uint16_t available:10;
|
||||
|
||||
uint16_t reason;
|
||||
} mem_event_request_t, mem_event_response_t;
|
@ -1,49 +0,0 @@
|
||||
# Commit ad6eddb742577d182e634785bcfaf92732a50024
|
||||
# Date 2014-08-28 16:05:10 +0200
|
||||
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/ats: Disable Address Translation Services by default
|
||||
|
||||
Xen cannot safely use any ATS functionality until it gains asynchronous queued
|
||||
invalidation support, because of the current synchronous wait for completion.
|
||||
|
||||
Do not turn ATS on by default.
|
||||
|
||||
While editing the default in the command line documentation, correct the
|
||||
statement regarding PCI Passthrough. ATS is purely a performance
|
||||
optimisation, and is certainly not required for PCI Passthrough to function.
|
||||
|
||||
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
Acked-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
|
||||
--- a/docs/misc/xen-command-line.markdown
|
||||
+++ b/docs/misc/xen-command-line.markdown
|
||||
@@ -167,10 +167,13 @@ developers wishing Xen to fall back to o
|
||||
### ats
|
||||
> `= <boolean>`
|
||||
|
||||
-> Default: `true`
|
||||
+> Default: `false`
|
||||
+
|
||||
+Permits Xen to set up and use PCI Address Translation Services. This is a
|
||||
+performance optimisation for PCI Passthrough.
|
||||
|
||||
-Permits Xen to set up and use PCI Address Translation Services, which
|
||||
-is required for PCI Passthrough.
|
||||
+**WARNING: Xen cannot currently safely use ATS because of its synchronous wait
|
||||
+loops for Queued Invalidation completions.**
|
||||
|
||||
### availmem
|
||||
> `= <size>`
|
||||
--- a/xen/drivers/passthrough/x86/ats.c
|
||||
+++ b/xen/drivers/passthrough/x86/ats.c
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
LIST_HEAD(ats_devices);
|
||||
|
||||
-bool_t __read_mostly ats_enabled = 1;
|
||||
+bool_t __read_mostly ats_enabled = 0;
|
||||
boolean_param("ats", ats_enabled);
|
||||
|
||||
int enable_ats_device(int seg, int bus, int devfn, const void *iommu)
|
@ -1,220 +0,0 @@
|
||||
# Commit 3ea2ba980afe7356c613c8e1ba00d223d1c25412
|
||||
# Date 2014-08-28 16:11:37 +0200
|
||||
# Author Ross Lagerwall <ross.lagerwall@citrix.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/NMI: allow processing unknown NMIs when watchdog is enabled
|
||||
|
||||
Change NMI processing so that if watchdog=force is passed on the
|
||||
command-line and the NMI is not caused by a perf counter overflow (i.e.
|
||||
likely not a watchdog "tick"), the NMI is handled by the unknown NMI
|
||||
handler.
|
||||
|
||||
This allows injection of NMIs from IPMI controllers that don't set the
|
||||
IOCK/SERR bits to trigger the unknown NMI handler rather than be
|
||||
ignored.
|
||||
|
||||
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
Fix command line parsing (don't enable the watchdog on e.g.
|
||||
"watchdog=xyz").
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
# Commit fd553ae5f0f57baa63d033bedee84f607de57d33
|
||||
# Date 2014-09-03 15:09:59 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
x86/NMI: allow passing just "watchdog" again
|
||||
|
||||
This capability got inadvertently lost in commit 3ea2ba980a ("x86/NMI:
|
||||
allow processing unknown NMIs when watchdog is enabled") due to an
|
||||
oversight of mine.
|
||||
|
||||
Reported-by: Ross Lagerwall <ross.lagerwall@citrix.com>
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
--- a/docs/misc/xen-command-line.markdown
|
||||
+++ b/docs/misc/xen-command-line.markdown
|
||||
@@ -1039,12 +1039,14 @@ As the BTS virtualisation is not 100% sa
|
||||
don't use the vpmu flag on production systems with Intel cpus!
|
||||
|
||||
### watchdog
|
||||
-> `= <boolean>`
|
||||
+> `= force | <boolean>`
|
||||
|
||||
> Default: `false`
|
||||
|
||||
Run an NMI watchdog on each processor. If a processor is stuck for
|
||||
-longer than the **watchdog\_timeout**, a panic occurs.
|
||||
+longer than the **watchdog\_timeout**, a panic occurs. When `force` is
|
||||
+specified, in addition to running an NMI watchdog on each processor,
|
||||
+unknown NMIs will still be processed.
|
||||
|
||||
### watchdog\_timeout
|
||||
> `= <integer>`
|
||||
--- a/xen/arch/x86/nmi.c
|
||||
+++ b/xen/arch/x86/nmi.c
|
||||
@@ -43,7 +43,32 @@ static DEFINE_PER_CPU(unsigned int, nmi_
|
||||
|
||||
/* opt_watchdog: If true, run a watchdog NMI on each processor. */
|
||||
bool_t __initdata opt_watchdog = 0;
|
||||
-boolean_param("watchdog", opt_watchdog);
|
||||
+
|
||||
+/* watchdog_force: If true, process unknown NMIs when running the watchdog. */
|
||||
+bool_t watchdog_force = 0;
|
||||
+
|
||||
+static void __init parse_watchdog(char *s)
|
||||
+{
|
||||
+ if ( !*s )
|
||||
+ {
|
||||
+ opt_watchdog = 1;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ switch ( parse_bool(s) )
|
||||
+ {
|
||||
+ case 0:
|
||||
+ opt_watchdog = 0;
|
||||
+ return;
|
||||
+ case 1:
|
||||
+ opt_watchdog = 1;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if ( !strcmp(s, "force") )
|
||||
+ watchdog_force = opt_watchdog = 1;
|
||||
+}
|
||||
+custom_param("watchdog", parse_watchdog);
|
||||
|
||||
/* opt_watchdog_timeout: Number of seconds to wait before panic. */
|
||||
static unsigned int opt_watchdog_timeout = 5;
|
||||
@@ -82,6 +107,7 @@ int nmi_active;
|
||||
#define K7_EVNTSEL_USR (1 << 16)
|
||||
#define K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING 0x76
|
||||
#define K7_NMI_EVENT K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING
|
||||
+#define K7_EVENT_WIDTH 32
|
||||
|
||||
#define P6_EVNTSEL0_ENABLE (1 << 22)
|
||||
#define P6_EVNTSEL_INT (1 << 20)
|
||||
@@ -89,10 +115,12 @@ int nmi_active;
|
||||
#define P6_EVNTSEL_USR (1 << 16)
|
||||
#define P6_EVENT_CPU_CLOCKS_NOT_HALTED 0x79
|
||||
#define CORE_EVENT_CPU_CLOCKS_NOT_HALTED 0x3c
|
||||
+#define P6_EVENT_WIDTH 32
|
||||
|
||||
#define P4_ESCR_EVENT_SELECT(N) ((N)<<25)
|
||||
#define P4_CCCR_OVF_PMI0 (1<<26)
|
||||
#define P4_CCCR_OVF_PMI1 (1<<27)
|
||||
+#define P4_CCCR_OVF (1<<31)
|
||||
#define P4_CCCR_THRESHOLD(N) ((N)<<20)
|
||||
#define P4_CCCR_COMPLEMENT (1<<19)
|
||||
#define P4_CCCR_COMPARE (1<<18)
|
||||
@@ -433,8 +461,10 @@ int __init watchdog_setup(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void nmi_watchdog_tick(struct cpu_user_regs * regs)
|
||||
+/* Returns false if this was not a watchdog NMI, true otherwise */
|
||||
+bool_t nmi_watchdog_tick(struct cpu_user_regs *regs)
|
||||
{
|
||||
+ bool_t watchdog_tick = 1;
|
||||
unsigned int sum = this_cpu(nmi_timer_ticks);
|
||||
|
||||
if ( (this_cpu(last_irq_sums) == sum) && watchdog_enabled() )
|
||||
@@ -460,8 +490,15 @@ void nmi_watchdog_tick(struct cpu_user_r
|
||||
|
||||
if ( nmi_perfctr_msr )
|
||||
{
|
||||
+ uint64_t msr_content;
|
||||
+
|
||||
+ /* Work out if this is a watchdog tick by checking for overflow. */
|
||||
if ( nmi_perfctr_msr == MSR_P4_IQ_PERFCTR0 )
|
||||
{
|
||||
+ rdmsrl(MSR_P4_IQ_CCCR0, msr_content);
|
||||
+ if ( !(msr_content & P4_CCCR_OVF) )
|
||||
+ watchdog_tick = 0;
|
||||
+
|
||||
/*
|
||||
* P4 quirks:
|
||||
* - An overflown perfctr will assert its interrupt
|
||||
@@ -474,14 +511,26 @@ void nmi_watchdog_tick(struct cpu_user_r
|
||||
}
|
||||
else if ( nmi_perfctr_msr == MSR_P6_PERFCTR0 )
|
||||
{
|
||||
+ rdmsrl(MSR_P6_PERFCTR0, msr_content);
|
||||
+ if ( msr_content & (1ULL << P6_EVENT_WIDTH) )
|
||||
+ watchdog_tick = 0;
|
||||
+
|
||||
/*
|
||||
* Only P6 based Pentium M need to re-unmask the apic vector but
|
||||
* it doesn't hurt other P6 variants.
|
||||
*/
|
||||
apic_write(APIC_LVTPC, APIC_DM_NMI);
|
||||
}
|
||||
+ else if ( nmi_perfctr_msr == MSR_K7_PERFCTR0 )
|
||||
+ {
|
||||
+ rdmsrl(MSR_K7_PERFCTR0, msr_content);
|
||||
+ if ( msr_content & (1ULL << K7_EVENT_WIDTH) )
|
||||
+ watchdog_tick = 0;
|
||||
+ }
|
||||
write_watchdog_counter(NULL);
|
||||
}
|
||||
+
|
||||
+ return watchdog_tick;
|
||||
}
|
||||
|
||||
/*
|
||||
--- a/xen/arch/x86/traps.c
|
||||
+++ b/xen/arch/x86/traps.c
|
||||
@@ -3226,14 +3226,15 @@ void do_nmi(struct cpu_user_regs *regs)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
unsigned char reason;
|
||||
+ bool_t handle_unknown = 0;
|
||||
|
||||
++nmi_count(cpu);
|
||||
|
||||
if ( nmi_callback(regs, cpu) )
|
||||
return;
|
||||
|
||||
- if ( nmi_watchdog )
|
||||
- nmi_watchdog_tick(regs);
|
||||
+ if ( !nmi_watchdog || (!nmi_watchdog_tick(regs) && watchdog_force) )
|
||||
+ handle_unknown = 1;
|
||||
|
||||
/* Only the BSP gets external NMIs from the system. */
|
||||
if ( cpu == 0 )
|
||||
@@ -3243,7 +3244,7 @@ void do_nmi(struct cpu_user_regs *regs)
|
||||
pci_serr_error(regs);
|
||||
if ( reason & 0x40 )
|
||||
io_check_error(regs);
|
||||
- if ( !(reason & 0xc0) && !nmi_watchdog )
|
||||
+ if ( !(reason & 0xc0) && handle_unknown )
|
||||
unknown_nmi_error(regs, reason);
|
||||
}
|
||||
}
|
||||
--- a/xen/include/asm-x86/apic.h
|
||||
+++ b/xen/include/asm-x86/apic.h
|
||||
@@ -206,7 +206,7 @@ extern void release_lapic_nmi(void);
|
||||
extern void self_nmi(void);
|
||||
extern void disable_timer_nmi_watchdog(void);
|
||||
extern void enable_timer_nmi_watchdog(void);
|
||||
-extern void nmi_watchdog_tick (struct cpu_user_regs *regs);
|
||||
+extern bool_t nmi_watchdog_tick (struct cpu_user_regs *regs);
|
||||
extern int APIC_init_uniprocessor (void);
|
||||
extern void disable_APIC_timer(void);
|
||||
extern void enable_APIC_timer(void);
|
||||
--- a/xen/include/asm-x86/nmi.h
|
||||
+++ b/xen/include/asm-x86/nmi.h
|
||||
@@ -8,6 +8,9 @@ struct cpu_user_regs;
|
||||
|
||||
/* Watchdog boolean from the command line */
|
||||
extern bool_t opt_watchdog;
|
||||
+
|
||||
+/* Watchdog force parameter from the command line */
|
||||
+extern bool_t watchdog_force;
|
||||
|
||||
typedef int (*nmi_callback_t)(struct cpu_user_regs *regs, int cpu);
|
||||
|
@ -1,163 +0,0 @@
|
||||
References: bnc#882089
|
||||
|
||||
# Commit ecb69533582e51999e5d76bce513be870222908f
|
||||
# Date 2014-08-29 12:22:42 +0200
|
||||
# Author Jan Beulich <jbeulich@suse.com>
|
||||
# Committer Jan Beulich <jbeulich@suse.com>
|
||||
EPT: utilize GLA->GPA translation known for certain faults
|
||||
|
||||
Rather than doing the translation ourselves in __hvmemul_{read,write}()
|
||||
leverage that we know the association for faults other than such having
|
||||
occurred when translating addresses of page tables.
|
||||
|
||||
There is one intentional but not necessarily obvious (and possibly
|
||||
subtle) adjustment to behavior: __hvmemul_read() no longer blindly
|
||||
bails on instruction fetches matching the MMIO GVA (the callers of
|
||||
handle_mmio_with_translation() now control the behavior via the struct
|
||||
npfec they pass, and it didn't seem right to bail here rather than just
|
||||
falling through to the unaccelerated path)
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Tim Deegan <tim@xen.org>
|
||||
|
||||
--- a/xen/arch/x86/hvm/emulate.c
|
||||
+++ b/xen/arch/x86/hvm/emulate.c
|
||||
@@ -496,10 +496,11 @@ static int __hvmemul_read(
|
||||
while ( off & (chunk - 1) )
|
||||
chunk >>= 1;
|
||||
|
||||
- if ( unlikely(vio->mmio_gva == (addr & PAGE_MASK)) && vio->mmio_gva )
|
||||
+ if ( ((access_type != hvm_access_insn_fetch
|
||||
+ ? vio->mmio_access.read_access
|
||||
+ : vio->mmio_access.insn_fetch)) &&
|
||||
+ (vio->mmio_gva == (addr & PAGE_MASK)) )
|
||||
{
|
||||
- if ( access_type == hvm_access_insn_fetch )
|
||||
- return X86EMUL_UNHANDLEABLE;
|
||||
gpa = (((paddr_t)vio->mmio_gpfn << PAGE_SHIFT) | off);
|
||||
while ( (off + chunk) <= PAGE_SIZE )
|
||||
{
|
||||
@@ -639,7 +640,8 @@ static int hvmemul_write(
|
||||
while ( off & (chunk - 1) )
|
||||
chunk >>= 1;
|
||||
|
||||
- if ( unlikely(vio->mmio_gva == (addr & PAGE_MASK)) && vio->mmio_gva )
|
||||
+ if ( vio->mmio_access.write_access &&
|
||||
+ (vio->mmio_gva == (addr & PAGE_MASK)) )
|
||||
{
|
||||
gpa = (((paddr_t)vio->mmio_gpfn << PAGE_SHIFT) | off);
|
||||
while ( (off + chunk) <= PAGE_SIZE )
|
||||
--- a/xen/arch/x86/hvm/hvm.c
|
||||
+++ b/xen/arch/x86/hvm/hvm.c
|
||||
@@ -1529,7 +1529,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
&& is_hvm_vcpu(v)
|
||||
&& hvm_mmio_internal(gpa) )
|
||||
{
|
||||
- if ( !handle_mmio() )
|
||||
+ if ( !handle_mmio_with_translation(gla, gpa >> PAGE_SHIFT, npfec) )
|
||||
hvm_inject_hw_exception(TRAP_gp_fault, 0);
|
||||
rc = 1;
|
||||
goto out;
|
||||
@@ -1603,7 +1603,7 @@ int hvm_hap_nested_page_fault(paddr_t gp
|
||||
if ( unlikely(is_pvh_vcpu(v)) )
|
||||
goto out;
|
||||
|
||||
- if ( !handle_mmio() )
|
||||
+ if ( !handle_mmio_with_translation(gla, gpa >> PAGE_SHIFT, npfec) )
|
||||
hvm_inject_hw_exception(TRAP_gp_fault, 0);
|
||||
rc = 1;
|
||||
goto out;
|
||||
--- a/xen/arch/x86/hvm/io.c
|
||||
+++ b/xen/arch/x86/hvm/io.c
|
||||
@@ -189,7 +189,7 @@ int handle_mmio(void)
|
||||
if ( vio->io_state == HVMIO_awaiting_completion )
|
||||
vio->io_state = HVMIO_handle_mmio_awaiting_completion;
|
||||
else
|
||||
- vio->mmio_gva = 0;
|
||||
+ vio->mmio_access = (struct npfec){};
|
||||
|
||||
switch ( rc )
|
||||
{
|
||||
@@ -218,9 +218,14 @@ int handle_mmio(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
-int handle_mmio_with_translation(unsigned long gva, unsigned long gpfn)
|
||||
+int handle_mmio_with_translation(unsigned long gva, unsigned long gpfn,
|
||||
+ struct npfec access)
|
||||
{
|
||||
struct hvm_vcpu_io *vio = ¤t->arch.hvm_vcpu.hvm_io;
|
||||
+
|
||||
+ vio->mmio_access = access.gla_valid &&
|
||||
+ access.kind == npfec_kind_with_gla
|
||||
+ ? access : (struct npfec){};
|
||||
vio->mmio_gva = gva & PAGE_MASK;
|
||||
vio->mmio_gpfn = gpfn;
|
||||
return handle_mmio();
|
||||
--- a/xen/arch/x86/mm/shadow/multi.c
|
||||
+++ b/xen/arch/x86/mm/shadow/multi.c
|
||||
@@ -2839,6 +2839,11 @@ static int sh_page_fault(struct vcpu *v,
|
||||
p2m_type_t p2mt;
|
||||
uint32_t rc;
|
||||
int version;
|
||||
+ struct npfec access = {
|
||||
+ .read_access = 1,
|
||||
+ .gla_valid = 1,
|
||||
+ .kind = npfec_kind_with_gla
|
||||
+ };
|
||||
#if SHADOW_OPTIMIZATIONS & SHOPT_FAST_EMULATION
|
||||
int fast_emul = 0;
|
||||
#endif
|
||||
@@ -2849,6 +2854,9 @@ static int sh_page_fault(struct vcpu *v,
|
||||
|
||||
perfc_incr(shadow_fault);
|
||||
|
||||
+ if ( regs->error_code & PFEC_write_access )
|
||||
+ access.write_access = 1;
|
||||
+
|
||||
#if SHADOW_OPTIMIZATIONS & SHOPT_FAST_EMULATION
|
||||
/* If faulting frame is successfully emulated in last shadow fault
|
||||
* it's highly likely to reach same emulation action for this frame.
|
||||
@@ -2950,7 +2958,7 @@ static int sh_page_fault(struct vcpu *v,
|
||||
SHADOW_PRINTK("fast path mmio %#"PRIpaddr"\n", gpa);
|
||||
reset_early_unshadow(v);
|
||||
trace_shadow_gen(TRC_SHADOW_FAST_MMIO, va);
|
||||
- return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT)
|
||||
+ return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access)
|
||||
? EXCRET_fault_fixed : 0);
|
||||
}
|
||||
else
|
||||
@@ -3447,7 +3455,7 @@ static int sh_page_fault(struct vcpu *v,
|
||||
paging_unlock(d);
|
||||
put_gfn(d, gfn_x(gfn));
|
||||
trace_shadow_gen(TRC_SHADOW_MMIO, va);
|
||||
- return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT)
|
||||
+ return (handle_mmio_with_translation(va, gpa >> PAGE_SHIFT, access)
|
||||
? EXCRET_fault_fixed : 0);
|
||||
|
||||
not_a_shadow_fault:
|
||||
--- a/xen/include/asm-x86/hvm/io.h
|
||||
+++ b/xen/include/asm-x86/hvm/io.h
|
||||
@@ -119,7 +119,8 @@ static inline void register_buffered_io_
|
||||
void send_timeoffset_req(unsigned long timeoff);
|
||||
void send_invalidate_req(void);
|
||||
int handle_mmio(void);
|
||||
-int handle_mmio_with_translation(unsigned long gva, unsigned long gpfn);
|
||||
+int handle_mmio_with_translation(unsigned long gva, unsigned long gpfn,
|
||||
+ struct npfec);
|
||||
int handle_pio(uint16_t port, unsigned int size, int dir);
|
||||
void hvm_interrupt_post(struct vcpu *v, int vector, int type);
|
||||
void hvm_io_assist(ioreq_t *p);
|
||||
--- a/xen/include/asm-x86/hvm/vcpu.h
|
||||
+++ b/xen/include/asm-x86/hvm/vcpu.h
|
||||
@@ -54,8 +54,9 @@ struct hvm_vcpu_io {
|
||||
* HVM emulation:
|
||||
* Virtual address @mmio_gva maps to MMIO physical frame @mmio_gpfn.
|
||||
* The latter is known to be an MMIO frame (not RAM).
|
||||
- * This translation is only valid if @mmio_gva is non-zero.
|
||||
+ * This translation is only valid for accesses as per @mmio_access.
|
||||
*/
|
||||
+ struct npfec mmio_access;
|
||||
unsigned long mmio_gva;
|
||||
unsigned long mmio_gpfn;
|
||||
|
@ -1,52 +0,0 @@
|
||||
References: bnc#864801
|
||||
|
||||
Subject: zaurus: fix buffer overrun on invalid state load
|
||||
From: Michael S. Tsirkin mst@redhat.com Thu Apr 3 19:52:13 2014 +0300
|
||||
Date: Mon May 5 22:15:02 2014 +0200:
|
||||
Git: 52f91c3723932f8340fe36c8ec8b18a757c37b2b
|
||||
|
||||
CVE-2013-4540
|
||||
|
||||
Within scoop_gpio_handler_update, if prev_level has a high bit set, then
|
||||
we get bit > 16 and that causes a buffer overrun.
|
||||
|
||||
Since prev_level comes from wire indirectly, this can
|
||||
happen on invalid state load.
|
||||
|
||||
Similarly for gpio_level and gpio_dir.
|
||||
|
||||
To fix, limit to 16 bit.
|
||||
|
||||
Reported-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
||||
|
||||
Index: xen-4.4.1-testing/tools/qemu-xen-dir-remote/hw/gpio/zaurus.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/qemu-xen-dir-remote/hw/gpio/zaurus.c
|
||||
+++ xen-4.4.1-testing/tools/qemu-xen-dir-remote/hw/gpio/zaurus.c
|
||||
@@ -203,6 +203,15 @@ static bool is_version_0 (void *opaque,
|
||||
return version_id == 0;
|
||||
}
|
||||
|
||||
+static bool vmstate_scoop_validate(void *opaque, int version_id)
|
||||
+{
|
||||
+ ScoopInfo *s = opaque;
|
||||
+
|
||||
+ return !(s->prev_level & 0xffff0000) &&
|
||||
+ !(s->gpio_level & 0xffff0000) &&
|
||||
+ !(s->gpio_dir & 0xffff0000);
|
||||
+}
|
||||
+
|
||||
static const VMStateDescription vmstate_scoop_regs = {
|
||||
.name = "scoop",
|
||||
.version_id = 1,
|
||||
@@ -215,6 +224,7 @@ static const VMStateDescription vmstate_
|
||||
VMSTATE_UINT32(gpio_level, ScoopInfo),
|
||||
VMSTATE_UINT32(gpio_dir, ScoopInfo),
|
||||
VMSTATE_UINT32(prev_level, ScoopInfo),
|
||||
+ VMSTATE_VALIDATE("irq levels are 16 bit", vmstate_scoop_validate),
|
||||
VMSTATE_UINT16(mcr, ScoopInfo),
|
||||
VMSTATE_UINT16(cdr, ScoopInfo),
|
||||
VMSTATE_UINT16(ccr, ScoopInfo),
|
17
README.SUSE
17
README.SUSE
@ -601,16 +601,13 @@ use the debug-enabled hypervisor, and/or to prevent automatic rebooting.
|
||||
Grub2 Example:
|
||||
Edit /etc/default/grub and add,
|
||||
GRUB_CMDLINE_XEN_DEFAULT="noreboot loglvl=all guest_loglvl=all"
|
||||
Edit /etc/grub.d/20_linux_xen file. Look for this line:
|
||||
while [ "x${xen_list}" != "x" ] ; do
|
||||
and add *before* the above line something like this:
|
||||
xen_dbg_list=`readlink -f /boot/xen-dbg.gz`
|
||||
xen_list="$xen_list $xen_dbg_list"
|
||||
finally run:
|
||||
grub2-mkconfig -o /boot/grub2/grub.cfg
|
||||
On reboot, select "Advanced options for SUSE Linux Enterprise Server 12
|
||||
(with Xen hypervisor)" from the grub menu and the Xen hypervisor debug entry
|
||||
in the submenu.
|
||||
Edit /boot/grub2/grub.cfg and look for these lines:
|
||||
multiboot /boot/xen-<version>.gz ...
|
||||
and replace them with:
|
||||
multiboot /boot/xen-dbg-<version>.gz' ... Replace <version> with the
|
||||
appropriate version string contained in the filename. Note that running
|
||||
grub2-mkconfig -o /boot/grub2/grub.cfg will overwrite all manual changes
|
||||
made to grub.cfg.
|
||||
|
||||
Grub1 Example:
|
||||
Edit your menu.lst configuration from something like this:
|
||||
|
@ -1,7 +1,7 @@
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
@@ -225,6 +225,7 @@ static int open_disk(struct td_state *s,
|
||||
BlockDriver* drv;
|
||||
char* devname;
|
||||
@ -19,11 +19,11 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
fprintf(stderr, "Could not open image file %s\n", path);
|
||||
return -ENOMEM;
|
||||
}
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -135,7 +135,8 @@ static void insert_media(void *opaque)
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -134,7 +134,8 @@ static void insert_media(void *opaque)
|
||||
else
|
||||
format = &bdrv_raw;
|
||||
|
||||
@ -33,7 +33,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
#ifdef CONFIG_STUBDOM
|
||||
{
|
||||
char *buf, *backend, *params_path, *params;
|
||||
@@ -510,7 +511,8 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -509,7 +510,8 @@ void xenstore_parse_domain_config(int hv
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
@ -43,7 +43,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
/* read the backend path */
|
||||
xenstore_get_backend_path(&bpath, "vbd", danger_path, hvm_domid, e_danger[i]);
|
||||
if (bpath == NULL)
|
||||
@@ -596,6 +598,17 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -595,6 +597,17 @@ void xenstore_parse_domain_config(int hv
|
||||
format = &bdrv_raw;
|
||||
}
|
||||
|
||||
@ -61,7 +61,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
#if 0
|
||||
/* Phantom VBDs are disabled because the use of paths
|
||||
* from guest-controlled areas in xenstore is unsafe.
|
||||
@@ -663,7 +676,7 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -662,7 +675,7 @@ void xenstore_parse_domain_config(int hv
|
||||
#ifdef CONFIG_STUBDOM
|
||||
if (pasprintf(&danger_buf, "%s/device/vbd/%s", danger_path, e_danger[i]) == -1)
|
||||
continue;
|
||||
|
@ -8,10 +8,10 @@
|
||||
xen/include/public/io/cdromif.h | 122 ++++
|
||||
7 files changed, 726 insertions(+), 3 deletions(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/blktap/drivers/Makefile
|
||||
Index: xen-4.5.0-testing/tools/blktap/drivers/Makefile
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/blktap/drivers/Makefile
|
||||
+++ xen-4.4.0-testing/tools/blktap/drivers/Makefile
|
||||
--- xen-4.5.0-testing.orig/tools/blktap/drivers/Makefile
|
||||
+++ xen-4.5.0-testing/tools/blktap/drivers/Makefile
|
||||
@@ -32,8 +32,9 @@ AIOLIBS := -laio
|
||||
CFLAGS += $(PTHREAD_CFLAGS)
|
||||
LDFLAGS += $(PTHREAD_LDFLAGS)
|
||||
@ -32,10 +32,10 @@ Index: xen-4.4.0-testing/tools/blktap/drivers/Makefile
|
||||
BLK-OBJS-y += aes.o
|
||||
BLK-OBJS-y += tapaio.o
|
||||
BLK-OBJS-$(CONFIG_Linux) += blk_linux.o
|
||||
Index: xen-4.4.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||
Index: xen-4.5.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.4.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||
+++ xen-4.5.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||
@@ -0,0 +1,568 @@
|
||||
+/* block-cdrom.c
|
||||
+ *
|
||||
@ -605,10 +605,10 @@ Index: xen-4.4.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||
+ .td_get_parent_id = tdcdrom_get_parent_id,
|
||||
+ .td_validate_parent = tdcdrom_validate_parent
|
||||
+};
|
||||
Index: xen-4.4.0-testing/tools/blktap/drivers/tapdisk.c
|
||||
Index: xen-4.5.0-testing/tools/blktap/drivers/tapdisk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/blktap/drivers/tapdisk.c
|
||||
+++ xen-4.4.0-testing/tools/blktap/drivers/tapdisk.c
|
||||
--- xen-4.5.0-testing.orig/tools/blktap/drivers/tapdisk.c
|
||||
+++ xen-4.5.0-testing/tools/blktap/drivers/tapdisk.c
|
||||
@@ -735,6 +735,22 @@ static void get_io_request(struct td_sta
|
||||
goto out;
|
||||
}
|
||||
@ -632,10 +632,10 @@ Index: xen-4.4.0-testing/tools/blktap/drivers/tapdisk.c
|
||||
default:
|
||||
DPRINTF("Unknown block operation\n");
|
||||
break;
|
||||
Index: xen-4.4.0-testing/tools/blktap/drivers/tapdisk.h
|
||||
Index: xen-4.5.0-testing/tools/blktap/drivers/tapdisk.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/blktap/drivers/tapdisk.h
|
||||
+++ xen-4.4.0-testing/tools/blktap/drivers/tapdisk.h
|
||||
--- xen-4.5.0-testing.orig/tools/blktap/drivers/tapdisk.h
|
||||
+++ xen-4.5.0-testing/tools/blktap/drivers/tapdisk.h
|
||||
@@ -137,6 +137,9 @@ struct tap_disk {
|
||||
int (*td_get_parent_id) (struct disk_driver *dd, struct disk_id *id);
|
||||
int (*td_validate_parent)(struct disk_driver *dd,
|
||||
@ -680,10 +680,10 @@ Index: xen-4.4.0-testing/tools/blktap/drivers/tapdisk.h
|
||||
};
|
||||
|
||||
typedef struct driver_list_entry {
|
||||
Index: xen-4.4.0-testing/tools/blktap/lib/blktaplib.h
|
||||
Index: xen-4.5.0-testing/tools/blktap/lib/blktaplib.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/blktap/lib/blktaplib.h
|
||||
+++ xen-4.4.0-testing/tools/blktap/lib/blktaplib.h
|
||||
--- xen-4.5.0-testing.orig/tools/blktap/lib/blktaplib.h
|
||||
+++ xen-4.5.0-testing/tools/blktap/lib/blktaplib.h
|
||||
@@ -219,6 +219,7 @@ typedef struct msg_pid {
|
||||
#define DISK_TYPE_RAM 3
|
||||
#define DISK_TYPE_QCOW 4
|
||||
@ -692,11 +692,11 @@ Index: xen-4.4.0-testing/tools/blktap/lib/blktaplib.h
|
||||
|
||||
/* xenstore/xenbus: */
|
||||
#define DOMNAME "Domain-0"
|
||||
Index: xen-4.4.0-testing/xen/include/public/io/blkif.h
|
||||
Index: xen-4.5.0-testing/xen/include/public/io/blkif.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/xen/include/public/io/blkif.h
|
||||
+++ xen-4.4.0-testing/xen/include/public/io/blkif.h
|
||||
@@ -453,7 +453,7 @@
|
||||
--- xen-4.5.0-testing.orig/xen/include/public/io/blkif.h
|
||||
+++ xen-4.5.0-testing/xen/include/public/io/blkif.h
|
||||
@@ -485,7 +485,7 @@
|
||||
* Used in SLES sources for device specific command packet
|
||||
* contained within the request. Reserved for that purpose.
|
||||
*/
|
||||
@ -705,10 +705,10 @@ Index: xen-4.4.0-testing/xen/include/public/io/blkif.h
|
||||
/*
|
||||
* Indicate to the backend device that a region of storage is no longer in
|
||||
* use, and may be discarded at any time without impact to the client. If
|
||||
Index: xen-4.4.0-testing/xen/include/public/io/cdromif.h
|
||||
Index: xen-4.5.0-testing/xen/include/public/io/cdromif.h
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.4.0-testing/xen/include/public/io/cdromif.h
|
||||
+++ xen-4.5.0-testing/xen/include/public/io/cdromif.h
|
||||
@@ -0,0 +1,122 @@
|
||||
+/******************************************************************************
|
||||
+ * cdromif.h
|
||||
|
13
blktap.patch
13
blktap.patch
@ -1,19 +1,6 @@
|
||||
bug #239173
|
||||
bug #242953
|
||||
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
@@ -3281,7 +3281,7 @@ class XendDomainInfo:
|
||||
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
||||
|
||||
vbd = {
|
||||
- 'mode': 'RO',
|
||||
+ 'mode': 'RW',
|
||||
'device': BOOTLOADER_LOOPBACK_DEVICE,
|
||||
}
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
|
@ -94,16 +94,8 @@ function deactivate_md()
|
||||
function activate_lvm()
|
||||
{
|
||||
local run_timeout=90
|
||||
local parsed_timeout
|
||||
local end_time
|
||||
|
||||
# Parse device-create-timeout from /etc/xen/xend-config.sxp
|
||||
# If not set, use default timeout of 90s
|
||||
parsed_timeout=$(grep -v "^[ \t]*#.*" /etc/xen/xend-config.sxp|sed -n 's/(device-create-timeout \+\([0-9]\+\))/\1/p')
|
||||
if [ ! -z $parsed_timeout ]; then
|
||||
run_timeout=$((${parsed_timeout}*9/10))
|
||||
fi
|
||||
|
||||
end_time=$(($(date +%s)+${run_timeout}))
|
||||
while true; do
|
||||
/sbin/lvchange -aey $1
|
||||
|
@ -1,57 +0,0 @@
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
@@ -251,6 +251,9 @@ op_start () {
|
||||
|
||||
claim_lock "network-bridge"
|
||||
|
||||
+ local bonded=""
|
||||
+ [ -e /sys/class/net/${netdev}/bonding ] && bonded="yes"
|
||||
+
|
||||
vlans=$(find_active_vlans "${netdev}")
|
||||
for vlan in $vlans ; do ifdown $vlan ; done
|
||||
|
||||
@@ -268,18 +271,32 @@ op_start () {
|
||||
ip link set ${netdev} down
|
||||
ip addr flush ${netdev}
|
||||
fi
|
||||
- ip link set ${netdev} name ${pdev}
|
||||
- ip link set ${tdev} name ${bridge}
|
||||
-
|
||||
- setup_physical_bridge_port ${pdev}
|
||||
|
||||
- # Restore slaves
|
||||
- if [ -n "${slaves}" ]; then
|
||||
- ip link set ${pdev} up
|
||||
- ifenslave ${pdev} ${slaves}
|
||||
+ if [ "x${bonded}" = "xyes" ]
|
||||
+ then
|
||||
+ ip link set ${tdev} name ${bridge}
|
||||
+ ln -sf /etc/sysconfig/network/ifcfg-${netdev} /etc/sysconfig/network/ifcfg-${pdev}
|
||||
+ ifup ${pdev}
|
||||
+ local gw=`ip route show dev ${pdev} | fgrep default | sed 's/default via //'`
|
||||
+ ip addr flush ${pdev}
|
||||
+ rm -f /etc/sysconfig/network/ifcfg-${pdev}
|
||||
+ brctl addif ${bridge} ${pdev}
|
||||
+ ip link set ${bridge} up
|
||||
+ [ -n "$gw" ] && ip route add default via ${gw}
|
||||
+ else
|
||||
+ ip link set ${netdev} name ${pdev}
|
||||
+ ip link set ${tdev} name ${bridge}
|
||||
+
|
||||
+ _setup_bridge_port ${pdev}
|
||||
+
|
||||
+ # Restore slaves
|
||||
+ if [ -n "${slaves}" ]; then
|
||||
+ ip link set ${pdev} up
|
||||
+ ifenslave ${pdev} ${slaves}
|
||||
+ fi
|
||||
+ add_to_bridge2 ${bridge} ${pdev}
|
||||
+ do_ifup ${bridge}
|
||||
fi
|
||||
- add_to_bridge2 ${bridge} ${pdev}
|
||||
- do_ifup ${bridge}
|
||||
|
||||
for vlan in $vlans ; do ifup $vlan ; done
|
||||
|
@ -1,32 +0,0 @@
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
@@ -280,19 +280,19 @@ op_stop () {
|
||||
transfer_addrs ${bridge} ${pdev}
|
||||
if ! ifdown ${bridge}; then
|
||||
get_ip_info ${bridge}
|
||||
- fi
|
||||
- ip link set ${pdev} down
|
||||
- ip addr flush ${bridge}
|
||||
+ ip link set ${pdev} down
|
||||
+ ip addr flush ${bridge}
|
||||
|
||||
- brctl delif ${bridge} ${pdev}
|
||||
- ip link set ${bridge} down
|
||||
+ brctl delif ${bridge} ${pdev}
|
||||
+ ip link set ${bridge} down
|
||||
|
||||
- ip link set ${bridge} name ${tdev}
|
||||
+ ip link set ${bridge} name ${tdev}
|
||||
+ brctl delbr ${tdev}
|
||||
+ fi
|
||||
+ ip link set ${pdev} down
|
||||
ip link set ${pdev} name ${netdev}
|
||||
do_ifup ${netdev}
|
||||
|
||||
- brctl delbr ${tdev}
|
||||
-
|
||||
release_lock "network-bridge"
|
||||
}
|
||||
|
@ -1,30 +0,0 @@
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
@@ -259,6 +259,11 @@ op_start () {
|
||||
|
||||
create_bridge ${tdev}
|
||||
|
||||
+ # Record creation of bridge in /dev/.sysconfig/network/xenbridges so other
|
||||
+ # tools, e.g. yast2 lan, know that Xen bridging is active.
|
||||
+ [ -d /dev/.sysconfig/network/xenbridges ] || mkdir /dev/.sysconfig/network/xenbridges
|
||||
+ touch /dev/.sysconfig/network/xenbridges/${bridge}
|
||||
+
|
||||
preiftransfer ${netdev}
|
||||
transfer_addrs ${netdev} ${tdev}
|
||||
# Remember slaves for bonding interface.
|
||||
@@ -340,6 +345,13 @@ op_stop () {
|
||||
ip link set ${pdev} name ${netdev}
|
||||
do_ifup ${netdev}
|
||||
|
||||
+ # Remove record of bridge from /dev/.sysconfig/network/xenbridges ...
|
||||
+ rm -f /dev/.sysconfig/network/xenbridges/${bridge}
|
||||
+ # ... and directory itself if empty
|
||||
+ if [ -z "$(ls -A /dev/.sysconfig/network/xenbridges 2>/dev/null)" ]; then
|
||||
+ rmdir /dev/.sysconfig/network/xenbridges
|
||||
+ fi
|
||||
+
|
||||
for vlan in $vlans ; do ifup $vlan ; done
|
||||
|
||||
release_lock "network-bridge"
|
@ -1,71 +0,0 @@
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/network-bridge
|
||||
@@ -195,6 +195,28 @@ antispoofing () {
|
||||
iptables -A FORWARD -m physdev --physdev-in ${pdev} -j ACCEPT
|
||||
}
|
||||
|
||||
+find_active_vlans() {
|
||||
+ local netdev=$1
|
||||
+ local vlan
|
||||
+ local vlans
|
||||
+ vlans=""
|
||||
+ for vifcfg in /etc/sysconfig/network/ifcfg-vlan* ; do
|
||||
+ vlan=${vifcfg/*\/ifcfg-}
|
||||
+ if [ "$vlan" = "vlan*" ]; then
|
||||
+ continue
|
||||
+ fi
|
||||
+ . $vifcfg
|
||||
+ etherdevice="$ETHERDEVICE"
|
||||
+ if [ -x /sbin/getcfg-interface ]; then
|
||||
+ etherdevice=$(/sbin/getcfg-interface "$ETHERDEVICE")
|
||||
+ fi
|
||||
+ if [ "$ETHERDEVICE" = "$netdev" ] || [ "$etherdevice" = "$netdev" ] ; then
|
||||
+ link_exists "$vlan" && vlans="$vlans $vlan"
|
||||
+ fi
|
||||
+ done
|
||||
+ echo "$vlans"
|
||||
+}
|
||||
+
|
||||
# Usage: show_status dev bridge
|
||||
# Print ifconfig and routes.
|
||||
show_status () {
|
||||
@@ -229,6 +251,9 @@ op_start () {
|
||||
|
||||
claim_lock "network-bridge"
|
||||
|
||||
+ vlans=$(find_active_vlans "${netdev}")
|
||||
+ for vlan in $vlans ; do ifdown $vlan ; done
|
||||
+
|
||||
create_bridge ${tdev}
|
||||
|
||||
preiftransfer ${netdev}
|
||||
@@ -256,6 +281,8 @@ op_start () {
|
||||
add_to_bridge2 ${bridge} ${pdev}
|
||||
do_ifup ${bridge}
|
||||
|
||||
+ for vlan in $vlans ; do ifup $vlan ; done
|
||||
+
|
||||
if [ ${antispoof} = 'yes' ] ; then
|
||||
antispoofing
|
||||
fi
|
||||
@@ -277,6 +304,9 @@ op_stop () {
|
||||
|
||||
claim_lock "network-bridge"
|
||||
|
||||
+ vlans=$(find_active_vlans "${netdev}")
|
||||
+ for vlan in $vlans ; do ifdown $vlan ; done
|
||||
+
|
||||
transfer_addrs ${bridge} ${pdev}
|
||||
if ! ifdown ${bridge}; then
|
||||
get_ip_info ${bridge}
|
||||
@@ -293,6 +323,8 @@ op_stop () {
|
||||
ip link set ${pdev} name ${netdev}
|
||||
do_ifup ${netdev}
|
||||
|
||||
+ for vlan in $vlans ; do ifup $vlan ; done
|
||||
+
|
||||
release_lock "network-bridge"
|
||||
}
|
||||
|
@ -8,24 +8,27 @@ resulted in tapdisk-ioemu appearing there, but actually not
|
||||
being built. This patch re-enables the build of tapdisk-ioemu.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@suse.de>
|
||||
---
|
||||
Makefile | 22 +++++++++++++++-------
|
||||
configure | 2 +-
|
||||
qemu-tool.c | 2 +-
|
||||
tapdisk-ioemu.c | 17 -----------------
|
||||
4 files changed, 17 insertions(+), 26 deletions(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xen-hooks.mak
|
||||
@@ -1,3 +1,4 @@
|
||||
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc
|
||||
CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include
|
||||
CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include
|
||||
CPPFLAGS+= -I$(XEN_ROOT)/tools/include
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
@@ -46,14 +46,6 @@ $(filter %-user,$(SUBDIR_RULES)): libqem
|
||||
|
||||
recurse-all: $(SUBDIR_RULES)
|
||||
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/libxc
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/libxc/include
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/blktap/lib
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore/include
|
||||
-CPPFLAGS += -I$(XEN_ROOT)/tools/include
|
||||
-
|
||||
-tapdisk-ioemu: tapdisk-ioemu.c cutils.c block.c block-raw.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c block-vpc.c block-vvfat.c block-qcow2.c hw/xen_blktap.c osdep.c
|
||||
@ -46,9 +49,9 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
+tapdisk-ioemu.o: tapdisk-ioemu.c
|
||||
+ $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_IMG -DQEMU_TOOL -c -o $@ $<
|
||||
+
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/libxc
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/libxc/include
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/blktap/lib
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore/include
|
||||
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/include
|
||||
+tapdisk-ioemu: tapdisk-ioemu.o $(BLOCK_OBJS) qemu-tool.o hw/tapdisk-xen_blktap.o
|
||||
+ $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
|
||||
@ -56,10 +59,10 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/Makefile
|
||||
######################################################################
|
||||
# libqemu_common.a: Target independent part of system emulation. The
|
||||
# long term path is to suppress *all* target specific code in case of
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/configure
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/configure
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/configure
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/configure
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/configure
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/configure
|
||||
@@ -1512,7 +1512,7 @@ bsd)
|
||||
;;
|
||||
esac
|
||||
@ -69,10 +72,10 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/configure
|
||||
if test `expr "$target_list" : ".*softmmu.*"` != 0 ; then
|
||||
tools="qemu-img\$(EXESUF) $tools"
|
||||
if [ "$linux" = "yes" ] ; then
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
@@ -68,7 +68,7 @@ void qemu_bh_delete(QEMUBH *bh)
|
||||
qemu_free(bh);
|
||||
}
|
||||
@ -82,10 +85,10 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-tool.c
|
||||
IOCanRWHandler *fd_read_poll,
|
||||
IOHandler *fd_read,
|
||||
IOHandler *fd_write,
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/tapdisk-ioemu.c
|
||||
@@ -12,34 +12,12 @@
|
||||
|
||||
extern void qemu_aio_init(void);
|
||||
|
@ -1,402 +1,3 @@
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/server/HalDaemon.py
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/server/HalDaemon.py
|
||||
@@ -0,0 +1,243 @@
|
||||
+#!/usr/bin/env python
|
||||
+# -*- mode: python; -*-
|
||||
+#============================================================================
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+#============================================================================
|
||||
+# Copyright (C) 2007 Pat Campbell <plc@novell.com>
|
||||
+# Copyright (C) 2007 Novell Inc.
|
||||
+#============================================================================
|
||||
+
|
||||
+"""hald (Hardware Abstraction Layer Daemon) watcher for Xen management
|
||||
+ of removable block device media.
|
||||
+
|
||||
+"""
|
||||
+
|
||||
+import gobject
|
||||
+import dbus
|
||||
+import dbus.glib
|
||||
+import os
|
||||
+import types
|
||||
+import sys
|
||||
+import signal
|
||||
+import traceback
|
||||
+from xen.xend.xenstore.xstransact import xstransact, complete
|
||||
+from xen.xend.xenstore.xsutil import xshandle
|
||||
+from xen.xend import PrettyPrint
|
||||
+from xen.xend import XendLogging
|
||||
+from xen.xend.XendLogging import log
|
||||
+
|
||||
+DEVICE_TYPES = ['vbd', 'tap']
|
||||
+
|
||||
+class HalDaemon:
|
||||
+ """The Hald block device watcher for XEN
|
||||
+ """
|
||||
+
|
||||
+ """Default path to the log file. """
|
||||
+ logfile_default = "/var/log/xen/hald.log"
|
||||
+
|
||||
+ """Default level of information to be logged."""
|
||||
+ loglevel_default = 'INFO'
|
||||
+
|
||||
+
|
||||
+ def __init__(self):
|
||||
+
|
||||
+ XendLogging.init(self.logfile_default, self.loglevel_default)
|
||||
+ log.debug( "%s", "__init__")
|
||||
+
|
||||
+ self.udi_dict = {}
|
||||
+ self.debug = 0
|
||||
+ self.dbpath = "/local/domain/0/backend"
|
||||
+ self.bus = dbus.SystemBus()
|
||||
+ self.hal_manager_obj = self.bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
|
||||
+ self.hal_manager = dbus.Interface( self.hal_manager_obj, 'org.freedesktop.Hal.Manager')
|
||||
+ self.gatherBlockDevices()
|
||||
+ self.registerDeviceCallbacks()
|
||||
+
|
||||
+ def run(self):
|
||||
+ log.debug( "%s", "In new run" );
|
||||
+ try:
|
||||
+ self.mainloop = gobject.MainLoop()
|
||||
+ self.mainloop.run()
|
||||
+ except KeyboardInterrupt, ex:
|
||||
+ log.debug('Keyboard exception handler: %s', ex )
|
||||
+ self.mainloop.quit()
|
||||
+ except Exception, ex:
|
||||
+ log.debug('Generic exception handler: %s', ex )
|
||||
+ self.mainloop.quit()
|
||||
+
|
||||
+ def __del__(self):
|
||||
+ log.debug( "%s", "In del " );
|
||||
+ self.unRegisterDeviceCallbacks()
|
||||
+ self.mainloop.quit()
|
||||
+
|
||||
+ def shutdown(self):
|
||||
+ log.debug( "%s", "In shutdown now " );
|
||||
+ self.unRegisterDeviceCallbacks()
|
||||
+ self.mainloop.quit()
|
||||
+
|
||||
+ def stop(self):
|
||||
+ log.debug( "%s", "In stop now " );
|
||||
+ self.unRegisterDeviceCallbacks()
|
||||
+ self.mainloop.quit()
|
||||
+
|
||||
+ def gatherBlockDevices(self):
|
||||
+
|
||||
+ # Get all the current devices from hal and save in a dictionary
|
||||
+ try:
|
||||
+ device_names = self.hal_manager.GetAllDevices()
|
||||
+ i = 0;
|
||||
+ for name in device_names:
|
||||
+ #log.debug("device name, device=%s",name)
|
||||
+ dev_obj = self.bus.get_object ('org.freedesktop.Hal', name)
|
||||
+ dev = dbus.Interface (dev_obj, 'org.freedesktop.Hal.Device')
|
||||
+ dev_properties = dev_obj.GetAllProperties(dbus_interface="org.freedesktop.Hal.Device")
|
||||
+ if dev_properties.has_key('block.device'):
|
||||
+ dev_str = dev_properties['block.device']
|
||||
+ dev_major = dev_properties['block.major']
|
||||
+ dev_minor = dev_properties['block.minor']
|
||||
+ udi_info = {}
|
||||
+ udi_info['device'] = dev_str
|
||||
+ udi_info['major'] = dev_major
|
||||
+ udi_info['minor'] = dev_minor
|
||||
+ udi_info['udi'] = name
|
||||
+ self.udi_dict[i] = udi_info
|
||||
+ i = i + 1
|
||||
+ except Exception, ex:
|
||||
+ print >>sys.stderr, 'Exception gathering block devices:', ex
|
||||
+ log.warn("Exception gathering block devices (%s)",ex)
|
||||
+
|
||||
+ #
|
||||
+ def registerDeviceCallbacks(self):
|
||||
+ # setup the callbacks for when the gdl changes
|
||||
+ self.hal_manager.connect_to_signal('DeviceAdded', self.device_added_callback)
|
||||
+ self.hal_manager.connect_to_signal('DeviceRemoved', self.device_removed_callback)
|
||||
+
|
||||
+ #
|
||||
+ def unRegisterDeviceCallbacks(self):
|
||||
+ # setup the callbacks for when the gdl changes
|
||||
+ self.hal_manager.remove_signal_receiver(self.device_added_callback,'DeviceAdded')
|
||||
+ self.hal_manager.remove_signal_receiver(self.device_removed_callback,'DeviceRemoved')
|
||||
+
|
||||
+ #
|
||||
+ def device_removed_callback(self,udi):
|
||||
+ log.debug('UDI %s was removed',udi)
|
||||
+ self.show_dict(self.udi_dict)
|
||||
+ for key in self.udi_dict:
|
||||
+ udi_info = self.udi_dict[key]
|
||||
+ if udi_info['udi'] == udi:
|
||||
+ device = udi_info['device']
|
||||
+ major = udi_info['major']
|
||||
+ minor = udi_info['minor']
|
||||
+ self.change_xenstore( "remove", device, major, minor)
|
||||
+
|
||||
+ # Adds device to dictionary if not already there
|
||||
+ def device_added_callback(self,udi):
|
||||
+ log.debug('UDI %s was added', udi)
|
||||
+ self.show_dict(self.udi_dict)
|
||||
+ dev_obj = self.bus.get_object ('org.freedesktop.Hal', udi)
|
||||
+ dev = dbus.Interface (dev_obj, 'org.freedesktop.Hal.Device')
|
||||
+ device = dev.GetProperty ('block.device')
|
||||
+ major = dev.GetProperty ('block.major')
|
||||
+ minor = dev.GetProperty ('block.minor')
|
||||
+ udi_info = {}
|
||||
+ udi_info['device'] = device
|
||||
+ udi_info['major'] = major
|
||||
+ udi_info['minor'] = minor
|
||||
+ udi_info['udi'] = udi
|
||||
+ already = 0
|
||||
+ cnt = 0;
|
||||
+ for key in self.udi_dict:
|
||||
+ info = self.udi_dict[key]
|
||||
+ if info['udi'] == udi:
|
||||
+ already = 1
|
||||
+ break
|
||||
+ cnt = cnt + 1
|
||||
+ if already == 0:
|
||||
+ self.udi_dict[cnt] = udi_info;
|
||||
+ log.debug('UDI %s was added, device:%s major:%s minor:%s index:%d\n', udi, device, major, minor, cnt)
|
||||
+ self.change_xenstore( "add", device, major, minor)
|
||||
+
|
||||
+ # Debug helper, shows dictionary contents
|
||||
+ def show_dict(self,dict=None):
|
||||
+ if self.debug == 0 :
|
||||
+ return
|
||||
+ if dict == None :
|
||||
+ dict = self.udi_dict
|
||||
+ for key in dict:
|
||||
+ log.debug('udi_info %s udi_info:%s',key,dict[key])
|
||||
+
|
||||
+ # Set or clear xenstore media-present depending on the action argument
|
||||
+ # for every vbd that has this block device
|
||||
+ def change_xenstore(self,action, device, major, minor):
|
||||
+ for type in DEVICE_TYPES:
|
||||
+ path = self.dbpath + '/' + type
|
||||
+ domains = xstransact.List(path)
|
||||
+ log.debug('domains: %s', domains)
|
||||
+ for domain in domains: # for each domain
|
||||
+ devices = xstransact.List( path + '/' + domain)
|
||||
+ log.debug('devices: %s',devices)
|
||||
+ for device in devices: # for each vbd device
|
||||
+ str = device.split('/')
|
||||
+ vbd_type = None;
|
||||
+ vbd_physical_device = None
|
||||
+ vbd_media = None
|
||||
+ vbd_device_path = path + '/' + domain + '/' + device
|
||||
+ listing = xstransact.List(vbd_device_path)
|
||||
+ for entry in listing: # for each entry
|
||||
+ item = path + '/' + entry
|
||||
+ value = xstransact.Read( vbd_device_path + '/' + entry)
|
||||
+ log.debug('%s=%s',item,value)
|
||||
+ if item.find('media-present') != -1:
|
||||
+ vbd_media = item;
|
||||
+ vbd_media_path = item
|
||||
+ if item.find('physical-device') != -1:
|
||||
+ vbd_physical_device = value;
|
||||
+ if item.find('type') != -1:
|
||||
+ vbd_type = value;
|
||||
+ if vbd_type is not None and vbd_physical_device is not None and vbd_media is not None :
|
||||
+ inode = vbd_physical_device.split(':')
|
||||
+ imajor = parse_hex(inode[0])
|
||||
+ iminor = parse_hex(inode[1])
|
||||
+ log.debug("action:%s major:%s- minor:%s- imajor:%s- iminor:%s- inode: %s",
|
||||
+ action,major,minor, imajor, iminor, inode)
|
||||
+ if int(imajor) == int(major) and int(iminor) == int(minor):
|
||||
+ if action == "add":
|
||||
+ xs_dict = {'media': "1"}
|
||||
+ xstransact.Write(vbd_device_path, 'media-present', "1" )
|
||||
+ log.debug("wrote xenstore media-present 1 path:%s",vbd_media_path)
|
||||
+ else:
|
||||
+ xstransact.Write(vbd_device_path, 'media-present', "0" )
|
||||
+ log.debug("wrote xenstore media 0 path:%s",vbd_media_path)
|
||||
+
|
||||
+def mylog( fmt, *args):
|
||||
+ f = open('/tmp/haldaemon.log', 'a')
|
||||
+ print >>f, "HalDaemon ", fmt % args
|
||||
+ f.close()
|
||||
+
|
||||
+
|
||||
+def parse_hex(val):
|
||||
+ try:
|
||||
+ if isinstance(val, types.StringTypes):
|
||||
+ return int(val, 16)
|
||||
+ else:
|
||||
+ return val
|
||||
+ except ValueError:
|
||||
+ return None
|
||||
+
|
||||
+if __name__ == "__main__":
|
||||
+ watcher = HalDaemon()
|
||||
+ watcher.run()
|
||||
+ print 'Falling off end'
|
||||
+
|
||||
+
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/server/Hald.py
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/server/Hald.py
|
||||
@@ -0,0 +1,125 @@
|
||||
+#============================================================================
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+#============================================================================
|
||||
+# Copyright (C) 2007 Pat Campbell <plc@novell.com>
|
||||
+# Copyright (C) 2007 Novell Inc.
|
||||
+#============================================================================
|
||||
+
|
||||
+import errno
|
||||
+import types
|
||||
+import os
|
||||
+import sys
|
||||
+import time
|
||||
+import signal
|
||||
+from traceback import print_exc
|
||||
+
|
||||
+from xen.xend.XendLogging import log
|
||||
+
|
||||
+class Hald:
|
||||
+ def __init__(self):
|
||||
+ self.ready = False
|
||||
+ self.running = True
|
||||
+
|
||||
+ def run(self):
|
||||
+ """Starts the HalDaemon process
|
||||
+ """
|
||||
+ self.ready = True
|
||||
+ try:
|
||||
+ myfile = self.find("xen/xend/server/HalDaemon.py")
|
||||
+ args = (["python", myfile ])
|
||||
+ self.pid = self.daemonize("python", args )
|
||||
+ #log.debug( "%s %s pid:%d", "Hald.py starting ", args, self.pid )
|
||||
+ except:
|
||||
+ self.pid = -1
|
||||
+ log.debug("Unable to start HalDaemon process")
|
||||
+
|
||||
+ def shutdown(self):
|
||||
+ """Shutdown the HalDaemon process
|
||||
+ """
|
||||
+ log.debug("%s pid:%d", "Hald.shutdown()", self.pid)
|
||||
+ self.running = False
|
||||
+ self.ready = False
|
||||
+ if self.pid != -1:
|
||||
+ try:
|
||||
+ os.kill(self.pid, signal.SIGINT)
|
||||
+ except:
|
||||
+ print_exc()
|
||||
+
|
||||
+ def daemonize(self,prog, args):
|
||||
+ """Runs a program as a daemon with the list of arguments. Returns the PID
|
||||
+ of the daemonized program, or returns 0 on error.
|
||||
+ Copied from xm/create.py instead of importing to reduce coupling
|
||||
+ """
|
||||
+ r, w = os.pipe()
|
||||
+ pid = os.fork()
|
||||
+
|
||||
+ if pid == 0:
|
||||
+ os.close(r)
|
||||
+ w = os.fdopen(w, 'w')
|
||||
+ os.setsid()
|
||||
+ try:
|
||||
+ pid2 = os.fork()
|
||||
+ except:
|
||||
+ pid2 = None
|
||||
+ if pid2 == 0:
|
||||
+ os.chdir("/")
|
||||
+ env = os.environ.copy()
|
||||
+ env['PYTHONPATH'] = self.getpythonpath()
|
||||
+ for fd in range(0, 256):
|
||||
+ try:
|
||||
+ os.close(fd)
|
||||
+ except:
|
||||
+ pass
|
||||
+ os.open("/dev/null", os.O_RDWR)
|
||||
+ os.dup2(0, 1)
|
||||
+ os.dup2(0, 2)
|
||||
+ os.execvpe(prog, args, env)
|
||||
+ os._exit(1)
|
||||
+ else:
|
||||
+ w.write(str(pid2 or 0))
|
||||
+ w.close()
|
||||
+ os._exit(0)
|
||||
+ os.close(w)
|
||||
+ r = os.fdopen(r)
|
||||
+ daemon_pid = int(r.read())
|
||||
+ r.close()
|
||||
+ os.waitpid(pid, 0)
|
||||
+ #log.debug( "daemon_pid: %d", daemon_pid )
|
||||
+ return daemon_pid
|
||||
+
|
||||
+ def getpythonpath(self):
|
||||
+ str = " "
|
||||
+ for p in sys.path:
|
||||
+ if str != " ":
|
||||
+ str = str + ":" + p
|
||||
+ else:
|
||||
+ if str != "":
|
||||
+ str = p
|
||||
+ return str
|
||||
+
|
||||
+ def find(self,path, matchFunc=os.path.isfile):
|
||||
+ """Find a module in the sys.path
|
||||
+ From web page: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52224
|
||||
+ """
|
||||
+ for dirname in sys.path:
|
||||
+ candidate = os.path.join(dirname, path)
|
||||
+ if matchFunc(candidate):
|
||||
+ return candidate
|
||||
+ raise Error("Can't find file %s" % path)
|
||||
+
|
||||
+if __name__ == "__main__":
|
||||
+ watcher = Hald()
|
||||
+ watcher.run()
|
||||
+ time.sleep(10)
|
||||
+ watcher.shutdown()
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/server/SrvServer.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/server/SrvServer.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/server/SrvServer.py
|
||||
@@ -57,6 +57,7 @@ from xen.web.SrvDir import SrvDir
|
||||
|
||||
from SrvRoot import SrvRoot
|
||||
from XMLRPCServer import XMLRPCServer
|
||||
+from xen.xend.server.Hald import Hald
|
||||
|
||||
xoptions = XendOptions.instance()
|
||||
|
||||
@@ -252,6 +253,8 @@ def _loadConfig(servers, root, reload):
|
||||
if xoptions.get_xend_unix_xmlrpc_server():
|
||||
servers.add(XMLRPCServer(XendAPI.AUTH_PAM, False))
|
||||
|
||||
+ servers.add(Hald())
|
||||
+
|
||||
|
||||
def create():
|
||||
root = SrvDir()
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
|
@ -1,166 +0,0 @@
|
||||
Add support of change-vnc-password while vm is running.
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
||||
|
||||
---
|
||||
tools/python/xen/xend/XendDomainInfo.py | 14 ++++++++++++++
|
||||
tools/python/xen/xend/server/XMLRPCServer.py | 2 +-
|
||||
tools/python/xen/xm/main.py | 12 ++++++++++++
|
||||
tools/qemu-xen-traditional-dir-remote/vl.c | 2 +-
|
||||
tools/qemu-xen-traditional-dir-remote/vnc.c | 1 +
|
||||
tools/qemu-xen-traditional-dir-remote/xenstore.c | 14 ++++++++++++++
|
||||
6 files changed, 43 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
@@ -1665,6 +1665,20 @@ class XendDomainInfo:
|
||||
vfb_ctrl.reconfigureDevice(0, dev_info)
|
||||
break
|
||||
|
||||
+ def chgvncpasswd(self, passwd):
|
||||
+ if self._stateGet() != DOM_STATE_HALTED:
|
||||
+ path = '/local/domain/0/backend/vfb/%u/0/' % self.getDomid()
|
||||
+ xstransact.Write(path, 'vncpasswd', passwd)
|
||||
+ self.image.signalDeviceModel("chgvncpasswd", "vncpasswdchged")
|
||||
+
|
||||
+ for dev_uuid, (dev_type, dev_info) in self.info['devices'].items():
|
||||
+ if dev_type == 'vfb':
|
||||
+ dev_info['vncpasswd'] = passwd
|
||||
+ dev_info['other_config']['vncpasswd'] = passwd
|
||||
+ self.info.device_update(dev_uuid, cfg_xenapi = dev_info)
|
||||
+ break
|
||||
+ xen.xend.XendDomain.instance().managed_config_save(self)
|
||||
+
|
||||
#
|
||||
# Function to update xenstore /vm/*
|
||||
#
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/server/XMLRPCServer.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
||||
@@ -95,7 +95,7 @@ methods = ['device_create', 'device_conf
|
||||
'destroyDevice','getDeviceSxprs',
|
||||
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
|
||||
'send_sysrq', 'getVCPUInfo', 'waitForDevices',
|
||||
- 'getRestartCount', 'getBlockDeviceClass']
|
||||
+ 'getRestartCount', 'getBlockDeviceClass', 'chgvncpasswd']
|
||||
|
||||
exclude = ['domain_create', 'domain_restore']
|
||||
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xm/main.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xm/main.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xm/main.py
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
"""Grand unified management application for Xen.
|
||||
"""
|
||||
+import getpass
|
||||
import atexit
|
||||
import cmd
|
||||
import os
|
||||
@@ -280,6 +281,9 @@ SUBCOMMAND_HELP = {
|
||||
'getenforce' : ('', 'Returns the current enforcing mode for the Flask XSM module (Enforcing,Permissive)'),
|
||||
'setenforce' : ('[ (Enforcing|1) | (Permissive|0) ]',
|
||||
'Modifies the current enforcing mode for the Flask XSM module'),
|
||||
+ #change vnc password
|
||||
+ 'change-vnc-passwd' : ('<Domain>',\
|
||||
+ 'Change vnc password'),
|
||||
}
|
||||
|
||||
SUBCOMMAND_OPTIONS = {
|
||||
@@ -404,6 +408,7 @@ common_commands = [
|
||||
"usb-del",
|
||||
"domstate",
|
||||
"vcpu-set",
|
||||
+ "change-vnc-passwd",
|
||||
]
|
||||
|
||||
domain_commands = [
|
||||
@@ -441,6 +446,7 @@ domain_commands = [
|
||||
"vcpu-list",
|
||||
"vcpu-pin",
|
||||
"vcpu-set",
|
||||
+ "change-vnc-passwd",
|
||||
]
|
||||
|
||||
host_commands = [
|
||||
@@ -3751,6 +3757,10 @@ def xm_cpupool_migrate(args):
|
||||
else:
|
||||
server.xend.cpu_pool.migrate(domname, poolname)
|
||||
|
||||
+def xm_chgvncpasswd(args):
|
||||
+ arg_check(args, "change-vnc-passwd", 1)
|
||||
+ pwd = getpass.getpass("Enter new password: ")
|
||||
+ server.xend.domain.chgvncpasswd(args[0], pwd)
|
||||
|
||||
commands = {
|
||||
"shell": xm_shell,
|
||||
@@ -3857,6 +3867,8 @@ commands = {
|
||||
"usb-del": xm_usb_del,
|
||||
#domstate
|
||||
"domstate": xm_domstate,
|
||||
+ #change vnc password:
|
||||
+ "change-vnc-passwd": xm_chgvncpasswd,
|
||||
}
|
||||
|
||||
## The commands supported by a separate argument parser in xend.xm.
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
@@ -200,7 +200,7 @@ DriveInfo drives_table[MAX_DRIVES+1];
|
||||
int nb_drives;
|
||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||
int vga_ram_size;
|
||||
-static DisplayState *display_state;
|
||||
+DisplayState *display_state;
|
||||
int nographic;
|
||||
static int curses;
|
||||
static int sdl;
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||
@@ -2600,6 +2600,7 @@ int vnc_display_password(DisplayState *d
|
||||
if (password && password[0]) {
|
||||
if (!(vs->password = qemu_strdup(password)))
|
||||
return -1;
|
||||
+ vs->auth = VNC_AUTH_VNC;
|
||||
}
|
||||
|
||||
return 0;
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "qemu-xen.h"
|
||||
#include "xen_backend.h"
|
||||
|
||||
+extern DisplayState *display_state;
|
||||
struct xs_handle *xsh = NULL;
|
||||
static char *media_filename[MAX_DRIVES+1];
|
||||
static QEMUTimer *insert_timer = NULL;
|
||||
@@ -897,6 +898,19 @@ static void xenstore_process_dm_command_
|
||||
} else if (!strncmp(command, "continue", len)) {
|
||||
fprintf(logfile, "dm-command: continue after state save\n");
|
||||
xen_pause_requested = 0;
|
||||
+ } else if (!strncmp(command, "chgvncpasswd", len)) {
|
||||
+ fprintf(logfile, "dm-command: change vnc passwd\n");
|
||||
+ if (pasprintf(&path,
|
||||
+ "/local/domain/0/backend/vfb/%u/0/vncpasswd", domid) == -1) {
|
||||
+ fprintf(logfile, "out of memory reading dm command parameter\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ par = xs_read(xsh, XBT_NULL, path, &len);
|
||||
+ if (!par)
|
||||
+ goto out;
|
||||
+ if (vnc_display_password(display_state, par) == 0)
|
||||
+ xenstore_record_dm_state("vncpasswdchged");
|
||||
+ free(par);
|
||||
} else if (!strncmp(command, "usb-add", len)) {
|
||||
fprintf(logfile, "dm-command: usb-add a usb device\n");
|
||||
if (pasprintf(&path,
|
@ -1,433 +0,0 @@
|
||||
Index: xen-4.4.1-testing/tools/configure
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/configure
|
||||
+++ xen-4.4.1-testing/tools/configure
|
||||
@@ -633,9 +633,6 @@ libgcrypt
|
||||
EXTFS_LIBS
|
||||
system_aio
|
||||
zlib
|
||||
-FETCHER
|
||||
-FTP
|
||||
-WGET
|
||||
glib_LIBS
|
||||
glib_CFLAGS
|
||||
PKG_CONFIG_LIBDIR
|
||||
@@ -7375,104 +7372,104 @@ $as_echo "yes" >&6; }
|
||||
fi
|
||||
|
||||
# Extract the first word of "wget", so it can be a program name with args.
|
||||
-set dummy wget; ac_word=$2
|
||||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||
-if ${ac_cv_path_WGET+:} false; then :
|
||||
- $as_echo_n "(cached) " >&6
|
||||
-else
|
||||
- case $WGET in
|
||||
- [\\/]* | ?:[\\/]*)
|
||||
- ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
|
||||
- ;;
|
||||
- *)
|
||||
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
-for as_dir in $PATH
|
||||
-do
|
||||
- IFS=$as_save_IFS
|
||||
- test -z "$as_dir" && as_dir=.
|
||||
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
- ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
|
||||
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
- break 2
|
||||
- fi
|
||||
-done
|
||||
- done
|
||||
-IFS=$as_save_IFS
|
||||
-
|
||||
- test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
|
||||
- ;;
|
||||
-esac
|
||||
-fi
|
||||
-WGET=$ac_cv_path_WGET
|
||||
-if test -n "$WGET"; then
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
|
||||
-$as_echo "$WGET" >&6; }
|
||||
-else
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
-$as_echo "no" >&6; }
|
||||
-fi
|
||||
-
|
||||
-
|
||||
-if test x"$WGET" != x"no"; then :
|
||||
-
|
||||
- FETCHER="$WGET -c -O"
|
||||
-
|
||||
-else
|
||||
-
|
||||
- # Extract the first word of "ftp", so it can be a program name with args.
|
||||
-set dummy ftp; ac_word=$2
|
||||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||
-if ${ac_cv_path_FTP+:} false; then :
|
||||
- $as_echo_n "(cached) " >&6
|
||||
-else
|
||||
- case $FTP in
|
||||
- [\\/]* | ?:[\\/]*)
|
||||
- ac_cv_path_FTP="$FTP" # Let the user override the test with a path.
|
||||
- ;;
|
||||
- *)
|
||||
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
-for as_dir in $PATH
|
||||
-do
|
||||
- IFS=$as_save_IFS
|
||||
- test -z "$as_dir" && as_dir=.
|
||||
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
- ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext"
|
||||
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
- break 2
|
||||
- fi
|
||||
-done
|
||||
- done
|
||||
-IFS=$as_save_IFS
|
||||
-
|
||||
- test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no"
|
||||
- ;;
|
||||
-esac
|
||||
-fi
|
||||
-FTP=$ac_cv_path_FTP
|
||||
-if test -n "$FTP"; then
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5
|
||||
-$as_echo "$FTP" >&6; }
|
||||
-else
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
-$as_echo "no" >&6; }
|
||||
-fi
|
||||
-
|
||||
-
|
||||
- if test x"$FTP" != x"no"; then :
|
||||
-
|
||||
- FETCHER="$FTP -o"
|
||||
-
|
||||
-else
|
||||
-
|
||||
- as_fn_error $? "cannot find wget or ftp" "$LINENO" 5
|
||||
-
|
||||
-fi
|
||||
-
|
||||
-fi
|
||||
+#set dummy wget; ac_word=$2
|
||||
+#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
+#$as_echo_n "checking for $ac_word... " >&6; }
|
||||
+#if ${ac_cv_path_WGET+:} false; then :
|
||||
+# $as_echo_n "(cached) " >&6
|
||||
+#else
|
||||
+# case $WGET in
|
||||
+# [\\/]* | ?:[\\/]*)
|
||||
+# ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
|
||||
+# ;;
|
||||
+# *)
|
||||
+# as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
+#for as_dir in $PATH
|
||||
+#do
|
||||
+# IFS=$as_save_IFS
|
||||
+# test -z "$as_dir" && as_dir=.
|
||||
+# for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
+# if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
+# ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
|
||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
+# break 2
|
||||
+# fi
|
||||
+#done
|
||||
+# done
|
||||
+#IFS=$as_save_IFS
|
||||
+#
|
||||
+# test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
|
||||
+# ;;
|
||||
+#esac
|
||||
+#fi
|
||||
+#WGET=$ac_cv_path_WGET
|
||||
+#if test -n "$WGET"; then
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
|
||||
+#$as_echo "$WGET" >&6; }
|
||||
+#else
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
+#$as_echo "no" >&6; }
|
||||
+#fi
|
||||
+#
|
||||
+#
|
||||
+#if test x"$WGET" != x"no"; then :
|
||||
+#
|
||||
+# FETCHER="$WGET -c -O"
|
||||
+#
|
||||
+#else
|
||||
+#
|
||||
+# # Extract the first word of "ftp", so it can be a program name with args.
|
||||
+#set dummy ftp; ac_word=$2
|
||||
+#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
+#$as_echo_n "checking for $ac_word... " >&6; }
|
||||
+#if ${ac_cv_path_FTP+:} false; then :
|
||||
+# $as_echo_n "(cached) " >&6
|
||||
+#else
|
||||
+# case $FTP in
|
||||
+# [\\/]* | ?:[\\/]*)
|
||||
+# ac_cv_path_FTP="$FTP" # Let the user override the test with a path.
|
||||
+# ;;
|
||||
+# *)
|
||||
+# as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
+#for as_dir in $PATH
|
||||
+#do
|
||||
+# IFS=$as_save_IFS
|
||||
+# test -z "$as_dir" && as_dir=.
|
||||
+# for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
+# if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
+# ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext"
|
||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
+# break 2
|
||||
+# fi
|
||||
+#done
|
||||
+# done
|
||||
+#IFS=$as_save_IFS
|
||||
+#
|
||||
+# test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no"
|
||||
+# ;;
|
||||
+#esac
|
||||
+#fi
|
||||
+#FTP=$ac_cv_path_FTP
|
||||
+#if test -n "$FTP"; then
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5
|
||||
+#$as_echo "$FTP" >&6; }
|
||||
+#else
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
+#$as_echo "no" >&6; }
|
||||
+#fi
|
||||
+#
|
||||
+#
|
||||
+# if test x"$FTP" != x"no"; then :
|
||||
+#
|
||||
+# FETCHER="$FTP -o"
|
||||
+#
|
||||
+#else
|
||||
+#
|
||||
+# as_fn_error $? "cannot find wget or ftp" "$LINENO" 5
|
||||
+#
|
||||
+#fi
|
||||
+#
|
||||
+#fi
|
||||
|
||||
|
||||
|
||||
Index: xen-4.4.1-testing/stubdom/configure
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/stubdom/configure
|
||||
+++ xen-4.4.1-testing/stubdom/configure
|
||||
@@ -623,8 +623,6 @@ LDFLAGS
|
||||
CFLAGS
|
||||
CC
|
||||
FETCHER
|
||||
-FTP
|
||||
-WGET
|
||||
CMAKE
|
||||
extfiles
|
||||
debug
|
||||
@@ -2300,104 +2298,104 @@ extfiles=$ax_cv_extfiles
|
||||
|
||||
|
||||
# Extract the first word of "wget", so it can be a program name with args.
|
||||
-set dummy wget; ac_word=$2
|
||||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||
-if ${ac_cv_path_WGET+:} false; then :
|
||||
- $as_echo_n "(cached) " >&6
|
||||
-else
|
||||
- case $WGET in
|
||||
- [\\/]* | ?:[\\/]*)
|
||||
- ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
|
||||
- ;;
|
||||
- *)
|
||||
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
-for as_dir in $PATH
|
||||
-do
|
||||
- IFS=$as_save_IFS
|
||||
- test -z "$as_dir" && as_dir=.
|
||||
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
- ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
|
||||
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
- break 2
|
||||
- fi
|
||||
-done
|
||||
- done
|
||||
-IFS=$as_save_IFS
|
||||
-
|
||||
- test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
|
||||
- ;;
|
||||
-esac
|
||||
-fi
|
||||
-WGET=$ac_cv_path_WGET
|
||||
-if test -n "$WGET"; then
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
|
||||
-$as_echo "$WGET" >&6; }
|
||||
-else
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
-$as_echo "no" >&6; }
|
||||
-fi
|
||||
-
|
||||
-
|
||||
-if test x"$WGET" != x"no"; then :
|
||||
-
|
||||
- FETCHER="$WGET -c -O"
|
||||
-
|
||||
-else
|
||||
-
|
||||
- # Extract the first word of "ftp", so it can be a program name with args.
|
||||
-set dummy ftp; ac_word=$2
|
||||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||
-if ${ac_cv_path_FTP+:} false; then :
|
||||
- $as_echo_n "(cached) " >&6
|
||||
-else
|
||||
- case $FTP in
|
||||
- [\\/]* | ?:[\\/]*)
|
||||
- ac_cv_path_FTP="$FTP" # Let the user override the test with a path.
|
||||
- ;;
|
||||
- *)
|
||||
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
-for as_dir in $PATH
|
||||
-do
|
||||
- IFS=$as_save_IFS
|
||||
- test -z "$as_dir" && as_dir=.
|
||||
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
- ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext"
|
||||
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
- break 2
|
||||
- fi
|
||||
-done
|
||||
- done
|
||||
-IFS=$as_save_IFS
|
||||
-
|
||||
- test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no"
|
||||
- ;;
|
||||
-esac
|
||||
-fi
|
||||
-FTP=$ac_cv_path_FTP
|
||||
-if test -n "$FTP"; then
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5
|
||||
-$as_echo "$FTP" >&6; }
|
||||
-else
|
||||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
-$as_echo "no" >&6; }
|
||||
-fi
|
||||
-
|
||||
-
|
||||
- if test x"$FTP" != x"no"; then :
|
||||
-
|
||||
- FETCHER="$FTP -o"
|
||||
-
|
||||
-else
|
||||
-
|
||||
- as_fn_error $? "cannot find wget or ftp" "$LINENO" 5
|
||||
-
|
||||
-fi
|
||||
-
|
||||
-fi
|
||||
+#set dummy wget; ac_word=$2
|
||||
+#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
+#$as_echo_n "checking for $ac_word... " >&6; }
|
||||
+#if ${ac_cv_path_WGET+:} false; then :
|
||||
+# $as_echo_n "(cached) " >&6
|
||||
+#else
|
||||
+# case $WGET in
|
||||
+# [\\/]* | ?:[\\/]*)
|
||||
+# ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
|
||||
+# ;;
|
||||
+# *)
|
||||
+# as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
+#for as_dir in $PATH
|
||||
+#do
|
||||
+# IFS=$as_save_IFS
|
||||
+# test -z "$as_dir" && as_dir=.
|
||||
+# for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
+# if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
+# ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
|
||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
+# break 2
|
||||
+# fi
|
||||
+#done
|
||||
+# done
|
||||
+#IFS=$as_save_IFS
|
||||
+#
|
||||
+# test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
|
||||
+# ;;
|
||||
+#esac
|
||||
+#fi
|
||||
+#WGET=$ac_cv_path_WGET
|
||||
+#if test -n "$WGET"; then
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
|
||||
+#$as_echo "$WGET" >&6; }
|
||||
+#else
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
+#$as_echo "no" >&6; }
|
||||
+#fi
|
||||
+#
|
||||
+#
|
||||
+#if test x"$WGET" != x"no"; then :
|
||||
+#
|
||||
+# FETCHER="$WGET -c -O"
|
||||
+#
|
||||
+#else
|
||||
+#
|
||||
+# # Extract the first word of "ftp", so it can be a program name with args.
|
||||
+#set dummy ftp; ac_word=$2
|
||||
+#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
+#$as_echo_n "checking for $ac_word... " >&6; }
|
||||
+#if ${ac_cv_path_FTP+:} false; then :
|
||||
+# $as_echo_n "(cached) " >&6
|
||||
+#else
|
||||
+# case $FTP in
|
||||
+# [\\/]* | ?:[\\/]*)
|
||||
+# ac_cv_path_FTP="$FTP" # Let the user override the test with a path.
|
||||
+# ;;
|
||||
+# *)
|
||||
+# as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
+#for as_dir in $PATH
|
||||
+#do
|
||||
+# IFS=$as_save_IFS
|
||||
+# test -z "$as_dir" && as_dir=.
|
||||
+# for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
+# if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
+# ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext"
|
||||
+# $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
+# break 2
|
||||
+# fi
|
||||
+#done
|
||||
+# done
|
||||
+#IFS=$as_save_IFS
|
||||
+#
|
||||
+# test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no"
|
||||
+# ;;
|
||||
+#esac
|
||||
+#fi
|
||||
+#FTP=$ac_cv_path_FTP
|
||||
+#if test -n "$FTP"; then
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5
|
||||
+#$as_echo "$FTP" >&6; }
|
||||
+#else
|
||||
+# { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
+#$as_echo "no" >&6; }
|
||||
+#fi
|
||||
+#
|
||||
+#
|
||||
+# if test x"$FTP" != x"no"; then :
|
||||
+#
|
||||
+# FETCHER="$FTP -o"
|
||||
+#
|
||||
+#else
|
||||
+#
|
||||
+# as_fn_error $? "cannot find wget or ftp" "$LINENO" 5
|
||||
+#
|
||||
+#fi
|
||||
+#
|
||||
+#fi
|
||||
|
||||
|
||||
|
553
domUloader.py
553
domUloader.py
@ -1,553 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# domUloader.py
|
||||
"""Loader for kernel and (optional) ramdisk from domU filesystem
|
||||
|
||||
Given a physical disk (or disk image) for a domU and the path of a kernel and
|
||||
optional ramdisk, copies the kernel and ramdisk from the domU disk to a
|
||||
temporary location in dom0.
|
||||
|
||||
The --entry parameter specifies the location of the kernel (and optional
|
||||
ramdisk) within the domU filesystem. dev is the disk as seen by domU.
|
||||
Filenames are relative to that filesystem.
|
||||
|
||||
The disk is passed as the last parameter. It must be a block device or raw
|
||||
disk image. More complex disk images (QCOW, VMDK, etc) must already be
|
||||
configured via blktap and presented as a block device.
|
||||
|
||||
The script writes an sxpr specifying the locations of the copied kernel and
|
||||
ramdisk into the file specified by --output (default is stdout).
|
||||
|
||||
Limitations:
|
||||
- It is assumed both kernel and ramdisk are on the same filesystem.
|
||||
- domUs might use LVM; the script currently does not have support for setting
|
||||
up LVM mappings for domUs; it's not trivial and we might risk namespace
|
||||
conflicts. If you want to use LVM inside domUs, set up a small non-LVM boot
|
||||
partition and specify it in bootentry.
|
||||
|
||||
The script uses kpartx (multipath-tools) to create mappings for devices that
|
||||
are exported as whole disk devices that are partitioned.
|
||||
|
||||
(c) 01/2006 Novell Inc
|
||||
License: GNU GPL
|
||||
Author: Kurt Garloff <garloff@suse.de>
|
||||
"""
|
||||
|
||||
import os, sys, getopt
|
||||
from stat import *
|
||||
from xen.xend import sxp
|
||||
import tempfile
|
||||
import time
|
||||
import xnloader
|
||||
|
||||
# Global options
|
||||
quiet = False
|
||||
verbose = False
|
||||
dryrun = False
|
||||
tmpdir = '/var/lib/xen/tmp'
|
||||
in_args = ''
|
||||
# kpartx, left to its own devices, does not consistently pick the
|
||||
# same partition separator. Explicitly specify it.
|
||||
kpartx_args = '-p -part'
|
||||
|
||||
# Helper functions
|
||||
|
||||
def kpartx_has_opt(opt):
|
||||
""" Return True if kpartx supports option opt, otherwise False"""
|
||||
have_opt = True
|
||||
kpartx_cmd = 'kpartx -' + opt + ' 2>&1'
|
||||
p = os.popen(kpartx_cmd)
|
||||
for line in p.readlines():
|
||||
if line.find('invalid option') >= 0:
|
||||
have_opt = False
|
||||
break
|
||||
p.close()
|
||||
return have_opt
|
||||
|
||||
def error(s):
|
||||
print >> sys.stderr, "domUloader error: %s" % s
|
||||
|
||||
def verbose_print(s):
|
||||
if verbose:
|
||||
print >> sys.stderr, "domUloader: %s" % s
|
||||
|
||||
def traildigits(strg):
|
||||
"""Return the trailing digits, used to split the partition number off"""
|
||||
idx = len(strg)-1
|
||||
while strg[idx].isdigit():
|
||||
if len == 0:
|
||||
return strg
|
||||
idx -= 1
|
||||
return strg[idx+1:]
|
||||
|
||||
def getWholedisk(part):
|
||||
while len(part) and part[len(part)-1].isdigit():
|
||||
part = part[:-1]
|
||||
return part
|
||||
|
||||
#def isWholedisk(domUname):
|
||||
# """Determines whether dev is a wholedisk dev"""
|
||||
# return not domUname[-1:].isdigit()
|
||||
|
||||
# If available, add '-f' option (bnc#613584)
|
||||
if kpartx_has_opt('f'):
|
||||
kpartx_args += ' -f'
|
||||
|
||||
class Wholedisk:
|
||||
"Class representing a whole disk that may have partitions"
|
||||
def __init__(self, vdev, pdev):
|
||||
"c'tor: set up"
|
||||
# Initialize object; will not raise:
|
||||
self.ldev = None
|
||||
self.vdev = vdev
|
||||
self.pdev = pdev
|
||||
self.mapped = 0
|
||||
self.partitions = []
|
||||
self.pcount = 0
|
||||
self.lvm = False
|
||||
# Finish initialization; may raise:
|
||||
self.is_blk = (S_ISBLK(os.stat(pdev)[ST_MODE]))
|
||||
self.pcount = self.scanpartitions()
|
||||
|
||||
def physdev(self):
|
||||
"""Gets the physical device used to access the device from dom0"""
|
||||
if self.ldev:
|
||||
return self.ldev
|
||||
return self.pdev
|
||||
|
||||
def findPart(self, vdev):
|
||||
"Find device dev in list of partitions"
|
||||
if len(vdev) > 5 and vdev[:5] == "/dev/":
|
||||
vdev = vdev[5:]
|
||||
for part in self.partitions:
|
||||
if vdev == part.vdev:
|
||||
return part
|
||||
if len(self.partitions):
|
||||
return self.partitions[0]
|
||||
return None
|
||||
|
||||
def loopsetup(self):
|
||||
"""Sets up the loop mapping for a disk image.
|
||||
|
||||
Will raise if no loopbacks are available.
|
||||
"""
|
||||
if not self.is_blk and not self.ldev:
|
||||
# Loops through all loopback devices, attempting to
|
||||
# find a free one to set up. Don't scan for free and
|
||||
# then try to set it up as a separate step - too racy!
|
||||
i = 0
|
||||
while True:
|
||||
ldev = '/dev/loop%i' % (i)
|
||||
if not os.path.exists(ldev):
|
||||
break
|
||||
i += 1
|
||||
fd = os.popen("losetup %s '%s' 2> /dev/null" % (ldev, self.pdev))
|
||||
if not fd.close():
|
||||
verbose_print("losetup %s '%s'" % (ldev, self.pdev))
|
||||
self.ldev = ldev
|
||||
break
|
||||
if not self.ldev:
|
||||
raise RuntimeError("No free loop device found")
|
||||
|
||||
def loopclean(self):
|
||||
"""Delete the loop mapping.
|
||||
|
||||
Will never raise.
|
||||
"""
|
||||
if self.ldev:
|
||||
verbose_print("losetup -d %s" % self.ldev)
|
||||
# Even seemingly innocent queries like "losetup /dev/loop0"
|
||||
# can temporarily block the loopback and cause transient
|
||||
# failures deleting the loopback, hence the retry logic.
|
||||
retries = 10
|
||||
while retries:
|
||||
fd = os.popen("losetup -d %s" % self.ldev)
|
||||
if not fd.close():
|
||||
self.ldev = None
|
||||
break
|
||||
else:
|
||||
# Mappings may not have been deleted due to race
|
||||
# between udev and dm - see bnc#379032. Causes
|
||||
# loop devices to leak. Call kpartx -d again
|
||||
os.system("kpartx %s -d '%s'" % (kpartx_args, self.physdev()))
|
||||
time.sleep(0.1)
|
||||
retries -= 1
|
||||
|
||||
def scanlvmpartitions(self):
|
||||
pcount = 0
|
||||
verbose_print("vgchange -ay '%s'" % (self.vdev))
|
||||
ret = os.system("vgchange -ay '%s' > /dev/null 2>&1" % (self.vdev)) >> 8
|
||||
if not ret:
|
||||
self.lvm = True
|
||||
verbose_print("lvscan | grep '/dev/%s'" % (self.vdev))
|
||||
fd = os.popen("lvscan | grep '/dev/%s'" % (self.vdev))
|
||||
for line in fd.readlines():
|
||||
line = line.strip()
|
||||
(t1, lvname, t2) = line.split('\'')
|
||||
pname = lvname[lvname.rfind('/')+1:]
|
||||
pname = pname.strip()
|
||||
pname = "/dev/mapper/" + self.vdev + "-" + pname
|
||||
verbose_print("Found partition: vdev %s, pdev %s" % (self.vdev, pname))
|
||||
self.partitions.append(Partition(self, self.vdev, pname))
|
||||
pcount += 1
|
||||
fd.close()
|
||||
verbose_print("vgchange -an '%s'" % (self.vdev))
|
||||
os.system("vgchange -an '%s' > /dev/null 2>&1" % (self.vdev))
|
||||
else:
|
||||
verbose_print("vgchange -ay %s ... failed: -%d" % (self.vdev, ret))
|
||||
|
||||
return pcount
|
||||
|
||||
def scanpartitions(self):
|
||||
"""Scan device for partitions (kpartx -l) and set up data structures,
|
||||
Returns number of partitions found."""
|
||||
self.loopsetup()
|
||||
# TODO: We could use fdisk -l instead and look at the type of
|
||||
# partitions; this way we could also detect LVM and support it.
|
||||
verbose_print("kpartx %s -l '%s'" % (kpartx_args, self.physdev()))
|
||||
fd = os.popen("kpartx %s -l '%s'" % (kpartx_args, self.physdev()))
|
||||
pcount = 0
|
||||
for line in fd.readlines():
|
||||
line = line.strip()
|
||||
verbose_print("kpartx -l: %s" % (line,))
|
||||
(pname, params) = line.split(' : ')
|
||||
pname = pname.strip()
|
||||
pno = int(traildigits(pname))
|
||||
#if pname.rfind('/') != -1:
|
||||
# pname = pname[pname.rfind('/')+1:]
|
||||
#pname = self.pdev[:self.pdev.rfind('/')] + '/' + pname
|
||||
pname = "/dev/mapper/" + pname
|
||||
verbose_print("Found partition: vdev %s, pdev %s" % ('%s%i' % (self.vdev, pno), pname))
|
||||
self.partitions.append(Partition(self, '%s%i' % (self.vdev, pno), pname))
|
||||
pcount += 1
|
||||
fd.close()
|
||||
|
||||
# Try lvm
|
||||
if not pcount:
|
||||
pcount = self.scanlvmpartitions()
|
||||
|
||||
# Add self to partition table
|
||||
if not pcount:
|
||||
if self.ldev:
|
||||
ref = self
|
||||
else:
|
||||
ref = None
|
||||
self.partitions.append(Partition(ref, self.vdev, self.pdev))
|
||||
return pcount
|
||||
|
||||
def activatepartitions(self):
|
||||
"Set up loop mapping and device-mapper mappings"
|
||||
verbose_print("activatepartitions")
|
||||
if not self.mapped:
|
||||
self.loopsetup()
|
||||
if self.pcount:
|
||||
verbose_print("kpartx %s -a '%s'" % (kpartx_args, self.physdev()))
|
||||
fd = os.popen("kpartx %s -a '%s'" % (kpartx_args, self.physdev()))
|
||||
fd.close()
|
||||
if self.pcount and self.lvm:
|
||||
verbose_print("vgchange -ay '%s'" % (self.vdev))
|
||||
ret = os.system("vgchange -ay '%s' > /dev/null 2>&1" % (self.vdev)) >> 8
|
||||
if not ret:
|
||||
verbose_print("lvchange -ay '%s'" % (self.vdev))
|
||||
os.system("lvchange -ay '%s' > /dev/null 2>&1" % (self.vdev))
|
||||
self.mapped += 1
|
||||
|
||||
def partitionsdeactivated(self):
|
||||
"Return True if partition mappings have been removed, False otherwise"
|
||||
for part in self.partitions:
|
||||
if os.access(part.pdev, os.F_OK):
|
||||
return False
|
||||
return True
|
||||
|
||||
def deactivatepartitions(self):
|
||||
"""Remove device-mapper mappings and loop mapping.
|
||||
|
||||
Will never raise.
|
||||
"""
|
||||
verbose_print("deactivatepartitions")
|
||||
if not self.mapped:
|
||||
return
|
||||
self.mapped -= 1
|
||||
if not self.mapped:
|
||||
if self.pcount:
|
||||
retries = 10
|
||||
while retries and not self.partitionsdeactivated():
|
||||
verbose_print("kpartx %s -d '%s'" % (kpartx_args, self.physdev()))
|
||||
os.system("kpartx %s -d '%s'" % (kpartx_args, self.physdev()))
|
||||
time.sleep(0.1)
|
||||
retries -= 1
|
||||
if retries == 0:
|
||||
error("unable to remove partition mappings with kpartx -d")
|
||||
if self.pcount and self.lvm:
|
||||
verbose_print("lvchange -an '%s'" % (self.vdev))
|
||||
ret = os.system("lvchange -an '%s' > /dev/null 2>&1" % (self.vdev)) >> 8
|
||||
if ret:
|
||||
time.sleep(0.3)
|
||||
os.system("lvchange -an '/dev/%s' > /dev/null 2>&1" % (self.vdev))
|
||||
verbose_print("vgchange -an '%s'" % (self.vdev))
|
||||
ret = os.system("vgchange -an '%s' > /dev/null 2>&1" % (self.vdev)) >> 8
|
||||
if ret:
|
||||
time.sleep(0.3)
|
||||
os.system("vgchange -an '%s' > /dev/null 2>&1" % (self.vdev))
|
||||
self.loopclean()
|
||||
|
||||
def __del__(self):
|
||||
"d'tor: clean up"
|
||||
self.deactivatepartitions()
|
||||
self.loopclean()
|
||||
|
||||
def __repr__(self):
|
||||
"string representation for debugging"
|
||||
strg = "[" + self.vdev + "," + self.pdev + ","
|
||||
if self.ldev:
|
||||
strg += self.ldev
|
||||
strg += "," + str(self.pcount) + ",mapped %ix]" % self.mapped
|
||||
return strg
|
||||
|
||||
class Partition:
|
||||
"""Class representing a domU filesystem (partition) that can be
|
||||
mounted in dom0"""
|
||||
def __init__(self, whole = None, vdev = None, pdev = None):
|
||||
"c'tor: setup"
|
||||
self.wholedisk = whole
|
||||
self.vdev = vdev
|
||||
self.pdev = pdev
|
||||
self.mountpoint = None
|
||||
|
||||
def __del__(self):
|
||||
"d'tor: cleanup"
|
||||
if self.mountpoint:
|
||||
self.umount()
|
||||
# Not needed: Refcounting will take care of it.
|
||||
#if self.wholedisk:
|
||||
# self.wholedisk.deactivatepartitions()
|
||||
|
||||
def __repr__(self):
|
||||
"string representation for debugging"
|
||||
strg = "[" + self.vdev + "," + self.pdev + ","
|
||||
if self.mountpoint:
|
||||
strg += "mounted on " + self.mountpoint + ","
|
||||
else:
|
||||
strg += "not mounted,"
|
||||
if self.wholedisk:
|
||||
return strg + self.wholedisk.__repr__() + "]"
|
||||
else:
|
||||
return strg + "]"
|
||||
|
||||
def mount(self, fstype = None, options = "ro"):
|
||||
"mount filesystem, sets self.mountpoint"
|
||||
if self.mountpoint:
|
||||
return
|
||||
if self.wholedisk:
|
||||
self.wholedisk.activatepartitions()
|
||||
mtpt = tempfile.mkdtemp(prefix = "%s." % self.vdev, dir = tmpdir)
|
||||
mopts = ""
|
||||
if fstype:
|
||||
mopts += " -t %s" % fstype
|
||||
if options:
|
||||
mopts += " -o %s" % options
|
||||
verbose_print("mount %s '%s' %s" % (mopts, self.pdev, mtpt))
|
||||
fd = os.popen("mount %s '%s' %s" % (mopts, self.pdev, mtpt))
|
||||
err = fd.close()
|
||||
if err:
|
||||
try:
|
||||
os.rmdir(mtpt)
|
||||
except:
|
||||
pass
|
||||
raise RuntimeError("Error %i from mount %s '%s' on %s" % \
|
||||
(err, mopts, self.pdev, mtpt))
|
||||
self.mountpoint = mtpt
|
||||
|
||||
def umount(self):
|
||||
"""umount filesystem at self.mountpoint"""
|
||||
if not self.mountpoint:
|
||||
return
|
||||
verbose_print("umount %s" % self.mountpoint)
|
||||
fd = os.popen("umount %s" % self.mountpoint)
|
||||
err = fd.close()
|
||||
try:
|
||||
os.rmdir(self.mountpoint)
|
||||
except:
|
||||
pass
|
||||
if err:
|
||||
error("Error %i from umount %s" % (err, self.mountpoint))
|
||||
else:
|
||||
self.mountpoint = None
|
||||
if self.wholedisk:
|
||||
self.wholedisk.deactivatepartitions()
|
||||
|
||||
def parseEntry(entry):
|
||||
"disects bootentry and returns vdev, kernel, ramdisk"
|
||||
def bad():
|
||||
raise RuntimeError, "Malformed --entry"
|
||||
fsspl = entry.split(':')
|
||||
if len(fsspl) != 2:
|
||||
bad()
|
||||
vdev = fsspl[0]
|
||||
entry = fsspl[1]
|
||||
enspl = entry.split(',')
|
||||
if len(enspl) not in (1, 2):
|
||||
bad()
|
||||
# Prepend '/' if missing
|
||||
kernel = enspl[0]
|
||||
if kernel == '':
|
||||
bad()
|
||||
if kernel[0] != '/':
|
||||
kernel = '/' + kernel
|
||||
ramdisk = None
|
||||
if len(enspl) > 1:
|
||||
ramdisk = enspl[1]
|
||||
if ramdisk != '' and ramdisk[0] != '/':
|
||||
ramdisk = '/' + ramdisk
|
||||
return vdev, kernel, ramdisk
|
||||
|
||||
def copyFile(src, dst):
|
||||
"Wrapper for shutil.filecopy"
|
||||
import shutil
|
||||
verbose_print("cp %s %s" % (src, dst))
|
||||
stat = os.stat(src)
|
||||
if stat.st_size > 16*1024*1024:
|
||||
raise RuntimeError("Too large file %s (%s larger than 16MB)" \
|
||||
% (src, stat.st_size))
|
||||
try:
|
||||
shutil.copyfile(src, dst)
|
||||
except:
|
||||
os.unlink(dst)
|
||||
raise()
|
||||
|
||||
def copyKernelAndRamdisk(disk, vdev, kernel, ramdisk):
|
||||
"""Finds vdev in list of partitions, mounts the partition, copies
|
||||
kernel [and ramdisk] off to dom0 files, umounts the parition again,
|
||||
and returns sxpr pointing to these copies."""
|
||||
verbose_print("copyKernelAndRamdisk(%s, %s, %s, %s)" % (disk, vdev, kernel, ramdisk))
|
||||
if dryrun:
|
||||
return "linux (kernel kernel.dummy) (ramdisk ramdisk.dummy)"
|
||||
part = disk.findPart(vdev)
|
||||
if not part:
|
||||
raise RuntimeError("Partition '%s' does not exist" % vdev)
|
||||
part.mount()
|
||||
try:
|
||||
(fd, knm) = tempfile.mkstemp(prefix = "kernel.", dir = tmpdir)
|
||||
os.close(fd)
|
||||
copyFile(part.mountpoint + kernel, knm)
|
||||
except:
|
||||
os.unlink(knm)
|
||||
part.umount()
|
||||
raise
|
||||
if not quiet:
|
||||
print "Copy kernel %s from %s to %s for booting" % (kernel, vdev, knm)
|
||||
sxpr = "linux (kernel %s)" % knm
|
||||
if ramdisk:
|
||||
try:
|
||||
(fd, inm) = tempfile.mkstemp(prefix = "ramdisk.", dir = tmpdir)
|
||||
os.close(fd)
|
||||
copyFile(part.mountpoint + ramdisk, inm)
|
||||
except:
|
||||
os.unlink(knm)
|
||||
os.unlink(inm)
|
||||
part.umount()
|
||||
raise
|
||||
sxpr += "(ramdisk %s)" % inm
|
||||
part.umount()
|
||||
xnloader.patch_netware_loader(knm)
|
||||
return sxpr
|
||||
|
||||
def main(argv):
|
||||
"Main routine: Parses options etc."
|
||||
global quiet, dryrun, verbose, tmpdir, in_args
|
||||
def usage():
|
||||
"Help output (usage info)"
|
||||
global verbose, quiet, dryrun
|
||||
print >> sys.stderr, "domUloader usage: domUloader [--output=fd] [--quiet] [--dryrun] [--verbose]\n" +\
|
||||
"[--args] [--help] --entry=dev:kernel[,ramdisk] physdisk [virtdisk]\n" +\
|
||||
"\n" +\
|
||||
"dev format: hd[a-p][0-9]*, xvd[a-p][0-9]*, LVM-vgname-lvname\n"
|
||||
print >> sys.stderr, __doc__
|
||||
|
||||
try:
|
||||
(optlist, args) = getopt.gnu_getopt(argv, 'qvh', \
|
||||
('entry=', 'output=', 'tmpdir=', 'args=', 'kernel=', 'ramdisk=', 'help', 'quiet', 'dryrun', 'verbose'))
|
||||
except:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
entry = None
|
||||
output = None
|
||||
pdisk = None
|
||||
vdisk = None
|
||||
|
||||
for (opt, oarg) in optlist:
|
||||
if opt in ('-h', '--help'):
|
||||
usage()
|
||||
sys.exit(1)
|
||||
elif opt in ('-q', '--quiet'):
|
||||
quiet = True
|
||||
elif opt in ('-n', '--dryrun'):
|
||||
dryrun = True
|
||||
elif opt in ('-v', '--verbose'):
|
||||
verbose = True
|
||||
elif opt == '--output':
|
||||
output = oarg
|
||||
elif opt == '--entry':
|
||||
entry = oarg
|
||||
elif opt == '--tmpdir':
|
||||
tmpdir = oarg
|
||||
elif opt == '--args':
|
||||
in_args = oarg
|
||||
|
||||
verbose_print(str(argv))
|
||||
|
||||
if args:
|
||||
if len(args) == 2:
|
||||
pdisk = args[1]
|
||||
elif len(args) == 3:
|
||||
pdisk = args[1]
|
||||
vdisk = args[2]
|
||||
|
||||
if not entry or not pdisk:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if output is None or output == "-":
|
||||
fd = sys.stdout.fileno()
|
||||
else:
|
||||
fd = os.open(output, os.O_WRONLY)
|
||||
|
||||
if not os.access(tmpdir, os.X_OK):
|
||||
os.mkdir(tmpdir)
|
||||
os.chmod(tmpdir, 0750)
|
||||
|
||||
vdev, kernel, ramdisk = parseEntry(entry)
|
||||
if vdev[:vdev.find('-')] == "LVM":
|
||||
vdev = vdev.split('-')[1]
|
||||
if not vdisk:
|
||||
vdisk = getWholedisk(vdev)
|
||||
verbose_print("vdisk not specified; guessing '%s' based on '%s'" % (vdisk, vdev))
|
||||
if not vdev.startswith(vdisk):
|
||||
error("Virtual disk '%s' does not match entry '%s'" % (vdisk, entry))
|
||||
sys.exit(1)
|
||||
disk = Wholedisk(vdisk, pdisk)
|
||||
|
||||
r = 0
|
||||
try:
|
||||
sxpr = copyKernelAndRamdisk(disk, vdev, kernel, ramdisk)
|
||||
if in_args:
|
||||
sxpr += "(args '%s')" % in_args
|
||||
os.write(fd, sxpr)
|
||||
except Exception, e:
|
||||
error(str(e))
|
||||
r = 1
|
||||
|
||||
for part in disk.partitions:
|
||||
part.wholedisk = None
|
||||
del disk
|
||||
|
||||
return r
|
||||
|
||||
# Call main if called (and not imported)
|
||||
if __name__ == "__main__":
|
||||
r = 1
|
||||
try:
|
||||
r = main(sys.argv)
|
||||
except Exception, e:
|
||||
error(str(e))
|
||||
sys.exit(r)
|
136
init.xend
136
init.xend
@ -1,136 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# xend Starts and stops the Xen management daemon
|
||||
#
|
||||
# chkconfig: 35 98 01
|
||||
# description: Starts and stops the Xen management daemon
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: xend
|
||||
# Required-Start: $syslog $network $remote_fs
|
||||
# Should-Start: iscsi $time
|
||||
# Required-Stop: $syslog $network $remote_fs
|
||||
# Should-Stop: iscsi $time
|
||||
# Default-Start: 3 5
|
||||
# Default-Stop: 0 1 2 6
|
||||
# Short-Description: Starts and stops the Xen management daemon
|
||||
# Description: Starts and stops the Xen management daemon. xend is needed
|
||||
# to create and manage VMs on Xen.
|
||||
### END INIT INFO
|
||||
|
||||
. /etc/rc.status
|
||||
rc_reset
|
||||
|
||||
XEND=`pidof -x /usr/sbin/xend`
|
||||
|
||||
await_daemons_up()
|
||||
{
|
||||
i=1
|
||||
rets=10
|
||||
xend status
|
||||
while [ $? -ne 0 -a $i -lt $rets ]; do
|
||||
sleep 1
|
||||
echo -n .
|
||||
i=$(($i + 1))
|
||||
xend status
|
||||
done
|
||||
}
|
||||
|
||||
xend_abort()
|
||||
{
|
||||
echo -n "xend "
|
||||
rc_failed $1
|
||||
rc_status -v
|
||||
rc_exit
|
||||
}
|
||||
|
||||
cleanup()
|
||||
{
|
||||
rm -f /var/lib/xen/tmp/* 2>/dev/null
|
||||
rm -f /var/lib/xen/xenbl* 2>/dev/null
|
||||
}
|
||||
|
||||
check()
|
||||
{
|
||||
if [ "$1" == status ]; then
|
||||
if [ ! -e /proc/xen/capabilities ]; then
|
||||
xend_abort 3
|
||||
fi
|
||||
else
|
||||
if [ `id -u` != 0 ]; then
|
||||
xend_abort 4
|
||||
fi
|
||||
if [ ! -e /proc/xen/capabilities ] ||
|
||||
! grep control_d /proc/xen/capabilities >/dev/null 2>&1; then
|
||||
if [ "$1" == stop ] ||
|
||||
[ "$1" == try-restart ]; then
|
||||
xend_abort 0
|
||||
else
|
||||
xend_abort 6
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
check $1
|
||||
echo -n "Starting xend "
|
||||
if [ ! -z "$XEND" ]; then
|
||||
echo -n "(already running pid $XEND) "
|
||||
else
|
||||
cleanup
|
||||
fi
|
||||
xend start
|
||||
await_daemons_up
|
||||
;;
|
||||
stop)
|
||||
check $1
|
||||
echo -n "Stopping xend "
|
||||
if [ -z "$XEND" ]; then
|
||||
echo -n "(not running) "
|
||||
xend stop
|
||||
rc_reset
|
||||
else
|
||||
echo -n "(pid $XEND) "
|
||||
xend stop
|
||||
cleanup
|
||||
rc_reset
|
||||
fi
|
||||
;;
|
||||
status)
|
||||
check $1
|
||||
echo -n "Checking status of xend "
|
||||
if [ ! -z "$XEND" ]; then
|
||||
echo -n "(pid $XEND) "
|
||||
fi
|
||||
checkproc /usr/sbin/xend
|
||||
;;
|
||||
restart|reload)
|
||||
check $1
|
||||
echo -n "Restarting xend "
|
||||
if [ -z "$XEND" ]; then
|
||||
echo -n "(not running) "
|
||||
else
|
||||
echo -n "(old pid $XEND) "
|
||||
fi
|
||||
xend restart
|
||||
await_daemons_up
|
||||
;;
|
||||
try-restart)
|
||||
check $1
|
||||
$0 status
|
||||
if [ $? = 0 ]; then
|
||||
$0 restart
|
||||
else
|
||||
rc_reset
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart|try-restart|reload|status}"
|
||||
rc_failed 2
|
||||
rc_exit
|
||||
esac
|
||||
|
||||
rc_status -v
|
||||
rc_exit
|
511
init.xendomains
511
init.xendomains
@ -1,511 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# xendomains Starts and stops Xen VMs
|
||||
#
|
||||
# chkconfig: 35 99 00
|
||||
# description: Starts and stops Xen VMs
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: xendomains
|
||||
# Required-Start: $syslog $remote_fs xenstored xenconsoled
|
||||
# Should-Start: xend iscsi o2cb ocfs2
|
||||
# Required-Stop: $syslog $remote_fs xenstored xenconsoled
|
||||
# Should-Stop: xend iscsi
|
||||
# Default-Start: 3 5
|
||||
# Default-Stop: 0 1 2 6
|
||||
# Short-Description: Starts and stops Xen VMs
|
||||
# Description: Starts and stops Xen VMs automatically when the
|
||||
# host starts and stops.
|
||||
### END INIT INFO
|
||||
|
||||
. /etc/rc.status
|
||||
rc_reset
|
||||
|
||||
RETCODE_FILE=/tmp/xendomains.rc.$$
|
||||
xm_cmd=echo
|
||||
|
||||
# See docs/misc/distro_mapping.txt
|
||||
if [ -d /var/lock/subsys ]; then
|
||||
LOCKFILE=/var/lock/subsys/xendomains
|
||||
else
|
||||
LOCKFILE=/var/lock/xendomains
|
||||
fi
|
||||
|
||||
if [ -d /etc/sysconfig ]; then
|
||||
XENDOM_CONFIG=/etc/sysconfig/xendomains
|
||||
else
|
||||
XENDOM_CONFIG=/etc/default/xendomains
|
||||
fi
|
||||
|
||||
test -r $XENDOM_CONFIG || { echo "$XENDOM_CONFIG not existing";
|
||||
if [ "$1" = "stop" ]; then exit 0;
|
||||
else exit 6; fi; }
|
||||
|
||||
. "$XENDOM_CONFIG"
|
||||
|
||||
shopt -s dotglob nullglob
|
||||
|
||||
smart_term=1
|
||||
if [ -z "$esc" ]; then
|
||||
smart_term=0
|
||||
rc_timer_on()
|
||||
{
|
||||
(trap "exit 0" TERM; sleep $1) & _rc_timer_pid=$!
|
||||
}
|
||||
rc_timer_off()
|
||||
{
|
||||
if [ -n "$_rc_timer_pid" ]; then
|
||||
kill -TERM $_rc_timer_pid > /dev/null 2>&1
|
||||
fi
|
||||
unset _rc_timer_pid
|
||||
}
|
||||
fi
|
||||
|
||||
xendomains_abort()
|
||||
{
|
||||
echo -n "xendomains "
|
||||
rc_failed $1
|
||||
rc_status -v
|
||||
rc_exit
|
||||
}
|
||||
|
||||
check()
|
||||
{
|
||||
XEND=`pidof -x /usr/sbin/xend`
|
||||
if [ -z "$XEND" ]; then
|
||||
xm_cmd="xl -f"
|
||||
XEND="xl"
|
||||
else
|
||||
xm_cmd="xm"
|
||||
fi
|
||||
if [ "$1" = status ]; then
|
||||
if [ ! -e /proc/xen/capabilities ] || [ ! -r "$XENDOM_CONFIG" ] || [ -z "$XEND" ]; then
|
||||
xendomains_abort 3
|
||||
fi
|
||||
else
|
||||
if [ `id -u` != 0 ]; then
|
||||
xendomains_abort 4
|
||||
fi
|
||||
if [ ! -e /proc/xen/capabilities ] || [ -z "$XEND" ] ||
|
||||
! grep control_d /proc/xen/capabilities >/dev/null 2>&1; then
|
||||
if [ "$1" = stop ] ||
|
||||
[ "$1" = restart ]; then
|
||||
xendomains_abort 0
|
||||
else
|
||||
xendomains_abort 6
|
||||
fi
|
||||
fi
|
||||
if [ ! -r "$XENDOM_CONFIG" ]; then
|
||||
xendomains_abort 6
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
dir_contains_something()
|
||||
{
|
||||
[ -d "$1" ] || return 1
|
||||
local dirfiles=( "$1"/* )
|
||||
[ ${#dirfiles[@]} != 0 ]
|
||||
}
|
||||
|
||||
get_name_from_cfg()
|
||||
{
|
||||
if grep -q "^name" "$1";then
|
||||
NM=`grep '^name[ ]*=' "$1" | sed -e 's/^name[ ]*=[ ]*['\''"]\([^'\''"]*\)['\''"].*$/\1/'`
|
||||
elif grep -q "(name " "$1";then
|
||||
NM=`grep '(name ' "$1" | sed -e 's/^ *//' | cut -d " " -f 2 | sed -e 's/)//'`
|
||||
fi
|
||||
}
|
||||
|
||||
running_auto_names()
|
||||
{
|
||||
unset AUTONAMES[@]
|
||||
if ! dir_contains_something "$XENDOMAINS_AUTO"; then
|
||||
return
|
||||
fi
|
||||
for dom in "$XENDOMAINS_AUTO"/*; do
|
||||
get_name_from_cfg "$dom"
|
||||
AUTONAMES+=("$NM")
|
||||
done
|
||||
}
|
||||
|
||||
parseln()
|
||||
{
|
||||
name=${1:0:$((${#1}-36))}
|
||||
name=${name%% *}
|
||||
rest="${1: -36}"
|
||||
id=${rest:0:4}
|
||||
id=`echo $id`
|
||||
mem=${rest:4:6}
|
||||
mem=`echo $mem`
|
||||
vcpu=${rest:10:6}
|
||||
vcpu=`echo $vcpu`
|
||||
state=${rest:16:11}
|
||||
state=`echo $state`
|
||||
tm=${rest:27}
|
||||
tm=`echo $tm`
|
||||
}
|
||||
|
||||
xm_list()
|
||||
{
|
||||
TERM=vt100 ${xm_cmd} list | grep -v '^Name *ID'
|
||||
}
|
||||
|
||||
is_cfg_running()
|
||||
{
|
||||
get_name_from_cfg "$1"
|
||||
while read LN; do
|
||||
parseln "$LN"
|
||||
[ "$id" = 0 ] && continue
|
||||
if [ "$name" = "$NM" ]; then
|
||||
[ -z "$state" ] && return 1
|
||||
return 0
|
||||
fi
|
||||
done < <(xm_list)
|
||||
return 1
|
||||
}
|
||||
|
||||
start()
|
||||
{
|
||||
if [ -f "$LOCKFILE" ]; then
|
||||
echo -n "xendomains already running (lockfile exists)"
|
||||
rc_reset
|
||||
rc_status -v
|
||||
return 0
|
||||
fi
|
||||
|
||||
local printed=0
|
||||
|
||||
if [ "$XENDOMAINS_RESTORE" = "true" ] &&
|
||||
dir_contains_something "$XENDOMAINS_SAVE"; then
|
||||
mkdir -p $(dirname "$LOCKFILE")
|
||||
touch "$LOCKFILE"
|
||||
echo "Restoring saved Xen domains"
|
||||
printed=1
|
||||
for dom in "$XENDOMAINS_SAVE"/*; do
|
||||
echo -n " ${dom##*/}: "
|
||||
${xm_cmd} restore "$dom" >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
else
|
||||
rc_reset
|
||||
rm -f "$dom"
|
||||
fi
|
||||
rc_status -v
|
||||
done
|
||||
fi
|
||||
|
||||
if dir_contains_something "$XENDOMAINS_AUTO"; then
|
||||
touch "$LOCKFILE"
|
||||
echo "Starting auto Xen domains"
|
||||
printed=1
|
||||
for dom in "$XENDOMAINS_AUTO"/*; do
|
||||
echo -n " ${dom##*/}: "
|
||||
if is_cfg_running "$dom"; then
|
||||
rc_status -s
|
||||
else
|
||||
if grep -q "^name" "$dom";then
|
||||
${xm_cmd} create --quiet --defconfig "$dom"
|
||||
elif grep -q "(name .*" "$dom";then
|
||||
${xm_cmd} create --quiet --config "$dom"
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
else
|
||||
usleep $XENDOMAINS_CREATE_USLEEP
|
||||
rc_reset
|
||||
fi
|
||||
rc_status -v
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $printed -eq 0 ]; then
|
||||
echo -n "Starting xendomains"
|
||||
rc_failed 6 # not configured
|
||||
rc_status -v
|
||||
fi
|
||||
}
|
||||
|
||||
is_zombie_state()
|
||||
{
|
||||
[ "$1" = "-b---d" ] || [ "$1" = "-----d" ]
|
||||
}
|
||||
|
||||
any_non_zombies()
|
||||
{
|
||||
while read LN; do
|
||||
parseln "$LN"
|
||||
[ "$id" = 0 ] && continue
|
||||
[ -z "$state" ] && continue
|
||||
is_zombie_state "$state" || return 0
|
||||
done < <(xm_list)
|
||||
return 1
|
||||
}
|
||||
|
||||
migrate_with_watchdog()
|
||||
{
|
||||
(${xm_cmd} migrate "$@" ; echo $? > "$RETCODE_FILE") >/dev/null 2>&1 &
|
||||
watchdog_xm $!
|
||||
}
|
||||
|
||||
save_with_watchdog()
|
||||
{
|
||||
(${xm_cmd} save "$@" ; echo $? > "$RETCODE_FILE") >/dev/null 2>&1 &
|
||||
watchdog_xm $!
|
||||
}
|
||||
|
||||
shutdown_with_watchdog()
|
||||
{
|
||||
(${xm_cmd} shutdown -w "$@" ; echo $? > "$RETCODE_FILE") >/dev/null 2>&1 &
|
||||
watchdog_xm $!
|
||||
}
|
||||
|
||||
get_return_code()
|
||||
{
|
||||
local RC=127
|
||||
[ -r "$RETCODE_FILE" ] && RC=`head -c10 "$RETCODE_FILE"`
|
||||
rm -f "$RETCODE_FILE"
|
||||
return $RC
|
||||
}
|
||||
|
||||
# $1: The PID to wait on.
|
||||
watchdog_xm()
|
||||
{
|
||||
local col=$((COLUMNS-11))
|
||||
if [ -z "$XENDOMAINS_STOP_MAXWAIT" ] || [ "$XENDOMAINS_STOP_MAXWAIT" = "0" ]; then
|
||||
wait $1 >/dev/null 2>&1
|
||||
get_return_code
|
||||
return
|
||||
fi
|
||||
|
||||
rc_timer_on $XENDOMAINS_STOP_MAXWAIT $col
|
||||
while true; do
|
||||
# Prefer "jobs" over "ps": faster and no false positives
|
||||
pid=`jobs -l | grep " $1 Running"`
|
||||
if [ -z "$pid" ]; then
|
||||
break
|
||||
fi
|
||||
pid=`jobs -l | grep " $_rc_timer_pid Running"`
|
||||
if [ -z "$pid" ]; then
|
||||
disown $1 # To avoid the "Terminated..." message
|
||||
kill $1 >/dev/null 2>&1
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
rc_timer_off
|
||||
if [ $smart_term -ne 0 ]; then
|
||||
echo -en "\015${esc}[${col}C "
|
||||
fi
|
||||
get_return_code
|
||||
}
|
||||
|
||||
stop()
|
||||
{
|
||||
echo "Shutting down Xen domains"
|
||||
if [ "$XENDOMAINS_AUTO_ONLY" = "true" ]; then
|
||||
running_auto_names
|
||||
fi
|
||||
local printed=0
|
||||
while read LN; do
|
||||
parseln "$LN"
|
||||
[ "$id" = 0 ] && continue
|
||||
[ -z "$state" ] && continue
|
||||
printed=1
|
||||
if [ "$XENDOMAINS_AUTO_ONLY" = "true" ]; then
|
||||
is_auto_domain=0
|
||||
for n in "${AUTONAMES[@]}"; do
|
||||
if [ "$name" = "$n" ]; then
|
||||
is_auto_domain=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ $is_auto_domain -eq 0 ]; then
|
||||
echo -n " $name: "
|
||||
rc_status -s
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
if [ -n "$XENDOMAINS_SYSRQ" ]; then
|
||||
for sysrq in $XENDOMAINS_SYSRQ; do
|
||||
echo -n " $name: "
|
||||
echo -n "sending sysrq '$sysrq'... "
|
||||
${xm_cmd} sysrq $id $sysrq
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
else
|
||||
rc_reset
|
||||
fi
|
||||
rc_status -v
|
||||
# usleep just ignores empty arg
|
||||
usleep $XENDOMAINS_USLEEP
|
||||
done
|
||||
fi
|
||||
if is_zombie_state "$state"; then
|
||||
echo -n " $name: "
|
||||
echo -n "destroying zombie... "
|
||||
${xm_cmd} destroy $id
|
||||
rc_reset
|
||||
rc_status -v
|
||||
continue
|
||||
fi
|
||||
if [ -n "$XENDOMAINS_MIGRATE" ]; then
|
||||
echo -n " $name: "
|
||||
echo -n "migrating... "
|
||||
migrate_with_watchdog $id "$XENDOMAINS_MIGRATE"
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
rc_status -v
|
||||
else
|
||||
rc_reset
|
||||
rc_status -v
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
if [ -n "$XENDOMAINS_SAVE" ]; then
|
||||
echo -n " $name: "
|
||||
echo -n "saving... "
|
||||
save_with_watchdog $id "$XENDOMAINS_SAVE/$name"
|
||||
if [ $? -ne 0 ]; then
|
||||
rm -f "$XENDOMAINS_SAVE/$name"
|
||||
rc_failed
|
||||
rc_status -v
|
||||
else
|
||||
rc_reset
|
||||
rc_status -v
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
if [ -n "$XENDOMAINS_SHUTDOWN" ]; then
|
||||
echo -n " $name: "
|
||||
echo -n "shutting down... "
|
||||
shutdown_with_watchdog $id $XENDOMAINS_SHUTDOWN
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
else
|
||||
rc_reset
|
||||
fi
|
||||
rc_status -v
|
||||
fi
|
||||
done < <(xm_list)
|
||||
|
||||
if [ -n "$XENDOMAINS_SHUTDOWN_ALL" ] && any_non_zombies ; then
|
||||
echo -n " others: shutting down... "
|
||||
shutdown_with_watchdog $XENDOMAINS_SHUTDOWN_ALL
|
||||
if [ $? -ne 0 ]; then
|
||||
rc_failed
|
||||
else
|
||||
rc_reset
|
||||
fi
|
||||
rc_status -v
|
||||
fi
|
||||
|
||||
if [ $printed -eq 0 ]; then
|
||||
echo -e "${rc_done_up}"
|
||||
fi
|
||||
|
||||
# Unconditionally delete lock file
|
||||
rm -f "$LOCKFILE"
|
||||
}
|
||||
|
||||
check_domain_up()
|
||||
{
|
||||
while read LN; do
|
||||
parseln "$LN"
|
||||
[ "$id" = 0 ] && continue
|
||||
if [ "$name" = "$1" ]; then
|
||||
[ -z "$state" ] && return 1
|
||||
return 0
|
||||
fi
|
||||
done < <(xm_list)
|
||||
return 1
|
||||
}
|
||||
|
||||
check_all_domains_up()
|
||||
{
|
||||
any_auto=0
|
||||
any_save=0
|
||||
dir_contains_something "$XENDOMAINS_AUTO" && any_auto=1
|
||||
dir_contains_something "$XENDOMAINS_SAVE" && any_save=1
|
||||
if [ $any_auto -eq 0 ] && [ $any_save -eq 0 ]; then
|
||||
rc_reset
|
||||
rc_status -v
|
||||
return
|
||||
fi
|
||||
echo
|
||||
if [ $any_auto -ne 0 ]; then
|
||||
for nm in "$XENDOMAINS_AUTO"/*; do
|
||||
get_name_from_cfg "$nm"
|
||||
echo -n " $nm: "
|
||||
if check_domain_up "$NM"; then
|
||||
rc_reset
|
||||
else
|
||||
rc_failed 2
|
||||
fi
|
||||
rc_status -v
|
||||
done
|
||||
fi
|
||||
if [ $any_save -ne 0 ]; then
|
||||
for nm in "$XENDOMAINS_SAVE"/*; do
|
||||
echo -n " $nm: "
|
||||
rc_failed 3
|
||||
rc_status -v
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# This does NOT necessarily restart all running domains: instead it
|
||||
# stops all running domains and then boots all the domains specified in
|
||||
# AUTODIR. If other domains have been started manually then they will
|
||||
# not get restarted.
|
||||
restart()
|
||||
{
|
||||
"$0" stop
|
||||
start
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
check $1
|
||||
start
|
||||
;;
|
||||
|
||||
stop)
|
||||
check $1
|
||||
stop
|
||||
;;
|
||||
|
||||
restart|reload)
|
||||
check $1
|
||||
restart
|
||||
;;
|
||||
|
||||
try-restart)
|
||||
check $1
|
||||
"$0" status
|
||||
if [ $? = 0 ]; then
|
||||
"$0" restart
|
||||
else
|
||||
rc_reset
|
||||
rc_status -v
|
||||
fi
|
||||
;;
|
||||
|
||||
status)
|
||||
check $1
|
||||
echo -n "Checking status of Xen domains"
|
||||
if [ ! -f "$LOCKFILE" ]; then
|
||||
rc_failed 3
|
||||
rc_status -v
|
||||
else
|
||||
check_all_domains_up
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart|try-restart|reload|status}"
|
||||
rc_failed 2
|
||||
;;
|
||||
esac
|
||||
|
||||
rc_exit
|
@ -29,16 +29,3 @@ Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/hw/xen_blktap.c
|
||||
s->info = ((s->flags & TD_RDONLY) ? VDISK_READONLY : 0);
|
||||
|
||||
#ifndef QEMU_TOOL
|
||||
Index: xen-4.2.0-testing/tools/python/xen/xend/server/DevController.py
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/server/DevController.py
|
||||
+++ xen-4.2.0-testing/tools/python/xen/xend/server/DevController.py
|
||||
@@ -155,7 +155,7 @@ class DevController:
|
||||
(devid, self.deviceClass))
|
||||
|
||||
elif status == Error:
|
||||
- self.destroyDevice(devid, False)
|
||||
+ self.destroyDevice(devid, True)
|
||||
if err is None:
|
||||
raise VmError("Device %s (%s) could not be connected. "
|
||||
"Backend device not found." %
|
||||
|
@ -1,7 +1,7 @@
|
||||
Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
===================================================================
|
||||
--- xen-4.2.3-testing.orig/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
+++ xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef QEMU_XEN_H
|
||||
#define QEMU_XEN_H
|
||||
@ -20,10 +20,10 @@ Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/qemu-xen.h
|
||||
int xenstore_parse_disable_pf_config(void);
|
||||
int xenstore_fd(void);
|
||||
void xenstore_process_event(void *opaque);
|
||||
Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
===================================================================
|
||||
--- xen-4.2.3-testing.orig/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
+++ xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
@@ -5862,9 +5862,9 @@ int main(int argc, char **argv, char **e
|
||||
if ((msg = xenbus_read(XBT_NIL, "domid", &domid_s)))
|
||||
fprintf(stderr,"Can not read our own domid: %s\n", msg);
|
||||
@ -36,11 +36,11 @@ Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||
#endif /* CONFIG_STUBDOM */
|
||||
}
|
||||
|
||||
Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.2.3-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -446,7 +446,7 @@ void xenstore_init(void)
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -445,7 +445,7 @@ void xenstore_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
{
|
||||
char **e_danger = NULL;
|
||||
char *buf = NULL;
|
||||
@@ -740,11 +740,19 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -739,11 +739,19 @@ void xenstore_parse_domain_config(int hv
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:736479fcbc2a8679a67ecd06a60e9c6af9bb7f0b582b31db6e9fad1679eeea1b
|
||||
size 2877494
|
||||
oid sha256:71ec2c199f41fe74e647f4065df60d99cc62ed684ef37f4267a457a2f65b1aff
|
||||
size 2877265
|
||||
|
@ -1,647 +0,0 @@
|
||||
From b7fc90f3d4f0d61281312c5d05859ee2de8fc8be Mon Sep 17 00:00:00 2001
|
||||
From: Olaf Hering <olaf@aepfle.de>
|
||||
Date: Mon, 10 Feb 2014 12:47:26 +0100
|
||||
Subject: libxc: pass errno to callers of xc_domain_save
|
||||
|
||||
Callers of xc_domain_save use errno to print diagnostics if the call
|
||||
fails. But xc_domain_save does not preserve the actual errno in case of
|
||||
a failure.
|
||||
|
||||
This change preserves errno in all cases where code jumps to the label
|
||||
"out". In addition a new label "exit" is added to catch also code which
|
||||
used to do just "return 1".
|
||||
|
||||
Now libxl_save_helper:complete can print the actual error string.
|
||||
|
||||
Note: some of the functions used in xc_domain_save do not use errno to
|
||||
indicate a reason. In these cases the errno remains undefined as it used
|
||||
to be without this change.
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
---
|
||||
tools/libxc/xc_domain_save.c | 88 +++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 82 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
|
||||
index 42c4752..f32ac81 100644
|
||||
--- a/tools/libxc/xc_domain_save.c
|
||||
+++ b/tools/libxc/xc_domain_save.c
|
||||
@@ -806,6 +806,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
xc_dominfo_t info;
|
||||
DECLARE_DOMCTL;
|
||||
|
||||
+ int errnoval = 0;
|
||||
int rc = 1, frc, i, j, last_iter = 0, iter = 0;
|
||||
int live = (flags & XCFLAGS_LIVE);
|
||||
int debug = (flags & XCFLAGS_DEBUG);
|
||||
@@ -898,8 +899,8 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( hvm && !callbacks->switch_qemu_logdirty )
|
||||
{
|
||||
ERROR("No switch_qemu_logdirty callback provided.");
|
||||
- errno = EINVAL;
|
||||
- return 1;
|
||||
+ errnoval = EINVAL;
|
||||
+ goto exit;
|
||||
}
|
||||
|
||||
outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
|
||||
@@ -913,14 +914,16 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( !get_platform_info(xch, dom,
|
||||
&ctx->max_mfn, &ctx->hvirt_start, &ctx->pt_levels, &dinfo->guest_width) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Unable to get platform info.");
|
||||
- return 1;
|
||||
+ goto exit;
|
||||
}
|
||||
|
||||
if ( xc_domain_getinfo(xch, dom, 1, &info) != 1 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Could not get domain info");
|
||||
- return 1;
|
||||
+ goto exit;
|
||||
}
|
||||
|
||||
shared_info_frame = info.shared_info_frame;
|
||||
@@ -932,6 +935,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
PROT_READ, shared_info_frame);
|
||||
if ( !live_shinfo )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Couldn't map live_shinfo");
|
||||
goto out;
|
||||
}
|
||||
@@ -942,6 +946,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( dinfo->p2m_size > ~XEN_DOMCTL_PFINFO_LTAB_MASK )
|
||||
{
|
||||
+ errnoval = E2BIG;
|
||||
ERROR("Cannot save this big a guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -967,6 +972,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( frc < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Couldn't enable shadow mode (rc %d) (errno %d)", frc, errno );
|
||||
goto out;
|
||||
}
|
||||
@@ -975,6 +981,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* Enable qemu-dm logging dirty pages to xen */
|
||||
if ( hvm && callbacks->switch_qemu_logdirty(dom, 1, callbacks->data) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Couldn't enable qemu log-dirty mode (errno %d)", errno);
|
||||
goto out;
|
||||
}
|
||||
@@ -985,6 +992,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( suspend_and_state(callbacks->suspend, callbacks->data, xch,
|
||||
io_fd, dom, &info) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Domain appears not to have suspended");
|
||||
goto out;
|
||||
}
|
||||
@@ -994,6 +1002,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
{
|
||||
if (!(compress_ctx = xc_compression_create_context(xch, dinfo->p2m_size)))
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Failed to create compression context");
|
||||
goto out;
|
||||
}
|
||||
@@ -1012,6 +1021,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( !to_send || !to_fix || !to_skip )
|
||||
{
|
||||
+ errnoval = ENOMEM;
|
||||
ERROR("Couldn't allocate to_send array");
|
||||
goto out;
|
||||
}
|
||||
@@ -1024,12 +1034,14 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
hvm_buf_size = xc_domain_hvm_getcontext(xch, dom, 0, 0);
|
||||
if ( hvm_buf_size == -1 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Couldn't get HVM context size from Xen");
|
||||
goto out;
|
||||
}
|
||||
hvm_buf = malloc(hvm_buf_size);
|
||||
if ( !hvm_buf )
|
||||
{
|
||||
+ errnoval = ENOMEM;
|
||||
ERROR("Couldn't allocate memory");
|
||||
goto out;
|
||||
}
|
||||
@@ -1043,7 +1055,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (pfn_type == NULL) || (pfn_batch == NULL) || (pfn_err == NULL) )
|
||||
{
|
||||
ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays");
|
||||
- errno = ENOMEM;
|
||||
+ errnoval = ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(pfn_type, 0,
|
||||
@@ -1052,6 +1064,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* Setup the mfn_to_pfn table mapping */
|
||||
if ( !(ctx->live_m2p = xc_map_m2p(xch, ctx->max_mfn, PROT_READ, &ctx->m2p_mfn0)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Failed to map live M2P table");
|
||||
goto out;
|
||||
}
|
||||
@@ -1059,6 +1072,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* Start writing out the saved-domain record. */
|
||||
if ( write_exact(io_fd, &dinfo->p2m_size, sizeof(unsigned long)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("write: p2m_size");
|
||||
goto out;
|
||||
}
|
||||
@@ -1071,6 +1085,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
ctx->live_p2m = map_and_save_p2m_table(xch, io_fd, dom, ctx, live_shinfo);
|
||||
if ( ctx->live_p2m == NULL )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Failed to map/save the p2m frame list");
|
||||
goto out;
|
||||
}
|
||||
@@ -1097,12 +1112,14 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
tmem_saved = xc_tmem_save(xch, dom, io_fd, live, XC_SAVE_ID_TMEM);
|
||||
if ( tmem_saved == -1 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (tmem)");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( !live && save_tsc_info(xch, dom, io_fd) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (tsc)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1143,6 +1160,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
dinfo->p2m_size, NULL, 0, NULL);
|
||||
if ( frc != dinfo->p2m_size )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Error peeking shadow bitmap");
|
||||
goto out;
|
||||
}
|
||||
@@ -1257,6 +1275,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
xch, dom, PROT_READ, pfn_type, pfn_err, batch);
|
||||
if ( region_base == NULL )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("map batch failed");
|
||||
goto out;
|
||||
}
|
||||
@@ -1264,6 +1283,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* Get page types */
|
||||
if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("get_pfn_type_batch failed");
|
||||
goto out;
|
||||
}
|
||||
@@ -1332,6 +1352,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( wrexact(io_fd, &batch, sizeof(unsigned int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (2)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1341,6 +1362,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
((unsigned long *)pfn_type)[j] = pfn_type[j];
|
||||
if ( wrexact(io_fd, pfn_type, sizeof(unsigned long)*batch) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (3)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1368,6 +1390,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
(char*)region_base+(PAGE_SIZE*(j-run)),
|
||||
PAGE_SIZE*run) != PAGE_SIZE*run )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (4a)"
|
||||
" (errno %d)", errno);
|
||||
goto out;
|
||||
@@ -1396,6 +1419,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( race && !live )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Fatal PT race (pfn %lx, type %08lx)", pfn,
|
||||
pagetype);
|
||||
goto out;
|
||||
@@ -1409,6 +1433,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
pfn, 1 /* raw page */);
|
||||
if (c_err == -2) /* OOB PFN */
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Could not add pagetable page "
|
||||
"(pfn:%" PRIpfn "to page buffer\n", pfn);
|
||||
goto out;
|
||||
@@ -1428,6 +1453,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
*/
|
||||
if (wrcompressed(io_fd) < 0)
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Error when writing compressed"
|
||||
" data (4b)\n");
|
||||
goto out;
|
||||
@@ -1437,6 +1463,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
else if ( wruncached(io_fd, live, page,
|
||||
PAGE_SIZE) != PAGE_SIZE )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (4b)"
|
||||
" (errno %d)", errno);
|
||||
goto out;
|
||||
@@ -1456,6 +1483,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if (c_err == -2) /* OOB PFN */
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Could not add page "
|
||||
"(pfn:%" PRIpfn "to page buffer\n", pfn);
|
||||
goto out;
|
||||
@@ -1465,6 +1493,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
{
|
||||
if (wrcompressed(io_fd) < 0)
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Error when writing compressed"
|
||||
" data (4c)\n");
|
||||
goto out;
|
||||
@@ -1483,6 +1512,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
(char*)region_base+(PAGE_SIZE*(j-run)),
|
||||
PAGE_SIZE*run) != PAGE_SIZE*run )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (4c)"
|
||||
" (errno %d)", errno);
|
||||
goto out;
|
||||
@@ -1520,6 +1550,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* send "-1" to put receiver into debug mode */
|
||||
if ( wrexact(io_fd, &id, sizeof(int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (6)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1542,6 +1573,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( suspend_and_state(callbacks->suspend, callbacks->data,
|
||||
xch, io_fd, dom, &info) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Domain appears not to have suspended");
|
||||
goto out;
|
||||
}
|
||||
@@ -1550,12 +1582,14 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (tmem_saved > 0) &&
|
||||
(xc_tmem_save_extra(xch,dom,io_fd,XC_SAVE_ID_TMEM_EXTRA) == -1) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (tmem)");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( save_tsc_info(xch, dom, io_fd) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (tsc)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1567,6 +1601,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
XEN_DOMCTL_SHADOW_OP_CLEAN, HYPERCALL_BUFFER(to_send),
|
||||
dinfo->p2m_size, NULL, 0, &shadow_stats) != dinfo->p2m_size )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error flushing shadow PT");
|
||||
goto out;
|
||||
}
|
||||
@@ -1598,6 +1633,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( info.max_vcpu_id >= XC_SR_MAX_VCPUS )
|
||||
{
|
||||
+ errnoval = E2BIG;
|
||||
ERROR("Too many VCPUS in guest!");
|
||||
goto out;
|
||||
}
|
||||
@@ -1614,6 +1650,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( wrexact(io_fd, &chunk, offsetof(struct chunk, vcpumap)
|
||||
+ vcpumap_sz(info.max_vcpu_id)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file");
|
||||
goto out;
|
||||
}
|
||||
@@ -1633,6 +1670,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the generation id buffer location for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1645,6 +1683,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the ident_pt for EPT guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1657,6 +1696,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the paging ring pfn for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1669,6 +1709,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the access ring pfn for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1681,6 +1722,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the sharing ring pfn for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1693,6 +1735,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the vm86 TSS for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1705,6 +1748,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the console pfn for guest");
|
||||
goto out;
|
||||
}
|
||||
@@ -1716,6 +1760,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ((chunk.data != 0) && wrexact(io_fd, &chunk, sizeof(chunk)))
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the firmware ioport version");
|
||||
goto out;
|
||||
}
|
||||
@@ -1728,6 +1773,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (chunk.data != 0) &&
|
||||
wrexact(io_fd, &chunk, sizeof(chunk)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing the viridian flag");
|
||||
goto out;
|
||||
}
|
||||
@@ -1741,6 +1787,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( callbacks->toolstack_save(dom, &buf, &len, callbacks->data) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error calling toolstack_save");
|
||||
goto out;
|
||||
}
|
||||
@@ -1759,6 +1806,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
i = XC_SAVE_ID_LAST_CHECKPOINT;
|
||||
if ( wrexact(io_fd, &i, sizeof(int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing last checkpoint chunk");
|
||||
goto out;
|
||||
}
|
||||
@@ -1778,6 +1826,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
i = XC_SAVE_ID_ENABLE_COMPRESSION;
|
||||
if ( wrexact(io_fd, &i, sizeof(int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing enable_compression marker");
|
||||
goto out;
|
||||
}
|
||||
@@ -1787,6 +1836,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
i = 0;
|
||||
if ( wrexact(io_fd, &i, sizeof(int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (6')");
|
||||
goto out;
|
||||
}
|
||||
@@ -1805,6 +1855,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
(unsigned long *)&magic_pfns[2]);
|
||||
if ( wrexact(io_fd, magic_pfns, sizeof(magic_pfns)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (7)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1813,18 +1864,21 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( (rec_size = xc_domain_hvm_getcontext(xch, dom, hvm_buf,
|
||||
hvm_buf_size)) == -1 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("HVM:Could not get hvm buffer");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( wrexact(io_fd, &rec_size, sizeof(uint32_t)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("error write hvm buffer size");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( wrexact(io_fd, hvm_buf, rec_size) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("write HVM info failed!");
|
||||
goto out;
|
||||
}
|
||||
@@ -1849,6 +1903,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( wrexact(io_fd, &j, sizeof(unsigned int)) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (6a)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1863,6 +1918,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
{
|
||||
if ( wrexact(io_fd, &pfntab, sizeof(unsigned long)*j) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (6b)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1873,6 +1929,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( xc_vcpu_getcontext(xch, dom, 0, &ctxt) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Could not get vcpu context");
|
||||
goto out;
|
||||
}
|
||||
@@ -1888,6 +1945,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
mfn = GET_FIELD(&ctxt, user_regs.edx);
|
||||
if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) )
|
||||
{
|
||||
+ errnoval = ERANGE;
|
||||
ERROR("Suspend record is not in range of pseudophys map");
|
||||
goto out;
|
||||
}
|
||||
@@ -1900,6 +1958,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
|
||||
if ( (i != 0) && xc_vcpu_getcontext(xch, dom, i, &ctxt) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("No context for VCPU%d", i);
|
||||
goto out;
|
||||
}
|
||||
@@ -1910,6 +1969,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
mfn = GET_FIELD(&ctxt, gdt_frames[j]);
|
||||
if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) )
|
||||
{
|
||||
+ errnoval = ERANGE;
|
||||
ERROR("GDT frame is not in range of pseudophys map");
|
||||
goto out;
|
||||
}
|
||||
@@ -1920,6 +1980,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(
|
||||
GET_FIELD(&ctxt, ctrlreg[3]))) )
|
||||
{
|
||||
+ errnoval = ERANGE;
|
||||
ERROR("PT base is not in range of pseudophys map");
|
||||
goto out;
|
||||
}
|
||||
@@ -1931,6 +1992,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
{
|
||||
if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(ctxt.x64.ctrlreg[1])) )
|
||||
{
|
||||
+ errnoval = ERANGE;
|
||||
ERROR("PT base is not in range of pseudophys map");
|
||||
goto out;
|
||||
}
|
||||
@@ -1943,6 +2005,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
? sizeof(ctxt.x64)
|
||||
: sizeof(ctxt.x32))) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (1)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1953,11 +2016,13 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
domctl.u.ext_vcpucontext.vcpu = i;
|
||||
if ( xc_domctl(xch, &domctl) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("No extended context for VCPU%d", i);
|
||||
goto out;
|
||||
}
|
||||
if ( wrexact(io_fd, &domctl.u.ext_vcpucontext, 128) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (2)");
|
||||
goto out;
|
||||
}
|
||||
@@ -1971,6 +2036,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
domctl.u.vcpuextstate.size = 0;
|
||||
if ( xc_domctl(xch, &domctl) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("No eXtended states (XSAVE) for VCPU%d", i);
|
||||
goto out;
|
||||
}
|
||||
@@ -1982,6 +2048,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
buffer = xc_hypercall_buffer_alloc(xch, buffer, domctl.u.vcpuextstate.size);
|
||||
if ( !buffer )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Insufficient memory for getting eXtended states for"
|
||||
"VCPU%d", i);
|
||||
goto out;
|
||||
@@ -1989,6 +2056,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
set_xen_guest_handle(domctl.u.vcpuextstate.buffer, buffer);
|
||||
if ( xc_domctl(xch, &domctl) < 0 )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("No eXtended states (XSAVE) for VCPU%d", i);
|
||||
xc_hypercall_buffer_free(xch, buffer);
|
||||
goto out;
|
||||
@@ -2000,6 +2068,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
sizeof(domctl.u.vcpuextstate.size)) ||
|
||||
wrexact(io_fd, buffer, domctl.u.vcpuextstate.size) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file VCPU extended state");
|
||||
xc_hypercall_buffer_free(xch, buffer);
|
||||
goto out;
|
||||
@@ -2015,6 +2084,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
arch.pfn_to_mfn_frame_list_list, 0);
|
||||
if ( wrexact(io_fd, page, PAGE_SIZE) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when writing to state file (1)");
|
||||
goto out;
|
||||
}
|
||||
@@ -2022,6 +2092,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
/* Flush last write and check for errors. */
|
||||
if ( fsync(io_fd) && errno != EINVAL )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when flushing state file");
|
||||
goto out;
|
||||
}
|
||||
@@ -2043,6 +2114,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
ob = &ob_pagebuf;
|
||||
if (wrcompressed(io_fd) < 0)
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Error when writing compressed data, after postcopy\n");
|
||||
rc = 1;
|
||||
goto out;
|
||||
@@ -2051,6 +2123,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( wrexact(io_fd, ob_tailbuf.buf, ob_tailbuf.pos) )
|
||||
{
|
||||
rc = 1;
|
||||
+ errnoval = errno;
|
||||
PERROR("Error when copying tailbuf into outbuf");
|
||||
goto out;
|
||||
}
|
||||
@@ -2079,6 +2152,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
if ( suspend_and_state(callbacks->suspend, callbacks->data, xch,
|
||||
io_fd, dom, &info) )
|
||||
{
|
||||
+ errnoval = errno;
|
||||
ERROR("Domain appears not to have suspended");
|
||||
goto out;
|
||||
}
|
||||
@@ -2130,7 +2204,9 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
free(hvm_buf);
|
||||
outbuf_free(&ob_pagebuf);
|
||||
|
||||
- DPRINTF("Save exit of domid %u with rc=%d\n", dom, rc);
|
||||
+exit:
|
||||
+ DPRINTF("Save exit of domid %u with rc=%d, errno=%d\n", dom, rc, errnoval);
|
||||
+ errno = errnoval;
|
||||
|
||||
return !!rc;
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
Index: xen-4.2.0-testing/tools/libxen/src/xen_common.c
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/libxen/src/xen_common.c
|
||||
+++ xen-4.2.0-testing/tools/libxen/src/xen_common.c
|
||||
@@ -904,8 +904,15 @@ static void parse_into(xen_session *s, x
|
||||
0 != strcmp((char *)value_node->children->name, "struct") ||
|
||||
value_node->children->children == NULL)
|
||||
{
|
||||
+#if PERMISSIVE
|
||||
+ fprintf(stderr,
|
||||
+ "Expected Map from the server, but didn't get one\n");
|
||||
+ ((arbitrary_map **)value)[slot] = NULL;
|
||||
+#else
|
||||
+
|
||||
server_error(s,
|
||||
"Expected Map from the server, but didn't get it");
|
||||
+#endif
|
||||
}
|
||||
else
|
||||
{
|
@ -1,130 +0,0 @@
|
||||
References: FATE#316071
|
||||
Subject: libxl: add option for discard support to xl disk configuration
|
||||
|
||||
Handle new boolean option discard/no-discard for disk configuration. It
|
||||
is supposed to disable discard support if file based backing storage was
|
||||
intentionally created non-sparse to avoid fragmentation of the file.
|
||||
|
||||
The option intended for the backend driver. A new boolean property
|
||||
"discard-enable" is written to the backend node. An upcoming patch for
|
||||
qemu will make use of this property. The kernel blkback driver may be
|
||||
updated as well to disable discard for phy based backing storage.
|
||||
|
||||
This change does not break ABI. Instead of adding a new member
|
||||
discard_enable to struct libxl_device_disk the existing readwrite member
|
||||
is reused.
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
---
|
||||
docs/misc/xl-disk-configuration.txt | 17 +++++++++++++++++
|
||||
tools/libxl/libxl.c | 2 ++
|
||||
tools/libxl/libxl.h | 12 ++++++++++++
|
||||
tools/libxl/libxlu_disk.c | 3 +++
|
||||
tools/libxl/libxlu_disk_i.h | 2 +-
|
||||
tools/libxl/libxlu_disk_l.l | 2 ++
|
||||
6 files changed, 37 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/docs/misc/xl-disk-configuration.txt
|
||||
+++ xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
||||
@@ -179,6 +179,23 @@ These scripts are normally called "block
|
||||
|
||||
|
||||
|
||||
+discard / no-discard
|
||||
+---------------
|
||||
+
|
||||
+Description: Request backend to advertise discard support to frontend
|
||||
+Supported values: discard
|
||||
+ no-discard
|
||||
+Mandatory: No
|
||||
+Default value: discard
|
||||
+
|
||||
+An advisory setting for the backend driver, specifying whether, to
|
||||
+advertise discard support (TRIM, UNMAP) to the frontend. The real
|
||||
+benefit of this option is to be able to force it off rather than on. It
|
||||
+can be used to disable "hole punching" for file based backends which
|
||||
+were intentionally created non-sparse to avoid fragmentation of the
|
||||
+file.
|
||||
+
|
||||
+
|
||||
============================================
|
||||
DEPRECATED PARAMETERS, PREFIXES AND SYNTAXES
|
||||
============================================
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
@@ -2484,6 +2484,8 @@ static void device_disk_add(libxl__egc *
|
||||
flexarray_append(back, disk->readwrite ? "w" : "r");
|
||||
flexarray_append(back, "device-type");
|
||||
flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
|
||||
+ if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC)
|
||||
+ flexarray_append_pair(back, "discard-enable", "0");
|
||||
|
||||
flexarray_append(front, "backend-id");
|
||||
flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
@@ -95,6 +95,18 @@
|
||||
#define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
|
||||
|
||||
/*
|
||||
+ * The libxl_device_disk lacks discard_enable field, disabling discard
|
||||
+ * is supported without breaking the ABI. This is done by overloading
|
||||
+ * struct libxl_device_disk->readwrite:
|
||||
+ * readwrite == 0: disk is readonly, no discard
|
||||
+ * readwrite == 1: disk is readwrite, backend driver may enable discard
|
||||
+ * readwrite == MAGIC: disk is readwrite, backend driver should not offer
|
||||
+ * discard to the frontend driver.
|
||||
+ */
|
||||
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC 0x00000060U
|
||||
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK 0xffffff0fU
|
||||
+
|
||||
+/*
|
||||
* libxl ABI compatibility
|
||||
*
|
||||
* The only guarantee which libxl makes regarding ABI compatibility
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
@@ -80,6 +80,9 @@ int xlu_disk_parse(XLU_Config *cfg,
|
||||
disk->format = LIBXL_DISK_FORMAT_EMPTY;
|
||||
}
|
||||
|
||||
+ if (disk->readwrite && dpc.disable_discard)
|
||||
+ disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC;
|
||||
+
|
||||
if (!disk->vdev) {
|
||||
xlu__disk_err(&dpc,0, "no vdev specified");
|
||||
goto x_err;
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_i.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
@@ -10,7 +10,7 @@ typedef struct {
|
||||
void *scanner;
|
||||
YY_BUFFER_STATE buf;
|
||||
libxl_device_disk *disk;
|
||||
- int access_set, had_depr_prefix;
|
||||
+ int access_set, disable_discard, had_depr_prefix;
|
||||
const char *spec;
|
||||
} DiskParseContext;
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_l.l
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
@@ -173,6 +173,8 @@ backendtype=[^,]*,? { STRIP(','); setbac
|
||||
|
||||
vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
|
||||
script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
|
||||
+discard,? { DPC->disable_discard = 0; }
|
||||
+no-discard,? { DPC->disable_discard = 1; }
|
||||
|
||||
/* the target magic parameter, eats the rest of the string */
|
||||
|
@ -7,25 +7,25 @@ https://bugzilla.novell.com/show_bug.cgi?id=879425
|
||||
tools/libxl/libxlu_disk_l.l | 1 +
|
||||
5 files changed, 18 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
@@ -2488,6 +2488,8 @@ static void device_disk_add(libxl__egc *
|
||||
flexarray_append_pair(back, "direct-io-safe", "1");
|
||||
if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC)
|
||||
flexarray_append_pair(back, "discard-enable", "0");
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
@@ -2771,6 +2771,8 @@ static void device_disk_add(libxl__egc *
|
||||
flexarray_append_pair(back, "discard-enable",
|
||||
libxl_defbool_val(disk->discard_enable) ?
|
||||
"1" : "0");
|
||||
+ if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MAGIC)
|
||||
+ flexarray_append_pair(back, "suse-diskcache-disable-flush", "1");
|
||||
|
||||
flexarray_append(front, "backend-id");
|
||||
flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
@@ -118,6 +118,18 @@
|
||||
#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK 0xffffff0fU
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
@@ -163,6 +163,18 @@
|
||||
#define LIBXL_HAVE_BUILDINFO_HVM_MMIO_HOLE_MEMKB 1
|
||||
|
||||
/*
|
||||
+ * The libxl_device_disk has no way to indicate that cache=unsafe is
|
||||
@ -43,40 +43,40 @@ Index: xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
* libxl ABI compatibility
|
||||
*
|
||||
* The only guarantee which libxl makes regarding ABI compatibility
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxlu_disk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
@@ -84,6 +84,8 @@ int xlu_disk_parse(XLU_Config *cfg,
|
||||
disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MAGIC;
|
||||
if (disk->readwrite && dpc.disable_discard)
|
||||
disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC;
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxlu_disk.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxlu_disk.c
|
||||
@@ -79,6 +79,8 @@ int xlu_disk_parse(XLU_Config *cfg,
|
||||
if (!disk->pdev_path || !strcmp(disk->pdev_path, ""))
|
||||
disk->format = LIBXL_DISK_FORMAT_EMPTY;
|
||||
}
|
||||
+ if (disk->readwrite && dpc.suse_diskcache_disable_flush)
|
||||
+ disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MAGIC;
|
||||
|
||||
if (!disk->vdev) {
|
||||
xlu__disk_err(&dpc,0, "no vdev specified");
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_i.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxlu_disk_i.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
@@ -10,7 +10,7 @@ typedef struct {
|
||||
void *scanner;
|
||||
YY_BUFFER_STATE buf;
|
||||
libxl_device_disk *disk;
|
||||
- int access_set, direct_io_safe, disable_discard, had_depr_prefix;
|
||||
+ int access_set, suse_diskcache_disable_flush, direct_io_safe, disable_discard, had_depr_prefix;
|
||||
- int access_set, had_depr_prefix;
|
||||
+ int access_set, suse_diskcache_disable_flush, had_depr_prefix;
|
||||
const char *spec;
|
||||
} DiskParseContext;
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_l.l
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxlu_disk_l.l
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
@@ -176,6 +176,7 @@ script=[^,]*,? { STRIP(','); SAVESTRING(
|
||||
direct-io-safe,? { DPC->direct_io_safe = 1; }
|
||||
discard,? { DPC->disable_discard = 0; }
|
||||
no-discard,? { DPC->disable_discard = 1; }
|
||||
direct-io-safe,? { DPC->disk->direct_io_safe = 1; }
|
||||
discard,? { libxl_defbool_set(&DPC->disk->discard_enable, true); }
|
||||
no-discard,? { libxl_defbool_set(&DPC->disk->discard_enable, false); }
|
||||
+suse-diskcache-disable-flush,? { DPC->suse_diskcache_disable_flush = 1; }
|
||||
|
||||
/* the target magic parameter, eats the rest of the string */
|
||||
|
@ -1,77 +0,0 @@
|
||||
From: Wei Liu <wei.liu2@citrix.com>
|
||||
Date: Tue, 28 Jan 2014 15:38:01 +0000
|
||||
Subject: xl: honor more top level vfb options
|
||||
|
||||
Now that SDL and keymap options for VFB can also be specified in top
|
||||
level options. Documentation is also updated.
|
||||
|
||||
This fixes bug #31 and further possible problems.
|
||||
|
||||
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
|
||||
Cc: Olaf Hering <olaf@aepfle.de>
|
||||
Cc: Ian Campbell <ian.campbell@citrix.com>
|
||||
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||
---
|
||||
docs/man/xl.cfg.pod.5 | 4 ++--
|
||||
tools/libxl/xl_cmdimpl.c | 17 ++++++++++++++---
|
||||
2 files changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5
|
||||
+++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
@@ -420,8 +420,8 @@ This options does not control the emulat
|
||||
an HVM guest. See L<Emulated VGA Graphics Device> below for how to
|
||||
configure the emulated device. If L<Emulated VGA Graphics Device> options
|
||||
are used in a PV guest configuration, xl will pick up B<vnc>, B<vnclisten>,
|
||||
-B<vncpasswd>, B<vncdisplay> and B<vncunused> to construct paravirtual
|
||||
-framebuffer device for the guest.
|
||||
+B<vncpasswd>, B<vncdisplay>, B<vncunused>, B<sdl>, B<opengl> and
|
||||
+B<keymap> to construct paravirtual framebuffer device for the guest.
|
||||
|
||||
Each B<VFB_SPEC_STRING> is a comma-separated list of C<KEY=VALUE>
|
||||
settings, from the following list:
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -721,6 +721,15 @@ static void parse_top_level_vnc_options(
|
||||
xlu_cfg_get_defbool(config, "vncunused", &vnc->findunused, 0);
|
||||
}
|
||||
|
||||
+static void parse_top_level_sdl_options(XLU_Config *config,
|
||||
+ libxl_sdl_info *sdl)
|
||||
+{
|
||||
+ xlu_cfg_get_defbool(config, "sdl", &sdl->enable, 0);
|
||||
+ xlu_cfg_get_defbool(config, "opengl", &sdl->opengl, 0);
|
||||
+ xlu_cfg_replace_string (config, "display", &sdl->display, 0);
|
||||
+ xlu_cfg_replace_string (config, "xauthority", &sdl->xauthority, 0);
|
||||
+}
|
||||
+
|
||||
static char *parse_cmdline(XLU_Config *config)
|
||||
{
|
||||
char *cmdline = NULL;
|
||||
@@ -1666,9 +1675,13 @@ skip_vfb:
|
||||
libxl_device_vkb_init);
|
||||
|
||||
parse_top_level_vnc_options(config, &vfb->vnc);
|
||||
+ parse_top_level_sdl_options(config, &vfb->sdl);
|
||||
+ xlu_cfg_replace_string (config, "keymap", &vfb->keymap, 0);
|
||||
}
|
||||
- } else
|
||||
+ } else {
|
||||
parse_top_level_vnc_options(config, &b_info->u.hvm.vnc);
|
||||
+ parse_top_level_sdl_options(config, &b_info->u.hvm.sdl);
|
||||
+ }
|
||||
|
||||
if (c_info->type == LIBXL_DOMAIN_TYPE_HVM) {
|
||||
if (!xlu_cfg_get_string (config, "vga", &buf, 0)) {
|
||||
@@ -1685,8 +1698,6 @@ skip_vfb:
|
||||
LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
|
||||
|
||||
xlu_cfg_replace_string (config, "keymap", &b_info->u.hvm.keymap, 0);
|
||||
- xlu_cfg_get_defbool(config, "sdl", &b_info->u.hvm.sdl.enable, 0);
|
||||
- xlu_cfg_get_defbool(config, "opengl", &b_info->u.hvm.sdl.opengl, 0);
|
||||
xlu_cfg_get_defbool (config, "spice", &b_info->u.hvm.spice.enable, 0);
|
||||
if (!xlu_cfg_get_long (config, "spiceport", &l, 0))
|
||||
b_info->u.hvm.spice.port = l;
|
@ -1,203 +0,0 @@
|
||||
xen-unstable commit 6ec48cf41b6656c98148380f39010063e62628c5
|
||||
Frp,: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
Date: Wed Apr 30 16:06:24 2014 +0100
|
||||
Subject: libxl: introduce an option for disabling the non-O_DIRECT workaround
|
||||
|
||||
Document and implement a new option that permits disk backends which
|
||||
would otherwise have to avoid O_DIRECT (because of the network memory
|
||||
lifetime bug) to use it anyway. This is:
|
||||
direct-io-safe in the xl domain disk config specification
|
||||
direct_io_safe in the libxl disk API
|
||||
direct-io-safe in the backend xenstore interface
|
||||
|
||||
Add a reference to xen/include/public/io/blkif.h in
|
||||
docs/misc/vbd-interface.txt.
|
||||
|
||||
This change does not break ABI. Instead of adding a new member
|
||||
direct_io_safe to struct libxl_device_disk the existing readwrite member
|
||||
is reused.
|
||||
|
||||
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
Tested-by: Felipe Franciosi <felipe@paradoxo.org>
|
||||
---
|
||||
docs/misc/vbd-interface.txt | 6 +++++
|
||||
docs/misc/xl-disk-configuration.txt | 38 ++++++++++++++++++++++++++++++++++++
|
||||
tools/libxl/libxl.c | 2 +
|
||||
tools/libxl/libxl.h | 11 ++++++++++
|
||||
tools/libxl/libxlu_disk.c | 2 +
|
||||
tools/libxl/libxlu_disk_i.h | 2 -
|
||||
tools/libxl/libxlu_disk_l.l | 1
|
||||
xen/include/public/io/blkif.h | 22 ++++++++++++++++++++
|
||||
8 files changed, 83 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.4.0-testing/docs/misc/vbd-interface.txt
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/docs/misc/vbd-interface.txt
|
||||
+++ xen-4.4.0-testing/docs/misc/vbd-interface.txt
|
||||
@@ -125,3 +125,9 @@ because they directly map the bottom 8 b
|
||||
directly to the Linux guest's device number and throw away the rest;
|
||||
they can crash due to minor number clashes. With these guests, the
|
||||
workaround is not to supply problematic combinations of devices.
|
||||
+
|
||||
+
|
||||
+Other frontend and backend options
|
||||
+----------------------------------
|
||||
+
|
||||
+See xen/include/public/io/blkif.h for the full list of options.
|
||||
Index: xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/docs/misc/xl-disk-configuration.txt
|
||||
+++ xen-4.4.0-testing/docs/misc/xl-disk-configuration.txt
|
||||
@@ -178,6 +178,44 @@ information to be interpreted by the exe
|
||||
These scripts are normally called "block-<script>".
|
||||
|
||||
|
||||
+direct-io-safe
|
||||
+--------------
|
||||
+
|
||||
+Description: Disables non-O_DIRECT workaround
|
||||
+Supported values: absent, present
|
||||
+Mandatory: No
|
||||
+Default value: absent (workaround may be enabled)
|
||||
+
|
||||
+There is a memory lifetime bug in some driver domain (dom0) kernels
|
||||
+which can cause crashes when using O_DIRECT. The bug occurs due to a
|
||||
+mismatch between the backend-visible lifetime of pages used for the
|
||||
+Xen PV network protocol and that expected by the backend kernel's
|
||||
+networking subsystem. This can cause crashes when using certain
|
||||
+backends with certain underlying storage.
|
||||
+
|
||||
+See:
|
||||
+ http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html
|
||||
+
|
||||
+For this reason, (this version of) the Xen libxl toolstack disables
|
||||
+O_DIRECT when using the qemu-based Xen PV backend ("qdisk").
|
||||
+
|
||||
+However, this workaround has performance and scaling implications, and
|
||||
+it is only necessary if the underlying device is a network filesystem.
|
||||
+If the underlying device is not, then it is good to disable it; that
|
||||
+is what this option is for.
|
||||
+
|
||||
+This option simply requests that the workaround be disabled. (However,
|
||||
+not all backends versions which use the workaround understand this
|
||||
+option, so this is on a best effort basis.)
|
||||
+
|
||||
+It's important to note that if you are storing the VM disk on a
|
||||
+network filesystem or a network block device (NFS or ISCSI) it might
|
||||
+not be safe to use this option. Otherwise specifying it is safe and
|
||||
+can give better performances.
|
||||
+
|
||||
+If in the future the bug is fixed properly this option will then be
|
||||
+silently ignored.
|
||||
+
|
||||
|
||||
discard / no-discard
|
||||
---------------
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
@@ -2484,6 +2484,8 @@ static void device_disk_add(libxl__egc *
|
||||
flexarray_append(back, disk->readwrite ? "w" : "r");
|
||||
flexarray_append(back, "device-type");
|
||||
flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
|
||||
+ if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MAGIC)
|
||||
+ flexarray_append_pair(back, "direct-io-safe", "1");
|
||||
if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC)
|
||||
flexarray_append_pair(back, "discard-enable", "0");
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.h
|
||||
@@ -95,6 +95,17 @@
|
||||
#define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
|
||||
|
||||
/*
|
||||
+ * The libxl_device_disk lacks some "cache" field, enabling directio
|
||||
+ * is supported without breaking the ABI. This is done by overloading
|
||||
+ * struct libxl_device_disk->readwrite:
|
||||
+ * readwrite == 0: disk is readonly, no directio
|
||||
+ * readwrite == 1: disk is readwrite, backend driver may enable directio
|
||||
+ * readwrite == MAGIC: disk is readwrite, backend driver should use direct IO
|
||||
+ */
|
||||
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MAGIC 0x00000600U
|
||||
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MASK 0xfffff0ffU
|
||||
+
|
||||
+/*
|
||||
* The libxl_device_disk lacks discard_enable field, disabling discard
|
||||
* is supported without breaking the ABI. This is done by overloading
|
||||
* struct libxl_device_disk->readwrite:
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk.c
|
||||
@@ -80,6 +80,8 @@ int xlu_disk_parse(XLU_Config *cfg,
|
||||
disk->format = LIBXL_DISK_FORMAT_EMPTY;
|
||||
}
|
||||
|
||||
+ if (disk->readwrite && dpc.direct_io_safe)
|
||||
+ disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MAGIC;
|
||||
if (disk->readwrite && dpc.disable_discard)
|
||||
disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC;
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_i.h
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_i.h
|
||||
@@ -10,7 +10,7 @@ typedef struct {
|
||||
void *scanner;
|
||||
YY_BUFFER_STATE buf;
|
||||
libxl_device_disk *disk;
|
||||
- int access_set, disable_discard, had_depr_prefix;
|
||||
+ int access_set, direct_io_safe, disable_discard, had_depr_prefix;
|
||||
const char *spec;
|
||||
} DiskParseContext;
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxlu_disk_l.l
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxlu_disk_l.l
|
||||
@@ -173,6 +173,7 @@ backendtype=[^,]*,? { STRIP(','); setbac
|
||||
|
||||
vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
|
||||
script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
|
||||
+direct-io-safe,? { DPC->direct_io_safe = 1; }
|
||||
discard,? { DPC->disable_discard = 0; }
|
||||
no-discard,? { DPC->disable_discard = 1; }
|
||||
|
||||
Index: xen-4.4.0-testing/xen/include/public/io/blkif.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/xen/include/public/io/blkif.h
|
||||
+++ xen-4.4.0-testing/xen/include/public/io/blkif.h
|
||||
@@ -97,6 +97,28 @@
|
||||
*
|
||||
* The type of the backing device/object.
|
||||
*
|
||||
+ *
|
||||
+ * direct-io-safe
|
||||
+ * Values: 0/1 (boolean)
|
||||
+ * Default Value: 0
|
||||
+ *
|
||||
+ * The underlying storage is not affected by the direct IO memory
|
||||
+ * lifetime bug. See:
|
||||
+ * http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html
|
||||
+ *
|
||||
+ * Therefore this option gives the backend permission to use
|
||||
+ * O_DIRECT, notwithstanding that bug.
|
||||
+ *
|
||||
+ * That is, if this option is enabled, use of O_DIRECT is safe,
|
||||
+ * in circumstances where we would normally have avoided it as a
|
||||
+ * workaround for that bug. This option is not relevant for all
|
||||
+ * backends, and even not necessarily supported for those for
|
||||
+ * which it is relevant. A backend which knows that it is not
|
||||
+ * affected by the bug can ignore this option.
|
||||
+ *
|
||||
+ * This option doesn't require a backend to use O_DIRECT, so it
|
||||
+ * should not be used to try to control the caching behaviour.
|
||||
+ *
|
||||
*--------------------------------- Features ---------------------------------
|
||||
*
|
||||
* feature-barrier
|
@ -31,11 +31,11 @@ ee2e7e5 Merge pull request #1 from aaannz/pvscsi
|
||||
7de6f49 support character devices too
|
||||
c84381b allow /dev/sda as scsi devspec
|
||||
f11e3a2 pvscsi
|
||||
Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
Index: xen-4.5.0-testing/docs/man/xl.cfg.pod.5
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/docs/man/xl.cfg.pod.5
|
||||
+++ xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
@@ -411,6 +411,36 @@ value is optional if this is a guest dom
|
||||
--- xen-4.5.0-testing.orig/docs/man/xl.cfg.pod.5
|
||||
+++ xen-4.5.0-testing/docs/man/xl.cfg.pod.5
|
||||
@@ -448,6 +448,36 @@ value is optional if this is a guest dom
|
||||
|
||||
=back
|
||||
|
||||
@ -72,11 +72,11 @@ Index: xen-4.4.1-testing/docs/man/xl.cfg.pod.5
|
||||
=item B<vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]>
|
||||
|
||||
Specifies the paravirtual framebuffer devices which should be supplied
|
||||
Index: xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
Index: xen-4.5.0-testing/docs/man/xl.pod.1
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/docs/man/xl.pod.1
|
||||
+++ xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
@@ -1208,6 +1208,26 @@ List virtual trusted platform modules fo
|
||||
--- xen-4.5.0-testing.orig/docs/man/xl.pod.1
|
||||
+++ xen-4.5.0-testing/docs/man/xl.pod.1
|
||||
@@ -1323,6 +1323,26 @@ List virtual trusted platform modules fo
|
||||
|
||||
=back
|
||||
|
||||
@ -103,11 +103,11 @@ Index: xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
=head1 PCI PASS-THROUGH
|
||||
|
||||
=over 4
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
@@ -2021,6 +2021,273 @@ int libxl_devid_to_device_vtpm(libxl_ctx
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
@@ -2263,6 +2263,273 @@ int libxl_devid_to_device_vtpm(libxl_ctx
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -381,7 +381,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
@@ -3489,6 +3756,8 @@ out:
|
||||
@@ -4138,6 +4405,8 @@ out:
|
||||
* libxl_device_vkb_destroy
|
||||
* libxl_device_vfb_remove
|
||||
* libxl_device_vfb_destroy
|
||||
@ -390,9 +390,9 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
*/
|
||||
#define DEFINE_DEVICE_REMOVE(type, removedestroy, f) \
|
||||
int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \
|
||||
@@ -3540,6 +3809,10 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1)
|
||||
DEFINE_DEVICE_REMOVE(vtpm, remove, 0)
|
||||
DEFINE_DEVICE_REMOVE(vtpm, destroy, 1)
|
||||
@@ -4193,6 +4462,10 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1)
|
||||
* 1. add support for secondary consoles to xenconsoled
|
||||
* 2. dynamically add/remove qemu chardevs via qmp messages. */
|
||||
|
||||
+/* vscsi */
|
||||
+DEFINE_DEVICE_REMOVE(vscsi, remove, 0)
|
||||
@ -401,7 +401,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
#undef DEFINE_DEVICE_REMOVE
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -3549,6 +3822,7 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1)
|
||||
@@ -4202,6 +4475,7 @@ DEFINE_DEVICE_REMOVE(vtpm, destroy, 1)
|
||||
* libxl_device_disk_add
|
||||
* libxl_device_nic_add
|
||||
* libxl_device_vtpm_add
|
||||
@ -409,7 +409,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
*/
|
||||
|
||||
#define DEFINE_DEVICE_ADD(type) \
|
||||
@@ -3578,6 +3852,9 @@ DEFINE_DEVICE_ADD(nic)
|
||||
@@ -4233,6 +4507,9 @@ DEFINE_DEVICE_ADD(nic)
|
||||
/* vtpm */
|
||||
DEFINE_DEVICE_ADD(vtpm)
|
||||
|
||||
@ -419,9 +419,9 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
#undef DEFINE_DEVICE_ADD
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -5683,6 +5960,20 @@ int libxl_fd_set_cloexec(libxl_ctx *ctx,
|
||||
int libxl_fd_set_nonblock(libxl_ctx *ctx, int fd, int nonblock)
|
||||
{ return fd_set_flags(ctx,fd, F_GETFL,F_SETFL,"FL", O_NONBLOCK, nonblock); }
|
||||
@@ -6769,6 +7046,20 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
+/* libxl.so.4.4 ABI compatilibity hack - do not do this at home */
|
||||
+static libxl_device_vscsi_suse* libxl__global_vscsi_list_suse;
|
||||
@ -440,11 +440,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
@@ -966,6 +966,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
@@ -1228,6 +1228,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis
|
||||
int libxl_device_vtpm_getinfo(libxl_ctx *ctx, uint32_t domid,
|
||||
libxl_device_vtpm *vtpm, libxl_vtpminfo *vtpminfo);
|
||||
|
||||
@ -471,7 +471,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
/* Keyboard */
|
||||
int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
@@ -1181,6 +1201,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx
|
||||
@@ -1485,6 +1505,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx
|
||||
|
||||
#include <libxl_event.h>
|
||||
|
||||
@ -499,11 +499,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
#endif /* LIBXL_H */
|
||||
|
||||
/*
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_create.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_create.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_create.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_create.c
|
||||
@@ -1048,6 +1048,7 @@ static void domcreate_rebuild_done(libxl
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_create.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_create.c
|
||||
@@ -1128,6 +1128,7 @@ static void domcreate_rebuild_done(libxl
|
||||
libxl__multidev_begin(ao, &dcs->multidev);
|
||||
dcs->multidev.callback = domcreate_launch_dm;
|
||||
libxl__add_disks(egc, ao, domid, d_config, &dcs->multidev);
|
||||
@ -511,11 +511,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_create.c
|
||||
libxl__multidev_prepared(egc, &dcs->multidev, 0);
|
||||
|
||||
return;
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_device.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_device.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_device.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_device.c
|
||||
@@ -523,6 +523,7 @@ void libxl__multidev_prepared(libxl__egc
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_device.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_device.c
|
||||
@@ -541,6 +541,7 @@ void libxl__multidev_prepared(libxl__egc
|
||||
* The following functions are defined:
|
||||
* libxl__add_disks
|
||||
* libxl__add_nics
|
||||
@ -523,7 +523,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_device.c
|
||||
* libxl__add_vtpms
|
||||
*/
|
||||
|
||||
@@ -542,10 +543,32 @@ void libxl__multidev_prepared(libxl__egc
|
||||
@@ -560,10 +561,32 @@ void libxl__multidev_prepared(libxl__egc
|
||||
|
||||
DEFINE_DEVICES_ADD(disk)
|
||||
DEFINE_DEVICES_ADD(nic)
|
||||
@ -556,11 +556,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_device.c
|
||||
/******************************************************************************/
|
||||
|
||||
int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_internal.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_internal.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
@@ -982,6 +982,7 @@ _hidden int libxl__device_disk_setdefaul
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_internal.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_internal.h
|
||||
@@ -1079,6 +1079,7 @@ _hidden int libxl__device_disk_setdefaul
|
||||
_hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic,
|
||||
uint32_t domid);
|
||||
_hidden int libxl__device_vtpm_setdefault(libxl__gc *gc, libxl_device_vtpm *vtpm);
|
||||
@ -568,7 +568,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
_hidden int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb);
|
||||
_hidden int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb);
|
||||
_hidden int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci);
|
||||
@@ -2082,6 +2083,10 @@ _hidden void libxl__device_vtpm_add(libx
|
||||
@@ -2390,6 +2391,10 @@ _hidden void libxl__device_vtpm_add(libx
|
||||
libxl_device_vtpm *vtpm,
|
||||
libxl__ao_device *aodev);
|
||||
|
||||
@ -579,7 +579,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
/* Internal function to connect a vkb device */
|
||||
_hidden int libxl__device_vkb_add(libxl__gc *gc, uint32_t domid,
|
||||
libxl_device_vkb *vkb);
|
||||
@@ -2522,6 +2527,10 @@ _hidden void libxl__add_vtpms(libxl__egc
|
||||
@@ -3013,6 +3018,10 @@ _hidden void libxl__add_vtpms(libxl__egc
|
||||
libxl_domain_config *d_config,
|
||||
libxl__multidev *multidev);
|
||||
|
||||
@ -590,12 +590,12 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
/*----- device model creation -----*/
|
||||
|
||||
/* First layer; wraps libxl__spawn_spawn. */
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_types.idl
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_types.idl
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
@@ -456,6 +456,26 @@ libxl_device_vtpm = Struct("device_vtpm"
|
||||
("uuid", libxl_uuid),
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_types.idl
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_types.idl
|
||||
@@ -539,6 +539,26 @@ libxl_device_channel = Struct("device_ch
|
||||
])),
|
||||
])
|
||||
|
||||
+libxl_vscsi_dev = Struct("vscsi_dev", [
|
||||
@ -621,16 +621,16 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
libxl_domain_config = Struct("domain_config", [
|
||||
("c_info", libxl_domain_create_info),
|
||||
("b_info", libxl_domain_build_info),
|
||||
@@ -466,6 +486,8 @@ libxl_domain_config = Struct("domain_con
|
||||
("vfbs", Array(libxl_device_vfb, "num_vfbs")),
|
||||
("vkbs", Array(libxl_device_vkb, "num_vkbs")),
|
||||
("vtpms", Array(libxl_device_vtpm, "num_vtpms")),
|
||||
@@ -552,6 +572,8 @@ libxl_domain_config = Struct("domain_con
|
||||
# a channel manifests as a console with a name,
|
||||
# see docs/misc/channels.txt
|
||||
("channels", Array(libxl_device_channel, "num_channels")),
|
||||
+# preserve libxl.so.4.4 ABI
|
||||
+# ("vscsis", Array(libxl_device_vscsi, "num_vscsis")),
|
||||
|
||||
("on_poweroff", libxl_action_on_shutdown),
|
||||
("on_reboot", libxl_action_on_shutdown),
|
||||
@@ -508,6 +530,28 @@ libxl_vtpminfo = Struct("vtpminfo", [
|
||||
@@ -594,6 +616,28 @@ libxl_vtpminfo = Struct("vtpminfo", [
|
||||
("uuid", libxl_uuid),
|
||||
], dir=DIR_OUT)
|
||||
|
||||
@ -659,11 +659,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_types.idl
|
||||
libxl_vcpuinfo = Struct("vcpuinfo", [
|
||||
("vcpuid", uint32),
|
||||
("cpu", uint32),
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_types_internal.idl
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_types_internal.idl
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_types_internal.idl
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_types_internal.idl
|
||||
@@ -20,6 +20,7 @@ libxl__device_kind = Enumeration("device
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_types_internal.idl
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_types_internal.idl
|
||||
@@ -22,6 +22,7 @@ libxl__device_kind = Enumeration("device
|
||||
(6, "VKBD"),
|
||||
(7, "CONSOLE"),
|
||||
(8, "VTPM"),
|
||||
@ -671,11 +671,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_types_internal.idl
|
||||
])
|
||||
|
||||
libxl__console_backend = Enumeration("console_backend", [
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/xl.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl.h
|
||||
@@ -81,6 +81,9 @@ int main_networkdetach(int argc, char **
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/xl.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/xl.h
|
||||
@@ -83,6 +83,9 @@ int main_channellist(int argc, char **ar
|
||||
int main_blockattach(int argc, char **argv);
|
||||
int main_blocklist(int argc, char **argv);
|
||||
int main_blockdetach(int argc, char **argv);
|
||||
@ -685,10 +685,10 @@ Index: xen-4.4.1-testing/tools/libxl/xl.h
|
||||
int main_vtpmattach(int argc, char **argv);
|
||||
int main_vtpmlist(int argc, char **argv);
|
||||
int main_vtpmdetach(int argc, char **argv);
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "libxl_osdeps.h"
|
||||
|
||||
@ -702,10 +702,10 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
+#include <dirent.h>
|
||||
#include <xen/hvm/e820.h>
|
||||
|
||||
#include "libxl.h"
|
||||
#include "libxl_utils.h"
|
||||
@@ -544,6 +546,122 @@ static void parse_vif_rate(XLU_Config **
|
||||
@@ -549,6 +551,122 @@ static void set_default_nic_values(libxl
|
||||
}
|
||||
}
|
||||
|
||||
@ -828,16 +828,16 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
static void split_string_into_string_list(const char *str,
|
||||
const char *delim,
|
||||
libxl_string_list *psl)
|
||||
@@ -763,7 +881,7 @@ static void parse_config_data(const char
|
||||
@@ -918,7 +1036,7 @@ static void parse_config_data(const char
|
||||
const char *buf;
|
||||
long l;
|
||||
XLU_Config *config;
|
||||
- XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms;
|
||||
+ XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms, *vscsis;
|
||||
XLU_ConfigList *ioports, *irqs, *iomem;
|
||||
int num_ioports, num_irqs, num_iomem;
|
||||
XLU_ConfigList *channels, *ioports, *irqs, *iomem, *viridian;
|
||||
int num_ioports, num_irqs, num_iomem, num_cpus, num_viridian;
|
||||
int pci_power_mgmt = 0;
|
||||
@@ -1255,6 +1373,66 @@ static void parse_config_data(const char
|
||||
@@ -1421,6 +1539,66 @@ static void parse_config_data(const char
|
||||
}
|
||||
}
|
||||
|
||||
@ -904,7 +904,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
if (!xlu_cfg_get_list(config, "vtpm", &vtpms, 0, 0)) {
|
||||
d_config->num_vtpms = 0;
|
||||
d_config->vtpms = NULL;
|
||||
@@ -6052,6 +6230,256 @@ int main_blockdetach(int argc, char **ar
|
||||
@@ -6490,6 +6668,256 @@ int main_blockdetach(int argc, char **ar
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1161,11 +1161,11 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
int main_vtpmattach(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdtable.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/xl_cmdtable.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdtable.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdtable.c
|
||||
@@ -354,6 +354,21 @@ struct cmd_spec cmd_table[] = {
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/xl_cmdtable.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/xl_cmdtable.c
|
||||
@@ -372,6 +372,21 @@ struct cmd_spec cmd_table[] = {
|
||||
"Destroy a domain's virtual block device",
|
||||
"<Domain> <DevId>",
|
||||
},
|
||||
|
@ -75,9 +75,9 @@ v2:
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
---
|
||||
docs/man/xl.pod.1 | 20 +++++++++++++++++++
|
||||
tools/libxc/xc_domain_save.c | 27 +++++++++++++++++++++++--
|
||||
tools/libxc/xc_nomigrate.c | 10 +++++++++
|
||||
tools/libxc/xenguest.h | 7 ++++++
|
||||
tools/libxc/include/xenguest.h | 6 +++++
|
||||
tools/libxc/xc_domain_save.c | 26 ++++++++++++++++++++++--
|
||||
tools/libxc/xc_nomigrate.c | 9 ++++++++
|
||||
tools/libxl/libxl.c | 27 ++++++++++++++++++++++---
|
||||
tools/libxl/libxl.h | 15 ++++++++++++++
|
||||
tools/libxl/libxl_dom.c | 1
|
||||
@ -86,13 +86,13 @@ Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
tools/libxl/libxl_save_helper.c | 4 ++-
|
||||
tools/libxl/xl_cmdimpl.c | 41 +++++++++++++++++++++++++++++++++------
|
||||
tools/libxl/xl_cmdtable.c | 23 ++++++++++++++-------
|
||||
12 files changed, 162 insertions(+), 21 deletions(-)
|
||||
12 files changed, 159 insertions(+), 21 deletions(-)
|
||||
|
||||
Index: xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
Index: xen-4.5.0-testing/docs/man/xl.pod.1
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/docs/man/xl.pod.1
|
||||
+++ xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
@@ -392,6 +392,26 @@ Send <config> instead of config file fro
|
||||
--- xen-4.5.0-testing.orig/docs/man/xl.pod.1
|
||||
+++ xen-4.5.0-testing/docs/man/xl.pod.1
|
||||
@@ -428,6 +428,26 @@ Send <config> instead of config file fro
|
||||
|
||||
Print huge (!) amount of debug during the migration process.
|
||||
|
||||
@ -119,11 +119,35 @@ Index: xen-4.4.1-testing/docs/man/xl.pod.1
|
||||
=back
|
||||
|
||||
=item B<remus> [I<OPTIONS>] I<domain-id> I<host>
|
||||
Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
Index: xen-4.5.0-testing/tools/libxc/include/xenguest.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxc/xc_domain_save.c
|
||||
+++ xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
@@ -43,6 +43,7 @@
|
||||
--- xen-4.5.0-testing.orig/tools/libxc/include/xenguest.h
|
||||
+++ xen-4.5.0-testing/tools/libxc/include/xenguest.h
|
||||
@@ -28,6 +28,7 @@
|
||||
#define XCFLAGS_HVM (1 << 2)
|
||||
#define XCFLAGS_STDVGA (1 << 3)
|
||||
#define XCFLAGS_CHECKPOINT_COMPRESS (1 << 4)
|
||||
+#define XCFLAGS_DOMSAVE_ABORT_IF_BUSY (1 << 5)
|
||||
|
||||
#define X86_64_B_SIZE 64
|
||||
#define X86_32_B_SIZE 32
|
||||
@@ -88,6 +89,11 @@ int xc_domain_save(xc_interface *xch, in
|
||||
uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
|
||||
struct save_callbacks* callbacks, int hvm);
|
||||
|
||||
+int xc_domain_save_suse(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
+ uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
|
||||
+ uint32_t min_remaining,
|
||||
+ struct save_callbacks* callbacks, int hvm);
|
||||
+
|
||||
|
||||
/* callbacks provided by xc_domain_restore */
|
||||
struct restore_callbacks {
|
||||
Index: xen-4.5.0-testing/tools/libxc/xc_domain_save.c
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/libxc/xc_domain_save.c
|
||||
+++ xen-4.5.0-testing/tools/libxc/xc_domain_save.c
|
||||
@@ -44,6 +44,7 @@
|
||||
*/
|
||||
#define DEF_MAX_ITERS 29 /* limit us to 30 times round loop */
|
||||
#define DEF_MAX_FACTOR 3 /* never send more than 3x p2m_size */
|
||||
@ -131,7 +155,7 @@ Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
|
||||
struct save_ctx {
|
||||
unsigned long hvirt_start; /* virtual starting address of the hypervisor */
|
||||
@@ -798,8 +799,9 @@ static int save_tsc_info(xc_interface *x
|
||||
@@ -800,8 +801,9 @@ static int save_tsc_info(xc_interface *x
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -139,11 +163,11 @@ Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
+int xc_domain_save_suse(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
uint32_t max_factor, uint32_t flags,
|
||||
+ uint32_t min_remaining,
|
||||
struct save_callbacks* callbacks, int hvm,
|
||||
unsigned long vm_generationid_addr)
|
||||
struct save_callbacks* callbacks, int hvm)
|
||||
{
|
||||
xc_dominfo_t info;
|
||||
@@ -810,6 +812,7 @@ int xc_domain_save(xc_interface *xch, in
|
||||
int rc = 1, frc, i, j, last_iter = 0, iter = 0;
|
||||
int rc, frc, i, j, last_iter = 0, iter = 0;
|
||||
int live = (flags & XCFLAGS_LIVE);
|
||||
int debug = (flags & XCFLAGS_DEBUG);
|
||||
+ int abort_if_busy = (flags & XCFLAGS_DOMSAVE_ABORT_IF_BUSY);
|
||||
@ -158,7 +182,7 @@ Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
|
||||
if ( !get_platform_info(xch, dom,
|
||||
&ctx->max_mfn, &ctx->hvirt_start, &ctx->pt_levels, &dinfo->guest_width) )
|
||||
@@ -1563,10 +1567,22 @@ int xc_domain_save(xc_interface *xch, in
|
||||
@@ -1536,10 +1540,21 @@ int xc_domain_save(xc_interface *xch, in
|
||||
|
||||
if ( live )
|
||||
{
|
||||
@ -170,7 +194,6 @@ Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
{
|
||||
+ if ( !min_reached && abort_if_busy )
|
||||
+ {
|
||||
+ errnoval = EBUSY;
|
||||
+ DPRINTF("Live migration aborted, as requested. (guest too busy?)");
|
||||
+ DPRINTF(" total_sent %lu iter %d, max_iters %u max_factor %u",
|
||||
+ total_sent, iter, max_iters, max_factor);
|
||||
@ -182,33 +205,32 @@ Index: xen-4.4.1-testing/tools/libxc/xc_domain_save.c
|
||||
DPRINTF("Start last iteration\n");
|
||||
last_iter = 1;
|
||||
|
||||
@@ -2210,6 +2226,13 @@ exit:
|
||||
|
||||
return !!rc;
|
||||
@@ -2181,6 +2196,13 @@ exit:
|
||||
return !!errno;
|
||||
}
|
||||
|
||||
+int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
+ uint32_t max_factor, uint32_t flags,
|
||||
+ struct save_callbacks* callbacks, int hvm,
|
||||
+ unsigned long vm_generationid_addr)
|
||||
+ struct save_callbacks* callbacks, int hvm)
|
||||
+{
|
||||
+ return xc_domain_save_suse(xch, io_fd, dom, max_iters, max_factor, flags, 0, callbacks, hvm, vm_generationid_addr);
|
||||
+ return xc_domain_save_suse(xch, io_fd, dom, max_iters, max_factor, flags, 0, callbacks, hvm);
|
||||
+}
|
||||
|
||||
+
|
||||
/*
|
||||
* Local variables:
|
||||
Index: xen-4.4.1-testing/tools/libxc/xc_nomigrate.c
|
||||
* mode: C
|
||||
Index: xen-4.5.0-testing/tools/libxc/xc_nomigrate.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxc/xc_nomigrate.c
|
||||
+++ xen-4.4.1-testing/tools/libxc/xc_nomigrate.c
|
||||
@@ -21,6 +21,16 @@
|
||||
--- xen-4.5.0-testing.orig/tools/libxc/xc_nomigrate.c
|
||||
+++ xen-4.5.0-testing/tools/libxc/xc_nomigrate.c
|
||||
@@ -21,6 +21,15 @@
|
||||
#include <xenctrl.h>
|
||||
#include <xenguest.h>
|
||||
|
||||
+int xc_domain_save_suse(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
+ uint32_t max_factor, uint32_t flags,
|
||||
+ uint32_t min_remaining,
|
||||
+ struct save_callbacks* callbacks, int hvm,
|
||||
+ unsigned long vm_generationid_addr)
|
||||
+ struct save_callbacks* callbacks, int hvm)
|
||||
+{
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
@ -216,37 +238,12 @@ Index: xen-4.4.1-testing/tools/libxc/xc_nomigrate.c
|
||||
+
|
||||
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
uint32_t max_factor, uint32_t flags,
|
||||
struct save_callbacks* callbacks, int hvm,
|
||||
Index: xen-4.4.1-testing/tools/libxc/xenguest.h
|
||||
struct save_callbacks* callbacks, int hvm)
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxc/xenguest.h
|
||||
+++ xen-4.4.1-testing/tools/libxc/xenguest.h
|
||||
@@ -28,6 +28,7 @@
|
||||
#define XCFLAGS_HVM (1 << 2)
|
||||
#define XCFLAGS_STDVGA (1 << 3)
|
||||
#define XCFLAGS_CHECKPOINT_COMPRESS (1 << 4)
|
||||
+#define XCFLAGS_DOMSAVE_ABORT_IF_BUSY (1 << 5)
|
||||
|
||||
#define X86_64_B_SIZE 64
|
||||
#define X86_32_B_SIZE 32
|
||||
@@ -89,6 +90,12 @@ int xc_domain_save(xc_interface *xch, in
|
||||
struct save_callbacks* callbacks, int hvm,
|
||||
unsigned long vm_generationid_addr);
|
||||
|
||||
+int xc_domain_save_suse(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
|
||||
+ uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
|
||||
+ uint32_t min_remaining,
|
||||
+ struct save_callbacks* callbacks, int hvm,
|
||||
+ unsigned long vm_generationid_addr);
|
||||
+
|
||||
|
||||
/* callbacks provided by xc_domain_restore */
|
||||
struct restore_callbacks {
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
@@ -763,7 +763,8 @@ static void domain_suspend_cb(libxl__egc
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
@@ -944,7 +944,8 @@ static void domain_suspend_cb(libxl__egc
|
||||
|
||||
}
|
||||
|
||||
@ -256,7 +253,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
const libxl_asyncop_how *ao_how)
|
||||
{
|
||||
AO_CREATE(ctx, domid, ao_how);
|
||||
@@ -784,8 +785,14 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
@@ -965,8 +966,14 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
dss->domid = domid;
|
||||
dss->fd = fd;
|
||||
dss->type = type;
|
||||
@ -273,7 +270,7 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
|
||||
libxl__domain_suspend(egc, dss);
|
||||
return AO_INPROGRESS;
|
||||
@@ -794,6 +801,20 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
@@ -975,6 +982,20 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
return AO_ABORT(rc);
|
||||
}
|
||||
|
||||
@ -294,11 +291,11 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.c
|
||||
int libxl_domain_pause(libxl_ctx *ctx, uint32_t domid)
|
||||
{
|
||||
int ret;
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
@@ -702,8 +702,23 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.h
|
||||
@@ -949,8 +949,23 @@ int libxl_domain_suspend(libxl_ctx *ctx,
|
||||
int flags, /* LIBXL_SUSPEND_* */
|
||||
const libxl_asyncop_how *ao_how)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
@ -322,25 +319,25 @@ Index: xen-4.4.1-testing/tools/libxl/libxl.h
|
||||
|
||||
/* @param suspend_cancel [from xenctrl.h:xc_domain_resume( @param fast )]
|
||||
* If this parameter is true, use co-operative resume. The guest
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_dom.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_dom.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_dom.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_dom.c
|
||||
@@ -1341,6 +1341,7 @@ void libxl__domain_suspend(libxl__egc *e
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_dom.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_dom.c
|
||||
@@ -1808,6 +1808,7 @@ void libxl__domain_suspend(libxl__egc *e
|
||||
|
||||
dss->xcflags = (live ? XCFLAGS_LIVE : 0)
|
||||
| (debug ? XCFLAGS_DEBUG : 0)
|
||||
+ | (dss->xlflags & LIBXL_SUSPEND_ABORT_IF_BUSY ? XCFLAGS_DOMSAVE_ABORT_IF_BUSY : 0)
|
||||
| (dss->hvm ? XCFLAGS_HVM : 0);
|
||||
|
||||
dss->suspend_eventchn = -1;
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
dss->guest_evtchn.port = -1;
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_internal.h
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_internal.h
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
@@ -2319,6 +2319,10 @@ struct libxl__domain_suspend_state {
|
||||
xc_evtchn *xce; /* event channel handle */
|
||||
int suspend_eventchn;
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_internal.h
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_internal.h
|
||||
@@ -2803,6 +2803,10 @@ struct libxl__domain_suspend_state {
|
||||
libxl__ev_evtchn guest_evtchn;
|
||||
int guest_evtchn_lockfd;
|
||||
int hvm;
|
||||
+ int max_iters;
|
||||
+ int max_factor;
|
||||
@ -348,49 +345,49 @@ Index: xen-4.4.1-testing/tools/libxl/libxl_internal.h
|
||||
+ int xlflags;
|
||||
int xcflags;
|
||||
int guest_responded;
|
||||
const char *dm_savefile;
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_save_callout.c
|
||||
libxl__xswait_state pvcontrol;
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_save_callout.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_save_callout.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_save_callout.c
|
||||
@@ -108,7 +108,9 @@ void libxl__xc_domain_save(libxl__egc *e
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_save_callout.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_save_callout.c
|
||||
@@ -110,7 +110,9 @@ void libxl__xc_domain_save(libxl__egc *e
|
||||
}
|
||||
|
||||
const unsigned long argnums[] = {
|
||||
- dss->domid, 0, 0, dss->xcflags, dss->hvm, vm_generationid_addr,
|
||||
- dss->domid, 0, 0, dss->xcflags, dss->hvm,
|
||||
+ dss->domid,
|
||||
+ dss->max_iters, dss->max_factor, dss->min_remaining,
|
||||
+ dss->xcflags, dss->hvm, vm_generationid_addr,
|
||||
+ dss->xcflags, dss->hvm,
|
||||
toolstack_data_fd, toolstack_data_len,
|
||||
cbflags,
|
||||
};
|
||||
Index: xen-4.4.1-testing/tools/libxl/libxl_save_helper.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl_save_helper.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/libxl_save_helper.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/libxl_save_helper.c
|
||||
@@ -221,6 +221,7 @@ int main(int argc, char **argv)
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl_save_helper.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl_save_helper.c
|
||||
@@ -215,6 +215,7 @@ int main(int argc, char **argv)
|
||||
uint32_t dom = strtoul(NEXTARG,0,10);
|
||||
uint32_t max_iters = strtoul(NEXTARG,0,10);
|
||||
uint32_t max_factor = strtoul(NEXTARG,0,10);
|
||||
+ uint32_t min_remaining = strtoul(NEXTARG,0,10);
|
||||
uint32_t flags = strtoul(NEXTARG,0,10);
|
||||
int hvm = atoi(NEXTARG);
|
||||
unsigned long genidad = strtoul(NEXTARG,0,10);
|
||||
@@ -235,7 +236,8 @@ int main(int argc, char **argv)
|
||||
toolstack_save_fd = atoi(NEXTARG);
|
||||
@@ -228,7 +229,8 @@ int main(int argc, char **argv)
|
||||
helper_setcallbacks_save(&helper_save_callbacks, cbflags);
|
||||
|
||||
startup("save");
|
||||
- r = xc_domain_save(xch, io_fd, dom, max_iters, max_factor, flags,
|
||||
+ r = xc_domain_save_suse(xch, io_fd, dom, max_iters, max_factor, flags,
|
||||
+ min_remaining,
|
||||
&helper_save_callbacks, hvm, genidad);
|
||||
&helper_save_callbacks, hvm);
|
||||
complete(r);
|
||||
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -3656,6 +3656,8 @@ static void migrate_do_preamble(int send
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/xl_cmdimpl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/xl_cmdimpl.c
|
||||
@@ -3878,6 +3878,8 @@ static void migrate_do_preamble(int send
|
||||
}
|
||||
|
||||
static void migrate_domain(uint32_t domid, const char *rune, int debug,
|
||||
@ -399,7 +396,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
const char *override_config_file)
|
||||
{
|
||||
pid_t child = -1;
|
||||
@@ -3664,7 +3666,13 @@ static void migrate_domain(uint32_t domi
|
||||
@@ -3886,7 +3888,13 @@ static void migrate_domain(uint32_t domi
|
||||
char *away_domname;
|
||||
char rc_buf;
|
||||
uint8_t *config_data;
|
||||
@ -414,7 +411,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
|
||||
save_domain_core_begin(domid, override_config_file,
|
||||
&config_data, &config_len);
|
||||
@@ -3683,10 +3691,13 @@ static void migrate_domain(uint32_t domi
|
||||
@@ -3905,10 +3913,13 @@ static void migrate_domain(uint32_t domi
|
||||
xtl_stdiostream_adjust_flags(logger, XTL_STDIOSTREAM_HIDE_PROGRESS, 0);
|
||||
|
||||
if (debug)
|
||||
@ -431,7 +428,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
" (rc=%d)\n", rc);
|
||||
if (rc == ERROR_GUEST_TIMEDOUT)
|
||||
goto failed_suspend;
|
||||
@@ -4073,13 +4084,18 @@ int main_migrate(int argc, char **argv)
|
||||
@@ -4295,13 +4306,18 @@ int main_migrate(int argc, char **argv)
|
||||
char *rune = NULL;
|
||||
char *host;
|
||||
int opt, daemonize = 1, monitor = 1, debug = 0;
|
||||
@ -451,7 +448,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
case 'C':
|
||||
config_filename = optarg;
|
||||
break;
|
||||
@@ -4096,6 +4112,18 @@ int main_migrate(int argc, char **argv)
|
||||
@@ -4318,6 +4334,18 @@ int main_migrate(int argc, char **argv)
|
||||
case 0x100:
|
||||
debug = 1;
|
||||
break;
|
||||
@ -470,7 +467,7 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
}
|
||||
|
||||
domid = find_domain(argv[optind]);
|
||||
@@ -4111,7 +4139,8 @@ int main_migrate(int argc, char **argv)
|
||||
@@ -4348,7 +4376,8 @@ int main_migrate(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -480,11 +477,11 @@ Index: xen-4.4.1-testing/tools/libxl/xl_cmdimpl.c
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
Index: xen-4.4.1-testing/tools/libxl/xl_cmdtable.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/xl_cmdtable.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/libxl/xl_cmdtable.c
|
||||
+++ xen-4.4.1-testing/tools/libxl/xl_cmdtable.c
|
||||
@@ -150,14 +150,21 @@ struct cmd_spec cmd_table[] = {
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/xl_cmdtable.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/xl_cmdtable.c
|
||||
@@ -155,14 +155,21 @@ struct cmd_spec cmd_table[] = {
|
||||
&main_migrate, 0, 1,
|
||||
"Migrate a domain to another host",
|
||||
"[options] <Domain> <host>",
|
||||
|
@ -10,11 +10,11 @@ Date: Wed Feb 12 11:15:17 2014 +0100
|
||||
Suggested-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
|
||||
|
||||
|
||||
Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
Index: xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
@@ -2634,6 +2634,16 @@ void libxl__device_disk_local_initiate_a
|
||||
--- xen-4.5.0-testing.orig/tools/libxl/libxl.c
|
||||
+++ xen-4.5.0-testing/tools/libxl/libxl.c
|
||||
@@ -3006,6 +3006,16 @@ void libxl__device_disk_local_initiate_a
|
||||
|
||||
switch (disk->backend) {
|
||||
case LIBXL_DISK_BACKEND_PHY:
|
||||
@ -31,7 +31,7 @@ Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching PHY disk %s",
|
||||
disk->pdev_path);
|
||||
dev = disk->pdev_path;
|
||||
@@ -2713,7 +2723,7 @@ static void local_device_attach_cb(libxl
|
||||
@@ -3085,7 +3095,7 @@ static void local_device_attach_cb(libxl
|
||||
}
|
||||
|
||||
dev = GCSPRINTF("/dev/%s", disk->vdev);
|
||||
@ -40,7 +40,7 @@ Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
|
||||
rc = libxl__device_from_disk(gc, LIBXL_TOOLSTACK_DOMID, disk, &device);
|
||||
if (rc < 0)
|
||||
@@ -2753,6 +2763,7 @@ void libxl__device_disk_local_initiate_d
|
||||
@@ -3125,6 +3135,7 @@ void libxl__device_disk_local_initiate_d
|
||||
if (!dls->diskpath) goto out;
|
||||
|
||||
switch (disk->backend) {
|
||||
@ -48,7 +48,7 @@ Index: xen-4.4.0-testing/tools/libxl/libxl.c
|
||||
case LIBXL_DISK_BACKEND_QDISK:
|
||||
if (disk->vdev != NULL) {
|
||||
GCNEW(device);
|
||||
@@ -2770,7 +2781,6 @@ void libxl__device_disk_local_initiate_d
|
||||
@@ -3142,7 +3153,6 @@ void libxl__device_disk_local_initiate_d
|
||||
/* disk->vdev == NULL; fall through */
|
||||
default:
|
||||
/*
|
||||
|
@ -1,22 +0,0 @@
|
||||
Open SuSEfirewall2 FORWARD rule when use xen nat
|
||||
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/network-nat
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/network-nat
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/network-nat
|
||||
@@ -83,6 +83,7 @@ function dhcp_stop()
|
||||
op_start() {
|
||||
echo 1 >/proc/sys/net/ipv4/ip_forward
|
||||
iptables -t nat -A POSTROUTING -o ${netdev} -j MASQUERADE
|
||||
+ iptables -P FORWARD ACCEPT
|
||||
[ "$dhcp" != 'no' ] && dhcp_start
|
||||
}
|
||||
|
||||
@@ -90,6 +91,7 @@ op_start() {
|
||||
op_stop() {
|
||||
[ "$dhcp" != 'no' ] && dhcp_stop
|
||||
iptables -t nat -D POSTROUTING -o ${netdev} -j MASQUERADE
|
||||
+ iptables -P FORWARD DROP
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
Index: xen-4.5.0-testing/tools/pygrub/src/pygrub
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/pygrub/src/pygrub
|
||||
+++ xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
@@ -452,7 +452,7 @@ class Grub:
|
||||
--- xen-4.5.0-testing.orig/tools/pygrub/src/pygrub
|
||||
+++ xen-4.5.0-testing/tools/pygrub/src/pygrub
|
||||
@@ -450,7 +450,7 @@ class Grub:
|
||||
self.cf.filename = f
|
||||
break
|
||||
if self.__dict__.get('cf', None) is None:
|
||||
@ -11,7 +11,7 @@ Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
f = fs.open_file(self.cf.filename)
|
||||
# limit read size to avoid pathological cases
|
||||
buf = f.read(FS_READ_MAX)
|
||||
@@ -598,6 +598,20 @@ def run_grub(file, entry, fs, cfg_args):
|
||||
@@ -622,6 +622,20 @@ def run_grub(file, entry, fs, cfg_args):
|
||||
|
||||
g = Grub(file, fs)
|
||||
|
||||
@ -32,7 +32,7 @@ Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
if list_entries:
|
||||
for i in range(len(g.cf.images)):
|
||||
img = g.cf.images[i]
|
||||
@@ -693,6 +707,19 @@ def sniff_netware(fs, cfg):
|
||||
@@ -717,6 +731,19 @@ def sniff_netware(fs, cfg):
|
||||
|
||||
return cfg
|
||||
|
||||
@ -52,11 +52,11 @@ Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
def format_sxp(kernel, ramdisk, args):
|
||||
s = "linux (kernel %s)" % kernel
|
||||
if ramdisk:
|
||||
@@ -773,7 +800,7 @@ if __name__ == "__main__":
|
||||
@@ -797,7 +824,7 @@ if __name__ == "__main__":
|
||||
debug = False
|
||||
not_really = False
|
||||
output_format = "sxp"
|
||||
- output_directory = "/var/run/xend/boot"
|
||||
- output_directory = "/var/run/xen/pygrub"
|
||||
+ output_directory = "/var/run/xen"
|
||||
|
||||
# what was passed in
|
||||
|
@ -1,7 +1,7 @@
|
||||
Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
Index: xen-4.5.0-testing/tools/pygrub/src/pygrub
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/pygrub/src/pygrub
|
||||
+++ xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
--- xen-4.5.0-testing.orig/tools/pygrub/src/pygrub
|
||||
+++ xen-4.5.0-testing/tools/pygrub/src/pygrub
|
||||
@@ -26,6 +26,7 @@ import fsimage
|
||||
import grub.GrubConf
|
||||
import grub.LiloConf
|
||||
@ -10,7 +10,7 @@ Index: xen-4.4.0-testing/tools/pygrub/src/pygrub
|
||||
|
||||
PYGRUB_VER = 0.6
|
||||
FS_READ_MAX = 1024 * 1024
|
||||
@@ -735,6 +736,8 @@ if __name__ == "__main__":
|
||||
@@ -759,6 +760,8 @@ if __name__ == "__main__":
|
||||
if len(data) == 0:
|
||||
os.close(tfd)
|
||||
del datafile
|
||||
|
@ -1,87 +0,0 @@
|
||||
From dd708897cc5b21bc374cd44b6d58c1e74b04bd6e Mon Sep 17 00:00:00 2001
|
||||
From: Chunyan Liu <cyliu@suse.com>
|
||||
Date: Wed, 28 May 2014 14:31:35 +0800
|
||||
Subject: [PATCH 2/2] qemu: support xen hvm direct kernel boot
|
||||
|
||||
qemu side patch to support xen HVM direct kernel boot:
|
||||
if -kernel exists, calls xen_load_linux(), which will read kernel/initrd
|
||||
and add a linuxboot.bin or multiboot.bin option rom. The
|
||||
linuxboot.bin/multiboot.bin will load kernel/initrd and jump to execute
|
||||
kernel directly. It's working when xen uses seabios.
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/i386/pc.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/i386/pc.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/i386/pc.c
|
||||
@@ -1105,6 +1105,35 @@ void pc_acpi_init(const char *default_ds
|
||||
}
|
||||
}
|
||||
|
||||
+FWCfgState *xen_load_linux(const char *kernel_filename,
|
||||
+ const char *kernel_cmdline,
|
||||
+ const char *initrd_filename,
|
||||
+ ram_addr_t below_4g_mem_size,
|
||||
+ PcGuestInfo *guest_info)
|
||||
+{
|
||||
+ int i;
|
||||
+ FWCfgState *fw_cfg;
|
||||
+
|
||||
+ assert(kernel_filename != NULL);
|
||||
+
|
||||
+ fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0);
|
||||
+ rom_set_fw(fw_cfg);
|
||||
+
|
||||
+ load_linux(fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size);
|
||||
+ for (i = 0; i < nb_option_roms; i++) {
|
||||
+ /* For xen, we only want to add the linuxboot.bin/multiboot.bin option rom.
|
||||
+ * But in option_rom, there is still kvmvapic.bin. We don't want to add it.
|
||||
+ */
|
||||
+ if (strcmp(option_rom[i].name, "linuxboot.bin") &&
|
||||
+ strcmp(option_rom[i].name, "multiboot.bin")) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ rom_add_option(option_rom[i].name, option_rom[i].bootindex);
|
||||
+ }
|
||||
+ guest_info->fw_cfg = fw_cfg;
|
||||
+ return fw_cfg;
|
||||
+}
|
||||
+
|
||||
FWCfgState *pc_memory_init(MemoryRegion *system_memory,
|
||||
const char *kernel_filename,
|
||||
const char *kernel_cmdline,
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/i386/pc_piix.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/i386/pc_piix.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/i386/pc_piix.c
|
||||
@@ -135,6 +135,13 @@ static void pc_init1(MemoryRegion *syste
|
||||
kernel_filename, kernel_cmdline, initrd_filename,
|
||||
below_4g_mem_size, above_4g_mem_size,
|
||||
rom_memory, &ram_memory, guest_info);
|
||||
+ } else if (kernel_filename != NULL) {
|
||||
+ /* For xen HVM direct kernel boot, load linux here */
|
||||
+ fw_cfg = xen_load_linux(kernel_filename,
|
||||
+ kernel_cmdline,
|
||||
+ initrd_filename,
|
||||
+ below_4g_mem_size,
|
||||
+ guest_info);
|
||||
}
|
||||
|
||||
gsi_state = g_malloc0(sizeof(*gsi_state));
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/include/hw/i386/pc.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/include/hw/i386/pc.h
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/include/hw/i386/pc.h
|
||||
@@ -120,6 +120,11 @@ static inline uint64_t pci_host_get_hole
|
||||
void pc_init_pci64_hole(PcPciInfo *pci_info, uint64_t pci_hole64_start,
|
||||
uint64_t pci_hole64_size);
|
||||
|
||||
+FWCfgState *xen_load_linux(const char *kernel_filename,
|
||||
+ const char *kernel_cmdline,
|
||||
+ const char *initrd_filename,
|
||||
+ ram_addr_t below_4g_mem_size,
|
||||
+ PcGuestInfo *guest_info);
|
||||
FWCfgState *pc_memory_init(MemoryRegion *system_memory,
|
||||
const char *kernel_filename,
|
||||
const char *kernel_cmdline,
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4d6448804cd43cc4c942dd031c17d1b46a1f68948b60d385e0c962ab4d4bdfd
|
||||
size 7597461
|
||||
oid sha256:c9b4434c2955f698a2d9f51ff2b79dff59962aae97cc1b4d5ef86be64b6143af
|
||||
size 8148812
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f9015611676155eea1abfbe65dda13bdc7195bfb87d3da7a6d27f0df77376014
|
||||
size 3235746
|
||||
oid sha256:30a688a1f21a26ffb2593e8c094fff190e33d432e13b4ee65313e8c37a88472a
|
||||
size 3212760
|
||||
|
@ -1,128 +0,0 @@
|
||||
References: FATE#316071
|
||||
Subject: qemu-upstream: add discard support for xen_disk
|
||||
Git-commit: f31352041bdde436c3f6d07e1525a42e48dec215
|
||||
|
||||
Implement discard support for xen_disk. It makes use of the existing
|
||||
discard code in qemu.
|
||||
|
||||
The discard support is enabled unconditionally. The tool stack may provide a
|
||||
property "discard-enable" in the backend node to optionally disable discard
|
||||
support. This is helpful in case the backing file was intentionally created
|
||||
non-sparse to avoid fragmentation.
|
||||
|
||||
v2:
|
||||
rename xenstore property from discard_enable to discard-enable
|
||||
move discard_req to case BLKIF_OP_DISCARD
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
---
|
||||
tools/qemu-xen-dir-remote/hw/block/xen_blkif.h | 12 ++++++++++
|
||||
tools/qemu-xen-dir-remote/hw/block/xen_disk.c | 30 +++++++++++++++++++++++++
|
||||
2 files changed, 42 insertions(+)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h
|
||||
@@ -79,6 +79,12 @@ static inline void blkif_get_x86_32_req(
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
+ if (src->operation == BLKIF_OP_DISCARD) {
|
||||
+ struct blkif_request_discard *s = (void *)src;
|
||||
+ struct blkif_request_discard *d = (void *)dst;
|
||||
+ d->nr_sectors = s->nr_sectors;
|
||||
+ return;
|
||||
+ }
|
||||
if (n > src->nr_segments)
|
||||
n = src->nr_segments;
|
||||
for (i = 0; i < n; i++)
|
||||
@@ -94,6 +100,12 @@ static inline void blkif_get_x86_64_req(
|
||||
dst->handle = src->handle;
|
||||
dst->id = src->id;
|
||||
dst->sector_number = src->sector_number;
|
||||
+ if (src->operation == BLKIF_OP_DISCARD) {
|
||||
+ struct blkif_request_discard *s = (void *)src;
|
||||
+ struct blkif_request_discard *d = (void *)dst;
|
||||
+ d->nr_sectors = s->nr_sectors;
|
||||
+ return;
|
||||
+ }
|
||||
if (n > src->nr_segments)
|
||||
n = src->nr_segments;
|
||||
for (i = 0; i < n; i++)
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
@@ -114,6 +114,7 @@ struct XenBlkDev {
|
||||
int requests_finished;
|
||||
|
||||
/* Persistent grants extension */
|
||||
+ gboolean feature_discard;
|
||||
gboolean feature_persistent;
|
||||
GTree *persistent_gnts;
|
||||
unsigned int persistent_gnt_count;
|
||||
@@ -253,6 +254,8 @@ static int ioreq_parse(struct ioreq *ior
|
||||
case BLKIF_OP_WRITE:
|
||||
ioreq->prot = PROT_READ; /* from memory */
|
||||
break;
|
||||
+ case BLKIF_OP_DISCARD:
|
||||
+ return 0;
|
||||
default:
|
||||
xen_be_printf(&blkdev->xendev, 0, "error: unknown operation (%d)\n",
|
||||
ioreq->req.operation);
|
||||
@@ -521,6 +524,16 @@ static int ioreq_runio_qemu_aio(struct i
|
||||
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
||||
qemu_aio_complete, ioreq);
|
||||
break;
|
||||
+ case BLKIF_OP_DISCARD:
|
||||
+ {
|
||||
+ struct blkif_request_discard *discard_req = (void *)&ioreq->req;
|
||||
+ bdrv_acct_start(blkdev->bs, &ioreq->acct, discard_req->nr_sectors * BLOCK_SIZE, BDRV_ACCT_WRITE);
|
||||
+ ioreq->aio_inflight++;
|
||||
+ bdrv_aio_discard(blkdev->bs,
|
||||
+ discard_req->sector_number, discard_req->nr_sectors,
|
||||
+ qemu_aio_complete, ioreq);
|
||||
+ break;
|
||||
+ }
|
||||
default:
|
||||
/* unknown operation (shouldn't happen -- parse catches this) */
|
||||
goto err;
|
||||
@@ -699,6 +712,19 @@ static void blk_alloc(struct XenDevice *
|
||||
}
|
||||
}
|
||||
|
||||
+static void blk_parse_discard(struct XenBlkDev *blkdev)
|
||||
+{
|
||||
+ int enable;
|
||||
+
|
||||
+ blkdev->feature_discard = true;
|
||||
+
|
||||
+ if (xenstore_read_be_int(&blkdev->xendev, "discard-enable", &enable) == 0)
|
||||
+ blkdev->feature_discard = !!enable;
|
||||
+
|
||||
+ if (blkdev->feature_discard)
|
||||
+ xenstore_write_be_int(&blkdev->xendev, "feature-discard", 1);
|
||||
+}
|
||||
+
|
||||
static int blk_init(struct XenDevice *xendev)
|
||||
{
|
||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||
@@ -766,6 +792,8 @@ static int blk_init(struct XenDevice *xe
|
||||
xenstore_write_be_int(&blkdev->xendev, "feature-persistent", 1);
|
||||
xenstore_write_be_int(&blkdev->xendev, "info", info);
|
||||
|
||||
+ blk_parse_discard(blkdev);
|
||||
+
|
||||
g_free(directiosafe);
|
||||
return 0;
|
||||
|
||||
@@ -801,6 +829,8 @@ static int blk_connect(struct XenDevice
|
||||
qflags |= BDRV_O_RDWR;
|
||||
readonly = false;
|
||||
}
|
||||
+ if (blkdev->feature_discard)
|
||||
+ qflags |= BDRV_O_UNMAP;
|
||||
|
||||
/* init qemu block driver */
|
||||
index = (blkdev->xendev.dev - 202 * 256) / 16;
|
@ -4,11 +4,11 @@ Says rpmlint.
|
||||
tools/qemu-xen-dir-remote/hw/scsi/megasas.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
@@ -712,8 +712,8 @@ static int megasas_ctrl_get_info(Megasas
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-dir-remote/hw/scsi/megasas.c
|
||||
@@ -717,8 +717,8 @@ static int megasas_ctrl_get_info(Megasas
|
||||
snprintf(info.package_version, 0x60, "%s-QEMU", QEMU_VERSION);
|
||||
memcpy(info.image_component[0].name, "APP", 3);
|
||||
memcpy(info.image_component[0].version, MEGASAS_VERSION "-QEMU", 9);
|
||||
|
@ -3,11 +3,11 @@ https://bugzilla.novell.com/show_bug.cgi?id=879425
|
||||
tools/qemu-xen-dir-remote/hw/block/xen_disk.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
@@ -113,6 +113,7 @@ struct XenBlkDev {
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
@@ -120,6 +120,7 @@ struct XenBlkDev {
|
||||
int requests_inflight;
|
||||
int requests_finished;
|
||||
|
||||
@ -15,8 +15,8 @@ Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
/* Persistent grants extension */
|
||||
gboolean feature_discard;
|
||||
gboolean feature_persistent;
|
||||
@@ -725,6 +726,16 @@ static void blk_parse_discard(struct Xen
|
||||
xenstore_write_be_int(&blkdev->xendev, "feature-discard", 1);
|
||||
@@ -780,6 +781,16 @@ static void blk_parse_discard(struct Xen
|
||||
}
|
||||
}
|
||||
|
||||
+static void blk_parse_cache_unsafe(struct XenBlkDev *blkdev)
|
||||
@ -32,7 +32,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
static int blk_init(struct XenDevice *xendev)
|
||||
{
|
||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||
@@ -793,6 +804,7 @@ static int blk_init(struct XenDevice *xe
|
||||
@@ -848,6 +859,7 @@ static int blk_init(struct XenDevice *xe
|
||||
xenstore_write_be_int(&blkdev->xendev, "info", info);
|
||||
|
||||
blk_parse_discard(blkdev);
|
||||
@ -40,9 +40,9 @@ Index: xen-4.4.0-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c
|
||||
|
||||
g_free(directiosafe);
|
||||
return 0;
|
||||
@@ -832,6 +844,9 @@ static int blk_connect(struct XenDevice
|
||||
if (blkdev->feature_discard)
|
||||
@@ -888,6 +900,9 @@ static int blk_connect(struct XenDevice
|
||||
qflags |= BDRV_O_UNMAP;
|
||||
}
|
||||
|
||||
+ if (blkdev->cache_unsafe)
|
||||
+ qflags |= BDRV_O_NO_FLUSH;
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cf7450369a8a4693ab95adcdb79317d0b524fe5e5c5f79bd6a630efcf376db25
|
||||
size 378198
|
||||
oid sha256:e1fe2f2ecc2b095f48915f325d0355cfdec3d125dfe52d05bf98d9c8860d1fb0
|
||||
size 366104
|
||||
|
@ -16,11 +16,11 @@ This patch sets the MTU for both 'online' and 'add' in the vif-bridge script.
|
||||
Signed-off-by: Charles Arnold <carnold@suse.com>
|
||||
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||||
|
||||
Index: xen-4.4.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
Index: xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.4.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -88,7 +88,7 @@ fi
|
||||
--- xen-4.5.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -84,7 +84,7 @@ fi
|
||||
case "$command" in
|
||||
online)
|
||||
setup_virtual_bridge_port "$dev"
|
||||
@ -29,7 +29,7 @@ Index: xen-4.4.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
add_to_bridge "$bridge" "$dev"
|
||||
;;
|
||||
|
||||
@@ -99,7 +99,7 @@ case "$command" in
|
||||
@@ -95,7 +95,7 @@ case "$command" in
|
||||
|
||||
add)
|
||||
setup_virtual_bridge_port "$dev"
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:90784022712efebb69d602810d07c2b86b572eb7bbc12dac58566c42dd5353c1
|
||||
size 17477566
|
||||
oid sha256:96339e810d23134d84ed306a42c24d8d648a6e6815808b9a5f418de073f56e01
|
||||
size 17477089
|
||||
|
@ -6,11 +6,11 @@ http://xen.1045712.n5.nabble.com/Re-PATCH-improve-suspend-evtchn-lock-processing
|
||||
|
||||
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||||
|
||||
Index: xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
||||
Index: xen-4.5.0-testing/tools/libxc/xc_suspend.c
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/libxc/xc_suspend.c
|
||||
+++ xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
||||
@@ -16,8 +16,43 @@
|
||||
--- xen-4.5.0-testing.orig/tools/libxc/xc_suspend.c
|
||||
+++ xen-4.5.0-testing/tools/libxc/xc_suspend.c
|
||||
@@ -19,6 +19,10 @@
|
||||
|
||||
#include "xc_private.h"
|
||||
#include "xenguest.h"
|
||||
@ -19,7 +19,12 @@ Index: xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
||||
+extern int kill (__pid_t __pid, int __sig);
|
||||
+#endif
|
||||
|
||||
#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn"
|
||||
#define SUSPEND_LOCK_FILE XEN_RUN_DIR "/suspend-evtchn-%d.lock"
|
||||
|
||||
@@ -34,6 +38,37 @@
|
||||
|
||||
#define SUSPEND_FILE_BUFLEN (sizeof(SUSPEND_LOCK_FILE) + 10)
|
||||
|
||||
+/* cleanup obsolete suspend lock file which is unlinked for any reason,
|
||||
+so that current process can get lock */
|
||||
+static void clean_obsolete_lock(int domid)
|
||||
@ -51,34 +56,23 @@ Index: xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int lock_suspend_event(xc_interface *xch, int domid)
|
||||
static void get_suspend_file(char buf[], int domid)
|
||||
{
|
||||
int fd, rc;
|
||||
@@ -27,6 +62,7 @@ static int lock_suspend_event(xc_interfa
|
||||
snprintf(buf, SUSPEND_FILE_BUFLEN, SUSPEND_LOCK_FILE, domid);
|
||||
@@ -47,6 +82,7 @@ static int lock_suspend_event(xc_interfa
|
||||
struct flock fl;
|
||||
|
||||
snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
|
||||
SUSPEND_LOCK_FILE, domid);
|
||||
get_suspend_file(suspend_file, domid);
|
||||
+ clean_obsolete_lock(domid);
|
||||
mask = umask(022);
|
||||
fd = open(suspend_file, O_CREAT | O_EXCL | O_RDWR, 0666);
|
||||
if (fd < 0)
|
||||
@@ -41,6 +77,9 @@ static int lock_suspend_event(xc_interfa
|
||||
rc = write_exact(fd, buf, strlen(buf));
|
||||
close(fd);
|
||||
|
||||
+ if(rc)
|
||||
*lockfd = -1;
|
||||
|
||||
@@ -96,6 +132,8 @@ static int lock_suspend_event(xc_interfa
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
|
||||
+ unlink(suspend_file);
|
||||
+
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -127,8 +166,7 @@ int xc_suspend_evtchn_init(xc_interface
|
||||
return suspend_evtchn;
|
||||
|
||||
cleanup:
|
||||
- if (suspend_evtchn != -1)
|
||||
- xc_suspend_evtchn_release(xch, xce, domid, suspend_evtchn);
|
||||
+ xc_suspend_evtchn_release(xch, xce, domid, suspend_evtchn);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
Index: xen-4.4.1-testing/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
===================================================================
|
||||
--- xen-4.4.1-testing.orig/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
+++ xen-4.4.1-testing/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
@@ -1651,6 +1651,25 @@ static void do_key_event(VncState *vs, i
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-dir-remote/ui/vnc.c
|
||||
@@ -1645,6 +1645,25 @@ static void do_key_event(VncState *vs, i
|
||||
if (down)
|
||||
vs->modifiers_state[keycode] ^= 1;
|
||||
break;
|
||||
|
@ -1,47 +0,0 @@
|
||||
Index: xen-4.3.0-testing/tools/hotplug/Linux/init.d/xencommons
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
||||
+++ xen-4.3.0-testing/tools/hotplug/Linux/init.d/xencommons
|
||||
@@ -57,21 +57,27 @@ do_start () {
|
||||
local time=0
|
||||
local timeout=30
|
||||
|
||||
- modprobe xen-evtchn 2>/dev/null
|
||||
- modprobe xen-gntdev 2>/dev/null
|
||||
- modprobe xen-gntalloc 2>/dev/null
|
||||
- modprobe xen-blkback 2>/dev/null
|
||||
- modprobe xen-netback 2>/dev/null
|
||||
- modprobe xen-pciback 2>/dev/null
|
||||
- modprobe evtchn 2>/dev/null
|
||||
- modprobe gntdev 2>/dev/null
|
||||
- modprobe netbk 2>/dev/null
|
||||
- modprobe blkbk 2>/dev/null
|
||||
- modprobe xen-scsibk 2>/dev/null
|
||||
- modprobe usbbk 2>/dev/null
|
||||
- modprobe pciback 2>/dev/null
|
||||
- modprobe xen-acpi-processor 2>/dev/null
|
||||
- modprobe blktap2 2>/dev/null || modprobe blktap 2>/dev/null
|
||||
+ #modprobe xen-evtchn 2>/dev/null
|
||||
+ #modprobe xen-gntdev 2>/dev/null
|
||||
+ #modprobe xen-gntalloc 2>/dev/null
|
||||
+ #modprobe xen-blkback 2>/dev/null
|
||||
+ #modprobe xen-netback 2>/dev/null
|
||||
+ #modprobe xen-pciback 2>/dev/null
|
||||
+ modprobe evtchn 2>/dev/null || true
|
||||
+ modprobe gntdev 2>/dev/null || true
|
||||
+ modprobe gntalloc 2>/dev/null || true
|
||||
+ modprobe netbk 2>/dev/null || true
|
||||
+ modprobe blkbk 2>/dev/null || true
|
||||
+ modprobe xen-scsibk 2>/dev/null || true
|
||||
+ modprobe usbbk 2>/dev/null || true
|
||||
+ modprobe pciback 2>/dev/null || true
|
||||
+ modprobe xen-acpi-processor 2>/dev/null || true
|
||||
+ modprobe blktap2 2>/dev/null || true
|
||||
+ modprobe blktap 2>/dev/null || true
|
||||
+ # xenblk (frontend module) is needed in dom0, allowing it to use vbds
|
||||
+ modprobe xenblk 2>/dev/null || true
|
||||
+ # support xl create pv guest with qcow/qcow2 disk image
|
||||
+ modprobe nbd max_part=8 2>/dev/null || true
|
||||
mkdir -p /var/run/xen
|
||||
|
||||
if ! `${BINDIR}/xenstore-read -s / >/dev/null 2>&1`
|
@ -1,26 +1,30 @@
|
||||
Index: xen-4.3.0-testing/tools/xenstore/Makefile
|
||||
---
|
||||
tools/xenstore/Makefile | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: xen-4.5.0-testing/tools/xenstore/Makefile
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/xenstore/Makefile
|
||||
+++ xen-4.3.0-testing/tools/xenstore/Makefile
|
||||
@@ -75,6 +75,7 @@ $(CLIENTS_DOMU): xenstore
|
||||
--- xen-4.5.0-testing.orig/tools/xenstore/Makefile
|
||||
+++ xen-4.5.0-testing/tools/xenstore/Makefile
|
||||
@@ -91,6 +91,7 @@ $(CLIENTS_DOMU): xenstore
|
||||
|
||||
xenstore: xenstore_client.o $(LIBXENSTORE)
|
||||
$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
+ $(CC) $(CFLAGS) $(LDFLAGS) -Wl,--build-id=uuid $< -L. -lxenstore $(SOCKET_LIBS) -o domu-$@
|
||||
$(CC) $< $(LDFLAGS) $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
+ $(CC) $< $(CFLAGS) $(LDFLAGS) -Wl,--build-id=uuid -L. -lxenstore $(SOCKET_LIBS) -o domu-$@
|
||||
|
||||
xenstore-control: xenstore_control.o $(LIBXENSTORE)
|
||||
$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
@@ -124,10 +125,11 @@ install: all
|
||||
$(CC) $< $(LDFLAGS) $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
@@ -141,10 +142,11 @@ endif
|
||||
$(INSTALL_PROG) xenstore-control $(DESTDIR)$(BINDIR)
|
||||
$(INSTALL_PROG) xenstore $(DESTDIR)$(BINDIR)
|
||||
set -e ; for c in $(CLIENTS) ; do \
|
||||
- ln -f $(DESTDIR)$(BINDIR)/xenstore $(DESTDIR)$(BINDIR)/$${c} ; \
|
||||
+ ln -fs /usr/bin/xenstore $(DESTDIR)/usr/bin/$${c} ; \
|
||||
+ ln -fs xenstore $(DESTDIR)/usr/bin/$${c} ; \
|
||||
done
|
||||
+ $(INSTALL_PROG) domu-xenstore $(DESTDIR)/bin
|
||||
for client in $(CLIENTS_DOMU); do \
|
||||
- $(INSTALL_PROG) $$client $(DESTDIR)/bin/$${client/domu-}; \
|
||||
+ ln -fs /bin/domu-xenstore $(DESTDIR)/bin/$${client/domu-}; \
|
||||
+ ln -fs domu-xenstore $(DESTDIR)/bin/$${client/domu-}; \
|
||||
done
|
||||
$(INSTALL_DIR) $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL_PROG) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL_SHLIB) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
|
||||
|
@ -1,11 +1,11 @@
|
||||
Index: xen-4.3.0-testing/tools/hotplug/Linux/xen-backend.rules
|
||||
Index: xen-4.5.0-testing/tools/hotplug/Linux/xen-backend.rules.in
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/hotplug/Linux/xen-backend.rules
|
||||
+++ xen-4.3.0-testing/tools/hotplug/Linux/xen-backend.rules
|
||||
--- xen-4.5.0-testing.orig/tools/hotplug/Linux/xen-backend.rules.in
|
||||
+++ xen-4.5.0-testing/tools/hotplug/Linux/xen-backend.rules.in
|
||||
@@ -12,4 +12,5 @@ KERNEL=="blktap-control", NAME="xen/blkt
|
||||
KERNEL=="gntdev", NAME="xen/%k", MODE="0600"
|
||||
KERNEL=="pci_iomul", NAME="xen/%k", MODE="0600"
|
||||
KERNEL=="tapdev[a-z]*", NAME="xen/blktap-2/tapdev%m", MODE="0600"
|
||||
-SUBSYSTEM=="net", KERNEL=="vif*-emu", ACTION=="add", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
|
||||
-SUBSYSTEM=="net", KERNEL=="vif*-emu", ACTION=="add", ENV{UDEV_CALL}="1", RUN+="@XEN_SCRIPT_DIR@/vif-setup $env{ACTION} type_if=tap"
|
||||
+SUBSYSTEM=="net", KERNEL=="vif*-emu", ACTION=="add", ENV{UDEV_CALL}="1", TEST=="/proc/xen" RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
|
||||
+KERNELS=="xen", KERNEL=="xvd*", SUBSYSTEM=="block", OPTIONS+="last_rule"
|
||||
|
@ -1,17 +1,13 @@
|
||||
Index: xen-4.4.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
Index: xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.4.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -97,9 +97,9 @@ case "$command" in
|
||||
--- xen-4.5.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -93,7 +93,7 @@ case "$command" in
|
||||
;;
|
||||
esac
|
||||
|
||||
-if [ "$type_if" = vif ]; then
|
||||
- handle_iptable
|
||||
-fi
|
||||
+#if [ "$type_if" = vif ]; then
|
||||
+# handle_iptable
|
||||
+#fi
|
||||
-handle_iptable
|
||||
+#handle_iptable
|
||||
|
||||
call_hooks vif post
|
||||
|
||||
|
@ -10,11 +10,11 @@ it from adding user-created taps to bridges.
|
||||
|
||||
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||
|
||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
Index: xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
===================================================================
|
||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -32,6 +32,13 @@
|
||||
--- xen-4.5.0-testing.orig/tools/hotplug/Linux/vif-bridge
|
||||
+++ xen-4.5.0-testing/tools/hotplug/Linux/vif-bridge
|
||||
@@ -28,6 +28,13 @@
|
||||
dir=$(dirname "$0")
|
||||
. "$dir/vif-common.sh"
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
Index: xen-4.4.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
Index: xen-4.5.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/xen/arch/x86/platform_hypercall.c
|
||||
+++ xen-4.4.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
--- xen-4.5.0-testing.orig/xen/arch/x86/platform_hypercall.c
|
||||
+++ xen-4.5.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
@@ -25,7 +25,7 @@
|
||||
#include <xen/irq.h>
|
||||
#include <asm/current.h>
|
||||
@ -11,7 +11,7 @@ Index: xen-4.4.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
#include <asm/edd.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/io_apic.h>
|
||||
@@ -601,6 +601,41 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PA
|
||||
@@ -760,6 +760,41 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PA
|
||||
}
|
||||
break;
|
||||
|
||||
@ -53,10 +53,10 @@ Index: xen-4.4.0-testing/xen/arch/x86/platform_hypercall.c
|
||||
default:
|
||||
ret = -ENOSYS;
|
||||
break;
|
||||
Index: xen-4.4.0-testing/xen/include/public/platform.h
|
||||
Index: xen-4.5.0-testing/xen/include/public/platform.h
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/xen/include/public/platform.h
|
||||
+++ xen-4.4.0-testing/xen/include/public/platform.h
|
||||
--- xen-4.5.0-testing.orig/xen/include/public/platform.h
|
||||
+++ xen-4.5.0-testing/xen/include/public/platform.h
|
||||
@@ -527,6 +527,16 @@ struct xenpf_core_parking {
|
||||
typedef struct xenpf_core_parking xenpf_core_parking_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t);
|
||||
@ -72,12 +72,12 @@ Index: xen-4.4.0-testing/xen/include/public/platform.h
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* ` enum neg_errnoval
|
||||
* ` HYPERVISOR_platform_op(const struct xen_platform_op*);
|
||||
@@ -553,6 +563,7 @@ struct xen_platform_op {
|
||||
struct xenpf_cpu_hotadd cpu_add;
|
||||
* Access generic platform resources(e.g., accessing MSR, port I/O, etc)
|
||||
* in unified way. Batch resource operations in one call are supported and
|
||||
@@ -587,6 +597,7 @@ struct xen_platform_op {
|
||||
struct xenpf_mem_hotadd mem_add;
|
||||
struct xenpf_core_parking core_parking;
|
||||
struct xenpf_resource_op resource_op;
|
||||
+ struct xenpf_get_cpu_freq get_cpu_freq;
|
||||
uint8_t pad[128];
|
||||
} u;
|
||||
|
@ -1,36 +0,0 @@
|
||||
Index: xen-4.3.0-testing/xen/arch/x86/domain.c
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/xen/arch/x86/domain.c
|
||||
+++ xen-4.3.0-testing/xen/arch/x86/domain.c
|
||||
@@ -151,15 +151,30 @@ void dump_pageframe_info(struct domain *
|
||||
|
||||
printk("Memory pages belonging to domain %u:\n", d->domain_id);
|
||||
|
||||
- if ( d->tot_pages >= 10 )
|
||||
+ if ( d->tot_pages >= 10 && d->is_dying < DOMDYING_dead )
|
||||
{
|
||||
printk(" DomPage list too long to display\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
+ unsigned long total[PGT_type_mask
|
||||
+ / (PGT_type_mask & -PGT_type_mask) + 1] = {};
|
||||
+
|
||||
spin_lock(&d->page_alloc_lock);
|
||||
page_list_for_each ( page, &d->page_list )
|
||||
{
|
||||
+ unsigned int index = (page->u.inuse.type_info & PGT_type_mask)
|
||||
+ / (PGT_type_mask & -PGT_type_mask);
|
||||
+
|
||||
+ if ( ++total[index] > 16 )
|
||||
+ {
|
||||
+ switch ( page->u.inuse.type_info & PGT_type_mask )
|
||||
+ {
|
||||
+ case PGT_none:
|
||||
+ case PGT_writable_page:
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
printk(" DomPage %p: caf=%08lx, taf=%" PRtype_info "\n",
|
||||
_p(page_to_mfn(page)),
|
||||
page->count_info, page->u.inuse.type_info);
|
@ -1,47 +0,0 @@
|
||||
Index: xen-4.4.0-testing/xen/arch/x86/x86_64/entry.S
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/xen/arch/x86/x86_64/entry.S
|
||||
+++ xen-4.4.0-testing/xen/arch/x86/x86_64/entry.S
|
||||
@@ -438,19 +438,30 @@ UNLIKELY_START(z, create_bounce_frame_ba
|
||||
__UNLIKELY_END(create_bounce_frame_bad_bounce_ip)
|
||||
movq %rax,UREGS_rip+8(%rsp)
|
||||
ret
|
||||
- _ASM_EXTABLE(.Lft2, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft3, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft4, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft5, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft6, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft7, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft8, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft9, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft10, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft11, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft12, dom_crash_sync_extable)
|
||||
- _ASM_EXTABLE(.Lft13, dom_crash_sync_extable)
|
||||
+ _ASM_EXTABLE(.Lft2, domain_crash_page_fault_32)
|
||||
+ _ASM_EXTABLE(.Lft3, domain_crash_page_fault_24)
|
||||
+ _ASM_EXTABLE(.Lft4, domain_crash_page_fault_8)
|
||||
+ _ASM_EXTABLE(.Lft5, domain_crash_page_fault_16)
|
||||
+ _ASM_EXTABLE(.Lft6, domain_crash_page_fault)
|
||||
+ _ASM_EXTABLE(.Lft7, domain_crash_page_fault)
|
||||
+ _ASM_EXTABLE(.Lft8, domain_crash_page_fault_24)
|
||||
+ _ASM_EXTABLE(.Lft9, domain_crash_page_fault_16)
|
||||
+ _ASM_EXTABLE(.Lft10, domain_crash_page_fault_8)
|
||||
+ _ASM_EXTABLE(.Lft11, domain_crash_page_fault)
|
||||
+ _ASM_EXTABLE(.Lft12, domain_crash_page_fault_8)
|
||||
+ _ASM_EXTABLE(.Lft13, domain_crash_page_fault)
|
||||
|
||||
+domain_crash_page_fault_32:
|
||||
+ addq $8,%rsi
|
||||
+domain_crash_page_fault_24:
|
||||
+ addq $8,%rsi
|
||||
+domain_crash_page_fault_16:
|
||||
+ addq $8,%rsi
|
||||
+domain_crash_page_fault_8:
|
||||
+ addq $8,%rsi
|
||||
+domain_crash_page_fault:
|
||||
+ movq %rsi,%rdi
|
||||
+ call show_page_walk
|
||||
ENTRY(dom_crash_sync_extable)
|
||||
# Get out of the guest-save area of the stack.
|
||||
GET_STACK_BASE(%rax)
|
@ -1,8 +1,10 @@
|
||||
Change default IO-APIC ack mode for single IO-APIC systems to old-style.
|
||||
|
||||
--- a/xen/arch/x86/io_apic.c
|
||||
+++ b/xen/arch/x86/io_apic.c
|
||||
@@ -2034,7 +2034,10 @@ void __init setup_IO_APIC(void)
|
||||
Index: xen-4.5.0-testing/xen/arch/x86/io_apic.c
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/xen/arch/x86/io_apic.c
|
||||
+++ xen-4.5.0-testing/xen/arch/x86/io_apic.c
|
||||
@@ -2035,7 +2035,10 @@ void __init setup_IO_APIC(void)
|
||||
io_apic_irqs = ~PIC_IRQS;
|
||||
|
||||
printk("ENABLING IO-APIC IRQs\n");
|
||||
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:57062330e02f3d4d2911bb184ed89717a007e8e276e5922a1e50d6e90e72662d
|
||||
size 4368624
|
3
xen-4.5.0-testing-src.tar.bz2
Normal file
3
xen-4.5.0-testing-src.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c06c55a820f55569918a2217164c175a8db9e623fd5a5cf22eeb10051891ef56
|
||||
size 4050263
|
@ -1,8 +1,8 @@
|
||||
Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
Index: xen-4.5.0-testing/tools/xenstore/Makefile
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/xenstore/Makefile
|
||||
+++ xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
@@ -10,6 +10,7 @@ CFLAGS += $(CFLAGS_libxenctrl)
|
||||
--- xen-4.5.0-testing.orig/tools/xenstore/Makefile
|
||||
+++ xen-4.5.0-testing/tools/xenstore/Makefile
|
||||
@@ -19,6 +19,7 @@ LDFLAGS += $(LDFLAGS-y)
|
||||
|
||||
CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm xenstore-chmod
|
||||
CLIENTS += xenstore-write xenstore-ls xenstore-watch
|
||||
@ -10,7 +10,7 @@ Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
|
||||
XENSTORED_OBJS = xenstored_core.o xenstored_watch.o xenstored_domain.o xenstored_transaction.o xs_lib.o talloc.o utils.o tdb.o hashtable.o
|
||||
|
||||
@@ -41,7 +42,7 @@ endif
|
||||
@@ -57,7 +58,7 @@ endif
|
||||
all: $(ALL_TARGETS)
|
||||
|
||||
.PHONY: clients
|
||||
@ -19,7 +19,7 @@ Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
|
||||
ifeq ($(CONFIG_SunOS),y)
|
||||
xenstored_probes.h: xenstored_probes.d
|
||||
@@ -69,6 +70,9 @@ xenstored.a: $(XENSTORED_OBJS)
|
||||
@@ -85,6 +86,9 @@ xenstored.a: $(XENSTORED_OBJS)
|
||||
$(CLIENTS): xenstore
|
||||
ln -f xenstore $@
|
||||
|
||||
@ -27,9 +27,9 @@ Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
+ ln -f xenstore $@
|
||||
+
|
||||
xenstore: xenstore_client.o $(LIBXENSTORE)
|
||||
$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
$(CC) $< $(LDFLAGS) $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(APPEND_LDFLAGS)
|
||||
|
||||
@@ -96,7 +100,7 @@ clean:
|
||||
@@ -112,7 +116,7 @@ clean:
|
||||
rm -f *.a *.o *.opic *.so* xenstored_probes.h
|
||||
rm -f xenstored xs_random xs_stress xs_crashme
|
||||
rm -f xs_tdb_dump xenstore-control init-xenstore-domain
|
||||
@ -38,15 +38,14 @@ Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
$(RM) $(DEPS)
|
||||
|
||||
.PHONY: TAGS
|
||||
@@ -113,6 +117,7 @@ install: all
|
||||
@@ -132,12 +136,16 @@ ifeq ($(XENSTORE_XENSTORED),y)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xenstore-compat
|
||||
+ $(INSTALL_DIR) $(DESTDIR)/bin
|
||||
$(INSTALL_DIR) $(DESTDIR)/var/run/xenstored
|
||||
$(INSTALL_DIR) $(DESTDIR)/var/lib/xenstored
|
||||
$(INSTALL_DIR) $(DESTDIR)$(XEN_LIB_STORED)
|
||||
$(INSTALL_PROG) xenstored $(DESTDIR)$(SBINDIR)
|
||||
@@ -121,6 +126,9 @@ install: all
|
||||
+ $(INSTALL_DIR) $(DESTDIR)/bin
|
||||
endif
|
||||
$(INSTALL_PROG) xenstore-control $(DESTDIR)$(BINDIR)
|
||||
$(INSTALL_PROG) xenstore $(DESTDIR)$(BINDIR)
|
||||
set -e ; for c in $(CLIENTS) ; do \
|
||||
ln -f $(DESTDIR)$(BINDIR)/xenstore $(DESTDIR)$(BINDIR)/$${c} ; \
|
||||
done
|
||||
@ -54,50 +53,5 @@ Index: xen-4.4.0-testing/tools/xenstore/Makefile
|
||||
+ $(INSTALL_PROG) $$client $(DESTDIR)/bin/$${client/domu-}; \
|
||||
+ done
|
||||
$(INSTALL_DIR) $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL_PROG) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL_SHLIB) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
|
||||
ln -sf libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenstore.so.$(MAJOR)
|
||||
Index: xen-4.4.0-testing/tools/hotplug/Linux/Makefile
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/hotplug/Linux/Makefile
|
||||
+++ xen-4.4.0-testing/tools/hotplug/Linux/Makefile
|
||||
@@ -46,14 +46,14 @@ install: all install-initd install-scrip
|
||||
.PHONY: install-initd
|
||||
install-initd:
|
||||
[ -d $(DESTDIR)$(INITD_DIR) ] || $(INSTALL_DIR) $(DESTDIR)$(INITD_DIR)
|
||||
- [ -d $(DESTDIR)$(SYSCONFIG_DIR) ] || $(INSTALL_DIR) $(DESTDIR)$(SYSCONFIG_DIR)
|
||||
+ [ -d $(DESTDIR)/var/adm/fillup-templates ] || $(INSTALL_DIR) $(DESTDIR)/var/adm/fillup-templates/
|
||||
ifeq ($(CONFIG_XEND),y)
|
||||
$(INSTALL_PROG) $(XEND_INITD) $(DESTDIR)$(INITD_DIR)
|
||||
endif
|
||||
$(INSTALL_PROG) $(XENDOMAINS_INITD) $(DESTDIR)$(INITD_DIR)
|
||||
- $(INSTALL_DATA) $(XENDOMAINS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xendomains
|
||||
+ $(INSTALL_DATA) $(XENDOMAINS_SYSCONFIG) $(DESTDIR)/var/adm/fillup-templates/
|
||||
$(INSTALL_PROG) $(XENCOMMONS_INITD) $(DESTDIR)$(INITD_DIR)
|
||||
- $(INSTALL_DATA) $(XENCOMMONS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xencommons
|
||||
+ $(INSTALL_DATA) $(XENCOMMONS_SYSCONFIG) $(DESTDIR)/var/adm/fillup-templates/
|
||||
$(INSTALL_PROG) init.d/xen-watchdog $(DESTDIR)$(INITD_DIR)
|
||||
|
||||
.PHONY: install-scripts
|
||||
Index: xen-4.4.0-testing/tools/firmware/etherboot/Makefile
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/firmware/etherboot/Makefile
|
||||
+++ xen-4.4.0-testing/tools/firmware/etherboot/Makefile
|
||||
@@ -28,12 +28,12 @@ all: $(ROMS)
|
||||
$(MAKE) -C $D/src bin/$(*F).rom
|
||||
|
||||
$T:
|
||||
- if ! $(FETCHER) _$T $(IPXE_TARBALL_URL); then \
|
||||
- $(GIT) clone $(IPXE_GIT_URL) $D.git; \
|
||||
- (cd $D.git && $(GIT) archive --format=tar --prefix=$D/ \
|
||||
- $(IPXE_GIT_TAG) | gzip >../_$T); \
|
||||
- rm -rf $D.git; \
|
||||
- fi
|
||||
+ #if ! $(FETCHER) _$T $(IPXE_TARBALL_URL); then \
|
||||
+ # $(GIT) clone $(IPXE_GIT_URL) $D.git; \
|
||||
+ # (cd $D.git && $(GIT) archive --format=tar --prefix=$D/ \
|
||||
+ # $(IPXE_GIT_TAG) | gzip >../_$T); \
|
||||
+ # rm -rf $D.git; \
|
||||
+ #fi
|
||||
mv _$T $T
|
||||
|
||||
$D/src/arch/i386/Makefile: $T Config
|
||||
|
@ -30,27 +30,6 @@ Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/net.c
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
Index: xen-4.2.3-testing/tools/python/xen/xend/image.py
|
||||
===================================================================
|
||||
--- xen-4.2.3-testing.orig/tools/python/xen/xend/image.py
|
||||
+++ xen-4.2.3-testing/tools/python/xen/xend/image.py
|
||||
@@ -912,11 +912,13 @@ class HVMImageHandler(ImageHandler):
|
||||
mac = devinfo.get('mac')
|
||||
if mac is None:
|
||||
raise VmError("MAC address not specified or generated.")
|
||||
- bridge = devinfo.get('bridge', 'xenbr0')
|
||||
+ bridge = devinfo.get('bridge', None)
|
||||
model = devinfo.get('model', 'rtl8139')
|
||||
ret.append("-net")
|
||||
- ret.append("nic,vlan=%d,macaddr=%s,model=%s" %
|
||||
- (nics, mac, model))
|
||||
+ net = "nic,vlan=%d,macaddr=%s,model=%s" % (nics, mac, model)
|
||||
+ if bridge:
|
||||
+ net += ",bridge=%s" % bridge
|
||||
+ ret.append(net)
|
||||
vifname = "vif%d.%d-emu" % (self.vm.getDomid(), nics-1)
|
||||
ret.append("-net")
|
||||
if osdep.tapif_script is not None:
|
||||
Index: xen-4.2.3-testing/tools/qemu-xen-traditional-dir-remote/i386-dm/qemu-ifup-Linux
|
||||
===================================================================
|
||||
--- xen-4.2.3-testing.orig/tools/qemu-xen-traditional-dir-remote/i386-dm/qemu-ifup-Linux
|
||||
|
@ -1,8 +1,8 @@
|
||||
Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
Index: xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -451,7 +451,7 @@ void xenstore_parse_domain_config(int hv
|
||||
--- xen-4.5.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
+++ xen-4.5.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
@@ -450,7 +450,7 @@ void xenstore_parse_domain_config(int hv
|
||||
char *buf = NULL;
|
||||
char *fpath = NULL, *bpath = NULL, *btype = NULL,
|
||||
*dev = NULL, *params = NULL, *drv = NULL;
|
||||
@ -11,7 +11,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
unsigned int len, num, hd_index, pci_devid = 0;
|
||||
BlockDriverState *bs;
|
||||
BlockDriver *format;
|
||||
@@ -535,12 +535,7 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -534,12 +534,7 @@ void xenstore_parse_domain_config(int hv
|
||||
continue;
|
||||
free(danger_type);
|
||||
danger_type = xs_read(xsh, XBT_NULL, danger_buf, &len);
|
||||
@ -25,7 +25,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
/* read the name of the device */
|
||||
if (pasprintf(&buf, "%s/type", bpath) == -1)
|
||||
continue;
|
||||
@@ -548,6 +543,35 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -547,6 +542,35 @@ void xenstore_parse_domain_config(int hv
|
||||
drv = xs_read(xsh, XBT_NULL, buf, &len);
|
||||
if (drv == NULL)
|
||||
continue;
|
||||
@ -61,7 +61,7 @@ Index: xen-4.4.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||
/* Obtain blktap sub-type prefix */
|
||||
if ((!strcmp(drv, "tap") || !strcmp(drv, "qdisk")) && params[0]) {
|
||||
char *offset = strchr(params, ':');
|
||||
@@ -665,6 +689,12 @@ void xenstore_parse_domain_config(int hv
|
||||
@@ -664,6 +688,12 @@ void xenstore_parse_domain_config(int hv
|
||||
format = &bdrv_host_device;
|
||||
else
|
||||
format = &bdrv_raw;
|
||||
|
177
xen-updown.sh
177
xen-updown.sh
@ -1,177 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
usage () {
|
||||
echo $@
|
||||
echo "usage: $0 [<config>] <interface> [-o <options>]"
|
||||
echo ""
|
||||
echo "Options are:"
|
||||
echo " debug : be verbose"
|
||||
echo " rc : indicates that we are called from rcnetwork"
|
||||
echo ""
|
||||
echo "Any another options are ignored"
|
||||
exit $R_USAGE
|
||||
}
|
||||
|
||||
xm_cmd="xm"
|
||||
pidof -x /usr/sbin/xend >/dev/null 2>&1 || xm_cmd="xl"
|
||||
|
||||
######################################################################
|
||||
# change the working direcory and source some common files
|
||||
#
|
||||
R_INTERNAL=1 # internal error, e.g. no config or missing scripts
|
||||
cd /etc/sysconfig/network || exit $R_INTERNAL
|
||||
test -f ./config && . ./config
|
||||
test -f scripts/functions && . scripts/functions || exit $R_INTERNAL
|
||||
|
||||
######################################################################
|
||||
# check arguments and how we are called (in case of links)
|
||||
#
|
||||
SCRIPTNAME=${0}
|
||||
debug $*
|
||||
case $1 in ""|-h|*help*) usage ;; esac
|
||||
CONFIG="$1"
|
||||
shift
|
||||
if [ "x$1" != x -a "x$1" != "x-o" ] ; then
|
||||
INTERFACE="$1"
|
||||
else
|
||||
INTERFACE="$CONFIG"
|
||||
fi
|
||||
shift
|
||||
test "x$1" = "x-o" && shift
|
||||
DEBUG=no
|
||||
RUN_FROM_RC=no
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
debug) DEBUG=yes ;;
|
||||
rc) RUN_FROM_RC=yes ;;
|
||||
*) debug unknown option $1 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# usage: ifprint <err_mesg|mesg|...> message....
|
||||
ifprint() {
|
||||
func=$1 ; shift
|
||||
test "x$func" = x && return 1
|
||||
if [ "$RUN_FROM_RC" = yes -a "$INTERFACE" != all ] ; then
|
||||
$func "`printf " %-9s " "$INTERFACE"`$*"
|
||||
else
|
||||
$func "$*"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# xen related code
|
||||
#
|
||||
|
||||
# check if xen is running
|
||||
is_xend_running() {
|
||||
test -x /etc/init.d/xend && \
|
||||
/etc/init.d/xend status &>/dev/null && return 0
|
||||
return 1
|
||||
}
|
||||
exit_if_xend_not_running() {
|
||||
is_xend_running || {
|
||||
debug "$0: xend is not running - nothing to do"
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
# (modified) functions from /etc/init.d/xendomains
|
||||
parseln()
|
||||
{
|
||||
name=${1:0:$((${#1}-36))}
|
||||
name=${name%% *}
|
||||
rest="${1: -36}"
|
||||
id=${rest:0:4}
|
||||
id=`echo $id`
|
||||
mem=${rest:4:6}
|
||||
mem=`echo $mem`
|
||||
vcpu=${rest:10:6}
|
||||
vcpu=`echo $vcpu`
|
||||
state=${rest:16:11}
|
||||
state=`echo $state`
|
||||
tm=${rest:27}
|
||||
tm=`echo $tm`
|
||||
}
|
||||
|
||||
xm_list()
|
||||
{
|
||||
TERM=vt100 ${xm_cmd} list | grep -v '^Name *ID'
|
||||
}
|
||||
|
||||
# For the specified vm, return a list of vifs that are connected to $INTERFACE
|
||||
list_vifs()
|
||||
{
|
||||
id=$1
|
||||
vifs=()
|
||||
for vif in $(ls -1 "/sys/class/net/$INTERFACE/brif/" 2>/dev/null) ; do
|
||||
eval BRIDGE_PORTS="" `grep "^[[:space:]]*BRIDGE_PORTS=" \
|
||||
"/etc/sysconfig/network/ifcfg-$INTERFACE" 2>/dev/null`
|
||||
for p in $BRIDGE_PORTS ; do
|
||||
test "x$p" = "x$vif" && continue 2
|
||||
done
|
||||
case $vif in
|
||||
(tap${id}\.*|vif${id}\.*)
|
||||
vifs=(${vifs[@]} ${vif})
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo "${vifs[@]}"
|
||||
}
|
||||
|
||||
# Write list of concerned vifs to state file
|
||||
save_sysconfig_state()
|
||||
{
|
||||
[ -d "${RUN_FILES_BASE}/xen/" ] || \
|
||||
mkdir -p "${RUN_FILES_BASE}/xen/" || return 1
|
||||
|
||||
rm -f "${RUN_FILES_BASE}/xen/$INTERFACE" && {
|
||||
echo "VIFS='${vifs[@]}'"
|
||||
} > "${RUN_FILES_BASE}/xen/$INTERFACE"
|
||||
}
|
||||
|
||||
case $SCRIPTNAME in
|
||||
*if-up.d*)
|
||||
exit_if_xend_not_running
|
||||
|
||||
if test -f "${RUN_FILES_BASE}/xen/$INTERFACE" ; then
|
||||
. "${RUN_FILES_BASE}/xen/$INTERFACE"
|
||||
|
||||
for vif in ${VIFS}; do
|
||||
test -d "/sys/class/net/${vif}" || continue
|
||||
test -d "/sys/class/net/${INTERFACE}/brif/${vif}" && \
|
||||
continue
|
||||
if ! is_iface_up ${vif} ; then
|
||||
ip link set dev ${vif} up || continue
|
||||
fi
|
||||
brctl addif ${INTERFACE} ${vif} &>/dev/null
|
||||
done
|
||||
|
||||
# remove sysconfig state
|
||||
rm -f "${RUN_FILES_BASE}/xen/$INTERFACE"
|
||||
fi
|
||||
;;
|
||||
*if-down.d*)
|
||||
exit_if_xend_not_running
|
||||
test -d "/sys/class/net/$INTERFACE/brif/" || exit 0
|
||||
|
||||
# Remember vifs attached to $INTERFACE
|
||||
vifs=()
|
||||
num=0
|
||||
while read LN; do
|
||||
parseln "$LN"
|
||||
[ "$id" = 0 ] && continue
|
||||
[ -z "$state" ] && continue
|
||||
|
||||
vifs=(${vifs[@]} $(list_vifs $id))
|
||||
done < <(xm_list)
|
||||
|
||||
[ -z "${vifs[*]}" ] || save_sysconfig_state
|
||||
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
|
@ -1,12 +0,0 @@
|
||||
[Unit]
|
||||
Description=Xen-watchdog - run xen watchdog daemon
|
||||
After=xend.service
|
||||
ConditionPathExists=/proc/xen
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStart=/usr/sbin/xenwatchdogd 30 15
|
||||
KillSignal=USR1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -1,317 +0,0 @@
|
||||
Change various example paths in the config files to match SUSE.
|
||||
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample1
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample1
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample1
|
||||
@@ -7,11 +7,17 @@
|
||||
#============================================================================
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
-# Kernel image file.
|
||||
-kernel = "/boot/vmlinuz-2.6.10-xenU"
|
||||
-
|
||||
-# Optional ramdisk.
|
||||
-#ramdisk = "/boot/initrd.gz"
|
||||
+# Kernel image file and (optional) ramdisk (initrd).
|
||||
+kernel = "/boot/vmlinuz-xen"
|
||||
+ramdisk = "/boot/initrd-xen"
|
||||
+
|
||||
+# Or use a bootloader instead of kernel/ramdisk to get the kernel from domU FS
|
||||
+# domUloader bootloader example:
|
||||
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
|
||||
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
|
||||
+# pygrub bootloader example:
|
||||
+#bootloader="/usr/bin/pygrub"
|
||||
+#bootargs=""
|
||||
|
||||
# The domain build function. Default is 'linux'.
|
||||
#builder='linux'
|
||||
@@ -49,11 +55,11 @@ name = "ExampleDomain"
|
||||
#
|
||||
# or optionally override backend, bridge, ip, mac, script, type, or vifname:
|
||||
#
|
||||
-# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=br0' ]
|
||||
#
|
||||
# or more than one interface may be configured:
|
||||
#
|
||||
-# vif = [ '', 'bridge=xenbr1' ]
|
||||
+# vif = [ '', 'bridge=br1' ]
|
||||
|
||||
vif = [ '' ]
|
||||
|
||||
@@ -117,7 +123,7 @@ disk = [ 'phy:hda1,hda1,w' ]
|
||||
#hostname= "vm%d" % vmid
|
||||
|
||||
# Set root device.
|
||||
-root = "/dev/hda1 ro"
|
||||
+root = "/dev/hda1"
|
||||
|
||||
# Root device for nfs.
|
||||
#root = "/dev/nfs"
|
||||
@@ -126,8 +132,8 @@ root = "/dev/hda1 ro"
|
||||
# Root directory on the nfs server.
|
||||
#nfs_root = '/full/path/to/root/directory'
|
||||
|
||||
-# Sets runlevel 4.
|
||||
-extra = "4"
|
||||
+# Extra arguments to pass to the kernel.
|
||||
+extra = ""
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Configure the behaviour when a domain exits. There are three 'reasons'
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample2
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample2
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample2
|
||||
@@ -35,11 +35,17 @@ xm_vars.var('vmid',
|
||||
xm_vars.check()
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
-# Kernel image file.
|
||||
-kernel = "/boot/vmlinuz-2.6.10-xenU"
|
||||
-
|
||||
-# Optional ramdisk.
|
||||
-#ramdisk = "/boot/initrd.gz"
|
||||
+# Kernel image file and (optional) ramdisk (initrd).
|
||||
+kernel = "/boot/vmlinuz-xen"
|
||||
+ramdisk = "/boot/initrd-xen"
|
||||
+
|
||||
+# Or use a bootloader instead of kernel/ramdisk to get the kernel from domU FS
|
||||
+# domUloader bootloader example:
|
||||
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
|
||||
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
|
||||
+# pygrub bootloader example:
|
||||
+#bootloader="/usr/bin/pygrub"
|
||||
+#bootargs=""
|
||||
|
||||
# The domain build function. Default is 'linux'.
|
||||
#builder='linux'
|
||||
@@ -80,11 +86,11 @@ vcpus = 4 # make your domain a 4-way
|
||||
#
|
||||
# or optionally override backend, bridge, ip, mac, script, type, or vifname:
|
||||
#
|
||||
-# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=br0' ]
|
||||
#
|
||||
# or more than one interface may be configured:
|
||||
#
|
||||
-# vif = [ '', 'bridge=xenbr1' ]
|
||||
+# vif = [ '', 'bridge=br1' ]
|
||||
|
||||
vif = [ '' ]
|
||||
|
||||
@@ -153,7 +159,7 @@ disk = [ 'phy:sda%d,sda1,w' % (7+vmid),
|
||||
#hostname= "vm%d" % vmid
|
||||
|
||||
# Set root device.
|
||||
-root = "/dev/sda1 ro"
|
||||
+root = "/dev/sda1"
|
||||
|
||||
# Root device for nfs.
|
||||
#root = "/dev/nfs"
|
||||
@@ -162,8 +168,8 @@ root = "/dev/sda1 ro"
|
||||
# Root directory on the nfs server.
|
||||
#nfs_root = '/full/path/to/root/directory'
|
||||
|
||||
-# Sets runlevel 4 and the device for /usr.
|
||||
-extra = "4 VMID=%d usr=/dev/sda6" % vmid
|
||||
+# Sets the device for /usr.
|
||||
+extra = "VMID=%d usr=/dev/sda6" % vmid
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Configure the behaviour when a domain exits. There are three 'reasons'
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample3
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample3
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample3
|
||||
@@ -35,11 +35,17 @@ xm_vars.var('vmid',
|
||||
xm_vars.check()
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
-# Kernel image file.
|
||||
-kernel = "/path/to/domU/kernel"
|
||||
+# Kernel image file and (optional) ramdisk (initrd).
|
||||
+kernel = "/boot/vmlinuz-xen"
|
||||
+ramdisk = "/boot/initrd-xen"
|
||||
|
||||
-# Optional ramdisk.
|
||||
-#ramdisk = "/boot/initrd.gz"
|
||||
+# Or use a bootloader instead of kernel/ramdisk to get the kernel from domU FS
|
||||
+# domUloader bootloader example:
|
||||
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
|
||||
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
|
||||
+# pygrub bootloader example:
|
||||
+#bootloader="/usr/bin/pygrub"
|
||||
+#bootargs=""
|
||||
|
||||
# The domain build function. Default is 'linux'.
|
||||
#builder='linux'
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample.hvm
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample.hvm
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample.hvm
|
||||
@@ -64,11 +64,26 @@ name = "ExampleHVMDomain"
|
||||
#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
|
||||
#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
|
||||
|
||||
-# Optionally define mac and/or bridge for the network interfaces.
|
||||
-# Random MACs are assigned if not given.
|
||||
-#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
|
||||
-# type=ioemu specify the NIC is an ioemu device not netfront
|
||||
-vif = [ 'type=ioemu, bridge=xenbr0' ]
|
||||
+#----------------------------------------------------------------------------
|
||||
+# Define network interfaces.
|
||||
+
|
||||
+# By default, no network interfaces are configured. You may have one created
|
||||
+# with sensible defaults using an empty vif clause:
|
||||
+#
|
||||
+# vif = [ '' ]
|
||||
+#
|
||||
+# or optionally override backend, bridge, ip, mac, script, type, model,
|
||||
+# or vifname.
|
||||
+#
|
||||
+# An emulated RealTek 8139 network interface can be configured with:
|
||||
+#
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, type=ioemu, model=rtl8139, bridge=br0' ]
|
||||
+#
|
||||
+# A para-virtual network interface can be configured with:
|
||||
+#
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, type=netfront, bridge=br0' ]
|
||||
+#
|
||||
+vif = [ '' ]
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Define the disk devices you want the domain to have access to, and
|
||||
@@ -78,7 +93,7 @@ vif = [ 'type=ioemu, bridge=xenbr0' ]
|
||||
# and MODE is r for read-only, w for read-write.
|
||||
|
||||
#disk = [ 'phy:hda1,hda1,r' ]
|
||||
-disk = [ 'file:/var/images/min-el3-i386.img,hda,w', ',hdc:cdrom,r' ]
|
||||
+disk = [ 'file:/var/lib/xen/images/disk.img,ioemu:hda,w', ',hdc:cdrom,r' ]
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Configure the behaviour when a domain exits. There are three 'reasons'
|
||||
Index: xen-4.3.0-testing/docs/man/xmdomain.cfg.pod.5
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/docs/man/xmdomain.cfg.pod.5
|
||||
+++ xen-4.3.0-testing/docs/man/xmdomain.cfg.pod.5
|
||||
@@ -38,13 +38,13 @@ file.
|
||||
|
||||
The kernel image for the domain. The format of the parameter is the
|
||||
fully qualified path to the kernel image file,
|
||||
-i.e. I</boot/vmlinuz-2.6.12-xenU>.
|
||||
+i.e. I</boot/vmlinuz-xen>.
|
||||
|
||||
|
||||
=item B<ramdisk>
|
||||
|
||||
The initial ramdisk for the domain. The format of the parameter is
|
||||
-the fully qualified path to the initrd, i.e. I</boot/initrd.gz>. On
|
||||
+the fully qualified path to the initrd, i.e. I</boot/initrd-xen>. On
|
||||
many Linux distros you will not need a ramdisk if using the default
|
||||
xen kernel.
|
||||
|
||||
@@ -321,14 +321,14 @@ configured. They should not be consider
|
||||
|
||||
=item I<A Loopback File as Root>
|
||||
|
||||
- kernel = "/boot/vmlinuz-2.6-xenU"
|
||||
+ kernel = "/boot/vmlinuz-xen"
|
||||
memory = 128
|
||||
name = "MyLinux"
|
||||
- root = "/dev/hda1 ro"
|
||||
- disk = [ "file:/var/xen/mylinux.img,hda1,w" ]
|
||||
+ root = "/dev/hda1"
|
||||
+ disk = [ "file:/var/lib/xen/images/MyLinux/hda1,hda1,w" ]
|
||||
|
||||
This creates a domain called MyLinux with 128 MB of memory using a
|
||||
-default xen kernel, and the file /var/xen/mylinux.img loopback mounted
|
||||
+default xen kernel, and the file hda1 loopback mounted
|
||||
at hda1, which is the root filesystem.
|
||||
|
||||
=item I<NFS Root>
|
||||
Index: xen-4.3.0-testing/docs/man/xm.pod.1
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/docs/man/xm.pod.1
|
||||
+++ xen-4.3.0-testing/docs/man/xm.pod.1
|
||||
@@ -165,8 +165,8 @@ soon as it is run.
|
||||
|
||||
=item I<without config file>
|
||||
|
||||
- xm create /dev/null ramdisk=initrd.img \
|
||||
- kernel=/boot/vmlinuz-2.6.12.6-xenU \
|
||||
+ xm create /dev/null ramdisk=initrd-xen \
|
||||
+ kernel=/boot/vmlinuz-xen \
|
||||
name=ramdisk vif='' vcpus=1 \
|
||||
memory=64 root=/dev/ram0
|
||||
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample.hvm-stubdom
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample.hvm-stubdom
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample.hvm-stubdom
|
||||
@@ -55,11 +55,26 @@ name = "xmexample.hvm"
|
||||
#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
|
||||
#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
|
||||
|
||||
-# Optionally define mac and/or bridge for the network interfaces.
|
||||
-# Random MACs are assigned if not given.
|
||||
-#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
|
||||
-# type=ioemu specify the NIC is an ioemu device not netfront
|
||||
-vif = [ 'type=ioemu, bridge=xenbr0' ]
|
||||
+#----------------------------------------------------------------------------
|
||||
+# Define network interfaces.
|
||||
+
|
||||
+# By default, no network interfaces are configured. You may have one created
|
||||
+# with sensible defaults using an empty vif clause:
|
||||
+#
|
||||
+# vif = [ '' ]
|
||||
+#
|
||||
+# or optionally override backend, bridge, ip, mac, script, type, model,
|
||||
+# or vifname.
|
||||
+#
|
||||
+# An emulated RealTek 8139 network interface can be configured with:
|
||||
+#
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, type=ioemu, model=rtl8139, bridge=br0' ]
|
||||
+#
|
||||
+# A para-virtual network interface can be configured with:
|
||||
+#
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, type=netfront, bridge=br0' ]
|
||||
+#
|
||||
+vif = [ '' ]
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Define the disk devices you want the domain to have access to, and
|
||||
Index: xen-4.3.0-testing/tools/examples/xmexample.pv-grub
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/tools/examples/xmexample.pv-grub
|
||||
+++ xen-4.3.0-testing/tools/examples/xmexample.pv-grub
|
||||
@@ -53,11 +53,11 @@ name = "ExampleDomain"
|
||||
#
|
||||
# or optionally override backend, bridge, ip, mac, script, type, or vifname:
|
||||
#
|
||||
-# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
|
||||
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=br0' ]
|
||||
#
|
||||
# or more than one interface may be configured:
|
||||
#
|
||||
-# vif = [ '', 'bridge=xenbr1' ]
|
||||
+# vif = [ '', 'bridge=br1' ]
|
||||
|
||||
vif = [ '' ]
|
||||
|
||||
Index: xen-4.3.0-testing/docs/man/xl.pod.1
|
||||
===================================================================
|
||||
--- xen-4.3.0-testing.orig/docs/man/xl.pod.1
|
||||
+++ xen-4.3.0-testing/docs/man/xl.pod.1
|
||||
@@ -12,7 +12,8 @@ The B<xl> program is the new tool for ma
|
||||
domains. The program can be used to create, pause, and shutdown
|
||||
domains. It can also be used to list current domains, enable or pin
|
||||
VCPUs, and attach or detach virtual block devices.
|
||||
-The old B<xm> tool is deprecated and should not be used.
|
||||
+The B<xm> tool continues to be supported on SLE11 platforms
|
||||
+and should still be used.
|
||||
|
||||
The basic structure of every B<xl> command is almost always:
|
||||
|
31
xen.build-compare.doc_html.patch
Normal file
31
xen.build-compare.doc_html.patch
Normal file
@ -0,0 +1,31 @@
|
||||
The result of $(wildcard *) is random.
|
||||
Sort input files to reduce build-compare noise.
|
||||
|
||||
---
|
||||
docs/Makefile | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
Index: xen-4.5.0-testing/docs/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/docs/Makefile
|
||||
+++ xen-4.5.0-testing/docs/Makefile
|
||||
@@ -110,7 +110,7 @@ install-html: html txt figs
|
||||
install: install-man-pages install-html
|
||||
|
||||
html/index.html: $(DOC_HTML) $(CURDIR)/gen-html-index INDEX
|
||||
- $(PERL) -w -- $(CURDIR)/gen-html-index -i INDEX html $(DOC_HTML)
|
||||
+ $(PERL) -w -- $(CURDIR)/gen-html-index -i INDEX html $(sort $(DOC_HTML))
|
||||
|
||||
html/%.html: %.markdown
|
||||
$(INSTALL_DIR) $(@D)
|
||||
@@ -152,8 +152,8 @@ html/hypercall/%/index.html: $(CURDIR)/x
|
||||
$(INSTALL_DIR) $(@D)
|
||||
$(PERL) -w $(CURDIR)/xen-headers -O $(@D) \
|
||||
-T 'arch-$* - Xen public headers' \
|
||||
- $(patsubst %,-X arch-%,$(filter-out $*,$(DOC_ARCHES))) \
|
||||
- $(patsubst %,-X xen-%,$(filter-out $*,$(DOC_ARCHES))) \
|
||||
+ $(sort $(patsubst %,-X arch-%,$(filter-out $*,$(DOC_ARCHES)))) \
|
||||
+ $(sort $(patsubst %,-X xen-%,$(filter-out $*,$(DOC_ARCHES)))) \
|
||||
$(EXTRA_EXCLUDE) \
|
||||
$(XEN_ROOT)/xen include/public include/xen/errno.h
|
||||
|
40
xen.build-compare.ipxe.patch
Normal file
40
xen.build-compare.ipxe.patch
Normal file
@ -0,0 +1,40 @@
|
||||
The result of $(wildcard *) is random.
|
||||
Sort input files to reduce build-compare noise.
|
||||
---
|
||||
tools/firmware/etherboot/patches/build-compare.patch | 19 +++++++++++++++++++
|
||||
tools/firmware/etherboot/patches/series | 1 +
|
||||
2 files changed, 20 insertions(+)
|
||||
|
||||
Index: xen-4.5.0-testing/tools/firmware/etherboot/patches/build-compare.patch
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.5.0-testing/tools/firmware/etherboot/patches/build-compare.patch
|
||||
@@ -0,0 +1,19 @@
|
||||
+The result of $(wildcard *) is random.
|
||||
+Sort input files to reduce build-compare noise.
|
||||
+---
|
||||
+ ipxe/src/Makefile.housekeeping | 2 +-
|
||||
+ 1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
+
|
||||
+Index: ipxe/src/Makefile.housekeeping
|
||||
+===================================================================
|
||||
+--- ipxe/src/Makefile.housekeeping
|
||||
++++ ipxe/src/Makefile.housekeeping
|
||||
+@@ -773,7 +773,7 @@ BLIB = $(BIN)/blib.a
|
||||
+ $(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS)
|
||||
+ $(Q)$(RM) $(BLIB)
|
||||
+ $(QM)$(ECHO) " [AR] $@"
|
||||
+- $(Q)$(AR) r $@ $(BLIB_OBJS)
|
||||
++ $(Q)$(AR) r $@ $(sort $(BLIB_OBJS))
|
||||
+ $(Q)$(RANLIB) $@
|
||||
+ blib : $(BLIB)
|
||||
+
|
||||
Index: xen-4.5.0-testing/tools/firmware/etherboot/patches/series
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/firmware/etherboot/patches/series
|
||||
+++ xen-4.5.0-testing/tools/firmware/etherboot/patches/series
|
||||
@@ -2,3 +2,4 @@ boot_prompt_option.patch
|
||||
build_fix_1.patch
|
||||
build_fix_2.patch
|
||||
build_fix_3.patch
|
||||
+build-compare.patch
|
18
xen.build-compare.man.patch
Normal file
18
xen.build-compare.man.patch
Normal file
@ -0,0 +1,18 @@
|
||||
Having just X.Y as version in the man pages is enough.
|
||||
---
|
||||
docs/Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.5.0-testing/docs/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/docs/Makefile
|
||||
+++ xen-4.5.0-testing/docs/Makefile
|
||||
@@ -2,7 +2,7 @@ XEN_ROOT=$(CURDIR)/..
|
||||
include $(XEN_ROOT)/Config.mk
|
||||
-include $(XEN_ROOT)/config/Docs.mk
|
||||
|
||||
-VERSION := $(shell $(MAKE) -C $(XEN_ROOT)/xen --no-print-directory xenversion)
|
||||
+VERSION := $(shell $(MAKE) -C $(XEN_ROOT)/xen --no-print-directory xenversion | cut -f -2 -d .)
|
||||
|
||||
DOC_ARCHES := arm x86_32 x86_64
|
||||
|
34
xen.build-compare.mini-os.patch
Normal file
34
xen.build-compare.mini-os.patch
Normal file
@ -0,0 +1,34 @@
|
||||
The result of $(wildcard *) is random.
|
||||
Sort input files to reduce build-compare noise.
|
||||
|
||||
---
|
||||
extras/mini-os/Makefile | 2 +-
|
||||
extras/mini-os/arch/x86/Makefile | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: xen-4.5.0-testing/extras/mini-os/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/extras/mini-os/Makefile
|
||||
+++ xen-4.5.0-testing/extras/mini-os/Makefile
|
||||
@@ -158,7 +158,7 @@ endif
|
||||
|
||||
$(OBJ_DIR)/lwip.a: $(LWO)
|
||||
$(RM) $@
|
||||
- $(AR) cqs $@ $^
|
||||
+ $(AR) cqs $@ $(sort $^)
|
||||
|
||||
OBJS += $(OBJ_DIR)/lwip.a
|
||||
endif
|
||||
Index: xen-4.5.0-testing/extras/mini-os/arch/x86/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/extras/mini-os/arch/x86/Makefile
|
||||
+++ xen-4.5.0-testing/extras/mini-os/arch/x86/Makefile
|
||||
@@ -24,7 +24,7 @@ all: $(OBJ_DIR)/$(ARCH_LIB)
|
||||
# $(HEAD_ARCH_OBJ) is only build here, needed on linking
|
||||
# in ../../Makefile.
|
||||
$(OBJ_DIR)/$(ARCH_LIB): $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ)
|
||||
- $(AR) rv $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS)
|
||||
+ $(AR) rv $(OBJ_DIR)/$(ARCH_LIB) $(sort $(ARCH_OBJS))
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ)
|
22
xen.build-compare.seabios.patch
Normal file
22
xen.build-compare.seabios.patch
Normal file
@ -0,0 +1,22 @@
|
||||
Use stable strings to reduce build-compare noise.
|
||||
---
|
||||
tools/firmware/seabios-dir-remote/tools/buildversion.sh | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
Index: xen-4.5.0-testing/tools/firmware/seabios-dir-remote/tools/buildversion.sh
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/firmware/seabios-dir-remote/tools/buildversion.sh
|
||||
+++ xen-4.5.0-testing/tools/firmware/seabios-dir-remote/tools/buildversion.sh
|
||||
@@ -11,7 +11,12 @@ elif [ -f .version ]; then
|
||||
else
|
||||
VERSION="?"
|
||||
fi
|
||||
+if test -n "${SEABIOS_DATE}"
|
||||
+then
|
||||
+ VERSION="${SEABIOS_DATE}"
|
||||
+else
|
||||
VERSION="${VERSION}-`date +"%Y%m%d_%H%M%S"`-`hostname`"
|
||||
+fi
|
||||
echo "Version: ${VERSION}"
|
||||
|
||||
# Build header file
|
26
xen.build-compare.smbiosdate.patch
Normal file
26
xen.build-compare.smbiosdate.patch
Normal file
@ -0,0 +1,26 @@
|
||||
Use stable strings to reduce build-compare noise.
|
||||
---
|
||||
tools/firmware/hvmloader/Makefile | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.5.0-testing/tools/firmware/hvmloader/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/firmware/hvmloader/Makefile
|
||||
+++ xen-4.5.0-testing/tools/firmware/hvmloader/Makefile
|
||||
@@ -25,6 +25,7 @@ SUBDIRS := acpi
|
||||
|
||||
# The HVM loader is started in 32-bit mode at the address below:
|
||||
LOADADDR = 0x100000
|
||||
+SMBIOS_DATE ?= $(shell date +%m/%d/%Y)
|
||||
|
||||
CFLAGS += $(CFLAGS_xeninclude)
|
||||
|
||||
@@ -88,7 +89,7 @@ all: subdirs-all
|
||||
$(MAKE) hvmloader
|
||||
|
||||
ovmf.o rombios.o seabios.o hvmloader.o: roms.inc
|
||||
-smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(shell date +%m/%d/%Y)\""
|
||||
+smbios.o: CFLAGS += -D__SMBIOS_DATE__="$(SMBIOS_DATE)"
|
||||
|
||||
hvmloader: $(OBJS) acpi/acpi.a
|
||||
$(LD) $(LDFLAGS_DIRECT) -N -Ttext $(LOADADDR) -o hvmloader.tmp $^
|
17
xen.build-compare.vgabios.patch
Normal file
17
xen.build-compare.vgabios.patch
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
tools/firmware/vgabios/Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: xen-4.5.0-testing/tools/firmware/vgabios/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/tools/firmware/vgabios/Makefile
|
||||
+++ xen-4.5.0-testing/tools/firmware/vgabios/Makefile
|
||||
@@ -5,7 +5,7 @@ BCC = bcc
|
||||
AS86 = as86
|
||||
|
||||
RELEASE = `pwd | sed "s-.*/--"`
|
||||
-RELDATE = `date '+%d %b %Y'`
|
||||
+RELDATE ?= `date '+%d %b %Y'`
|
||||
RELVERS = `pwd | sed "s-.*/--" | sed "s/vgabios//" | sed "s/-//"`
|
||||
|
||||
VGABIOS_DATE = "-DVGABIOS_DATE=\"$(RELDATE)\""
|
30
xen.build-compare.xen_compile_h.patch
Normal file
30
xen.build-compare.xen_compile_h.patch
Normal file
@ -0,0 +1,30 @@
|
||||
Use stable strings to reduce build-compare noise.
|
||||
Index: xen-4.5.0-testing/xen/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/xen/Makefile
|
||||
+++ xen-4.5.0-testing/xen/Makefile
|
||||
@@ -8,6 +8,9 @@ export XEN_FULLVERSION = $(XEN_VERSION
|
||||
|
||||
export XEN_WHOAMI ?= $(USER)
|
||||
export XEN_DOMAIN ?= $(shell ([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown]))
|
||||
+export XEN_BUILD_DATE ?= $(shell LC_ALL=C date)
|
||||
+export XEN_BUILD_TIME ?= $(shell LC_ALL=C date +%T)
|
||||
+export XEN_BUILD_HOST ?= $(shell hostname)
|
||||
|
||||
export BASEDIR := $(CURDIR)
|
||||
export XEN_ROOT := $(BASEDIR)/..
|
||||
@@ -126,11 +129,11 @@ delete-unfresh-files:
|
||||
|
||||
# compile.h contains dynamic build info. Rebuilt on every 'make' invocation.
|
||||
include/xen/compile.h: include/xen/compile.h.in .banner
|
||||
- @sed -e 's/@@date@@/$(shell LC_ALL=C date)/g' \
|
||||
- -e 's/@@time@@/$(shell LC_ALL=C date +%T)/g' \
|
||||
+ @sed -e 's/@@date@@/$(XEN_BUILD_DATE)/g' \
|
||||
+ -e 's/@@time@@/$(XEN_BUILD_TIME)/g' \
|
||||
-e 's/@@whoami@@/$(XEN_WHOAMI)/g' \
|
||||
-e 's/@@domain@@/$(XEN_DOMAIN)/g' \
|
||||
- -e 's/@@hostname@@/$(shell hostname)/g' \
|
||||
+ -e 's/@@hostname@@/$(XEN_BUILD_HOST)/g' \
|
||||
-e 's!@@compiler@@!$(shell $(CC) $(CFLAGS) --version 2>&1 | head -1)!g' \
|
||||
-e 's/@@version@@/$(XEN_VERSION)/g' \
|
||||
-e 's/@@subversion@@/$(XEN_SUBVERSION)/g' \
|
228
xen.changes
228
xen.changes
@ -1,8 +1,229 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 14 10:47:43 MST 2015 - carnold@suse.com
|
||||
|
||||
- Update to Xen 4.5.0 FCS
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 14 16:54:24 UTC 2015 - ohering@suse.de
|
||||
|
||||
- Include systemd presets in 13.2 and older
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jan 12 14:49:23 UTC 2015 - ohering@suse.de
|
||||
|
||||
- bnc#897352 - Enable xencommons/xendomains only during fresh install
|
||||
- disable restart on upgrade because the toolstack is not restartable
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Dec 16 11:42:30 UTC 2014 - ohering@suse.de
|
||||
|
||||
- adjust seabios, vgabios, stubdom and hvmloader build to reduce
|
||||
build-compare noise
|
||||
xen.build-compare.mini-os.patch
|
||||
xen.build-compare.smbiosdate.patch
|
||||
xen.build-compare.ipxe.patch
|
||||
xen.build-compare.vgabios.patch
|
||||
xen.build-compare.seabios.patch
|
||||
xen.build-compare.man.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Dec 15 11:36:42 MST 2014 - carnold@suse.com
|
||||
|
||||
- Update to Xen 4.5.0 RC4
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 10 08:54:22 UTC 2014 - ohering@suse.de
|
||||
|
||||
- Remove xend specific if-up scripts
|
||||
Recording bridge slaves is a generic task which should be handled
|
||||
by generic network code
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Dec 9 18:33:51 UTC 2014 - ohering@suse.de
|
||||
|
||||
- Use systemd features from upstream
|
||||
requires updated systemd-presets-branding package
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Dec 4 11:59:29 MST 2014 - carnold@suse.com
|
||||
|
||||
- Update to Xen 4.5.0 RC3
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Dec 4 11:44:24 UTC 2014 - ohering@suse.de
|
||||
|
||||
- Set GIT, WGET and FTP to /bin/false
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 3 12:14:27 UTC 2014 - ohering@suse.de
|
||||
|
||||
- Use new configure features instead of make variables
|
||||
xen.stubdom.newlib.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Nov 19 17:10:51 UTC 2014 - ohering@suse.de
|
||||
|
||||
- adjust docs and xen build to reduce build-compare noise
|
||||
xen.build-compare.doc_html.patch
|
||||
xen.build-compare.xen_compile_h.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 17 16:28:13 UTC 2014 - ohering@suse.de
|
||||
|
||||
- Drop trailing B_CNT from XEN_EXTRAVERSION to reduce build-compare noise
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Nov 11 11:15:30 MST 2014 - carnold@suse.com
|
||||
|
||||
- Update to Xen 4.5.0 RC2
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Oct 23 18:34:55 MDT 2014 - carnold@suse.com
|
||||
|
||||
- Update to Xen 4.5.0 RC1
|
||||
xen-4.5.0-testing-src.tar.bz2
|
||||
- Remove all patches now contained in the new tarball
|
||||
xen-4.4.1-testing-src.tar.bz2
|
||||
5315a3bb-x86-don-t-propagate-acpi_skip_timer_override-do-Dom0.patch
|
||||
5315a43a-x86-ACPI-also-print-address-space-for-PM1x-fields.patch
|
||||
53299d8f-xenconsole-reset-tty-on-failure.patch
|
||||
53299d8f-xenconsole-tolerate-tty-errors.patch
|
||||
5346a7a0-x86-AMD-support-further-feature-masking-MSRs.patch
|
||||
53563ea4-x86-MSI-drop-workaround-for-insecure-Dom0-kernels.patch
|
||||
537c9c77-libxc-check-return-values-on-mmap-and-madvise.patch
|
||||
537cd0b0-hvmloader-also-cover-PCI-MMIO-ranges-above-4G-with-UC-MTRR-ranges.patch
|
||||
537cd0cc-hvmloader-PA-range-0xfc000000-0xffffffff-should-be-UC.patch
|
||||
539ebe62-x86-EFI-improve-boot-time-diagnostics.patch
|
||||
53aac342-x86-HVM-consolidate-and-sanitize-CR4-guest-reserved-bit-determination.patch
|
||||
53c9151b-Fix-xl-vncviewer-accesses-port-0-by-any-invalid-domid.patch
|
||||
53d124e7-fix-list_domain_details-check-config-data-length-0.patch
|
||||
53dba447-x86-ACPI-allow-CMOS-RTC-use-even-when-ACPI-says-there-is-none.patch
|
||||
53df727b-x86-HVM-extend-LAPIC-shortcuts-around-P2M-lookups.patch
|
||||
53e8be5f-x86-vHPET-use-rwlock-instead-of-simple-one.patch
|
||||
53f737b1-VMX-fix-DebugCtl-MSR-clearing.patch
|
||||
53f7386d-x86-irq-process-softirqs-in-irq-keyhandlers.patch
|
||||
53fcebab-xen-pass-kernel-initrd-to-qemu.patch
|
||||
53ff3659-x86-consolidate-boolean-inputs-in-hvm-and-p2m.patch
|
||||
53ff36ae-x86-hvm-treat-non-insn-fetch-NPF-also-as-read-violations.patch
|
||||
53ff36d5-x86-mem_event-deliver-gla-fault-EPT-violation-information.patch
|
||||
53ff3716-x86-ats-Disable-Address-Translation-Services-by-default.patch
|
||||
53ff3899-x86-NMI-allow-processing-unknown-NMIs-with-watchdog.patch
|
||||
54005472-EPT-utilize-GLA-GPA-translation-known-for-certain-faults.patch
|
||||
540effe6-evtchn-check-control-block-exists-when-using-FIFO-based-events.patch
|
||||
540f2624-x86-idle-add-barriers-to-CLFLUSH-workaround.patch
|
||||
541825dc-VMX-don-t-leave-x2APIC-MSR-intercepts-disabled.patch
|
||||
541ad385-x86-suppress-event-check-IPI-to-MWAITing-CPUs.patch
|
||||
541ad3ca-x86-HVM-batch-vCPU-wakeups.patch
|
||||
541ad81a-VT-d-suppress-UR-signaling-for-further-desktop-chipsets.patch
|
||||
54216833-x86-shadow-fix-race-when-sampling-dirty-vram-state.patch
|
||||
54216882-x86-emulate-check-cpl-for-all-privileged-instructions.patch
|
||||
542168ae-x86emul-only-emulate-swint-injection-for-real-mode.patch
|
||||
54228a37-x86-EFI-fix-freeing-of-uninitialized-pointer.patch
|
||||
5423e61c-x86emul-fix-SYSCALL-SYSENTER-SYSEXIT-emulation.patch
|
||||
5424057f-x86-HVM-fix-miscellaneous-aspects-of-x2APIC-emulation.patch
|
||||
542405b4-x86-HVM-fix-ID-handling-of-x2APIC-emulation.patch
|
||||
542bf997-x86-HVM-properly-bound-x2APIC-MSR-range.patch
|
||||
54325cc0-x86-MSI-fix-MSI-X-case-of-freeing-IRQ.patch
|
||||
54325d2f-x86-restore-reserving-of-IO-APIC-pages-in-XENMEM_machine_memory_map-output.patch
|
||||
54325d95-don-t-allow-Dom0-access-to-IOMMUs-MMIO-pages.patch
|
||||
54325ecc-AMD-guest_iommu-properly-disable-guest-iommu-support.patch
|
||||
54325f3c-x86-paging-make-log-dirty-operations-preemptible.patch
|
||||
54379e6d-x86-vlapic-don-t-silently-accept-bad-vectors.patch
|
||||
CVE-2013-4540-qemu.patch qemu-support-xen-hvm-direct-kernel-boot.patch
|
||||
qemu-xen-upstream-blkif-discard.patch change-vnc-passwd.patch
|
||||
libxc-pass-errno-to-callers-of-xc_domain_save.patch
|
||||
libxl.honor-more-top-level-vfb-options.patch
|
||||
libxl.add-option-for-discard-support-to-xl-disk-conf.patch
|
||||
libxl.introduce-an-option-to-disable-the-non-O_DIRECT-workaround.patch
|
||||
x86-dom-print.patch x86-extra-trap-info.patch tmp-initscript-modprobe.patch tmp_build.patch
|
||||
xl-check-for-libvirt-managed-domain.patch
|
||||
- Xend/xm is no longer supported and is not part of the upstream code. Remove
|
||||
all xend/xm specific patches, configs, and scripts
|
||||
xen-xmexample.patch bridge-opensuse.patch xmexample.disks xmclone.sh
|
||||
init.xend xend-relocation.sh xend.service xend-relocation-server.fw
|
||||
domUloader.py xmexample.domUloader xmexample.disks
|
||||
bridge-vlan.patch bridge-bonding.patch bridge-record-creation.patch
|
||||
network-nat-open-SuSEfirewall2-FORWARD.patch
|
||||
xend-set-migration-constraints-from-cmdline.patch
|
||||
xen.migrate.tools-xend_move_assert_to_exception_block.patch
|
||||
xend-pvscsi-recognize-also-SCSI-CDROM-devices.patch
|
||||
xend-config.patch xend-max-free-mem.patch xend-hvm-default-pae.patch
|
||||
xend-vif-route-ifup.patch xend-xenapi-console-protocol.patch xend-core-dump-loc.patch
|
||||
xend-xen-api-auth.patch xend-checkpoint-rename.patch xend-xm-save-check-file.patch
|
||||
xend-xm-create-xflag.patch xend-domu-usb-controller.patch xend-devid-or-name.patch
|
||||
xend-migration-domname-fix.patch xend-del_usb_xend_entry.patch xend-xen-domUloader.patch
|
||||
xend-multi-xvdp.patch xend-check_device_status.patch xend-change_home_server.patch
|
||||
xend-minimum-restart-time.patch xend-disable-internal-logrotate.patch xend-config-enable-dump-comment.patch
|
||||
xend-tools-watchdog-support.patch xend-console-port-restore.patch xend-vcpu-affinity-fix.patch
|
||||
xend-migration-bridge-check.patch xend-managed-pci-device.patch xend-hvm-firmware-passthrough.patch
|
||||
xend-cpuinfo-model-name.patch xend-xm-reboot-fix.patch xend-domain-lock.patch
|
||||
xend-domain-lock-sfex.patch xend-32on64-extra-mem.patch xend-hv_extid_compatibility.patch
|
||||
xend-xenpaging.autostart.patch xend-remove-xm-deprecation-warning.patch libxen_permissive.patch
|
||||
tmp-initscript-modprobe.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Oct 16 14:17:37 MDT 2014 - carnold@suse.com
|
||||
|
||||
- bnc#901317 - L3: increase limit domUloader to 32MB
|
||||
domUloader.py
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 14 09:16:37 MDT 2014 - carnold@suse.com
|
||||
|
||||
- bnc#898772 - SLES 12 RC3 - XEN Host crashes when assigning non-VF
|
||||
device (SR-IOV) to guest
|
||||
54325cc0-x86-MSI-fix-MSI-X-case-of-freeing-IRQ.patch
|
||||
- bnc#882089 - Windows 2012 R2 fails to boot up with greater than
|
||||
60 vcpus
|
||||
54325ecc-AMD-guest_iommu-properly-disable-guest-iommu-support.patch
|
||||
- bnc#826717 - VUL-0: CVE-2013-3495: XSA-59: xen: Intel VT-d
|
||||
Interrupt Remapping engines can be evaded by native NMI interrupts
|
||||
541ad81a-VT-d-suppress-UR-signaling-for-further-desktop-chipsets.patch
|
||||
- Upstream patches from Jan
|
||||
540effe6-evtchn-check-control-block-exists-when-using-FIFO-based-events.patch (Replaces xsa107.patch)
|
||||
54216833-x86-shadow-fix-race-when-sampling-dirty-vram-state.patch (Replaces xsa104.patch)
|
||||
54216882-x86-emulate-check-cpl-for-all-privileged-instructions.patch (Replaces xsa105.patch)
|
||||
542168ae-x86emul-only-emulate-swint-injection-for-real-mode.patch (Replaces xsa106.patch)
|
||||
54228a37-x86-EFI-fix-freeing-of-uninitialized-pointer.patch
|
||||
5423e61c-x86emul-fix-SYSCALL-SYSENTER-SYSEXIT-emulation.patch
|
||||
5424057f-x86-HVM-fix-miscellaneous-aspects-of-x2APIC-emulation.patch
|
||||
542405b4-x86-HVM-fix-ID-handling-of-x2APIC-emulation.patch
|
||||
542bf997-x86-HVM-properly-bound-x2APIC-MSR-range.patch (Replaces xsa108.patch)
|
||||
54325d2f-x86-restore-reserving-of-IO-APIC-pages-in-XENMEM_machine_memory_map-output.patch
|
||||
54325d95-don-t-allow-Dom0-access-to-IOMMUs-MMIO-pages.patch
|
||||
54325f3c-x86-paging-make-log-dirty-operations-preemptible.patch (Replaces xsa97.patch)
|
||||
54379e6d-x86-vlapic-don-t-silently-accept-bad-vectors.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Oct 11 08:38:36 UTC 2014 - dmueller@suse.com
|
||||
|
||||
- restrict requires on grub2-x86_64-xen to x86_64 hosts
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Oct 8 15:25:34 MDT 2014 - jfehlig@suse.com
|
||||
|
||||
- bsc#900292 - xl: change default dump directory
|
||||
xl-coredump-file-location.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 03 15:42:36 MDT 2014 - mlatimer@suse.com
|
||||
|
||||
- Update xen2libvirt.py to better detect and handle file formats
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Sep 30 12:11:36 MDT 2014 - carnold@suse.com
|
||||
|
||||
- bnc#889526 - VUL-0: CVE-2014-5146, CVE-2014-5149: xen: XSA-97
|
||||
Long latency virtual-mmu operations are not preemptible
|
||||
xsa97.patch
|
||||
- bnc#882089 - Windows 2012 R2 fails to boot up with greater than
|
||||
60 vcpus
|
||||
541ad385-x86-suppress-event-check-IPI-to-MWAITing-CPUs.patch
|
||||
541ad3ca-x86-HVM-batch-vCPU-wakeups.patch
|
||||
- Upstream patches from Jan
|
||||
540f2624-x86-idle-add-barriers-to-CLFLUSH-workaround.patch
|
||||
541825dc-VMX-don-t-leave-x2APIC-MSR-intercepts-disabled.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Sep 30 09:01:16 MDT 2014 - carnold@suse.com
|
||||
|
||||
@ -10,6 +231,13 @@ Tue Sep 30 09:01:16 MDT 2014 - carnold@suse.com
|
||||
range used for x2APIC emulation
|
||||
xsa108.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 29 14:20:15 MDT 2014 - carnold@suse.com
|
||||
|
||||
- bnc#897906 - libxc: check return values on mmap() and madvise()
|
||||
on xc_alloc_hypercall_buffer()
|
||||
537c9c77-libxc-check-return-values-on-mmap-and-madvise.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 22 09:55:35 MDT 2014 - carnold@suse.com
|
||||
|
||||
|
@ -1,43 +0,0 @@
|
||||
user: Olaf Hering <olaf@aepfle.de>
|
||||
date: Thu Mar 28 15:36:02 2013 +0100
|
||||
files: tools/python/xen/xend/XendCheckpoint.py
|
||||
description:
|
||||
tools/xend: move assert to exception block
|
||||
|
||||
The two assert in restore trigger sometimes after hundreds of
|
||||
migrations. If they trigger the destination host will not destroy the
|
||||
newly created, still empty guest. After a second migration attempt to
|
||||
this host there will be two guets with the same name and uuid. This
|
||||
situation is poorly handled by the xm tools.
|
||||
With this change the guest will be destroyed.
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
|
||||
---
|
||||
tools/python/xen/xend/XendCheckpoint.py | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||
@@ -267,9 +267,6 @@ def restore(xd, fd, dominfo = None, paus
|
||||
store_port = dominfo.getStorePort()
|
||||
console_port = dominfo.getConsolePort()
|
||||
|
||||
- assert store_port
|
||||
- assert console_port
|
||||
-
|
||||
# if hvm, pass mem size to calculate the store_mfn
|
||||
if is_hvm:
|
||||
apic = int(dominfo.info['platform'].get('apic', 0))
|
||||
@@ -281,6 +278,9 @@ def restore(xd, fd, dominfo = None, paus
|
||||
pae = 0
|
||||
|
||||
try:
|
||||
+ assert store_port
|
||||
+ assert console_port
|
||||
+
|
||||
restore_image = image.create(dominfo, dominfo.info)
|
||||
memory = restore_image.getRequiredAvailableMemory(
|
||||
dominfo.info['memory_dynamic_max'] / 1024)
|
103
xen.stubdom.newlib.patch
Normal file
103
xen.stubdom.newlib.patch
Normal file
@ -0,0 +1,103 @@
|
||||
# HG changeset patch
|
||||
# Parent 02ec826cab1e4acb25b364a180a1597ace1149f9
|
||||
stubdom: fix errors in newlib
|
||||
|
||||
rpm post-build-checks found a few code bugs in newlib, and marks them as
|
||||
errors. Add another newlib patch and apply it during stubdom build.
|
||||
|
||||
I: A function uses a 'return;' statement, but has actually a value
|
||||
to return, like an integer ('return 42;') or similar.
|
||||
W: xen voidreturn ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:117, 125, 146, 157, 330
|
||||
|
||||
I: Program is using implicit definitions of special functions.
|
||||
these functions need to use their correct prototypes to allow
|
||||
the lightweight buffer overflow checking to work.
|
||||
- Implicit memory/string functions need #include <string.h>.
|
||||
- Implicit *printf functions need #include <stdio.h>.
|
||||
- Implicit *printf functions need #include <stdio.h>.
|
||||
- Implicit *read* functions need #include <unistd.h>.
|
||||
- Implicit *recv* functions need #include <sys/socket.h>.
|
||||
E: xen implicit-fortify-decl ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:119
|
||||
|
||||
I: Program returns random data in a function
|
||||
E: xen no-return-in-nonvoid-function ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:362
|
||||
|
||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||
|
||||
Index: xen-4.5.0-testing/stubdom/Makefile
|
||||
===================================================================
|
||||
--- xen-4.5.0-testing.orig/stubdom/Makefile
|
||||
+++ xen-4.5.0-testing/stubdom/Makefile
|
||||
@@ -72,6 +72,7 @@ newlib-$(NEWLIB_VERSION): newlib-$(NEWLI
|
||||
patch -d $@ -p0 < newlib.patch
|
||||
patch -d $@ -p0 < newlib-chk.patch
|
||||
patch -d $@ -p1 < newlib-stdint-size_max-fix-from-1.17.0.patch
|
||||
+ patch -d $@ -p1 < newlib-cygmon-gmon.patch
|
||||
find $@ -type f | xargs perl -i.bak \
|
||||
-pe 's/\b_(tzname|daylight|timezone)\b/$$1/g'
|
||||
touch $@
|
||||
Index: xen-4.5.0-testing/stubdom/newlib-cygmon-gmon.patch
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ xen-4.5.0-testing/stubdom/newlib-cygmon-gmon.patch
|
||||
@@ -0,0 +1,60 @@
|
||||
+
|
||||
+I: A function uses a 'return;' statement, but has actually a value
|
||||
+ to return, like an integer ('return 42;') or similar.
|
||||
+W: xen voidreturn ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:117, 125, 146, 157, 330
|
||||
+
|
||||
+I: Program is using implicit definitions of special functions.
|
||||
+ these functions need to use their correct prototypes to allow
|
||||
+ the lightweight buffer overflow checking to work.
|
||||
+ - Implicit memory/string functions need #include <string.h>.
|
||||
+ - Implicit *printf functions need #include <stdio.h>.
|
||||
+ - Implicit *printf functions need #include <stdio.h>.
|
||||
+ - Implicit *read* functions need #include <unistd.h>.
|
||||
+ - Implicit *recv* functions need #include <sys/socket.h>.
|
||||
+E: xen implicit-fortify-decl ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:119
|
||||
+
|
||||
+I: Program returns random data in a function
|
||||
+E: xen no-return-in-nonvoid-function ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:362
|
||||
+
|
||||
+---
|
||||
+ libgloss/i386/cygmon-gmon.c | 6 +++++-
|
||||
+ 1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
+
|
||||
+Index: newlib-1.16.0/libgloss/i386/cygmon-gmon.c
|
||||
+===================================================================
|
||||
+--- newlib-1.16.0.orig/libgloss/i386/cygmon-gmon.c
|
||||
++++ newlib-1.16.0/libgloss/i386/cygmon-gmon.c
|
||||
+@@ -61,6 +61,8 @@
|
||||
+ static char sccsid[] = "@(#)gmon.c 5.3 (Berkeley) 5/22/91";
|
||||
+ #endif /* not lint */
|
||||
+
|
||||
++#include <string.h>
|
||||
++#include <unistd.h>
|
||||
+ #define DEBUG
|
||||
+ #ifdef DEBUG
|
||||
+ #include <stdio.h>
|
||||
+@@ -89,7 +91,7 @@ static int s_scale;
|
||||
+
|
||||
+ extern int errno;
|
||||
+
|
||||
+-int
|
||||
++void
|
||||
+ monstartup(lowpc, highpc)
|
||||
+ char *lowpc;
|
||||
+ char *highpc;
|
||||
+@@ -199,6 +201,7 @@ _mcleanup()
|
||||
+
|
||||
+ static char already_setup = 0;
|
||||
+
|
||||
++void
|
||||
+ _mcount()
|
||||
+ {
|
||||
+ register char *selfpc;
|
||||
+@@ -341,6 +344,7 @@ overflow:
|
||||
+ * profiling is what mcount checks to see if
|
||||
+ * all the data structures are ready.
|
||||
+ */
|
||||
++void
|
||||
+ moncontrol(mode)
|
||||
+ int mode;
|
||||
+ {
|
@ -51,12 +51,25 @@ def check_config(path, config):
|
||||
isbinary = os.system('file -b ' + path + ' | grep text > /dev/null')
|
||||
|
||||
if isbinary:
|
||||
print 'File %s is not a text file containing Xen xm or sexpr configuration'
|
||||
sys.exit(1)
|
||||
print('Skipping %s (not a valid Xen configuration file)' % path)
|
||||
return 'unknown'
|
||||
|
||||
if config.find('\(domain'):
|
||||
return 'sexpr'
|
||||
return 'xm'
|
||||
for line in config.splitlines():
|
||||
if len(line) == 0 or line.startswith('#'):
|
||||
continue
|
||||
if line.startswith('<domain'):
|
||||
# XML is not a supported conversion format
|
||||
break
|
||||
if line.startswith('(domain'):
|
||||
print('Found sexpr formatted file %s' % path)
|
||||
return 'sexpr'
|
||||
if '=' in line:
|
||||
print('Found xm formatted file %s' % path)
|
||||
return 'xm'
|
||||
break
|
||||
|
||||
print('Skipping %s (not a valid Xen configuration file)' % path)
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def import_domain(conn, path, format=None, convert_only=False):
|
||||
@ -68,20 +81,22 @@ def import_domain(conn, path, format=None, convert_only=False):
|
||||
format = check_config(path, config)
|
||||
|
||||
if format == 'sexpr':
|
||||
print_verbose('scrubbing domin from configuration')
|
||||
print_verbose('scrubbing domid from configuration')
|
||||
config = re.sub("\(domid [0-9]*\)", "", config)
|
||||
print_verbose('scrubbed sexpr:\n %s' % config)
|
||||
xml = conn.domainXMLFromNative('xen-sxpr', config, 0)
|
||||
else:
|
||||
# if format != sexpr, try xm
|
||||
elif format == 'xm':
|
||||
xml = conn.domainXMLFromNative('xen-xm', config, 0)
|
||||
else:
|
||||
# Return to continue on to next file (if recursive)
|
||||
return
|
||||
|
||||
f.close()
|
||||
|
||||
# domUloader is no longer available in SLES12, replace with pygrub
|
||||
tree = ElementTree.fromstring(xml)
|
||||
bl = tree.find('.//bootloader')
|
||||
if bl is not None and 'domUloader' in bl.text:
|
||||
if bl is not None and bl.text is not None and 'domUloader' in bl.text:
|
||||
bl.text = 'pygrub'
|
||||
xml = ElementTree.tostring(tree)
|
||||
|
||||
|
@ -1,13 +1,31 @@
|
||||
[Unit]
|
||||
Description=Xencommons - Script to start and stop xenstored and xenconsoled
|
||||
ConditionPathExists=/proc/xen
|
||||
Description=xencommons
|
||||
ConditionPathExists=/proc/xen/capabilities
|
||||
|
||||
# Pull in all upstream service files
|
||||
Requires=proc-xen.mount
|
||||
After=proc-xen.mount
|
||||
Requires=xenstored.service
|
||||
After=xenstored.service
|
||||
Requires=xenconsoled.service
|
||||
After=xenconsoled.service
|
||||
Requires=xen-init-dom0.service
|
||||
After=xen-init-dom0.service
|
||||
Requires=xen-qemu-dom0-disk-backend.service
|
||||
After=xen-qemu-dom0-disk-backend.service
|
||||
|
||||
# Make sure network (for bridge) and remote mounts (for xendomains) are available ...
|
||||
After=network-online.target
|
||||
After=remote-fs.target
|
||||
|
||||
# ... for libvirt and xendomains
|
||||
Before=xendomains.service libvirtd.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=true
|
||||
ExecStartPre=/bin/grep -q control_d /proc/xen/capabilities
|
||||
ExecStart=-/etc/init.d/xencommons start
|
||||
ExecStop=/etc/init.d/xencommons stop
|
||||
ExecStart=/usr/bin/xenstore-ls -f
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
@ -1,8 +1,8 @@
|
||||
Index: xen-4.4.0-testing/tools/console/client/main.c
|
||||
Index: xen-4.5.0-testing/tools/console/client/main.c
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/console/client/main.c
|
||||
+++ xen-4.4.0-testing/tools/console/client/main.c
|
||||
@@ -96,6 +96,7 @@ static int get_pty_fd(struct xs_handle *
|
||||
--- xen-4.5.0-testing.orig/tools/console/client/main.c
|
||||
+++ xen-4.5.0-testing/tools/console/client/main.c
|
||||
@@ -95,6 +95,7 @@ static int get_pty_fd(struct xs_handle *
|
||||
* Assumes there is already a watch set in the store for this path. */
|
||||
{
|
||||
struct timeval tv;
|
||||
@ -10,7 +10,7 @@ Index: xen-4.4.0-testing/tools/console/client/main.c
|
||||
fd_set watch_fdset;
|
||||
int xs_fd = xs_fileno(xs), pty_fd = -1;
|
||||
int start, now;
|
||||
@@ -119,6 +120,14 @@ static int get_pty_fd(struct xs_handle *
|
||||
@@ -118,6 +119,14 @@ static int get_pty_fd(struct xs_handle *
|
||||
pty_fd = open(pty_path, O_RDWR | O_NOCTTY);
|
||||
if (pty_fd == -1)
|
||||
warn("Could not open tty `%s'", pty_path);
|
||||
|
@ -1,13 +0,0 @@
|
||||
Index: xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
===================================================================
|
||||
--- xen-4.4.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||
+++ xen-4.4.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||
@@ -3000,7 +3000,7 @@ class XendDomainInfo:
|
||||
|
||||
self.guest_bitsize = self.image.getBitSize()
|
||||
# Make sure there's enough RAM available for the domain
|
||||
- balloon.free(memory + shadow + vtd_mem, self)
|
||||
+ balloon.free(memory + shadow + vtd_mem + 512, self)
|
||||
|
||||
# Set up the shadow memory
|
||||
shadow_cur = xc.shadow_mem_control(self.domid, shadow / 1024)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user