On Mon, 11 Nov 2024 at 23:10, Adriano Cordova <adria...@gmail.com> wrote: > > Set the device path of the efi boot device to an HTTP device path > (as formed by efi_dp_from_http) when the next boot stage is loaded > using wget (i.e., when wget is used with wget_info.set_bootdev=1).
We want the reasoning of why you need the change in the commit log, instead of what the code does. > > Signed-off-by: Adriano Cordova <adria...@gmail.com> > --- > > (no changes since v2) > > include/efi_loader.h | 6 ++++++ > lib/efi_loader/efi_device_path.c | 2 +- > lib/efi_loader/efi_net.c | 22 +++++++++++++++++++++- > net/lwip/wget.c | 1 + > net/wget.c | 1 + > 5 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/include/efi_loader.h b/include/efi_loader.h > index 96b204dfc3..f49f8e6be0 100644 > --- a/include/efi_loader.h > +++ b/include/efi_loader.h > @@ -126,6 +126,10 @@ static inline void efi_set_bootdev(const char *dev, > const char *devnr, > #endif > > #if CONFIG_IS_ENABLED(NETDEVICES) && CONFIG_IS_ENABLED(EFI_LOADER) > +/* Call this to update the current device path of the efi net device */ > +void efi_net_set_dp(const char *dev, const char *server); > +/* Call this to get the current device path of the efi net device */ > +void efi_net_get_dp(void **dp); > void efi_net_get_addr(struct efi_ipv4_address *ip, > struct efi_ipv4_address *mask, > struct efi_ipv4_address *gw); > @@ -133,6 +137,8 @@ void efi_net_set_addr(struct efi_ipv4_address *ip, > struct efi_ipv4_address *mask, > struct efi_ipv4_address *gw); > #else > +static inline void efi_net_set_dp(const char *dev, const char *server) { } > +static inline void efi_net_get_dp(void **dp) { } > static inline void efi_net_get_addr(struct efi_ipv4_address *ip, > struct efi_ipv4_address *mask, > struct efi_ipv4_address *gw) { } > diff --git a/lib/efi_loader/efi_device_path.c > b/lib/efi_loader/efi_device_path.c > index 158f08b9e5..afb4abc3ff 100644 > --- a/lib/efi_loader/efi_device_path.c > +++ b/lib/efi_loader/efi_device_path.c > @@ -1168,7 +1168,7 @@ efi_status_t efi_dp_from_name(const char *dev, const > char *devnr, > dp = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, > (uintptr_t)image_addr, image_size); > } else if (IS_ENABLED(CONFIG_NETDEVICES) && !strcmp(dev, "Net")) { > - dp = efi_dp_from_eth(); > + efi_net_get_dp((void **)&dp); > } else if (!strcmp(dev, "Uart")) { > dp = efi_dp_from_uart(); > } else { > diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c > index dd84b3f18d..d4570d4d7c 100644 > --- a/lib/efi_loader/efi_net.c > +++ b/lib/efi_loader/efi_net.c > @@ -16,6 +16,7 @@ > */ > > #include <efi_loader.h> > +#include <dm.h> > #include <malloc.h> > #include <vsprintf.h> > #include <net.h> > @@ -31,6 +32,7 @@ static size_t *receive_lengths; > static int rx_packet_idx; > static int rx_packet_num; > static struct efi_net_obj *netobj; > +static struct efi_device_path *net_dp; > > /* > * The notification function of this event is called in every timer cycle > @@ -902,8 +904,10 @@ efi_status_t efi_net_register(void) > &netobj->net); > if (r != EFI_SUCCESS) > goto failure_to_add_protocol; > + if (!net_dp) > + efi_net_set_dp("Net", NULL); > r = efi_add_protocol(&netobj->header, &efi_guid_device_path, > - efi_dp_from_eth()); > + net_dp); > if (r != EFI_SUCCESS) > goto failure_to_add_protocol; > r = efi_add_protocol(&netobj->header, > &efi_pxe_base_code_protocol_guid, > @@ -999,6 +1003,22 @@ out_of_resources: > return EFI_OUT_OF_RESOURCES; > } > > +void efi_net_set_dp(const char *dev, const char *server) > +{ > + if (!strcmp(dev, "Net")) > + net_dp = efi_dp_from_eth(); > + else if (!strcmp(dev, "Http")) > + net_dp = efi_dp_from_http(server); > +} > + > +void efi_net_get_dp(void **dp) > +{ > + if (!net_dp) > + efi_net_set_dp("Net", NULL); > + if (dp && net_dp) > + *dp = efi_dp_dup(net_dp); > +} > + > void efi_net_get_addr(struct efi_ipv4_address *ip, > struct efi_ipv4_address *mask, > struct efi_ipv4_address *gw) > diff --git a/net/lwip/wget.c b/net/lwip/wget.c > index 53c3b169e0..5c44e324be 100644 > --- a/net/lwip/wget.c > +++ b/net/lwip/wget.c > @@ -217,6 +217,7 @@ static void httpc_result_cb(void *arg, httpc_result_t > httpc_result, > print_size(rx_content_len / elapsed * 1000, "/s)\n"); > printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size); > if (wget_info->set_bootdev) { > + efi_net_set_dp("Http", ctx->server_name); > efi_set_bootdev("Net", "", ctx->path, > map_sysmem(ctx->saved_daddr, 0), > rx_content_len); > } > diff --git a/net/wget.c b/net/wget.c > index 36158e0a9c..676d4db759 100644 > --- a/net/wget.c > +++ b/net/wget.c > @@ -442,6 +442,7 @@ static void wget_handler(uchar *pkt, u16 dport, > net_set_state(wget_loop_state); > wget_info->file_size = net_boot_file_size; > if (wget_info->method == WGET_HTTP_METHOD_GET && > wget_info->set_bootdev) { > + efi_net_set_dp("Http", NULL); > efi_set_bootdev("Net", "", image_url, > map_sysmem(image_load_addr, 0), > net_boot_file_size); > -- > 2.43.0 >