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-changelog

[Xen-changelog] [xen-unstable] hvm: Etherboot for E100 NIC

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] hvm: Etherboot for E100 NIC
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 01 Feb 2008 08:00:24 -0800
Delivery-date: Fri, 01 Feb 2008 08:01:13 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1201796615 0
# Node ID 42369d21641d6297dc369441c3bfd355880d28c0
# Parent  71e9c5d41023e4066cea8767c573a62f05b45115
hvm: Etherboot for E100 NIC
Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx>
---
 .hgignore                                 |    2 
 tools/firmware/etherboot/Makefile         |   21 ++++++--
 tools/firmware/etherboot/make-eb-rom-list |   11 ++++
 tools/firmware/hvmloader/Makefile         |    2 
 tools/firmware/hvmloader/hvmloader.c      |   77 +++++++++++++++++++-----------
 5 files changed, 81 insertions(+), 32 deletions(-)

diff -r 71e9c5d41023 -r 42369d21641d .hgignore
--- a/.hgignore Thu Jan 31 14:14:23 2008 +0000
+++ b/.hgignore Thu Jan 31 16:23:35 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 -r 42369d21641d 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 16:23:35 2008 +0000
@@ -9,16 +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
 
-all: $(TARGETS)
+ROM_ZHS = $(addprefix eb-, $(addsuffix .zrom.h, $(NICS)))
+
+all: eb-roms.h
 
 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 $@
 
-$E/src/Config: $T Config
+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
        tar zxf $T
        cat Config >>$D/src/Config
@@ -44,7 +52,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 eb-rom-list.h eb-roms.h *~
 
 .PHONY: all clean
diff -r 71e9c5d41023 -r 42369d21641d 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 16:23:35 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.*/"
diff -r 71e9c5d41023 -r 42369d21641d 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 16:23:35 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 -r 42369d21641d 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 16:23:35 2008 +0000
@@ -345,27 +345,58 @@ static void pci_setup(void)
     }
 }
 
+static int must_load_extboot(void)
+{
+    return (inb(0x404) == 1);
+}
+
 /*
- * If the network card is in the boot order, load the Etherboot option ROM.
- * Read the boot order bytes from CMOS and check if any of them are 0x4.
+ * Scan the PCI bus for the first NIC supported by etherboot, and copy
+ * the corresponding rom data to *copy_rom_dest. Returns the length of the
+ * selected rom, or 0 if no NIC found.
  */
-static int must_load_nic(void) 
-{
-    uint8_t boot_order;
-
-    /* Read CMOS register 0x3d (boot choices 0 and 1). */
-    boot_order = cmos_inb(0x3d);
-    if ( ((boot_order & 0xf) == 0x4) || ((boot_order & 0xf0) == 0x40) ) 
-        return 1;
-
-    /* Read CMOS register 0x38 (boot choice 2 and FDD test flag). */
-    boot_order = cmos_inb(0x38);
-    return ((boot_order & 0xf0) == 0x40);
-}
-
-static int must_load_extboot(void)
-{
-    return (inb(0x404) == 1);
+static int scan_etherboot_nic(void *copy_rom_dest)
+{
+    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;
+    }
+
+    return 0;
+
+ found:
+    printf("Loading %s Etherboot PXE ROM ...\n", eb->name);
+    memcpy(copy_rom_dest, eb->etherboot_rom, eb->etherboot_sz);
+    return eb->etherboot_sz;
 }
 
 /* Replace possibly erroneous memory-size CMOS fields with correct values. */
@@ -443,13 +474,7 @@ int main(void)
         vgabios_sz = sizeof(vgabios_stdvga);
     }
 
-    if ( must_load_nic() )
-    {
-        printf("Loading ETHERBOOT ...\n");
-        memcpy((void *)ETHERBOOT_PHYSICAL_ADDRESS,
-               etherboot, sizeof(etherboot));
-        etherboot_sz = sizeof(etherboot);
-    }
+    etherboot_sz = scan_etherboot_nic((void*)ETHERBOOT_PHYSICAL_ADDRESS);
 
     if ( must_load_extboot() )
     {

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] hvm: Etherboot for E100 NIC, Xen patchbot-unstable <=