# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1202132899 0
# Node ID 10014990a4863a5f98bde4b2a6d77ec8e4663f2c
# Parent dbe47d8cb825f834ec64b3f83a0c198a4f8a2cde
linux/x86: Obtain EDD info from Xen
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
linux-2.6.18-xen changeset: 67:706976fe8333a88c4d3482253927faa3b4714b15
linux-2.6.18-xen date: Wed Jun 20 19:09:25 2007 +0100
Fix build with CONFIG_EDD disabled.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
linux-2.6.18-xen changeset: 76:6433fb4f88d6779073bb527e0ea13814206d3259
linux-2.6.18-xen date: Thu Jun 21 22:37:49 2007 +0100
---
buildconfigs/linux-defconfig_xen0_x86_32 | 2
buildconfigs/linux-defconfig_xenU_x86_32 | 2
buildconfigs/linux-defconfig_xen_x86_32 | 2
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c | 3 +
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c | 3 +
linux-2.6-xen-sparse/drivers/firmware/Kconfig | 1
linux-2.6-xen-sparse/drivers/xen/core/Makefile | 2
linux-2.6-xen-sparse/drivers/xen/core/firmware.c | 56 ++++++++++++++++++++
linux-2.6-xen-sparse/include/xen/firmware.h | 8 ++
9 files changed, 77 insertions(+), 2 deletions(-)
diff -r dbe47d8cb825 -r 10014990a486 buildconfigs/linux-defconfig_xen0_x86_32
--- a/buildconfigs/linux-defconfig_xen0_x86_32 Thu Jan 31 10:07:57 2008 +0000
+++ b/buildconfigs/linux-defconfig_xen0_x86_32 Mon Feb 04 13:48:19 2008 +0000
@@ -155,12 +155,14 @@ CONFIG_VM86=y
# CONFIG_I8K is not set
# CONFIG_X86_REBOOTFIXUPS is not set
CONFIG_MICROCODE=y
+CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_SWIOTLB=y
#
# Firmware Drivers
#
+CONFIG_EDD=y
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
# CONFIG_NOHIGHMEM is not set
diff -r dbe47d8cb825 -r 10014990a486 buildconfigs/linux-defconfig_xenU_x86_32
--- a/buildconfigs/linux-defconfig_xenU_x86_32 Thu Jan 31 10:07:57 2008 +0000
+++ b/buildconfigs/linux-defconfig_xenU_x86_32 Mon Feb 04 13:48:19 2008 +0000
@@ -152,12 +152,14 @@ CONFIG_VM86=y
# CONFIG_TOSHIBA is not set
# CONFIG_I8K is not set
# CONFIG_X86_REBOOTFIXUPS is not set
+# CONFIG_X86_MSR is not set
CONFIG_X86_CPUID=y
CONFIG_SWIOTLB=y
#
# Firmware Drivers
#
+# CONFIG_EDD is not set
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
# CONFIG_NOHIGHMEM is not set
diff -r dbe47d8cb825 -r 10014990a486 buildconfigs/linux-defconfig_xen_x86_32
--- a/buildconfigs/linux-defconfig_xen_x86_32 Thu Jan 31 10:07:57 2008 +0000
+++ b/buildconfigs/linux-defconfig_xen_x86_32 Mon Feb 04 13:48:19 2008 +0000
@@ -160,12 +160,14 @@ CONFIG_VM86=y
# CONFIG_I8K is not set
# CONFIG_X86_REBOOTFIXUPS is not set
CONFIG_MICROCODE=y
+CONFIG_X86_MSR=y
CONFIG_X86_CPUID=m
CONFIG_SWIOTLB=y
#
# Firmware Drivers
#
+CONFIG_EDD=y
CONFIG_DELL_RBU=m
CONFIG_DCDBAS=m
# CONFIG_NOHIGHMEM is not set
diff -r dbe47d8cb825 -r 10014990a486
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Thu Jan 31 10:07:57
2008 +0000
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Feb 04 13:48:19
2008 +0000
@@ -66,6 +66,7 @@
#include <xen/interface/physdev.h>
#include <xen/interface/memory.h>
#include <xen/features.h>
+#include <xen/firmware.h>
#include <xen/xencons.h>
#include <setup_arch.h>
#include <bios_ebda.h>
@@ -740,6 +741,7 @@ struct edd edd;
#ifdef CONFIG_EDD_MODULE
EXPORT_SYMBOL(edd);
#endif
+#ifndef CONFIG_XEN
/**
* copy_edd() - Copy the BIOS EDD information
* from boot_params into a safe place.
@@ -752,6 +754,7 @@ static inline void copy_edd(void)
edd.mbr_signature_nr = EDD_MBR_SIG_NR;
edd.edd_info_nr = EDD_NR;
}
+#endif
#else
static inline void copy_edd(void)
{
diff -r dbe47d8cb825 -r 10014990a486
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Thu Jan 31
10:07:57 2008 +0000
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Mon Feb 04
13:48:19 2008 +0000
@@ -71,6 +71,7 @@
#include <asm/hypervisor.h>
#include <xen/interface/nmi.h>
#include <xen/features.h>
+#include <xen/firmware.h>
#include <xen/xencons.h>
#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
@@ -534,6 +535,7 @@ struct edd edd;
#ifdef CONFIG_EDD_MODULE
EXPORT_SYMBOL(edd);
#endif
+#ifndef CONFIG_XEN
/**
* copy_edd() - Copy the BIOS EDD information
* from boot_params into a safe place.
@@ -546,6 +548,7 @@ static inline void copy_edd(void)
edd.mbr_signature_nr = EDD_MBR_SIG_NR;
edd.edd_info_nr = EDD_NR;
}
+#endif
#else
static inline void copy_edd(void)
{
diff -r dbe47d8cb825 -r 10014990a486
linux-2.6-xen-sparse/drivers/firmware/Kconfig
--- a/linux-2.6-xen-sparse/drivers/firmware/Kconfig Thu Jan 31 10:07:57
2008 +0000
+++ b/linux-2.6-xen-sparse/drivers/firmware/Kconfig Mon Feb 04 13:48:19
2008 +0000
@@ -8,7 +8,6 @@ config EDD
config EDD
tristate "BIOS Enhanced Disk Drive calls determine boot disk"
depends on !IA64
- depends on !XEN
help
Say Y or M here if you want to enable BIOS Enhanced Disk Drive
Services real mode BIOS calls to determine which disk
diff -r dbe47d8cb825 -r 10014990a486
linux-2.6-xen-sparse/drivers/xen/core/Makefile
--- a/linux-2.6-xen-sparse/drivers/xen/core/Makefile Thu Jan 31 10:07:57
2008 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/core/Makefile Mon Feb 04 13:48:19
2008 +0000
@@ -2,7 +2,7 @@
# Makefile for the linux kernel.
#
-obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o
+obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o
obj-$(CONFIG_PROC_FS) += xen_proc.o
obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor_sysfs.o
diff -r dbe47d8cb825 -r 10014990a486
linux-2.6-xen-sparse/drivers/xen/core/firmware.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/core/firmware.c Mon Feb 04 13:48:19
2008 +0000
@@ -0,0 +1,56 @@
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/edd.h>
+#include <xen/interface/platform.h>
+#include <asm/hypervisor.h>
+
+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+void __init copy_edd(void)
+{
+ int ret;
+ xen_platform_op_t op;
+
+ if (!is_initial_xendomain())
+ return;
+
+ op.cmd = XENPF_firmware_info;
+
+ for (op.u.firmware_info.index = 0, ret = 0;
+ ret != -ESRCH && ret != -ENOSYS && edd.edd_info_nr < EDDMAXNR;
+ ++op.u.firmware_info.index) {
+ struct edd_info *info = edd.edd_info + edd.edd_info_nr;
+
+ op.u.firmware_info.type = XEN_FW_DISK_INFO;
+ info->params.length = sizeof(info->params);
+ set_xen_guest_handle(op.u.firmware_info.u.disk_info.edd_params,
+ &info->params);
+ ret = HYPERVISOR_platform_op(&op);
+ if (ret)
+ continue;
+
+#define C(x) info->x = op.u.firmware_info.u.disk_info.x
+ C(device);
+ C(version);
+ C(interface_support);
+ C(legacy_max_cylinder);
+ C(legacy_max_head);
+ C(legacy_sectors_per_track);
+#undef C
+
+ ++edd.edd_info_nr;
+ }
+
+ op.u.firmware_info.type = XEN_FW_DISK_MBR_SIGNATURE;
+ for (op.u.firmware_info.index = 0, ret = 0;
+ (ret != -ESRCH && ret != -ENOSYS &&
+ edd.mbr_signature_nr < EDD_MBR_SIG_MAX);
+ ++op.u.firmware_info.index) {
+ ret = HYPERVISOR_platform_op(&op);
+ if (ret)
+ continue;
+ edd.mbr_signature[edd.mbr_signature_nr++] =
+ op.u.firmware_info.u.disk_mbr_signature.mbr_signature;
+ }
+}
+#endif
diff -r dbe47d8cb825 -r 10014990a486 linux-2.6-xen-sparse/include/xen/firmware.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/xen/firmware.h Mon Feb 04 13:48:19
2008 +0000
@@ -0,0 +1,8 @@
+#ifndef __XEN_FIRMWARE_H__
+#define __XEN_FIRMWARE_H__
+
+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+void copy_edd(void);
+#endif
+
+#endif /* __XEN_FIRMWARE_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|