update uefi patch

This commit is contained in:
Peter Robinson 2018-10-30 11:38:52 +00:00
parent 08c8c778c9
commit 5ffeca0670
1 changed files with 48 additions and 21 deletions

View File

@ -306,10 +306,9 @@ index 3935e4f1ce9..56557205d00 100644
-- --
2.19.0 2.19.0
From 05e6d0b69f30c6b902ab9a343f4c4080a837ebd2 Mon Sep 17 00:00:00 2001
From 8624839d8a6fda54bd09edcd1c661fb960cca236 Mon Sep 17 00:00:00 2001
From: Peter Robinson <pbrobinson@gmail.com> From: Peter Robinson <pbrobinson@gmail.com>
Date: Tue, 2 Oct 2018 10:04:29 +0100 Date: Thu, 4 Oct 2018 10:37:24 +0100
Subject: [PATCH] efi_loader: fix simple network protocol Subject: [PATCH] efi_loader: fix simple network protocol
We should not call eth_rx() before the network interface is initialized. We should not call eth_rx() before the network interface is initialized.
@ -323,15 +322,18 @@ Correct the unit test.
Add and correct comments. Add and correct comments.
Without this patch i.mx6 system Wandboard Quad rev B1 fails to execute
bootefi selftest.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Peter Robinson <pbrobinson@gmail.com> Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
--- ---
lib/efi_loader/efi_net.c | 404 +++++++++++++++++++++++----- lib/efi_loader/efi_net.c | 419 +++++++++++++++++++++++-----
lib/efi_selftest/efi_selftest_snp.c | 16 +- lib/efi_selftest/efi_selftest_snp.c | 16 +-
2 files changed, 349 insertions(+), 71 deletions(-) 2 files changed, 359 insertions(+), 76 deletions(-)
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 5a3d7be86cf..7879952b260 100644 index 5a3d7be86cf..871c4c98228 100644
--- a/lib/efi_loader/efi_net.c --- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c +++ b/lib/efi_loader/efi_net.c
@@ -16,6 +16,8 @@ static const efi_guid_t efi_pxe_guid = EFI_PXE_GUID; @@ -16,6 +16,8 @@ static const efi_guid_t efi_pxe_guid = EFI_PXE_GUID;
@ -355,7 +357,7 @@ index 5a3d7be86cf..7879952b260 100644
+ * (UEFI) specification for details. + * (UEFI) specification for details.
+ * + *
+ * @this: pointer to the protocol instance + * @this: pointer to the protocol instance
+ * @return: status code + * Return: status code
+ */ + */
static efi_status_t EFIAPI efi_net_start(struct efi_simple_network *this) static efi_status_t EFIAPI efi_net_start(struct efi_simple_network *this)
{ {
@ -386,7 +388,7 @@ index 5a3d7be86cf..7879952b260 100644
+ * (UEFI) specification for details. + * (UEFI) specification for details.
+ * + *
+ * @this: pointer to the protocol instance + * @this: pointer to the protocol instance
+ * @return: status code + * Return: status code
+ */ + */
static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this) static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this)
{ {
@ -415,6 +417,15 @@ index 5a3d7be86cf..7879952b260 100644
* *
* This function implements the Initialize service of the * This function implements the Initialize service of the
* EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface * EFI_SIMPLE_NETWORK_PROTOCOL. See the Unified Extensible Firmware Interface
@@ -61,7 +109,7 @@ static efi_status_t EFIAPI efi_net_stop(struct efi_simple_network *this)
* @this: pointer to the protocol instance
* @extra_rx: extra receive buffer to be allocated
* @extra_tx: extra transmit buffer to be allocated
- * @return: status code
+ * Return: status code
*/
static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this,
ulong extra_rx, ulong extra_tx)
@@ -71,9 +119,10 @@ static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this, @@ -71,9 +119,10 @@ static efi_status_t EFIAPI efi_net_initialize(struct efi_simple_network *this,
EFI_ENTRY("%p, %lx, %lx", this, extra_rx, extra_tx); EFI_ENTRY("%p, %lx, %lx", this, extra_rx, extra_tx);
@ -785,13 +796,15 @@ index 5a3d7be86cf..7879952b260 100644
struct ethernet_hdr *eth_hdr; struct ethernet_hdr *eth_hdr;
size_t hdr_size = sizeof(struct ethernet_hdr); size_t hdr_size = sizeof(struct ethernet_hdr);
u16 protlen; u16 protlen;
@@ -240,8 +458,26 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, @@ -240,14 +458,35 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this,
EFI_ENTRY("%p, %p, %p, %p, %p, %p, %p", this, header_size, EFI_ENTRY("%p, %p, %p, %p, %p, %p, %p", this, header_size,
buffer_size, buffer, src_addr, dest_addr, protocol); buffer_size, buffer, src_addr, dest_addr, protocol);
+ /* Execute events */ + /* Execute events */
efi_timer_check(); efi_timer_check();
- if (!new_rx_packet)
- return EFI_EXIT(EFI_NOT_READY);
+ /* Check parameters */ + /* Check parameters */
+ if (!this) { + if (!this) {
+ ret = EFI_INVALID_PARAMETER; + ret = EFI_INVALID_PARAMETER;
@ -809,19 +822,31 @@ index 5a3d7be86cf..7879952b260 100644
+ break; + break;
+ } + }
+ +
if (!new_rx_packet) + if (!new_rx_packet) {
return EFI_EXIT(EFI_NOT_READY); + ret = EFI_NOT_READY;
+ goto out;
+ }
/* Check that we at least received an Ethernet header */ /* Check that we at least received an Ethernet header */
@@ -265,7 +501,7 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, if (net_rx_packet_len < sizeof(struct ethernet_hdr)) {
new_rx_packet = false;
- return EFI_EXIT(EFI_NOT_READY);
+ ret = EFI_NOT_READY;
+ goto out;
}
/* Fill export parameters */
eth_hdr = (struct ethernet_hdr *)net_rx_packet;
@@ -265,18 +504,24 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this,
if (protocol) if (protocol)
*protocol = protlen; *protocol = protlen;
if (*buffer_size < net_rx_packet_len) { if (*buffer_size < net_rx_packet_len) {
- /* Packet doesn't fit, try again with bigger buf */ - /* Packet doesn't fit, try again with bigger buf */
+ /* Packet doesn't fit, try again with bigger buffer */ + /* Packet doesn't fit, try again with bigger buffer */
*buffer_size = net_rx_packet_len; *buffer_size = net_rx_packet_len;
return EFI_EXIT(EFI_BUFFER_TOO_SMALL); - return EFI_EXIT(EFI_BUFFER_TOO_SMALL);
+ ret = EFI_BUFFER_TOO_SMALL;
+ goto out;
} }
@@ -273,10 +509,15 @@ static efi_status_t EFIAPI efi_net_receive(struct efi_simple_network *this, /* Copy packet */
memcpy(buffer, net_rx_packet, net_rx_packet_len); memcpy(buffer, net_rx_packet, net_rx_packet_len);
*buffer_size = net_rx_packet_len; *buffer_size = net_rx_packet_len;
new_rx_packet = false; new_rx_packet = false;
@ -839,7 +864,7 @@ index 5a3d7be86cf..7879952b260 100644
void efi_net_set_dhcp_ack(void *pkt, int len) void efi_net_set_dhcp_ack(void *pkt, int len)
{ {
int maxsize = sizeof(*dhcp_ack); int maxsize = sizeof(*dhcp_ack);
@@ -287,8 +528,22 @@ void efi_net_set_dhcp_ack(void *pkt, int len) @@ -287,8 +532,22 @@ void efi_net_set_dhcp_ack(void *pkt, int len)
memcpy(dhcp_ack, pkt, min(len, maxsize)); memcpy(dhcp_ack, pkt, min(len, maxsize));
} }
@ -864,7 +889,7 @@ index 5a3d7be86cf..7879952b260 100644
* *
* This notification function is called in every timer cycle. * This notification function is called in every timer cycle.
* *
@@ -298,8 +553,17 @@ void efi_net_set_dhcp_ack(void *pkt, int len) @@ -298,20 +557,34 @@ void efi_net_set_dhcp_ack(void *pkt, int len)
static void EFIAPI efi_network_timer_notify(struct efi_event *event, static void EFIAPI efi_network_timer_notify(struct efi_event *event,
void *context) void *context)
{ {
@ -877,12 +902,14 @@ index 5a3d7be86cf..7879952b260 100644
+ * initialization. + * initialization.
+ */ + */
+ if (!this || this->mode->state != EFI_NETWORK_INITIALIZED) + if (!this || this->mode->state != EFI_NETWORK_INITIALIZED)
+ return; + goto out;
+ +
if (!new_rx_packet) { if (!new_rx_packet) {
push_packet = efi_net_push; push_packet = efi_net_push;
eth_rx(); eth_rx();
@@ -308,10 +572,14 @@ static void EFIAPI efi_network_timer_notify(struct efi_event *event, push_packet = NULL;
}
+out:
EFI_EXIT(EFI_SUCCESS); EFI_EXIT(EFI_SUCCESS);
} }
@ -899,7 +926,7 @@ index 5a3d7be86cf..7879952b260 100644
efi_status_t r; efi_status_t r;
if (!eth_get_dev()) { if (!eth_get_dev()) {
@@ -321,10 +589,15 @@ efi_status_t efi_net_register(void) @@ -321,10 +594,15 @@ efi_status_t efi_net_register(void)
/* We only expose the "active" eth device, so one is enough */ /* We only expose the "active" eth device, so one is enough */
netobj = calloc(1, sizeof(*netobj)); netobj = calloc(1, sizeof(*netobj));
@ -919,7 +946,7 @@ index 5a3d7be86cf..7879952b260 100644
/* Hook net up to the device list */ /* Hook net up to the device list */
efi_add_handle(&netobj->parent); efi_add_handle(&netobj->parent);
@@ -387,13 +660,13 @@ efi_status_t efi_net_register(void) @@ -387,13 +665,13 @@ efi_status_t efi_net_register(void)
* iPXE is running at TPL_CALLBACK most of the time. Use a higher TPL. * iPXE is running at TPL_CALLBACK most of the time. Use a higher TPL.
*/ */
r = efi_create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, r = efi_create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY,
@ -935,7 +962,7 @@ index 5a3d7be86cf..7879952b260 100644
r = efi_set_timer(network_timer_event, EFI_TIMER_PERIODIC, 0); r = efi_set_timer(network_timer_event, EFI_TIMER_PERIODIC, 0);
if (r != EFI_SUCCESS) { if (r != EFI_SUCCESS) {
printf("ERROR: Failed to set network timer\n"); printf("ERROR: Failed to set network timer\n");
@@ -404,4 +677,9 @@ efi_status_t efi_net_register(void) @@ -404,4 +682,9 @@ efi_status_t efi_net_register(void)
failure_to_add_protocol: failure_to_add_protocol:
printf("ERROR: Failure to add protocol\n"); printf("ERROR: Failure to add protocol\n");
return r; return r;