[kernel/rawhide/user/myoung/xendom0: 12/12] Update xen.next-2.6.38 and xen.pvhvm.fixes patches

myoung myoung at fedoraproject.org
Tue Feb 1 23:09:44 UTC 2011


commit f50d2873c3c6f04d0b47200701046b05e4693aaf
Author: Michael Young <m.a.young at durham.ac.uk>
Date:   Tue Feb 1 23:08:28 2011 +0000

    Update xen.next-2.6.38 and xen.pvhvm.fixes patches

 kernel.spec           |    3 +
 xen.next-2.6.37.patch | 2065 -------------------------------------------------
 xen.next-2.6.38.patch |  587 ++++++++++++++
 xen.pvhvm.fixes.patch |   64 +--
 4 files changed, 601 insertions(+), 2118 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index acb7298..fcbde95 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -1994,6 +1994,9 @@ fi
 #                 ||----w |
 #                 ||     ||
 %changelog
+* Tue Feb 02 2011 Michael Young <m.a.young at durham.ac.uk>
+- Update xen.next-2.6.38 and xen.pvhvm.fixes patches
+
 * Mon Feb 01 2011 Chuck Ebbert <cebbert at redhat.com>
 - Linux 2.6.38-rc3
 - Try to fix some obvious bugs in hfsplus mount failure handling (#673857)
diff --git a/xen.next-2.6.38.patch b/xen.next-2.6.38.patch
index c8a28e1..05e5ae3 100644
--- a/xen.next-2.6.38.patch
+++ b/xen.next-2.6.38.patch
@@ -30819,3 +30819,590 @@ index 1e31cdc..2b777c0 100644
 -- 
 1.7.3.4
 
+From cee0b1c0ea524ddc735ad04b9e6e548f3f5de42a Mon Sep 17 00:00:00 2001
+From: Stephen Tweedie <sct at redhat.com>
+Date: Fri, 6 Feb 2009 19:09:47 -0800
+Subject: [PATCH 140/141] xen dom0: Add support for the platform_ops hypercall
+
+Minimal changes to get platform ops (renamed dom0_ops on pv_ops) working
+on pv_ops builds.  Pulls in upstream linux-2.6.18-xen.hg's platform.h
+
+[ Impact: add Xen hypercall definitions ]
+
+Signed-off-by: Stephen Tweedie <sct at redhat.com>
+Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge at citrix.com>
+---
+ arch/x86/include/asm/xen/hypercall.h |    8 ++
+ include/xen/interface/platform.h     |  222 ++++++++++++++++++++++++++++++++++
+ include/xen/interface/xen.h          |    2 +
+ 3 files changed, 232 insertions(+), 0 deletions(-)
+ create mode 100644 include/xen/interface/platform.h
+
+diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
+index a3c28ae..3d10d04 100644
+--- a/arch/x86/include/asm/xen/hypercall.h
++++ b/arch/x86/include/asm/xen/hypercall.h
+@@ -45,6 +45,7 @@
+ #include <xen/interface/xen.h>
+ #include <xen/interface/sched.h>
+ #include <xen/interface/physdev.h>
++#include <xen/interface/platform.h>
+ 
+ /*
+  * The hypercall asms have to meet several constraints:
+@@ -299,6 +300,13 @@ HYPERVISOR_set_timer_op(u64 timeout)
+ }
+ 
+ static inline int
++HYPERVISOR_dom0_op(struct xen_platform_op *platform_op)
++{
++	platform_op->interface_version = XENPF_INTERFACE_VERSION;
++	return _hypercall1(int, dom0_op, platform_op);
++}
++
++static inline int
+ HYPERVISOR_set_debugreg(int reg, unsigned long value)
+ {
+ 	return _hypercall2(int, set_debugreg, reg, value);
+diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h
+new file mode 100644
+index 0000000..83e4714
+--- /dev/null
++++ b/include/xen/interface/platform.h
+@@ -0,0 +1,222 @@
++/******************************************************************************
++ * platform.h
++ *
++ * Hardware platform operations. Intended for use by domain-0 kernel.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to
++ * deal in the Software without restriction, including without limitation the
++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
++ * sell copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ * Copyright (c) 2002-2006, K Fraser
++ */
++
++#ifndef __XEN_PUBLIC_PLATFORM_H__
++#define __XEN_PUBLIC_PLATFORM_H__
++
++#include "xen.h"
++
++#define XENPF_INTERFACE_VERSION 0x03000001
++
++/*
++ * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC,
++ * 1 January, 1970 if the current system time was <system_time>.
++ */
++#define XENPF_settime             17
++struct xenpf_settime {
++    /* IN variables. */
++    uint32_t secs;
++    uint32_t nsecs;
++    uint64_t system_time;
++};
++typedef struct xenpf_settime xenpf_settime_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime_t);
++
++/*
++ * Request memory range (@mfn, @mfn+ at nr_mfns-1) to have type @type.
++ * On x86, @type is an architecture-defined MTRR memory type.
++ * On success, returns the MTRR that was used (@reg) and a handle that can
++ * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting.
++ * (x86-specific).
++ */
++#define XENPF_add_memtype         31
++struct xenpf_add_memtype {
++    /* IN variables. */
++    unsigned long mfn;
++    uint64_t nr_mfns;
++    uint32_t type;
++    /* OUT variables. */
++    uint32_t handle;
++    uint32_t reg;
++};
++typedef struct xenpf_add_memtype xenpf_add_memtype_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t);
++
++/*
++ * Tear down an existing memory-range type. If @handle is remembered then it
++ * should be passed in to accurately tear down the correct setting (in case
++ * of overlapping memory regions with differing types). If it is not known
++ * then @handle should be set to zero. In all cases @reg must be set.
++ * (x86-specific).
++ */
++#define XENPF_del_memtype         32
++struct xenpf_del_memtype {
++    /* IN variables. */
++    uint32_t handle;
++    uint32_t reg;
++};
++typedef struct xenpf_del_memtype xenpf_del_memtype_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t);
++
++/* Read current type of an MTRR (x86-specific). */
++#define XENPF_read_memtype        33
++struct xenpf_read_memtype {
++    /* IN variables. */
++    uint32_t reg;
++    /* OUT variables. */
++    unsigned long mfn;
++    uint64_t nr_mfns;
++    uint32_t type;
++};
++typedef struct xenpf_read_memtype xenpf_read_memtype_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t);
++
++#define XENPF_microcode_update    35
++struct xenpf_microcode_update {
++    /* IN variables. */
++    GUEST_HANDLE(void) data;          /* Pointer to microcode data */
++    uint32_t length;                  /* Length of microcode data. */
++};
++typedef struct xenpf_microcode_update xenpf_microcode_update_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t);
++
++#define XENPF_platform_quirk      39
++#define QUIRK_NOIRQBALANCING      1 /* Do not restrict IO-APIC RTE targets */
++#define QUIRK_IOAPIC_BAD_REGSEL   2 /* IO-APIC REGSEL forgets its value    */
++#define QUIRK_IOAPIC_GOOD_REGSEL  3 /* IO-APIC REGSEL behaves properly     */
++struct xenpf_platform_quirk {
++    /* IN variables. */
++    uint32_t quirk_id;
++};
++typedef struct xenpf_platform_quirk xenpf_platform_quirk_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t);
++
++#define XENPF_firmware_info       50
++#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08/41/48 */
++#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
++#define XEN_FW_VBEDDC_INFO        3 /* from int 10 AX=4f15 */
++struct xenpf_firmware_info {
++	/* IN variables. */
++	uint32_t type;
++	uint32_t index;
++	/* OUT variables. */
++	union {
++		struct {
++			/* Int13, Fn48: Check Extensions Present. */
++			uint8_t device;                   /* %dl: bios device number */
++			uint8_t version;                  /* %ah: major version      */
++			uint16_t interface_support;       /* %cx: support bitmap     */
++			/* Int13, Fn08: Legacy Get Device Parameters. */
++			uint16_t legacy_max_cylinder;     /* %cl[7:6]:%ch: max cyl # */
++			uint8_t legacy_max_head;          /* %dh: max head #         */
++			uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector #  */
++			/* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */
++			/* NB. First uint16_t of buffer must be set to buffer size.      */
++			GUEST_HANDLE(void) edd_params;
++		} disk_info; /* XEN_FW_DISK_INFO */
++		struct {
++			uint8_t device;                   /* bios device number  */
++			uint32_t mbr_signature;           /* offset 0x1b8 in mbr */
++		} disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
++		struct {
++			/* Int10, AX=4F15: Get EDID info. */
++			uint8_t capabilities;
++			uint8_t edid_transfer_time;
++			/* must refer to 128-byte buffer */
++			GUEST_HANDLE(uchar) edid;
++		} vbeddc_info; /* XEN_FW_VBEDDC_INFO */
++	} u;
++};
++typedef struct xenpf_firmware_info xenpf_firmware_info_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t);
++
++#define XENPF_enter_acpi_sleep    51
++struct xenpf_enter_acpi_sleep {
++	/* IN variables */
++	uint16_t pm1a_cnt_val;      /* PM1a control value. */
++	uint16_t pm1b_cnt_val;      /* PM1b control value. */
++	uint32_t sleep_state;       /* Which state to enter (Sn). */
++	uint32_t flags;             /* Must be zero. */
++};
++typedef struct xenpf_enter_acpi_sleep xenpf_enter_acpi_sleep_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t);
++
++#define XENPF_change_freq         52
++struct xenpf_change_freq {
++	/* IN variables */
++	uint32_t flags; /* Must be zero. */
++	uint32_t cpu;   /* Physical cpu. */
++	uint64_t freq;  /* New frequency (Hz). */
++};
++typedef struct xenpf_change_freq xenpf_change_freq_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t);
++
++/*
++ * Get idle times (nanoseconds since boot) for physical CPUs specified in the
++ * @cpumap_bitmap with range [0.. at cpumap_nr_cpus-1]. The @idletime array is
++ * indexed by CPU number; only entries with the corresponding @cpumap_bitmap
++ * bit set are written to. On return, @cpumap_bitmap is modified so that any
++ * non-existent CPUs are cleared. Such CPUs have their @idletime array entry
++ * cleared.
++ */
++#define XENPF_getidletime         53
++struct xenpf_getidletime {
++	/* IN/OUT variables */
++	/* IN: CPUs to interrogate; OUT: subset of IN which are present */
++	GUEST_HANDLE(uchar) cpumap_bitmap;
++	/* IN variables */
++	/* Size of cpumap bitmap. */
++	uint32_t cpumap_nr_cpus;
++	/* Must be indexable for every cpu in cpumap_bitmap. */
++	GUEST_HANDLE(uint64_t) idletime;
++	/* OUT variables */
++	/* System time when the idletime snapshots were taken. */
++	uint64_t now;
++};
++typedef struct xenpf_getidletime xenpf_getidletime_t;
++DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t);
++
++struct xen_platform_op {
++	uint32_t cmd;
++	uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
++	union {
++		struct xenpf_settime           settime;
++		struct xenpf_add_memtype       add_memtype;
++		struct xenpf_del_memtype       del_memtype;
++		struct xenpf_read_memtype      read_memtype;
++		struct xenpf_microcode_update  microcode;
++		struct xenpf_platform_quirk    platform_quirk;
++		struct xenpf_firmware_info     firmware_info;
++		struct xenpf_enter_acpi_sleep  enter_acpi_sleep;
++		struct xenpf_change_freq       change_freq;
++		struct xenpf_getidletime       getidletime;
++		uint8_t                        pad[128];
++	} u;
++};
++typedef struct xen_platform_op xen_platform_op_t;
++DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t);
++
++#endif /* __XEN_PUBLIC_PLATFORM_H__ */
+diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
+index 2befa3e..18b5599 100644
+--- a/include/xen/interface/xen.h
++++ b/include/xen/interface/xen.h
+@@ -461,6 +461,8 @@ typedef uint8_t xen_domain_handle_t[16];
+ #define __mk_unsigned_long(x) x ## UL
+ #define mk_unsigned_long(x) __mk_unsigned_long(x)
+ 
++DEFINE_GUEST_HANDLE(uint64_t);
++
+ #else /* __ASSEMBLY__ */
+ 
+ /* In assembly code we cannot use C numeric constant suffixes. */
+-- 
+1.7.3.5
+
+
+From 0a49ceea0d032864a72a8744c82c3786a01f34f4 Mon Sep 17 00:00:00 2001
+From: Jeremy Fitzhardinge <jeremy.fitzhardinge at citrix.com>
+Date: Fri, 27 Mar 2009 17:39:15 -0700
+Subject: [PATCH 141/141] xen: add CPU microcode update driver
+
+Xen does all the hard work for us, including choosing the right update
+method for this cpu type and actually doing it for all cpus.  We just
+need to supply it with the firmware blob.
+
+Because Xen updates all CPUs (and the kernel's virtual cpu numbers have
+no fixed relationship with the underlying physical cpus), we only bother
+doing anything for cpu "0".
+
+[ Impact: allow CPU microcode update in Xen dom0 ]
+Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge at citrix.com>
+---
+ arch/x86/include/asm/microcode.h |    9 ++
+ arch/x86/kernel/Makefile         |    1 +
+ arch/x86/kernel/microcode_core.c |    5 +-
+ arch/x86/kernel/microcode_xen.c  |  198 ++++++++++++++++++++++++++++++++++++++
+ arch/x86/xen/Kconfig             |    4 +
+ 5 files changed, 216 insertions(+), 1 deletions(-)
+ create mode 100644 arch/x86/kernel/microcode_xen.c
+
+diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h
+index 2421507..22677d6 100644
+--- a/arch/x86/include/asm/microcode.h
++++ b/arch/x86/include/asm/microcode.h
+@@ -61,4 +61,13 @@ static inline struct microcode_ops * __init init_amd_microcode(void)
+ }
+ #endif
+ 
++#ifdef CONFIG_MICROCODE_XEN
++extern struct microcode_ops * __init init_xen_microcode(void);
++#else
++static inline struct microcode_ops * __init init_xen_microcode(void)
++{
++	return NULL;
++}
++#endif
++
+ #endif /* _ASM_X86_MICROCODE_H */
+diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
+index 34244b2..8fd7a4e 100644
+--- a/arch/x86/kernel/Makefile
++++ b/arch/x86/kernel/Makefile
+@@ -104,6 +104,7 @@ obj-$(CONFIG_PCSPKR_PLATFORM)	+= pcspeaker.o
+ microcode-y				:= microcode_core.o
+ microcode-$(CONFIG_MICROCODE_INTEL)	+= microcode_intel.o
+ microcode-$(CONFIG_MICROCODE_AMD)	+= microcode_amd.o
++microcode-$(CONFIG_MICROCODE_XEN)	+= microcode_xen.o
+ obj-$(CONFIG_MICROCODE)			+= microcode.o
+ 
+ obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o
+diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c
+index 1cca374..6550539 100644
+--- a/arch/x86/kernel/microcode_core.c
++++ b/arch/x86/kernel/microcode_core.c
+@@ -83,6 +83,7 @@
+ #include <linux/fs.h>
+ #include <linux/mm.h>
+ 
++#include <xen/xen.h>
+ #include <asm/microcode.h>
+ #include <asm/processor.h>
+ 
+@@ -506,7 +507,9 @@ static int __init microcode_init(void)
+ 	struct cpuinfo_x86 *c = &cpu_data(0);
+ 	int error;
+ 
+-	if (c->x86_vendor == X86_VENDOR_INTEL)
++	if (xen_pv_domain())
++		microcode_ops = init_xen_microcode();
++	else if (c->x86_vendor == X86_VENDOR_INTEL)
+ 		microcode_ops = init_intel_microcode();
+ 	else if (c->x86_vendor == X86_VENDOR_AMD)
+ 		microcode_ops = init_amd_microcode();
+diff --git a/arch/x86/kernel/microcode_xen.c b/arch/x86/kernel/microcode_xen.c
+new file mode 100644
+index 0000000..9d2a06b
+--- /dev/null
++++ b/arch/x86/kernel/microcode_xen.c
+@@ -0,0 +1,198 @@
++/*
++ * Xen microcode update driver
++ *
++ * Xen does most of the work here.  We just pass the whole blob into
++ * Xen, and it will apply it to all CPUs as appropriate.  Xen will
++ * worry about how different CPU models are actually updated.
++ */
++#include <linux/sched.h>
++#include <linux/module.h>
++#include <linux/firmware.h>
++#include <linux/vmalloc.h>
++#include <linux/uaccess.h>
++
++#include <asm/microcode.h>
++
++#include <xen/xen.h>
++#include <xen/interface/platform.h>
++#include <xen/interface/xen.h>
++
++#include <asm/xen/hypercall.h>
++#include <asm/xen/hypervisor.h>
++
++MODULE_DESCRIPTION("Xen microcode update driver");
++MODULE_LICENSE("GPL");
++
++struct xen_microcode {
++	size_t len;
++	char data[0];
++};
++
++static int xen_microcode_update(int cpu)
++{
++	int err;
++	struct xen_platform_op op;
++	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++	struct xen_microcode *uc = uci->mc;
++
++	if (uc == NULL || uc->len == 0) {
++		/*
++		 * We do all cpus at once, so we don't need to do
++		 * other cpus explicitly (besides, these vcpu numbers
++		 * have no relationship to underlying physical cpus).
++		 */
++		return 0;
++	}
++
++	op.cmd = XENPF_microcode_update;
++	set_xen_guest_handle(op.u.microcode.data, uc->data);
++	op.u.microcode.length = uc->len;
++
++	err = HYPERVISOR_dom0_op(&op);
++
++	if (err != 0)
++		printk(KERN_WARNING "microcode_xen: microcode update failed: %d\n", err);
++
++	return err;
++}
++
++static enum ucode_state xen_request_microcode_fw(int cpu, struct device *device)
++{
++	char name[30];
++	struct cpuinfo_x86 *c = &cpu_data(cpu);
++	const struct firmware *firmware;
++	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++	enum ucode_state ret;
++	struct xen_microcode *uc;
++	size_t size;
++	int err;
++
++	switch (c->x86_vendor) {
++	case X86_VENDOR_INTEL:
++		snprintf(name, sizeof(name), "intel-ucode/%02x-%02x-%02x",
++			 c->x86, c->x86_model, c->x86_mask);
++		break;
++
++	case X86_VENDOR_AMD:
++		snprintf(name, sizeof(name), "amd-ucode/microcode_amd.bin");
++		break;
++
++	default:
++		return UCODE_NFOUND;
++	}
++
++	err = request_firmware(&firmware, name, device);
++	if (err) {
++		pr_debug("microcode: data file %s load failed\n", name);
++		return UCODE_NFOUND;
++	}
++
++	/*
++	 * Only bother getting real firmware for cpu 0; the others get
++	 * dummy placeholders.
++	 */
++	if (cpu == 0)
++		size = firmware->size;
++	else
++		size = 0;
++
++	if (uci->mc != NULL) {
++		vfree(uci->mc);
++		uci->mc = NULL;
++	}
++
++	ret = UCODE_ERROR;
++	uc = vmalloc(sizeof(*uc) + size);
++	if (uc == NULL)
++		goto out;
++
++	ret = UCODE_OK;
++	uc->len = size;
++	memcpy(uc->data, firmware->data, uc->len);
++
++	uci->mc = uc;
++
++out:
++	release_firmware(firmware);
++
++	return ret;
++}
++
++static enum ucode_state xen_request_microcode_user(int cpu,
++						   const void __user *buf, size_t size)
++{
++	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++	struct xen_microcode *uc;
++	enum ucode_state ret;
++	size_t unread;
++
++	if (cpu != 0) {
++		/* No real firmware for non-zero cpus; just store a
++		   placeholder */
++		size = 0;
++	}
++
++	if (uci->mc != NULL) {
++		vfree(uci->mc);
++		uci->mc = NULL;
++	}
++
++	ret = UCODE_ERROR;
++	uc = vmalloc(sizeof(*uc) + size);
++	if (uc == NULL)
++		goto out;
++
++	uc->len = size;
++
++	ret = UCODE_NFOUND;
++
++	unread = copy_from_user(uc->data, buf, size);
++
++	if (unread != 0) {
++		printk(KERN_WARNING "failed to read %zd of %zd bytes at %p -> %p\n",
++		       unread, size, buf, uc->data);
++		goto out;
++	}
++
++	ret = UCODE_OK;
++
++out:
++	if (ret == 0)
++		uci->mc = uc;
++	else
++		vfree(uc);
++
++	return ret;
++}
++
++static void xen_microcode_fini_cpu(int cpu)
++{
++	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++
++	vfree(uci->mc);
++	uci->mc = NULL;
++}
++
++static int xen_collect_cpu_info(int cpu, struct cpu_signature *sig)
++{
++	sig->sig = 0;
++	sig->pf = 0;
++	sig->rev = 0;
++
++	return 0;
++}
++
++static struct microcode_ops microcode_xen_ops = {
++	.request_microcode_user		  = xen_request_microcode_user,
++	.request_microcode_fw             = xen_request_microcode_fw,
++	.collect_cpu_info                 = xen_collect_cpu_info,
++	.apply_microcode                  = xen_microcode_update,
++	.microcode_fini_cpu               = xen_microcode_fini_cpu,
++};
++
++struct microcode_ops * __init init_xen_microcode(void)
++{
++	if (!xen_initial_domain())
++		return NULL;
++	return &microcode_xen_ops;
++}
+diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
+index 5b54892..384e0a5 100644
+--- a/arch/x86/xen/Kconfig
++++ b/arch/x86/xen/Kconfig
+@@ -48,3 +48,7 @@ config XEN_DEBUG_FS
+ 	help
+ 	  Enable statistics output and various tuning options in debugfs.
+ 	  Enabling this option may incur a significant performance overhead.
++
++config MICROCODE_XEN
++       def_bool y
++       depends on XEN_DOM0 && MICROCODE
+\ No newline at end of file
+-- 
+1.7.3.5
+
diff --git a/xen.pvhvm.fixes.patch b/xen.pvhvm.fixes.patch
index 1150934..958b2db 100644
--- a/xen.pvhvm.fixes.patch
+++ b/xen.pvhvm.fixes.patch
@@ -1,4 +1,4 @@
-From bb89b5a4444a7514f3cf6cadb4f613832d7a9887 Mon Sep 17 00:00:00 2001
+From 20fddbd4510f3a3888cccc64f89862168a2b7528 Mon Sep 17 00:00:00 2001
 From: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
 Date: Fri, 14 Jan 2011 17:55:44 -0500
 Subject: [PATCH 1/4] m2p: No need to catch exceptions when we know that there is no RAM
@@ -37,55 +37,24 @@ index f25bdf2..74a8559 100644
  	 * If this appears to be a foreign mfn (because the pfn
  	 * doesn't map back to the mfn), then check the local override
 -- 
-1.7.3.4
+1.7.3.5
 
 
-From b84683ad1e704c2a296d08ff0cbe29db936f94a7 Mon Sep 17 00:00:00 2001
-From: Stefano Stabellini <stefano.stabellini at eu.citrix.com>
-Date: Tue, 25 Jan 2011 12:03:42 +0000
-Subject: [PATCH 3/4] xen: make sure the e820 memory regions end at page boundary
-
-Signed-off-by: M A Young <m.a.young at durham.ac.uk>
-Signed-off-by: Stefano Stabellini <stefano.stabellini at eu.citrix.com>
----
- arch/x86/xen/setup.c |    5 ++++-
- 1 files changed, 4 insertions(+), 1 deletions(-)
-
-diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
-index b5a7f92..a3d28a1 100644
---- a/arch/x86/xen/setup.c
-+++ b/arch/x86/xen/setup.c
-@@ -179,7 +179,10 @@ char * __init xen_memory_setup(void)
- 	e820.nr_map = 0;
- 	xen_extra_mem_start = mem_end;
- 	for (i = 0; i < memmap.nr_entries; i++) {
--		unsigned long long end = map[i].addr + map[i].size;
-+		unsigned long long end;
-+		if (map[i].type == E820_RAM)
-+			map[i].size -= (map[i].size + map[i].addr) % PAGE_SIZE;
-+		end = map[i].addr + map[i].size;
- 
- 		if (map[i].type == E820_RAM && end > mem_end) {
- 			/* RAM off the end - may be partially included */
--- 
-1.7.3.4
-
-
-From daed469760dabbf6ae81c9869a263535fb587e63 Mon Sep 17 00:00:00 2001
+From a89d6bd5cfa1ba3b27d7ba2dc664975a0560fb15 Mon Sep 17 00:00:00 2001
 From: Stefano Stabellini <stefano.stabellini at eu.citrix.com>
 Date: Tue, 25 Jan 2011 12:05:11 +0000
-Subject: [PATCH 4/4] When destroying mappings between _brk_end and _end, do not go over _end
+Subject: [PATCH 3/4] When destroying mappings between _brk_end and _end, do not go over _end
 
 Signed-off-by: Stefano Stabellini <stefano.stabellini at eu.citrix.com>
 ---
- arch/x86/mm/init.c |   15 ++++++++++++++-
- 1 files changed, 14 insertions(+), 1 deletions(-)
+ arch/x86/mm/init.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
 
 diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
-index 947f42a..ebc0221 100644
+index 947f42a..c7263c9 100644
 --- a/arch/x86/mm/init.c
 +++ b/arch/x86/mm/init.c
-@@ -291,10 +291,23 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+@@ -291,10 +291,11 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
  		 * located on different 2M pages. cleanup_highmap(), however,
  		 * can only consider _end when it runs, so destroy any
  		 * mappings beyond _brk_end here.
@@ -94,22 +63,11 @@ index 947f42a..ebc0221 100644
  		pud = pud_offset(pgd_offset_k(_brk_end), _brk_end);
  		pmd = pmd_offset(pud, _brk_end - 1);
 -		while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1))
-+		while (++pmd < pmd_offset(pud, (unsigned long)_end - 1))
-+			pmd_clear(pmd);
-+		if (((unsigned long)_end) & ~PMD_MASK) {
-+			pte_t *pte;
-+			unsigned long addr;
-+			for (addr = ((unsigned long)_end) & PMD_MASK;
-+					addr < ((unsigned long)_end);
-+					addr += PAGE_SIZE) {
-+				pte = pte_offset_map(pmd, addr);
-+				pte_clear(&init_mm, addr, pte);
-+				pte_unmap(pte);
-+			}
-+		} else
++		while (++pmd < pmd_offset(pud, (unsigned long)_end))
  			pmd_clear(pmd);
  	}
  #endif
 -- 
-1.7.3.4
+1.7.3.5
+
 


More information about the scm-commits mailing list