[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#473645: linux-2.6: Please enable Xen guest support in all i386 kernel packages



Package: linux-2.6
Severity: wishlist
Tags: patch

I posted some time ago[0] regarding my desire to enable Debian Installer to
run in a Xen guest domain. Since then I have been working on getting
the necessary support into the upstream kernel. Those bits are now
queued upstream, hopefully for inclusion in 2.6.26.

I've attached a patch (enable-xen) against trunk (svn version 11011)
which turns on Xen support in all i386 kernels. Since CONFIG_PARAVIRT is
already enabled the extra overhead of enabling Xen is very low.

I'd also appriciate if you would consider two other patches for
inclusion in trunk. These are the bits I've found necessary for D-I
support backported to 2.6.25. Having these patches in the Debian kernels
will make working on this support in the installer very much easier for
me once d-i moves to 2.6.25 (I expect both patches to be in 2.6.26).

"v2.08" is version 2.08 of the x86 boot protocol which allows the Xen
domain builder to extract the ELF file from a bzImage in order to boot
it. This is needed because the standard (i.e. non-Xen) kernel packages
do not include the raw ELF file.

"xen-modules-autoprobing-support-for-frontend-drivers.patch" adds
support for module alias in order to allow modules to be autoloaded.

Thanks,
Ian.

[0] http://lists.debian.org/debian-boot/2008/01/msg00269.html
-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.23-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Index: linux-2.6/debian/config/i386/config
===================================================================
--- linux-2.6.orig/debian/config/i386/config	2008-03-30 12:01:36.000000000 +0100
+++ linux-2.6/debian/config/i386/config	2008-03-30 12:01:52.000000000 +0100
@@ -148,7 +148,7 @@
 ##
 ## file: arch/x86/xen/Kconfig
 ##
-# CONFIG_XEN is not set
+CONFIG_XEN=y
 
 ##
 ## file: crypto/Kconfig
@@ -247,6 +247,7 @@
 CONFIG_CDROM_PKTCDVD=m
 CONFIG_CDROM_PKTCDVD_BUFFERS=8
 # CONFIG_CDROM_PKTCDVD_WCACHE is not set
+CONFIG_XEN_BLKDEV_FRONTEND=m
 CONFIG_VIRTIO_BLK=m
 
 ##
@@ -312,6 +313,7 @@
 CONFIG_PRINTER=m
 # CONFIG_LP_CONSOLE is not set
 CONFIG_PPDEV=m
+CONFIG_HVC_XEN=y
 CONFIG_NVRAM=m
 CONFIG_RTC=m
 CONFIG_GEN_RTC=m
@@ -1114,6 +1116,7 @@
 CONFIG_VIA_VELOCITY=m
 CONFIG_TIGON3=m
 CONFIG_BNX2=m
+CONFIG_XEN_NETDEV_FRONTEND=m
 CONFIG_FDDI=y
 CONFIG_DEFXX=m
 # CONFIG_DEFXX_MMIO is not set
Index: linux-2.6/debian/changelog
===================================================================
--- linux-2.6.orig/debian/changelog	2008-03-30 12:01:36.000000000 +0100
+++ linux-2.6/debian/changelog	2008-03-30 12:01:52.000000000 +0100
@@ -89,6 +89,9 @@
   * topconfig: Enable CONFIG_CIFS_WEAK_PW_HASH, required for compatibility
     with legacy (pre-NTLM) fileservers.
 
+  [ Ian Campbell ]
+  * [x86]: Enable Xen guest support in all i386 flavours.
+
  -- Bastian Blank <waldi@debian.org>  Tue, 26 Feb 2008 23:59:55 -0700
 
 linux-2.6 (2.6.24-5) unstable; urgency=low
Index: linux-2.6/debian/patches/series/1~experimental.1
===================================================================
--- linux-2.6.orig/debian/patches/series/1~experimental.1	2008-03-30 11:51:33.000000000 +0100
+++ linux-2.6/debian/patches/series/1~experimental.1	2008-03-30 11:57:49.000000000 +0100
@@ -37,3 +37,4 @@
 + bugfix/all/rtc-x1205-new-style-conversion-checkpatch-fixes.patch
 + bugfix/all/mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1.patch
 + bugfix/arm/oabi-shim-for-fstatat64.patch
++ features/x86/boot-protocol-v2.08.patch
Index: linux-2.6/debian/changelog
===================================================================
--- linux-2.6.orig/debian/changelog	2008-03-30 11:56:43.000000000 +0100
+++ linux-2.6/debian/changelog	2008-03-30 11:57:31.000000000 +0100
@@ -91,6 +91,7 @@
 
   [ Ian Campbell ]
   * [x86]: Enable Xen guest support in all i386 flavours.
+  * [x86]: Backport boot protocol v2.08.
 
  -- Bastian Blank <waldi@debian.org>  Tue, 26 Feb 2008 23:59:55 -0700
 
Index: linux-2.6/debian/patches/features/x86/boot-protocol-v2.08.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/debian/patches/features/x86/boot-protocol-v2.08.patch	2008-03-30 11:57:31.000000000 +0100
@@ -0,0 +1,329 @@
+diff --git a/Documentation/i386/boot.txt b/Documentation/i386/boot.txt
+index fc49b79..05c24df 100644
+--- a/Documentation/i386/boot.txt
++++ b/Documentation/i386/boot.txt
+@@ -170,6 +170,8 @@ Offset	Proto	Name		Meaning
+ 0238/4	2.06+	cmdline_size	Maximum size of the kernel command line
+ 023C/4	2.07+	hardware_subarch Hardware subarchitecture
+ 0240/8	2.07+	hardware_subarch_data Subarchitecture-specific data
++0248/4	2.08+	compressed_payload_offset
++024C/4	2.08+	compressed_payload_length
+ 
+ (1) For backwards compatibility, if the setup_sects field contains 0, the
+     real value is 4.
+@@ -512,6 +514,30 @@ Protocol:	2.07+
+ 
+   A pointer to data that is specific to hardware subarch
+ 
++Field name:	compressed_payload_offset
++Type:		read
++Offset/size:	0x248/4
++Protocol:	2.08+
++
++  If non-zero then this field contains the offset from the end of the
++  real-mode code to the compressed payload. The compression format
++  should be determined using the standard magic number, currently only
++  gzip is used.
++  
++Field name:	compressed_payload_length
++Type:		read
++Offset/size:	0x24c/4
++Protocol:	2.08+
++
++  The length of the compressed payload.
++
++**** THE IMAGE CHECKSUM
++
++From boot protocol version 2.08 onwards the CRC-32 is calculated over
++the entire file using the characteristic polynomial 0x04C11DB7 and an
++initial remainder of 0xffffffff.  The checksum is appended to the
++file; therefore the CRC of the file up to the limit specified in the
++syssize field of the header is always 0.
+ 
+ **** THE KERNEL COMMAND LINE
+ 
+diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
+index f88458e..9695aff 100644
+--- a/arch/x86/boot/Makefile
++++ b/arch/x86/boot/Makefile
+@@ -94,6 +94,20 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
+ 
+ SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
+ 
++sed-offsets := -e 's/^00*/0/' \
++        -e 's/^\([0-9a-fA-F]*\) . \(input_data\|input_data_end\)$$/\#define \2 0x\1/p'
++
++quiet_cmd_offsets = OFFSETS $@
++      cmd_offsets = $(NM) $< | sed -n $(sed-offsets) > $@
++
++$(obj)/offsets.h: $(obj)/compressed/vmlinux FORCE
++	$(call if_changed,offsets)
++
++targets += offsets.h
++
++AFLAGS_header.o += -I$(obj)
++$(obj)/header.o: $(obj)/offsets.h
++
+ LDFLAGS_setup.elf	:= -T
+ $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
+ 	$(call if_changed,ld)
+diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
+index d2b9f3b..92fdd35 100644
+--- a/arch/x86/boot/compressed/Makefile
++++ b/arch/x86/boot/compressed/Makefile
+@@ -22,7 +22,7 @@ $(obj)/vmlinux: $(src)/vmlinux_$(BITS).lds $(obj)/head_$(BITS).o $(obj)/misc.o $
+ 	$(call if_changed,ld)
+ 	@:
+ 
+-OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note -R .comment -S
++OBJCOPYFLAGS_vmlinux.bin :=  -R .comment -S
+ $(obj)/vmlinux.bin: vmlinux FORCE
+ 	$(call if_changed,objcopy)
+ 
+diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
+index 8182e32..69aec2f 100644
+--- a/arch/x86/boot/compressed/misc.c
++++ b/arch/x86/boot/compressed/misc.c
+@@ -15,6 +15,10 @@
+  * we just keep it from happening
+  */
+ #undef CONFIG_PARAVIRT
++#ifdef CONFIG_X86_32
++#define _ASM_DESC_H_ 1
++#endif
++
+ #ifdef CONFIG_X86_64
+ #define _LINUX_STRING_H_ 1
+ #define __LINUX_BITMAP_H 1
+@@ -22,6 +26,7 @@
+ 
+ #include <linux/linkage.h>
+ #include <linux/screen_info.h>
++#include <linux/elf.h>
+ #include <asm/io.h>
+ #include <asm/page.h>
+ #include <asm/boot.h>
+@@ -365,6 +370,56 @@ static void error(char *x)
+ 		asm("hlt");
+ }
+ 
++static void parse_elf(void *output)
++{
++#ifdef CONFIG_X86_64
++	Elf64_Ehdr ehdr;
++	Elf64_Phdr *phdrs, *phdr;
++#else
++	Elf32_Ehdr ehdr;
++	Elf32_Phdr *phdrs, *phdr;
++#endif
++	void *dest;
++	int i;
++
++	memcpy(&ehdr, output, sizeof(ehdr));
++	if(ehdr.e_ident[EI_MAG0] != ELFMAG0 ||
++	   ehdr.e_ident[EI_MAG1] != ELFMAG1 ||
++	   ehdr.e_ident[EI_MAG2] != ELFMAG2 ||
++	   ehdr.e_ident[EI_MAG3] != ELFMAG3)
++	{
++		error("Kernel is not a valid ELF file");
++		return;
++	}
++
++	putstr("Parsing ELF... ");
++
++	phdrs = malloc(sizeof(*phdrs) * ehdr.e_phnum);
++	if (!phdrs)
++		error("Failed to allocate space for phdrs");
++
++	memcpy(phdrs, output + ehdr.e_phoff, sizeof(*phdrs) * ehdr.e_phnum);
++
++	for (i=0; i<ehdr.e_phnum; i++) {
++		phdr = &phdrs[i];
++
++		switch (phdr->p_type) {
++		case PT_LOAD:
++#ifdef CONFIG_RELOCATABLE
++			dest = output;
++			dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR);
++#else
++			dest = (void*)(phdr->p_paddr);
++#endif
++			memcpy(dest,
++			       output + phdr->p_offset,
++			       phdr->p_filesz);
++			break;
++		default: /* Ignore other PT_* */ break;
++		}
++	}
++}
++
+ asmlinkage void decompress_kernel(void *rmode, memptr heap,
+ 				  uch *input_data, unsigned long input_len,
+ 				  uch *output)
+@@ -408,6 +463,7 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
+ 	makecrc();
+ 	putstr("\nDecompressing Linux... ");
+ 	gunzip();
++	parse_elf(output);
+ 	putstr("done.\nBooting the kernel.\n");
+ 	return;
+ }
+diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
+index 64ad901..40c91bb 100644
+--- a/arch/x86/boot/header.S
++++ b/arch/x86/boot/header.S
+@@ -22,6 +22,7 @@
+ #include <asm/page.h>
+ #include <asm/setup.h>
+ #include "boot.h"
++#include "offsets.h"
+ 
+ SETUPSECTS	= 4			/* default nr of setup-sectors */
+ BOOTSEG		= 0x07C0		/* original address of boot-sector */
+@@ -119,7 +120,7 @@ _start:
+ 	# Part 2 of the header, from the old setup.S
+ 
+ 		.ascii	"HdrS"		# header signature
+-		.word	0x0207		# header version number (>= 0x0105)
++		.word	0x0208		# header version number (>= 0x0105)
+ 					# or else old loadlin-1.5 will fail)
+ 		.globl realmode_swtch
+ realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG
+@@ -223,6 +224,11 @@ hardware_subarch:	.long 0			# subarchitecture, added with 2.07
+ 
+ hardware_subarch_data:	.quad 0
+ 
++compressed_payload_offset:
++			.long input_data
++compressed_payload_length:
++			.long input_data_end-input_data
++
+ # End of setup header #####################################################
+ 
+ 	.section ".inittext", "ax"
+diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c
+index b424874..44dc192 100644
+--- a/arch/x86/boot/tools/build.c
++++ b/arch/x86/boot/tools/build.c
+@@ -50,6 +50,75 @@ typedef unsigned long  u32;
+ u8 buf[SETUP_SECT_MAX*512];
+ int is_big_kernel;
+ 
++/*----------------------------------------------------------------------*/
++
++static const u32 crctab32[] = {
++	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
++	0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
++	0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
++	0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
++	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
++	0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
++	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
++	0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
++	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
++	0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
++	0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
++	0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
++	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
++	0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
++	0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
++	0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
++	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
++	0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
++	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
++	0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
++	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
++	0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
++	0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
++	0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
++	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
++	0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
++	0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
++	0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
++	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
++	0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
++	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
++	0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
++	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
++	0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
++	0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
++	0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
++	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
++	0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
++	0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
++	0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
++	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
++	0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
++	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
++	0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
++	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
++	0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
++	0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
++	0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
++	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
++	0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
++	0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
++	0x2d02ef8d
++};
++
++static u32 partial_crc32_one(u8 c, u32 crc)
++{
++	return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8);
++}
++
++static u32 partial_crc32(const u8 *s, int len, u32 crc)
++{
++	while (len--)
++		crc = partial_crc32_one(*s++, crc);
++	return crc;
++}
++
+ static void die(const char * str, ...)
+ {
+ 	va_list args;
+@@ -74,6 +143,7 @@ int main(int argc, char ** argv)
+ 	FILE *file;
+ 	int fd;
+ 	void *kernel;
++	u32 crc = 0xffffffffUL;
+ 
+ 	if (argc > 2 && !strcmp(argv[1], "-b"))
+ 	  {
+@@ -144,7 +214,8 @@ int main(int argc, char ** argv)
+ 	kernel = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0);
+ 	if (kernel == MAP_FAILED)
+ 		die("Unable to mmap '%s': %m", argv[2]);
+-	sys_size = (sz + 15) / 16;
++	/* Number of 16-byte paragraphs, including space for a 4-byte CRC */
++	sys_size = (sz + 15 + 4) / 16;
+ 	if (!is_big_kernel && sys_size > DEF_SYSSIZE)
+ 		die("System is too big. Try using bzImage or modules.");
+ 
+@@ -155,12 +226,27 @@ int main(int argc, char ** argv)
+ 	buf[0x1f6] = sys_size >> 16;
+ 	buf[0x1f7] = sys_size >> 24;
+ 
++	crc = partial_crc32(buf, i, crc);
+ 	if (fwrite(buf, 1, i, stdout) != i)
+ 		die("Writing setup failed");
+ 
+ 	/* Copy the kernel code */
++	crc = partial_crc32(kernel, sz, crc);
+ 	if (fwrite(kernel, 1, sz, stdout) != sz)
+ 		die("Writing kernel failed");
++
++	/* Add padding leaving 4 bytes for the checksum */
++	while (sz++ < (sys_size*16) - 4) {
++		crc = partial_crc32_one('\0', crc);
++		if (fwrite("\0", 1, 1, stdout) != 1)
++			die("Writing padding failed");
++	}
++
++	/* Write the CRC */
++	fprintf(stderr, "CRC %lx\n", crc);
++	if (fwrite(&crc, 1, 4, stdout) != 4)
++		die("Writing CRC failed");
++
+ 	close(fd);
+ 
+ 	/* Everything is OK */
Index: linux-2.6/debian/patches/series/1~experimental.1
===================================================================
--- linux-2.6.orig/debian/patches/series/1~experimental.1	2008-03-20 23:26:54.000000000 +0000
+++ linux-2.6/debian/patches/series/1~experimental.1	2008-03-20 23:27:23.000000000 +0000
@@ -38,3 +38,4 @@
 + bugfix/all/file2alias-cross-compile-fix.patch
 + features/arm/glantank-register-f75375s.patch
 + features/x86/boot-protocol-v2.08.patch
++ features/x86/xen-modules-autoprobing-support-for-frontend-drivers.patch
Index: linux-2.6/debian/changelog
===================================================================
--- linux-2.6.orig/debian/changelog	2008-03-20 23:27:20.000000000 +0000
+++ linux-2.6/debian/changelog	2008-03-20 23:27:50.000000000 +0000
@@ -88,6 +88,7 @@
   [ Ian Campbell ]
   * [x86]: Enable Xen guest support in all i386 flavours.
   * [x86]: Backport boot protocol v2.08.
+  * [xen]: Module autoprobing support for Xen frontend drivers.
 
  -- Bastian Blank <waldi@debian.org>  Tue, 26 Feb 2008 23:59:55 -0700
 
Index: linux-2.6/debian/patches/features/x86/xen-modules-autoprobing-support-for-frontend-drivers.patch
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/debian/patches/features/x86/xen-modules-autoprobing-support-for-frontend-drivers.patch	2008-03-20 23:27:23.000000000 +0000
@@ -0,0 +1,150 @@
+From linux-kernel-owner@vger.kernel.org Fri Feb 22 16:27:34 2008
+Return-path:
+	<linux-kernel-owner+ijc=40hellion.org.uk-S1759959AbYBVQ10@vger.kernel.org>
+Envelope-to: ijc@hellion.org.uk
+Delivery-date: Fri, 22 Feb 2008 16:27:35 +0000
+Received: from vger.kernel.org ([209.132.176.167]) by
+	hopkins.hellion.org.uk with esmtp (Exim 4.63) (envelope-from
+	<linux-kernel-owner+ijc=40hellion.org.uk-S1759959AbYBVQ10@vger.kernel.org>)
+	id 1JSakB-0007kd-1A for ijc@hellion.org.uk; Fri, 22 Feb 2008 16:27:34 +0000
+Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id
+	S1759959AbYBVQ10 (ORCPT <rfc822;ijc@hellion.org.uk>); Fri, 22 Feb 2008
+	11:27:26 -0500
+Received: (majordomo@vger.kernel.org) by vger.kernel.org id
+	S1757016AbYBVQ0v (ORCPT <rfc822;linux-kernel-outgoing>); Fri, 22 Feb 2008
+	11:26:51 -0500
+Received: from mail26.svc.cra.dublin.eircom.net ([159.134.118.55]:31938
+	"HELO mail26.svc.cra.dublin.eircom.net" rhost-flags-OK-OK-OK-OK) by
+	vger.kernel.org with SMTP id S1756260AbYBVQ0t (ORCPT
+	<rfc822;linux-kernel@vger.kernel.org>); Fri, 22 Feb 2008 11:26:49 -0500
+Received: (qmail 94145 messnum 8385106 invoked from
+	network[86.40.134.210/86-40-134-210.b-ras1.srl.dublin.eircom.net]); 22 Feb
+	2008 16:20:08 -0000
+Received: from 86-40-134-210.b-ras1.srl.dublin.eircom.net (HELO
+	zig.localdomain) (86.40.134.210) by mail26.svc.cra.dublin.eircom.net (qp
+	94145) with SMTP; 22 Feb 2008 16:20:08 -0000
+Received: by zig.localdomain (Postfix, from userid 500) id A92CA2100C3;
+	Fri, 22 Feb 2008 16:20:18 +0000 (GMT)
+From:	Mark McLoughlin <markmc@redhat.com>
+To:	linux-kernel@vger.kernel.org
+Cc:	akpm@linux-foundation.org, xen-devel@lists.xensource.com, jeremy@goop.org, Mark McLoughlin <markmc@redhat.com>
+Date:	Fri, 22 Feb 2008 16:20:17 +0000
+Message-Id: <1203697218-32064-1-git-send-email-markmc@redhat.com>
+X-Mailer: git-send-email 1.5.4.2
+Sender:	linux-kernel-owner@vger.kernel.org
+Precedence: bulk
+List-ID: <linux-kernel.vger.kernel.org>
+X-Mailing-List:	linux-kernel@vger.kernel.org
+X-SA-Exim-Connect-IP: 209.132.176.167
+X-SA-Exim-Mail-From:
+	linux-kernel-owner+ijc=40hellion.org.uk-S1759959AbYBVQ10@vger.kernel.org
+X-Spam-Checker-Version: SpamAssassin 3.1.7 (2006-10-05) on 
+	hopkins.hellion.org.uk
+X-Spam-Level: 
+X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,FORGED_RCVD_HELO 
+	autolearn=ham version=3.1.7
+Subject: [PATCH] xen: Module autoprobing support for frontend drivers
+X-SA-Exim-Version: 4.2.1 (built Tue, 09 Jan 2007 17:23:22 +0000)
+X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
+X-Evolution-Source: imap://ijc@imap.hellion.org.uk/
+Content-Transfer-Encoding: 8bit
+Mime-Version: 1.0
+
+Add module aliases to support autoprobing modules
+for xen frontend devices.
+
+Signed-off-by: Mark McLoughlin <markmc@redhat.com>
+---
+ drivers/block/xen-blkfront.c      |    1 +
+ drivers/net/xen-netfront.c        |    1 +
+ drivers/xen/xenbus/xenbus_probe.c |   27 +++++++++++++++++++++++++--
+ 3 files changed, 27 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
+index 9c6f3f9..d0d5a02 100644
+--- a/drivers/block/xen-blkfront.c
++++ b/drivers/block/xen-blkfront.c
+@@ -998,3 +998,4 @@ module_exit(xlblk_exit);
+ MODULE_DESCRIPTION("Xen virtual block device frontend");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_BLOCKDEV_MAJOR(XENVBD_MAJOR);
++MODULE_ALIAS("xen:vbd");
+diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
+index 7483d45..b3fa27e 100644
+--- a/drivers/net/xen-netfront.c
++++ b/drivers/net/xen-netfront.c
+@@ -1809,3 +1809,4 @@ module_exit(netif_exit);
+ 
+ MODULE_DESCRIPTION("Xen virtual network device frontend");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("xen:vif");
+diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
+index 4750de3..336363c 100644
+--- a/drivers/xen/xenbus/xenbus_probe.c
++++ b/drivers/xen/xenbus/xenbus_probe.c
+@@ -88,6 +88,16 @@ int xenbus_match(struct device *_dev, struct device_driver *_drv)
+ 	return match_device(drv->ids, to_xenbus_device(_dev)) != NULL;
+ }
+ 
++static int xenbus_uevent(struct device *_dev, struct kobj_uevent_env *env)
++{
++	struct xenbus_device *dev = to_xenbus_device(_dev);
++
++	if (add_uevent_var(env, "MODALIAS=xen:%s", dev->devicetype))
++		return -ENOMEM;
++
++	return 0;
++}
++
+ /* device/<type>/<id> => <type>-<id> */
+ static int frontend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
+ {
+@@ -166,6 +176,7 @@ static struct xen_bus_type xenbus_frontend = {
+ 	.bus = {
+ 		.name     = "xen",
+ 		.match    = xenbus_match,
++		.uevent   = xenbus_uevent,
+ 		.probe    = xenbus_dev_probe,
+ 		.remove   = xenbus_dev_remove,
+ 		.shutdown = xenbus_dev_shutdown,
+@@ -438,6 +449,12 @@ static ssize_t xendev_show_devtype(struct device *dev,
+ }
+ DEVICE_ATTR(devtype, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_devtype, NULL);
+ 
++static ssize_t xendev_show_modalias(struct device *dev,
++				    struct device_attribute *attr, char *buf)
++{
++	return sprintf(buf, "xen:%s\n", to_xenbus_device(dev)->devicetype);
++}
++DEVICE_ATTR(modalias, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_modalias, NULL);
+ 
+ int xenbus_probe_node(struct xen_bus_type *bus,
+ 		      const char *type,
+@@ -492,10 +509,16 @@ int xenbus_probe_node(struct xen_bus_type *bus,
+ 
+ 	err = device_create_file(&xendev->dev, &dev_attr_devtype);
+ 	if (err)
+-		goto fail_remove_file;
++		goto fail_remove_nodename;
++
++	err = device_create_file(&xendev->dev, &dev_attr_modalias);
++	if (err)
++		goto fail_remove_devtype;
+ 
+ 	return 0;
+-fail_remove_file:
++fail_remove_devtype:
++	device_remove_file(&xendev->dev, &dev_attr_devtype);
++fail_remove_nodename:
+ 	device_remove_file(&xendev->dev, &dev_attr_nodename);
+ fail_unregister:
+ 	device_unregister(&xendev->dev);
+-- 
+1.5.4.2
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at  http://www.tux.org/lkml/
+

Reply to: