From 7628b0f5aaa2b46ffcd3df2e574e6bb487268b92 Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 15 May 2013 18:20:39 +0000 Subject: [PATCH] OvmfPkg: enable the generic network stack by default DHCP, PXE, and StdLib socket apps are enabled in OVMF by the sum of: (a) a UEFI NIC driver, (b) the generic network stack. The only choice for (a) used to be the proprietary Intel E1000 driver, which is cumbersome to obtain and enable. The iPXE UEFI NIC drivers packaged with qemu-1.5 cover (a) for each NIC type supported by qemu, and are easy to obtain & configure, even for earlier qemu versions. Therefore enable (b) per default as well. This doesn't take up much space; the binaries (b) adds to the firmware don't seem to need -D FD_SIZE_2MB. Intel's e1000 driver remains an option, requested by the -D E1000_ENABLE build flag. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14366 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/OvmfPkgIa32.dsc | 2 - OvmfPkg/OvmfPkgIa32.fdf | 4 +- OvmfPkg/OvmfPkgIa32X64.dsc | 2 - OvmfPkg/OvmfPkgIa32X64.fdf | 4 +- OvmfPkg/OvmfPkgX64.dsc | 2 - OvmfPkg/OvmfPkgX64.fdf | 4 +- OvmfPkg/README | 84 ++++++++++++++++++++++++++------------ 7 files changed, 65 insertions(+), 37 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index c99cee3965..0e6d1879b5 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -467,7 +467,6 @@ # # Network Support # -!if $(NETWORK_ENABLE) MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -481,7 +480,6 @@ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index 8861980b9d..4665b9e1bd 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -249,10 +249,11 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { # # Network modules # -!if $(NETWORK_ENABLE) +!if $(E1000_ENABLE) FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 { SECTION PE32 = Intel3.5/EFI32/E3507E2.EFI } +!endif INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -266,7 +267,6 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 9173aae70e..48da5328e0 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -474,7 +474,6 @@ # # Network Support # -!if $(NETWORK_ENABLE) MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -488,7 +487,6 @@ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 93a36b7cca..177c880d4b 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -249,10 +249,11 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { # # Network modules # -!if $(NETWORK_ENABLE) +!if $(E1000_ENABLE) FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 { SECTION PE32 = Intel3.5/EFIX64/E3507X2.EFI } +!endif INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -266,7 +267,6 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index dce9ce1086..7f138ce48d 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -472,7 +472,6 @@ # # Network Support # -!if $(NETWORK_ENABLE) MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -486,7 +485,6 @@ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index d023cb19b0..1d3ba8e52f 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -249,10 +249,11 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { # # Network modules # -!if $(NETWORK_ENABLE) +!if $(E1000_ENABLE) FILE DRIVER = 5D695E11-9B3F-4b83-B25F-4A8D5D69BE07 { SECTION PE32 = Intel3.5/EFIX64/E3507X2.EFI } +!endif INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf @@ -266,7 +267,6 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf -!endif # # Usb Support diff --git a/OvmfPkg/README b/OvmfPkg/README index 2c8b51fc76..13058eae47 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -108,31 +108,65 @@ $ OvmfPkg/build.sh -a IA32 -b RELEASE -t GCC45 === Network Support === -To add network drivers to OVMF: - -* Download UEFI drivers for the e1000 NIC - - http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17515&lang=eng - - Install the drivers into a directory called Intel3.5 in your WORKSPACE - -* Include the drivers in OVMF during the build: - - Add '-D NETWORK_ENABLE' to your build command - - For example: build -D NETWORK_ENABLE - -* Use the QEMU -net parameter to enable NIC support. - - QEMU does not support UEFI DHCP or UEFI PXE Boot, so long timeouts will - occur when NICs are enabled. The long timeouts can be avoided by - interrupts the boot sequence by pressing a key when the logo appears. - - Example: Enable e1000 NIC with a DHCP server and restrict packet - forwarding: - -net nic,model=e1000 -net user,restrict=yes -net user,dhcpstart=10.0.2.10 - - Example: Enable e1000 NIC with a DHCP server, restrict packet forwarding, - and generate PCAP file: - -net nic,model=e1000 -net user,restrict=yes -net user,dhcpstart=10.0.2.10 - -net dump,file=a.pcap - - Example: Enable 2 e1000 NICs with a DHCP server and restrict - packet forwarding: - -net nic,model=e1000,addr=3 -net nic,model=e1000,addr=4 - -net user,restrict=yes -net user,dhcpstart=10.0.2.10 +OVMF provides a generic UEFI network stack by default, with the lowest level +driver (the NIC driver) missing in the default build. In order to complete the +stack and make eg. DHCP, PXE Boot, and socket test utilities from the StdLib +edk2 package work, (1) qemu has to be configured to emulate a NIC, (2) a +matching UEFI NIC driver must be available when OVMF boots. + +(If a NIC is configured for the virtual machine, and -- dependent on boot order +-- PXE booting is attempted, but no DHCP server responds to OVMF's DHCP +DISCOVER message at startup, the boot process may take approx. 3 seconds +longer.) + +* For each NIC emulated by qemu, a GPLv2 licensed UEFI driver is available from + the iPXE project. The qemu source distribution, starting with version 1.5, + contains prebuilt binaries of these drivers (and of course allows one to + rebuild them from source as well). + +* Use the qemu -netdev and -device options, or the legacy -net option, to + enable NIC support: . + +* For a qemu >= 1.5 binary running *without* any "-M machine" option where + "machine" would identify a < qemu-1.5 configuration (for example: "-M + pc-i440fx-1.4" or "-M pc-0.13"), the drivers are available from the default + qemu installation to OVMF without further settings. + +* For a qemu binary in [0.13, 1.5), or a qemu >= 1.5 binary with an "-M + machine" option where "machine" selects a < qemu-1.5 configuration: + + - download a >= 1.5.0-rc1 source tarball from , + + - extract the following files from the tarball and install them in a + location that is accessible to qemu processes (this may depend on your + SELinux configuration, for example): + + qemu-VERSION/pc-bios/efi-e1000.rom + qemu-VERSION/pc-bios/efi-ne2k_pci.rom + qemu-VERSION/pc-bios/efi-pcnet.rom + qemu-VERSION/pc-bios/efi-rtl8139.rom + qemu-VERSION/pc-bios/efi-virtio.rom + + - extend the NIC's -device option on the qemu command line with a matching + "romfile=" optarg: + + -device e1000,...,romfile=/full/path/to/efi-e1000.rom + -device ne2k_pci,...,romfile=/full/path/to/efi-ne2k_pci.rom + -device pcnet,...,romfile=/full/path/to/efi-pcnet.rom + -device rtl8139,...,romfile=/full/path/to/efi-rtl8139.rom + -device virtio-net-pci,...,romfile=/full/path/to/efi-virtio.rom + +* Independently of the iPXE NIC drivers, Intel's proprietary E1000 NIC driver + can be embedded in the OVMF image at build time, as an alternative guest + driver for "-device e1000": + + - Download UEFI drivers for the e1000 NIC + - http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17515&lang=eng + - Install the drivers into a directory called Intel3.5 in your WORKSPACE. + + - Include the driver in OVMF during the build: + - Add "-D E1000_ENABLE -D FD_SIZE_2MB" to your build command, + - For example: "build -D E1000_ENABLE -D FD_SIZE_2MB". === UNIXGCC Debug === -- 2.39.2