Fix virtio bug with UEFI driver
This commit is contained in:
parent
cf5216a4fe
commit
f39b985b6e
@ -0,0 +1,51 @@
|
|||||||
|
From b12b1b620fffc89e86af3879a945e7ffaa7c141d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
Date: Fri, 10 Apr 2015 21:53:21 +0200
|
||||||
|
Subject: [PATCH] [virtio] Downgrade per-iobuf debug messages to DBGC2
|
||||||
|
|
||||||
|
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
Signed-off-by: Michael Brown <mcb30@ipxe.org>
|
||||||
|
---
|
||||||
|
src/drivers/net/virtio-net.c | 12 ++++++------
|
||||||
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/drivers/net/virtio-net.c b/src/drivers/net/virtio-net.c
|
||||||
|
index 8b67d9d..533ccb0 100644
|
||||||
|
--- a/src/drivers/net/virtio-net.c
|
||||||
|
+++ b/src/drivers/net/virtio-net.c
|
||||||
|
@@ -131,8 +131,8 @@ static void virtnet_enqueue_iob ( struct net_device *netdev,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
- DBGC ( virtnet, "VIRTIO-NET %p enqueuing iobuf %p on vq %d\n",
|
||||||
|
- virtnet, iobuf, vq_idx );
|
||||||
|
+ DBGC2 ( virtnet, "VIRTIO-NET %p enqueuing iobuf %p on vq %d\n",
|
||||||
|
+ virtnet, iobuf, vq_idx );
|
||||||
|
|
||||||
|
vring_add_buf ( vq, list, out, in, iobuf, 0 );
|
||||||
|
vring_kick ( virtnet->ioaddr, vq, 1 );
|
||||||
|
@@ -256,8 +256,8 @@ static void virtnet_process_tx_packets ( struct net_device *netdev ) {
|
||||||
|
while ( vring_more_used ( tx_vq ) ) {
|
||||||
|
struct io_buffer *iobuf = vring_get_buf ( tx_vq, NULL );
|
||||||
|
|
||||||
|
- DBGC ( virtnet, "VIRTIO-NET %p tx complete iobuf %p\n",
|
||||||
|
- virtnet, iobuf );
|
||||||
|
+ DBGC2 ( virtnet, "VIRTIO-NET %p tx complete iobuf %p\n",
|
||||||
|
+ virtnet, iobuf );
|
||||||
|
|
||||||
|
netdev_tx_complete ( netdev, iobuf );
|
||||||
|
}
|
||||||
|
@@ -283,8 +283,8 @@ static void virtnet_process_rx_packets ( struct net_device *netdev ) {
|
||||||
|
iob_unput ( iobuf, RX_BUF_SIZE );
|
||||||
|
iob_put ( iobuf, len - sizeof ( struct virtio_net_hdr ) );
|
||||||
|
|
||||||
|
- DBGC ( virtnet, "VIRTIO-NET %p rx complete iobuf %p len %zd\n",
|
||||||
|
- virtnet, iobuf, iob_len ( iobuf ) );
|
||||||
|
+ DBGC2 ( virtnet, "VIRTIO-NET %p rx complete iobuf %p len %zd\n",
|
||||||
|
+ virtnet, iobuf, iob_len ( iobuf ) );
|
||||||
|
|
||||||
|
/* Pass completed packet to the network stack */
|
||||||
|
netdev_rx ( netdev, iobuf );
|
||||||
|
--
|
||||||
|
2.3.5
|
||||||
|
|
@ -0,0 +1,79 @@
|
|||||||
|
From 755d2b8f6be681a2e620534b237471b75f28ed8c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Brown <mcb30@ipxe.org>
|
||||||
|
Date: Mon, 13 Apr 2015 12:06:59 +0100
|
||||||
|
Subject: [PATCH] [efi] Ensure drivers are disconnected when ExitBootServices()
|
||||||
|
is called
|
||||||
|
|
||||||
|
We hook the UEFI ExitBootServices() event and use it to trigger a call
|
||||||
|
to shutdown_boot(). This does not automatically cause drivers to be
|
||||||
|
disconnected from their devices, since device enumeration is now
|
||||||
|
handled by the UEFI core rather than by iPXE. (Under the old and
|
||||||
|
dubiously compatible device model, iPXE used to perform its own device
|
||||||
|
enumeration and so the call to shutdown_boot() would indeed have
|
||||||
|
caused drivers to be disconnected.)
|
||||||
|
|
||||||
|
Fix by replicating parts of the dummy "EFI root device" from
|
||||||
|
efiprefix.c to efidrvprefix.c, so that the call to shutdown_boot()
|
||||||
|
will call efi_driver_disconnect_all().
|
||||||
|
|
||||||
|
Originally-fixed-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
Tested-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
Signed-off-by: Michael Brown <mcb30@ipxe.org>
|
||||||
|
---
|
||||||
|
src/arch/x86/prefix/efidrvprefix.c | 35 +++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 35 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/arch/x86/prefix/efidrvprefix.c b/src/arch/x86/prefix/efidrvprefix.c
|
||||||
|
index 3daefd0..4fbb19f 100644
|
||||||
|
--- a/src/arch/x86/prefix/efidrvprefix.c
|
||||||
|
+++ b/src/arch/x86/prefix/efidrvprefix.c
|
||||||
|
@@ -21,7 +21,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ipxe/init.h>
|
||||||
|
+#include <ipxe/device.h>
|
||||||
|
#include <ipxe/efi/efi.h>
|
||||||
|
+#include <ipxe/efi/efi_driver.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EFI entry point
|
||||||
|
@@ -44,3 +46,36 @@ EFI_STATUS EFIAPI _efidrv_start ( EFI_HANDLE image_handle,
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Probe EFI root bus
|
||||||
|
+ *
|
||||||
|
+ * @v rootdev EFI root device
|
||||||
|
+ */
|
||||||
|
+static int efi_probe ( struct root_device *rootdev __unused ) {
|
||||||
|
+
|
||||||
|
+ /* Do nothing */
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Remove EFI root bus
|
||||||
|
+ *
|
||||||
|
+ * @v rootdev EFI root device
|
||||||
|
+ */
|
||||||
|
+static void efi_remove ( struct root_device *rootdev __unused ) {
|
||||||
|
+
|
||||||
|
+ efi_driver_disconnect_all();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/** EFI root device driver */
|
||||||
|
+static struct root_driver efi_root_driver = {
|
||||||
|
+ .probe = efi_probe,
|
||||||
|
+ .remove = efi_remove,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/** EFI root device */
|
||||||
|
+struct root_device efi_root_device __root_device = {
|
||||||
|
+ .dev = { .name = "EFI" },
|
||||||
|
+ .driver = &efi_root_driver,
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.3.5
|
||||||
|
|
13
ipxe.spec
13
ipxe.spec
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
Name: ipxe
|
Name: ipxe
|
||||||
Version: %{date}
|
Version: %{date}
|
||||||
Release: 1.git%{hash}%{?dist}
|
Release: 2.git%{hash}%{?dist}
|
||||||
Summary: A network boot loader
|
Summary: A network boot loader
|
||||||
|
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
@ -50,6 +50,11 @@ Source0: %{name}-%{version}-git%{hash}.tar.xz
|
|||||||
Source1: USAGE
|
Source1: USAGE
|
||||||
Source2: config.local.general.h
|
Source2: config.local.general.h
|
||||||
|
|
||||||
|
# From upstream commit b12b1b620fffc89e86af3879a945e7ffaa7c141d
|
||||||
|
Patch0001: 0001-virtio-Downgrade-per-iobuf-debug-messages-to-DBGC2.patch
|
||||||
|
# From upstream commit 755d2b8f6be681a2e620534b237471b75f28ed8c
|
||||||
|
Patch0002: 0002-efi-Ensure-drivers-are-disconnected-when-ExitBootSer.patch
|
||||||
|
|
||||||
# From QEMU
|
# From QEMU
|
||||||
Patch1001: qemu-0001-efi_snp-improve-compliance-with-the-EFI_SIMPLE_NETWO.patch
|
Patch1001: qemu-0001-efi_snp-improve-compliance-with-the-EFI_SIMPLE_NETWO.patch
|
||||||
Patch1002: qemu-0002-efi-make-load-file-protocol-optional.patch
|
Patch1002: qemu-0002-efi-make-load-file-protocol-optional.patch
|
||||||
@ -119,6 +124,9 @@ DNS, HTTP, iSCSI, etc.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{name}-%{version}-git%{hash}
|
%setup -q -n %{name}-%{version}-git%{hash}
|
||||||
|
|
||||||
|
# From upstream
|
||||||
|
%patch0001 -p1
|
||||||
|
%patch0002 -p1
|
||||||
# From QEMU
|
# From QEMU
|
||||||
%patch1001 -p1
|
%patch1001 -p1
|
||||||
%patch1002 -p1
|
%patch1002 -p1
|
||||||
@ -218,6 +226,9 @@ done
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Apr 16 2015 Paolo Bonzini <pbonzini@redhat.com> - 20150407-2.gitdc795b9f
|
||||||
|
- Fix virtio bug with UEFI driver
|
||||||
|
|
||||||
* Thu Apr 16 2015 Paolo Bonzini <pbonzini@redhat.com> - 20150407-1.gitdc795b9f
|
* Thu Apr 16 2015 Paolo Bonzini <pbonzini@redhat.com> - 20150407-1.gitdc795b9f
|
||||||
- Update to latest upstream snapshot
|
- Update to latest upstream snapshot
|
||||||
- Switch source to .tar.xz
|
- Switch source to .tar.xz
|
||||||
|
Loading…
Reference in New Issue
Block a user