mbox series

[v6,0/9] Add EFI HTTP boot support

Message ID 20231015234907.2362717-1-masahisa.kojima@linaro.org
Headers show
Series Add EFI HTTP boot support | expand

Message

Masahisa Kojima Oct. 15, 2023, 11:48 p.m. UTC
This series adds the EFI HTTP boot support.
User can add the URI device path with "efidebug boot add" command.
efibootmgr handles the URI device path, download the
specified file using wget, mount the downloaded image with
blkmap, then boot with the default file(e.g. EFI/BOOT/BOOTAA64.EFI)
by selecting automatically created boot option when the new disk is
detected.

This version still does not include the test.

To enable EFI HTTP boot, we need to enable the following Kconfig options.
 CONFIG_CMD_DNS
 CONFIG_CMD_WGET
 CONFIG_BLKMAP
 CONFIG_EFI_HTTP_BOOT

On the Socionext Developerbox, enter the following commands then
debian installer is downloaded into "loadaddr" and installer
automatically starts.
 => dhcp
 => setenv serverip 192.168.1.1
 => efidebug boot add -u 3 debian-netinst http://ftp.riken.jp/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
 => efidebug boot order 3
 => bootefi bootmgr

Note that this debian installer can not proceed the installation
bacause RAM disk of installer image is not recogniged by the kernel.
I'm still investigating this issue, but drivers/nvdimm/of_pmem.c in linux
will be one of the solution to recognize RAM disk from kernel.
(In EDK2, the equivalent solution is called ACPI NFIT.)

On QEMU, I can not make DNS work from the QEMU guest.
The following commands work on qemu_arm64(manually set the http server ip in URI).
  => dhcp
  => setenv gatewayip 10.0.2.2
  => setenv httpserverip 134.160.38.1
  => efidebug boot add -u 3 debian-netinst http://134.160.38.1/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
  => efidebug boot order 3
  => bootefi bootmgr

[TODO]
- add test
- stricter wget uri check
- omit the dns process if the given uri has ip address
   -> this will be supported when the lwip migration completes
- uri device path support in eficonfig

[change log]
v5 -> v6
- add patch #4 "Boot var automatic management for removable medias"
- boot from automatically created boot option
  rather than searching default file on the fly
- introduce new CONFIG_EFI_HTTP_BOOT Kconfig option
- comment in one place
- use log_err() rather than printf()
- use env_get_hex("filesize", 0) instead of return value of net_loop()
- use more suitable error code
- blkmap can be build for SPL/TPL
- add CDROM short-form device path support

v4 -> v5
- add missing else statement
- add NULL check of efi_dp_find_obj() call
- update document to remove "limitation"

v3 -> v4
- patch#8 is added to simplify the bootmgr default boot process
- add function comments

v2 -> v3
- Patch#6 is added, reserve the whole ramdisk memory region
- remove .efi file extension check for PE-COFF image
- use "if IS_ENABLED(..)" as much as possible
- 1024 should be sizeof(net_boot_file_name)
- call net_set_state(NETLOOP_FAIL) when wget encounters error
- describe DNS ip address host name limitation in document

v1 -> v2
- carve out the network handling(wget and dns code) under net/wget.c
- carve out ramdisk creation code under drivers/block/blkmap_helper.c
- wget supports the valid range check to store the received blocks using lmb
- support when the downloaded image have no partiton table but a file system
- not start the .efi file in try_load_entry()
- call efi_check_pe() for .efi file to check the file is PE-COFF image
- add documentation for EFI HTTP Boot

Masahisa Kojima (8):
  net: wget: prevent overwriting reserved memory
  net: wget: add wget with dns utility function
  blk: blkmap: add ramdisk creation utility function
  efi_loader: create default file boot option
  efi_loader: support boot from URI device path
  efi_loader: add CDROM short-form device path
  cmd: efidebug: add uri device path
  doc: uefi: add HTTP Boot support

Raymond Mao (1):
  Boot var automatic management for removable medias

 cmd/efidebug.c                                |  50 ++++
 doc/develop/uefi/uefi.rst                     |  30 ++
 drivers/block/Makefile                        |   3 +-
 drivers/block/blkmap.c                        |  15 -
 drivers/block/blkmap_helper.c                 |  53 ++++
 include/blkmap.h                              |  29 ++
 include/efi_loader.h                          |   2 +
 include/net.h                                 |  17 ++
 lib/efi_loader/Kconfig                        |   9 +
 lib/efi_loader/efi_bootmgr.c                  | 282 ++++++++++++++++--
 lib/efi_loader/efi_device_path.c              |   3 +-
 lib/efi_loader/efi_disk.c                     |  18 ++
 lib/efi_loader/efi_dt_fixup.c                 |   2 +-
 lib/efi_loader/efi_setup.c                    |   7 +
 net/wget.c                                    | 205 ++++++++++++-
 test/py/tests/test_efi_secboot/test_signed.py |  42 +--
 .../test_efi_secboot/test_signed_intca.py     |  14 +-
 .../tests/test_efi_secboot/test_unsigned.py   |  14 +-
 .../test_fs/test_squashfs/test_sqfs_ls.py     |   6 +
 19 files changed, 718 insertions(+), 83 deletions(-)
 create mode 100644 drivers/block/blkmap_helper.c


base-commit: c1ab04626d6b05c6e82dfe4d97d3f62f7310d612
prerequisite-patch-id: 386e2563ffafe7f80fda169076d2835ea071b3f9

Comments

Masahisa Kojima Oct. 16, 2023, 2:39 a.m. UTC | #1
On Mon, 16 Oct 2023 at 08:50, Masahisa Kojima
<masahisa.kojima@linaro.org> wrote:
>
> This series adds the EFI HTTP boot support.
> User can add the URI device path with "efidebug boot add" command.
> efibootmgr handles the URI device path, download the
> specified file using wget, mount the downloaded image with
> blkmap, then boot with the default file(e.g. EFI/BOOT/BOOTAA64.EFI)
> by selecting automatically created boot option when the new disk is
> detected.
>
> This version still does not include the test.
>
> To enable EFI HTTP boot, we need to enable the following Kconfig options.
>  CONFIG_CMD_DNS
>  CONFIG_CMD_WGET
>  CONFIG_BLKMAP
>  CONFIG_EFI_HTTP_BOOT
>
> On the Socionext Developerbox, enter the following commands then
> debian installer is downloaded into "loadaddr" and installer
> automatically starts.
>  => dhcp
>  => setenv serverip 192.168.1.1
>  => efidebug boot add -u 3 debian-netinst http://ftp.riken.jp/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
>  => efidebug boot order 3
>  => bootefi bootmgr
>
> Note that this debian installer can not proceed the installation
> bacause RAM disk of installer image is not recogniged by the kernel.
> I'm still investigating this issue, but drivers/nvdimm/of_pmem.c in linux
> will be one of the solution to recognize RAM disk from kernel.
> (In EDK2, the equivalent solution is called ACPI NFIT.)
>
> On QEMU, I can not make DNS work from the QEMU guest.
> The following commands work on qemu_arm64(manually set the http server ip in URI).
>   => dhcp
>   => setenv gatewayip 10.0.2.2
>   => setenv httpserverip 134.160.38.1
>   => efidebug boot add -u 3 debian-netinst http://134.160.38.1/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
>   => efidebug boot order 3
>   => bootefi bootmgr
>
> [TODO]
> - add test
> - stricter wget uri check
> - omit the dns process if the given uri has ip address
>    -> this will be supported when the lwip migration completes
> - uri device path support in eficonfig
>
> [change log]
> v5 -> v6
> - add patch #4 "Boot var automatic management for removable medias"
> - boot from automatically created boot option
>   rather than searching default file on the fly
> - introduce new CONFIG_EFI_HTTP_BOOT Kconfig option
> - comment in one place
> - use log_err() rather than printf()
> - use env_get_hex("filesize", 0) instead of return value of net_loop()
> - use more suitable error code
> - blkmap can be build for SPL/TPL
> - add CDROM short-form device path support

Sorry but I forgot to include the necessary changes.
I will resend this series soon.

Thanks,
Masahisa Kojima


>
> v4 -> v5
> - add missing else statement
> - add NULL check of efi_dp_find_obj() call
> - update document to remove "limitation"
>
> v3 -> v4
> - patch#8 is added to simplify the bootmgr default boot process
> - add function comments
>
> v2 -> v3
> - Patch#6 is added, reserve the whole ramdisk memory region
> - remove .efi file extension check for PE-COFF image
> - use "if IS_ENABLED(..)" as much as possible
> - 1024 should be sizeof(net_boot_file_name)
> - call net_set_state(NETLOOP_FAIL) when wget encounters error
> - describe DNS ip address host name limitation in document
>
> v1 -> v2
> - carve out the network handling(wget and dns code) under net/wget.c
> - carve out ramdisk creation code under drivers/block/blkmap_helper.c
> - wget supports the valid range check to store the received blocks using lmb
> - support when the downloaded image have no partiton table but a file system
> - not start the .efi file in try_load_entry()
> - call efi_check_pe() for .efi file to check the file is PE-COFF image
> - add documentation for EFI HTTP Boot
>
> Masahisa Kojima (8):
>   net: wget: prevent overwriting reserved memory
>   net: wget: add wget with dns utility function
>   blk: blkmap: add ramdisk creation utility function
>   efi_loader: create default file boot option
>   efi_loader: support boot from URI device path
>   efi_loader: add CDROM short-form device path
>   cmd: efidebug: add uri device path
>   doc: uefi: add HTTP Boot support
>
> Raymond Mao (1):
>   Boot var automatic management for removable medias
>
>  cmd/efidebug.c                                |  50 ++++
>  doc/develop/uefi/uefi.rst                     |  30 ++
>  drivers/block/Makefile                        |   3 +-
>  drivers/block/blkmap.c                        |  15 -
>  drivers/block/blkmap_helper.c                 |  53 ++++
>  include/blkmap.h                              |  29 ++
>  include/efi_loader.h                          |   2 +
>  include/net.h                                 |  17 ++
>  lib/efi_loader/Kconfig                        |   9 +
>  lib/efi_loader/efi_bootmgr.c                  | 282 ++++++++++++++++--
>  lib/efi_loader/efi_device_path.c              |   3 +-
>  lib/efi_loader/efi_disk.c                     |  18 ++
>  lib/efi_loader/efi_dt_fixup.c                 |   2 +-
>  lib/efi_loader/efi_setup.c                    |   7 +
>  net/wget.c                                    | 205 ++++++++++++-
>  test/py/tests/test_efi_secboot/test_signed.py |  42 +--
>  .../test_efi_secboot/test_signed_intca.py     |  14 +-
>  .../tests/test_efi_secboot/test_unsigned.py   |  14 +-
>  .../test_fs/test_squashfs/test_sqfs_ls.py     |   6 +
>  19 files changed, 718 insertions(+), 83 deletions(-)
>  create mode 100644 drivers/block/blkmap_helper.c
>
>
> base-commit: c1ab04626d6b05c6e82dfe4d97d3f62f7310d612
> prerequisite-patch-id: 386e2563ffafe7f80fda169076d2835ea071b3f9
> --
> 2.34.1
>
Michal Simek Oct. 16, 2023, 6:24 a.m. UTC | #2
On 10/16/23 04:39, Masahisa Kojima wrote:
> On Mon, 16 Oct 2023 at 08:50, Masahisa Kojima
> <masahisa.kojima@linaro.org> wrote:
>>
>> This series adds the EFI HTTP boot support.
>> User can add the URI device path with "efidebug boot add" command.
>> efibootmgr handles the URI device path, download the
>> specified file using wget, mount the downloaded image with
>> blkmap, then boot with the default file(e.g. EFI/BOOT/BOOTAA64.EFI)
>> by selecting automatically created boot option when the new disk is
>> detected.
>>
>> This version still does not include the test.
>>
>> To enable EFI HTTP boot, we need to enable the following Kconfig options.
>>   CONFIG_CMD_DNS
>>   CONFIG_CMD_WGET
>>   CONFIG_BLKMAP
>>   CONFIG_EFI_HTTP_BOOT
>>
>> On the Socionext Developerbox, enter the following commands then
>> debian installer is downloaded into "loadaddr" and installer
>> automatically starts.
>>   => dhcp
>>   => setenv serverip 192.168.1.1
>>   => efidebug boot add -u 3 debian-netinst http://ftp.riken.jp/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
>>   => efidebug boot order 3
>>   => bootefi bootmgr
>>
>> Note that this debian installer can not proceed the installation
>> bacause RAM disk of installer image is not recogniged by the kernel.
>> I'm still investigating this issue, but drivers/nvdimm/of_pmem.c in linux
>> will be one of the solution to recognize RAM disk from kernel.
>> (In EDK2, the equivalent solution is called ACPI NFIT.)
>>
>> On QEMU, I can not make DNS work from the QEMU guest.
>> The following commands work on qemu_arm64(manually set the http server ip in URI).
>>    => dhcp
>>    => setenv gatewayip 10.0.2.2
>>    => setenv httpserverip 134.160.38.1
>>    => efidebug boot add -u 3 debian-netinst http://134.160.38.1/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
>>    => efidebug boot order 3
>>    => bootefi bootmgr
>>
>> [TODO]
>> - add test
>> - stricter wget uri check
>> - omit the dns process if the given uri has ip address
>>     -> this will be supported when the lwip migration completes
>> - uri device path support in eficonfig
>>
>> [change log]
>> v5 -> v6
>> - add patch #4 "Boot var automatic management for removable medias"
>> - boot from automatically created boot option
>>    rather than searching default file on the fly
>> - introduce new CONFIG_EFI_HTTP_BOOT Kconfig option
>> - comment in one place
>> - use log_err() rather than printf()
>> - use env_get_hex("filesize", 0) instead of return value of net_loop()
>> - use more suitable error code
>> - blkmap can be build for SPL/TPL
>> - add CDROM short-form device path support
> 
> Sorry but I forgot to include the necessary changes.
> I will resend this series soon.

Which pretty much means that that next series is v7. If not you will confuse 
tools like b4.

Thanks,
Michal
Masahisa Kojima Oct. 16, 2023, 6:35 a.m. UTC | #3
Hi Michal,

On Mon, 16 Oct 2023 at 15:25, Michal Simek <michal.simek@amd.com> wrote:
>
>
>
> On 10/16/23 04:39, Masahisa Kojima wrote:
> > On Mon, 16 Oct 2023 at 08:50, Masahisa Kojima
> > <masahisa.kojima@linaro.org> wrote:
> >>
> >> This series adds the EFI HTTP boot support.
> >> User can add the URI device path with "efidebug boot add" command.
> >> efibootmgr handles the URI device path, download the
> >> specified file using wget, mount the downloaded image with
> >> blkmap, then boot with the default file(e.g. EFI/BOOT/BOOTAA64.EFI)
> >> by selecting automatically created boot option when the new disk is
> >> detected.
> >>
> >> This version still does not include the test.
> >>
> >> To enable EFI HTTP boot, we need to enable the following Kconfig options.
> >>   CONFIG_CMD_DNS
> >>   CONFIG_CMD_WGET
> >>   CONFIG_BLKMAP
> >>   CONFIG_EFI_HTTP_BOOT
> >>
> >> On the Socionext Developerbox, enter the following commands then
> >> debian installer is downloaded into "loadaddr" and installer
> >> automatically starts.
> >>   => dhcp
> >>   => setenv serverip 192.168.1.1
> >>   => efidebug boot add -u 3 debian-netinst http://ftp.riken.jp/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
> >>   => efidebug boot order 3
> >>   => bootefi bootmgr
> >>
> >> Note that this debian installer can not proceed the installation
> >> bacause RAM disk of installer image is not recogniged by the kernel.
> >> I'm still investigating this issue, but drivers/nvdimm/of_pmem.c in linux
> >> will be one of the solution to recognize RAM disk from kernel.
> >> (In EDK2, the equivalent solution is called ACPI NFIT.)
> >>
> >> On QEMU, I can not make DNS work from the QEMU guest.
> >> The following commands work on qemu_arm64(manually set the http server ip in URI).
> >>    => dhcp
> >>    => setenv gatewayip 10.0.2.2
> >>    => setenv httpserverip 134.160.38.1
> >>    => efidebug boot add -u 3 debian-netinst http://134.160.38.1/Linux/debian/debian-cd/12.1.0/arm64/iso-cd/debian-12.1.0-arm64-netinst.iso
> >>    => efidebug boot order 3
> >>    => bootefi bootmgr
> >>
> >> [TODO]
> >> - add test
> >> - stricter wget uri check
> >> - omit the dns process if the given uri has ip address
> >>     -> this will be supported when the lwip migration completes
> >> - uri device path support in eficonfig
> >>
> >> [change log]
> >> v5 -> v6
> >> - add patch #4 "Boot var automatic management for removable medias"
> >> - boot from automatically created boot option
> >>    rather than searching default file on the fly
> >> - introduce new CONFIG_EFI_HTTP_BOOT Kconfig option
> >> - comment in one place
> >> - use log_err() rather than printf()
> >> - use env_get_hex("filesize", 0) instead of return value of net_loop()
> >> - use more suitable error code
> >> - blkmap can be build for SPL/TPL
> >> - add CDROM short-form device path support
> >
> > Sorry but I forgot to include the necessary changes.
> > I will resend this series soon.
>
> Which pretty much means that that next series is v7. If not you will confuse
> tools like b4.

Thank you, yes, I will send the updated version as v7.
Sorry for sending so many emails.

Thanks,
Masahisa Kojima

>
> Thanks,
> Michal
>