WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] Etherboot for E100 NIC

To: Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] Etherboot for E100 NIC
From: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
Date: Thu, 31 Jan 2008 15:51:32 +0000
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Thu, 31 Jan 2008 07:54:24 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <479E6049.7020908@xxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Newsgroups: chiark.mail.xen.devel
References: <479E6049.7020908@xxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Yosuke Iwamatsu writes ("[Xen-devel] [PATCH] Etherboot for E100 NIC"):
> Currently, Xen has the etherboot rom for hvm guests,
> which only supports rtl8139 nic device model.
> This patch is intended to support etherboot for e100 nic by:
> - adding etherboot rom for e100 nic (provided by rom-o-matic.net).
> - making hvmloader scan pci devices, find the first nic device
> and load the corresponding etherboot rom.

Following on from the changes recently made to build etherboot
ourselves from source, I've adapted Yosuke Iwamatsu's idea to work in
this context.

The result is below and appears to work.  The set of supported NICs
can be adjusted by changing the setting of NICS in
tools/firmware/etherboot/Makefile.

The added file tools/firmware/etherboot/make-eb-rom-list needs to have
chmod +x run on it before committing.

Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx>

diff -r 71e9c5d41023 .hgignore
--- a/.hgignore Thu Jan 31 14:14:23 2008 +0000
+++ b/.hgignore Thu Jan 31 15:45:21 2008 +0000
@@ -105,6 +105,8 @@
 ^tools/firmware/.*\.bin$
 ^tools/firmware/.*\.sym$
 ^tools/firmware/.*bios/.*bios.*\.txt$
+^tools/firmware/etherboot/eb-roms\.h$
+^tools/firmware/etherboot/eb-rom-list\.h$
 ^tools/firmware/etherboot/etherboot-5
 ^tools/firmware/etherboot/etherboot-build
 ^tools/firmware/etherboot/.*\.zrom\.h$
diff -r 71e9c5d41023 tools/firmware/etherboot/Makefile
--- a/tools/firmware/etherboot/Makefile Thu Jan 31 14:14:23 2008 +0000
+++ b/tools/firmware/etherboot/Makefile Thu Jan 31 15:45:26 2008 +0000
@@ -9,14 +9,24 @@ T=etherboot-$(EB_VERSION).tar.gz
 T=etherboot-$(EB_VERSION).tar.gz
 E=etherboot-build
 
-TARGETS=eb-rtl8139.zrom.h
+NICS = rtl8139 eepro100
+
+TARGETS= eb-rom-list.h eb-roms.h $(ROM_ZHS)
+
+ROM_ZHS= $(addprefix eb-, $(addsuffix .zrom.h, $(NICS)))
 
 all: $(TARGETS)
 
 eb-%.zrom.h: $E/src/Config
        $(MAKE) -C $E/src bin/$*.zrom
-       ../hvmloader/mkhex etherboot <$E/src/bin/$*.zrom >$@.new
+       ../hvmloader/mkhex etherboot_$* <$E/src/bin/$*.zrom >$@.new
        mv -f $@.new $@
+
+eb-rom-list.h: make-eb-rom-list $E/src/bin/Roms
+       ./$^ $(NICS) >$@.new && mv -f $@.new $@
+
+eb-roms.h: eb-rom-list.h $(ROM_ZHS)
+       cat $^ >$@.new && mv -f $@.new $@
 
 $E/src/Config: $T Config
        rm -rf $D $E
@@ -44,7 +54,10 @@ eb-%.zrom.h: $E/src/Config
                mv Config.new Config
        mv $D $E
 
+$E/src/bin/Roms: $E/src/Config
+       $(MAKE) -C $E/src bin/Roms
+
 clean:
-       rm -rf $D $E *.zrom.h *~
+       rm -rf $D $E *.zrom.h $(TARGETS) *~
 
 .PHONY: all clean
diff -r 71e9c5d41023 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile Thu Jan 31 14:14:23 2008 +0000
+++ b/tools/firmware/hvmloader/Makefile Thu Jan 31 14:15:33 2008 +0000
@@ -55,7 +55,7 @@ roms.h:       ../rombios/BIOS-bochs-latest ../
        sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h
        sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin 
>> roms.h
        sh ./mkhex vmxassist ../vmxassist/vmxassist.bin >> roms.h
-       cat ../etherboot/eb-rtl8139.zrom.h >> roms.h
+       cat ../etherboot/eb-roms.h >> roms.h
        sh ./mkhex extboot ../extboot/extboot.bin >> roms.h
 
 .PHONY: clean
diff -r 71e9c5d41023 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Thu Jan 31 14:14:23 2008 +0000
+++ b/tools/firmware/hvmloader/hvmloader.c      Thu Jan 31 14:30:52 2008 +0000
@@ -368,6 +368,58 @@ static int must_load_extboot(void)
     return (inb(0x404) == 1);
 }
 
+/*
+ * Scan the PCI bus for the first NIC supported by etherboot, and copy
+ * the corresponding rom data to *copy_rom_dest.  On return *sz_r
+ * is the length of the selected rom found, or 0 if no NIC found.
+ */
+static void scan_etherboot_nic(void *copy_rom_dest, int *sz_r)
+{
+    static struct etherboots_table_entry {
+        char *name;
+        void *etherboot_rom;
+        int etherboot_sz;
+        uint16_t vendor, device;
+    } etherboots_table[] = {
+#define ETHERBOOT_ROM(name, vendor, device) \
+  { #name, etherboot_##name, sizeof(etherboot_##name), vendor, device },
+        ETHERBOOT_ROM_LIST
+        { 0 }
+    };
+
+    uint32_t devfn;
+    uint16_t class, vendor_id, device_id;
+    struct etherboots_table_entry *eb;
+
+    for ( devfn = 0; devfn < 128; devfn++ )
+    {
+        class     = pci_readw(devfn, PCI_CLASS_DEVICE);
+        vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
+        device_id = pci_readw(devfn, PCI_DEVICE_ID);
+
+        if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
+            continue;
+
+        if ( class != 0x0200 ) /* Not a NIC */
+            continue;
+
+        for (eb = etherboots_table;
+             eb->name;
+             eb++)
+            if (eb->vendor == vendor_id &&
+                eb->device == device_id)
+                goto found;
+    }
+    /* not found: */
+    *sz_r = 0;
+    return;
+
+ found:
+    memcpy(copy_rom_dest, eb->etherboot_rom, eb->etherboot_sz);
+    *sz_r = eb->etherboot_sz;
+    printf("Using etherboot_%s ...\n", eb->name);
+}
+
 /* Replace possibly erroneous memory-size CMOS fields with correct values. */
 static void cmos_write_memory_size(void)
 {
@@ -446,9 +498,7 @@ int main(void)
     if ( must_load_nic() )
     {
         printf("Loading ETHERBOOT ...\n");
-        memcpy((void *)ETHERBOOT_PHYSICAL_ADDRESS,
-               etherboot, sizeof(etherboot));
-        etherboot_sz = sizeof(etherboot);
+        scan_etherboot_nic((void*)ETHERBOOT_PHYSICAL_ADDRESS, &etherboot_sz);
     }
 
     if ( must_load_extboot() )
diff -r 71e9c5d41023 tools/firmware/etherboot/make-eb-rom-list
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/etherboot/make-eb-rom-list Thu Jan 31 14:02:22 2008 +0000
@@ -0,0 +1,11 @@
+#!/bin/sh
+set -e
+roms=$1; shift
+echo "/* autogenerated - do not edit */"
+echo "#define ETHERBOOT_ROM_LIST \\"
+for nic in "$@"; do
+       makerom=`grep "^MAKEROM_ID_$nic *= *-p *" <$roms`
+       echo "  ETHERBOOT_ROM($nic,${makerom#*-p}) \\"
+done
+echo
+echo "/*end.*/"
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>