[PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow

This collects together the patches previously sent relating to PXE.
Firstly, it moves the boot code out of common/ and into a new boot/ directory. This helps to collect these related files in one place, as common/ is quite large.
Secondly, it provides patache so clean up the PXE code and refactor it into something closer to a module that can be called, teasing apart its reliance on the command-line interpreter to access filesystems and the like. Also it now uses function arguments and its own context struct internally rather than environment variables, which is very hard to follow. No core functional change is intended.
Changes in v3: - Rebase to -master
Changes in v2: - Rebase to -next - Split out from the bootmethod patches
Simon Glass (18): Create a new boot/ directory pxe: Move API comments to the header files pxe: Use a context pointer pxe: Move do_getfile() into the context pxe: Add a userdata field to the context pxe: Tidy up the is_pxe global pxe: Move pxe_utils files pxe: Tidy up some comments in pxe_utils pxe: Tidy up code style a little in pxe_utils pxe: Move common parsing coding into pxe_util pxe: Clean up the use of bootfile pxe: Drop get_bootfile_path() lib: Add tests for simple_itoa() lib: Add a function to convert a string to a hex value pxe: Return the file size from the getfile() function pxe: Refactor sysboot to have one helper doc: Move distro boot doc to rST pxe: Allow calling the pxe_get logic directly
Kconfig | 2 + Makefile | 3 +- README | 1 + common/Kconfig.boot => boot/Kconfig | 0 boot/Makefile | 37 ++ {common => boot}/android_ab.c | 0 {common => boot}/boot_fit.c | 0 {common => boot}/bootm.c | 0 {common => boot}/bootm_os.c | 0 {common => boot}/bootretry.c | 0 {common => boot}/common_fit.c | 0 {common => boot}/fdt_region.c | 0 {common => boot}/image-android-dt.c | 0 {common => boot}/image-android.c | 0 {common => boot}/image-board.c | 0 {common => boot}/image-cipher.c | 0 {common => boot}/image-fdt.c | 0 {common => boot}/image-fit-sig.c | 0 {common => boot}/image-fit.c | 0 {common => boot}/image-host.c | 0 {common => boot}/image-sig.c | 0 {common => boot}/image.c | 0 {cmd => boot}/pxe_utils.c | 512 +++++++++++----------- cmd/Makefile | 4 +- cmd/pxe.c | 136 +++--- cmd/pxe_utils.h | 91 ---- cmd/sysboot.c | 114 +++-- common/Kconfig | 2 - common/Makefile | 22 - doc/android/boot-image.rst | 2 +- doc/{README.distro => develop/distro.rst} | 177 ++++---- doc/develop/index.rst | 1 + include/pxe_utils.h | 253 +++++++++++ include/vsprintf.h | 25 +- lib/vsprintf.c | 20 +- scripts/Makefile.spl | 4 +- test/print_ut.c | 41 ++ tools/Makefile | 18 +- 38 files changed, 874 insertions(+), 591 deletions(-) rename common/Kconfig.boot => boot/Kconfig (100%) create mode 100644 boot/Makefile rename {common => boot}/android_ab.c (100%) rename {common => boot}/boot_fit.c (100%) rename {common => boot}/bootm.c (100%) rename {common => boot}/bootm_os.c (100%) rename {common => boot}/bootretry.c (100%) rename {common => boot}/common_fit.c (100%) rename {common => boot}/fdt_region.c (100%) rename {common => boot}/image-android-dt.c (100%) rename {common => boot}/image-android.c (100%) rename {common => boot}/image-board.c (100%) rename {common => boot}/image-cipher.c (100%) rename {common => boot}/image-fdt.c (100%) rename {common => boot}/image-fit-sig.c (100%) rename {common => boot}/image-fit.c (100%) rename {common => boot}/image-host.c (100%) rename {common => boot}/image-sig.c (100%) rename {common => boot}/image.c (100%) rename {cmd => boot}/pxe_utils.c (74%) delete mode 100644 cmd/pxe_utils.h rename doc/{README.distro => develop/distro.rst} (76%) create mode 100644 include/pxe_utils.h

Quite a lot of the code in common/relates to booting and images. Before adding more it seems like a good time to move the code into its own directory.
Most files with 'boot' or 'image' in them are moved, except:
- autoboot.c which relates to U-Boot automatically running a script - bootstage.c which relates to U-Boot timing
Drop the removal of boot* files from the output directory, since this interfers with the symlinks created by tools and there does not appear to be any such file from my brief testing.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
Kconfig | 2 ++ Makefile | 3 ++- README | 1 + common/Kconfig.boot => boot/Kconfig | 0 boot/Makefile | 34 +++++++++++++++++++++++++++++ {common => boot}/android_ab.c | 0 {common => boot}/boot_fit.c | 0 {common => boot}/bootm.c | 0 {common => boot}/bootm_os.c | 0 {common => boot}/bootretry.c | 0 {common => boot}/common_fit.c | 0 {common => boot}/fdt_region.c | 0 {common => boot}/image-android-dt.c | 0 {common => boot}/image-android.c | 0 {common => boot}/image-board.c | 0 {common => boot}/image-cipher.c | 0 {common => boot}/image-fdt.c | 0 {common => boot}/image-fit-sig.c | 0 {common => boot}/image-fit.c | 0 {common => boot}/image-host.c | 0 {common => boot}/image-sig.c | 0 {common => boot}/image.c | 0 common/Kconfig | 2 -- common/Makefile | 22 ------------------- doc/android/boot-image.rst | 2 +- scripts/Makefile.spl | 4 ++-- tools/Makefile | 18 +++++++-------- 27 files changed, 51 insertions(+), 37 deletions(-) rename common/Kconfig.boot => boot/Kconfig (100%) create mode 100644 boot/Makefile rename {common => boot}/android_ab.c (100%) rename {common => boot}/boot_fit.c (100%) rename {common => boot}/bootm.c (100%) rename {common => boot}/bootm_os.c (100%) rename {common => boot}/bootretry.c (100%) rename {common => boot}/common_fit.c (100%) rename {common => boot}/fdt_region.c (100%) rename {common => boot}/image-android-dt.c (100%) rename {common => boot}/image-android.c (100%) rename {common => boot}/image-board.c (100%) rename {common => boot}/image-cipher.c (100%) rename {common => boot}/image-fdt.c (100%) rename {common => boot}/image-fit-sig.c (100%) rename {common => boot}/image-fit.c (100%) rename {common => boot}/image-host.c (100%) rename {common => boot}/image-sig.c (100%) rename {common => boot}/image.c (100%)
diff --git a/Kconfig b/Kconfig index 931a22806e4..c46f4fce862 100644 --- a/Kconfig +++ b/Kconfig @@ -466,6 +466,8 @@ endmenu # General setup
source "api/Kconfig"
+source "boot/Kconfig" + source "common/Kconfig"
source "cmd/Kconfig" diff --git a/Makefile b/Makefile index f911f703443..4e064acdcff 100644 --- a/Makefile +++ b/Makefile @@ -804,6 +804,7 @@ HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makef
libs-$(CONFIG_API) += api/ libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/ +libs-y += boot/ libs-y += cmd/ libs-y += common/ libs-$(CONFIG_OF_EMBED) += dts/ @@ -2076,7 +2077,7 @@ CLEAN_DIRS += $(MODVERDIR) \ $(filter-out include, $(shell ls -1 $d 2>/dev/null))))
CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h tools/version.h \ - boot* u-boot* MLO* SPL System.map fit-dtb.blob* \ + u-boot* MLO* SPL System.map fit-dtb.blob* \ u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log \ lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* \ idbloader.img flash.bin flash.log defconfig keep-syms-lto.c diff --git a/README b/README index 840b192aae5..49c79ca6a2d 100644 --- a/README +++ b/README @@ -144,6 +144,7 @@ Directory Hierarchy: /xtensa Files generic to Xtensa architecture /api Machine/arch-independent API for external apps /board Board-dependent files +/boot Support for images and booting /cmd U-Boot commands functions /common Misc architecture-independent functions /configs Board default configuration files diff --git a/common/Kconfig.boot b/boot/Kconfig similarity index 100% rename from common/Kconfig.boot rename to boot/Kconfig diff --git a/boot/Makefile b/boot/Makefile new file mode 100644 index 00000000000..a19e85cf6c8 --- /dev/null +++ b/boot/Makefile @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# (C) Copyright 2004-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. + +ifndef CONFIG_SPL_BUILD + +# This option is not just y/n - it can have a numeric value +ifdef CONFIG_BOOT_RETRY_TIME +obj-y += bootretry.o +endif + +obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o +obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o +obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o + +endif + +obj-y += image.o image-board.o +obj-$(CONFIG_ANDROID_AB) += android_ab.o +obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o +obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o +obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += fdt_region.o +obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o +obj-$(CONFIG_$(SPL_)MULTI_DTB_FIT) += boot_fit.o common_fit.o +obj-$(CONFIG_$(SPL_TPL_)IMAGE_SIGN_INFO) += image-sig.o +obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-fit-sig.o +obj-$(CONFIG_$(SPL_TPL_)FIT_CIPHER) += image-cipher.o + +obj-$(CONFIG_CMD_ADTIMG) += image-android-dt.o + +ifdef CONFIG_SPL_BUILD +obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o +endif diff --git a/common/android_ab.c b/boot/android_ab.c similarity index 100% rename from common/android_ab.c rename to boot/android_ab.c diff --git a/common/boot_fit.c b/boot/boot_fit.c similarity index 100% rename from common/boot_fit.c rename to boot/boot_fit.c diff --git a/common/bootm.c b/boot/bootm.c similarity index 100% rename from common/bootm.c rename to boot/bootm.c diff --git a/common/bootm_os.c b/boot/bootm_os.c similarity index 100% rename from common/bootm_os.c rename to boot/bootm_os.c diff --git a/common/bootretry.c b/boot/bootretry.c similarity index 100% rename from common/bootretry.c rename to boot/bootretry.c diff --git a/common/common_fit.c b/boot/common_fit.c similarity index 100% rename from common/common_fit.c rename to boot/common_fit.c diff --git a/common/fdt_region.c b/boot/fdt_region.c similarity index 100% rename from common/fdt_region.c rename to boot/fdt_region.c diff --git a/common/image-android-dt.c b/boot/image-android-dt.c similarity index 100% rename from common/image-android-dt.c rename to boot/image-android-dt.c diff --git a/common/image-android.c b/boot/image-android.c similarity index 100% rename from common/image-android.c rename to boot/image-android.c diff --git a/common/image-board.c b/boot/image-board.c similarity index 100% rename from common/image-board.c rename to boot/image-board.c diff --git a/common/image-cipher.c b/boot/image-cipher.c similarity index 100% rename from common/image-cipher.c rename to boot/image-cipher.c diff --git a/common/image-fdt.c b/boot/image-fdt.c similarity index 100% rename from common/image-fdt.c rename to boot/image-fdt.c diff --git a/common/image-fit-sig.c b/boot/image-fit-sig.c similarity index 100% rename from common/image-fit-sig.c rename to boot/image-fit-sig.c diff --git a/common/image-fit.c b/boot/image-fit.c similarity index 100% rename from common/image-fit.c rename to boot/image-fit.c diff --git a/common/image-host.c b/boot/image-host.c similarity index 100% rename from common/image-host.c rename to boot/image-host.c diff --git a/common/image-sig.c b/boot/image-sig.c similarity index 100% rename from common/image-sig.c rename to boot/image-sig.c diff --git a/common/image.c b/boot/image.c similarity index 100% rename from common/image.c rename to boot/image.c diff --git a/common/Kconfig b/common/Kconfig index d6f77ab7b9c..fdcf4536d0f 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -1,5 +1,3 @@ -source "common/Kconfig.boot" - menu "Console"
config MENU diff --git a/common/Makefile b/common/Makefile index e7839027b6c..afaf8e5048a 100644 --- a/common/Makefile +++ b/common/Makefile @@ -11,21 +11,12 @@ obj-y += exports.o obj-$(CONFIG_HUSH_PARSER) += cli_hush.o obj-$(CONFIG_AUTOBOOT) += autoboot.o
-# This option is not just y/n - it can have a numeric value -ifdef CONFIG_BOOT_RETRY_TIME -obj-y += bootretry.o -endif - # # boards obj-y += board_f.o obj-y += board_r.o obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
-obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o -obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o -obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o - obj-$(CONFIG_CMD_BEDBUG) += bedbug.o obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o obj-$(CONFIG_MII) += miiphyutil.o @@ -65,7 +56,6 @@ ifdef CONFIG_SPL_BUILD ifdef CONFIG_SPL_DFU obj-$(CONFIG_DFU_OVER_USB) += dfu.o endif -obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o obj-$(CONFIG_SPL_NET) += miiphyutil.o obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o
@@ -101,23 +91,11 @@ obj-y += malloc_simple.o endif endif
-obj-y += image.o image-board.o obj-$(CONFIG_$(SPL_TPL_)HASH) += hash.o -obj-$(CONFIG_ANDROID_AB) += android_ab.o -obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o -obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o -obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += fdt_region.o -obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o -obj-$(CONFIG_$(SPL_)MULTI_DTB_FIT) += boot_fit.o common_fit.o -obj-$(CONFIG_$(SPL_TPL_)IMAGE_SIGN_INFO) += image-sig.o -obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-fit-sig.o -obj-$(CONFIG_$(SPL_TPL_)FIT_CIPHER) += image-cipher.o obj-$(CONFIG_IO_TRACE) += iotrace.o obj-y += memsize.o obj-y += stdio.o
-obj-$(CONFIG_CMD_ADTIMG) += image-android-dt.o - ifdef CONFIG_CMD_EEPROM_LAYOUT obj-y += eeprom/eeprom_field.o eeprom/eeprom_layout.o endif diff --git a/doc/android/boot-image.rst b/doc/android/boot-image.rst index fa8f2a47ee3..71db02521b0 100644 --- a/doc/android/boot-image.rst +++ b/doc/android/boot-image.rst @@ -139,7 +139,7 @@ overview on the whole Android 10 boot process can be found at [8]_. C API for working with Android Boot Image format ------------------------------------------------
-.. kernel-doc:: common/image-android.c +.. kernel-doc:: boot/image-android.c :internal:
References diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index 6f26eb1fa1f..06f27dee3d1 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -92,10 +92,10 @@ libs-y += common/init/
# Special handling for a few options which support SPL/TPL ifeq ($(CONFIG_TPL_BUILD),y) -libs-$(CONFIG_TPL_LIBCOMMON_SUPPORT) += common/ cmd/ env/ +libs-$(CONFIG_TPL_LIBCOMMON_SUPPORT) += boot/ common/ cmd/ env/ libs-$(CONFIG_TPL_LIBGENERIC_SUPPORT) += lib/ else -libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += common/ cmd/ env/ +libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += boot/ common/ cmd/ env/ libs-$(CONFIG_SPL_LIBGENERIC_SUPPORT) += lib/ ifdef CONFIG_SPL_FRAMEWORK libs-$(CONFIG_PARTITIONS) += disk/ diff --git a/tools/Makefile b/tools/Makefile index 999fd465316..6519a66e9a0 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -76,9 +76,9 @@ hostprogs-$(CONFIG_TOOLS_LIBCRYPTO) += fit_info fit_check_sign
hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
-FIT_OBJS-y := fit_common.o fit_image.o image-host.o common/image-fit.o -FIT_SIG_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := image-sig-host.o common/image-fit-sig.o -FIT_CIPHER_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := common/image-cipher.o +FIT_OBJS-y := fit_common.o fit_image.o image-host.o boot/image-fit.o +FIT_SIG_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := image-sig-host.o boot/image-fit-sig.o +FIT_CIPHER_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := boot/image-cipher.o
# The following files are synced with upstream DTC. # Use synced versions from scripts/dtc/libfdt/. @@ -106,14 +106,14 @@ dumpimage-mkimage-objs := aisimage.o \ $(FIT_OBJS-y) \ $(FIT_SIG_OBJS-y) \ $(FIT_CIPHER_OBJS-y) \ - common/fdt_region.o \ - common/bootm.o \ + boot/fdt_region.o \ + boot/bootm.o \ lib/crc32.o \ default_image.o \ lib/fdtdec_common.o \ lib/fdtdec.o \ - common/image.o \ - common/image-host.o \ + boot/image.o \ + boot/image-host.o \ imagetool.o \ imximage.o \ imx8image.o \ @@ -227,7 +227,7 @@ hostprogs-$(CONFIG_ARCH_OCTEON) += update_octeon_header update_octeon_header-objs := update_octeon_header.o lib/crc32.o
hostprogs-y += fdtgrep -fdtgrep-objs += $(LIBFDT_OBJS) common/fdt_region.o fdtgrep.o +fdtgrep-objs += $(LIBFDT_OBJS) boot/fdt_region.o fdtgrep.o
ifneq ($(TOOLS_ONLY),y) hostprogs-y += spl_size_limit @@ -254,7 +254,7 @@ HOSTCFLAGS_sha512.o := -pedantic -DCONFIG_SHA512 -DCONFIG_SHA384 quiet_cmd_wrap = WRAP $@ cmd_wrap = echo "#include <../$(patsubst $(obj)/%,%,$@)>" >$@
-$(obj)/lib/%.c $(obj)/common/%.c $(obj)/env/%.c: +$(obj)/boot/%.c $(obj)/common/%.c $(obj)/env/%.c $(obj)/lib/%.c: $(call cmd,wrap)
clean-dirs := lib common

rename {common => boot}/image-board.c (100%)
Before accepting this series we need to fix common/image-board.c which have mistakes! patch there > https://patchwork.ozlabs.org/project/uboot/patch/20211016051915.4157293-1-ar...
On Fri, Oct 15, 2021 at 2:48 AM Simon Glass sjg@chromium.org wrote:
Quite a lot of the code in common/relates to booting and images. Before adding more it seems like a good time to move the code into its own directory.
Most files with 'boot' or 'image' in them are moved, except:
- autoboot.c which relates to U-Boot automatically running a script
- bootstage.c which relates to U-Boot timing
Drop the removal of boot* files from the output directory, since this interfers with the symlinks created by tools and there does not appear to be any such file from my brief testing.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
Kconfig | 2 ++ Makefile | 3 ++- README | 1 + common/Kconfig.boot => boot/Kconfig | 0 boot/Makefile | 34 +++++++++++++++++++++++++++++ {common => boot}/android_ab.c | 0 {common => boot}/boot_fit.c | 0 {common => boot}/bootm.c | 0 {common => boot}/bootm_os.c | 0 {common => boot}/bootretry.c | 0 {common => boot}/common_fit.c | 0 {common => boot}/fdt_region.c | 0 {common => boot}/image-android-dt.c | 0 {common => boot}/image-android.c | 0 {common => boot}/image-board.c | 0 {common => boot}/image-cipher.c | 0 {common => boot}/image-fdt.c | 0 {common => boot}/image-fit-sig.c | 0 {common => boot}/image-fit.c | 0 {common => boot}/image-host.c | 0 {common => boot}/image-sig.c | 0 {common => boot}/image.c | 0 common/Kconfig | 2 -- common/Makefile | 22 ------------------- doc/android/boot-image.rst | 2 +- scripts/Makefile.spl | 4 ++-- tools/Makefile | 18 +++++++-------- 27 files changed, 51 insertions(+), 37 deletions(-) rename common/Kconfig.boot => boot/Kconfig (100%) create mode 100644 boot/Makefile rename {common => boot}/android_ab.c (100%) rename {common => boot}/boot_fit.c (100%) rename {common => boot}/bootm.c (100%) rename {common => boot}/bootm_os.c (100%) rename {common => boot}/bootretry.c (100%) rename {common => boot}/common_fit.c (100%) rename {common => boot}/fdt_region.c (100%) rename {common => boot}/image-android-dt.c (100%) rename {common => boot}/image-android.c (100%) rename {common => boot}/image-board.c (100%) rename {common => boot}/image-cipher.c (100%) rename {common => boot}/image-fdt.c (100%) rename {common => boot}/image-fit-sig.c (100%) rename {common => boot}/image-fit.c (100%) rename {common => boot}/image-host.c (100%) rename {common => boot}/image-sig.c (100%) rename {common => boot}/image.c (100%)
diff --git a/Kconfig b/Kconfig index 931a22806e4..c46f4fce862 100644 --- a/Kconfig +++ b/Kconfig @@ -466,6 +466,8 @@ endmenu # General setup
source "api/Kconfig"
+source "boot/Kconfig"
source "common/Kconfig"
source "cmd/Kconfig" diff --git a/Makefile b/Makefile index f911f703443..4e064acdcff 100644 --- a/Makefile +++ b/Makefile @@ -804,6 +804,7 @@ HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makef
libs-$(CONFIG_API) += api/ libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/ +libs-y += boot/ libs-y += cmd/ libs-y += common/ libs-$(CONFIG_OF_EMBED) += dts/ @@ -2076,7 +2077,7 @@ CLEAN_DIRS += $(MODVERDIR) \ $(filter-out include, $(shell ls -1 $d 2>/dev/null))))
CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h tools/version.h \
boot* u-boot* MLO* SPL System.map fit-dtb.blob* \
u-boot* MLO* SPL System.map fit-dtb.blob* \ u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log \ lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* \ idbloader.img flash.bin flash.log defconfig keep-syms-lto.c
diff --git a/README b/README index 840b192aae5..49c79ca6a2d 100644 --- a/README +++ b/README @@ -144,6 +144,7 @@ Directory Hierarchy: /xtensa Files generic to Xtensa architecture /api Machine/arch-independent API for external apps /board Board-dependent files +/boot Support for images and booting /cmd U-Boot commands functions /common Misc architecture-independent functions /configs Board default configuration files diff --git a/common/Kconfig.boot b/boot/Kconfig similarity index 100% rename from common/Kconfig.boot rename to boot/Kconfig diff --git a/boot/Makefile b/boot/Makefile new file mode 100644 index 00000000000..a19e85cf6c8 --- /dev/null +++ b/boot/Makefile @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# (C) Copyright 2004-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ifndef CONFIG_SPL_BUILD
+# This option is not just y/n - it can have a numeric value +ifdef CONFIG_BOOT_RETRY_TIME +obj-y += bootretry.o +endif
+obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o +obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o +obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o
+endif
+obj-y += image.o image-board.o +obj-$(CONFIG_ANDROID_AB) += android_ab.o +obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o +obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o +obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += fdt_region.o +obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o +obj-$(CONFIG_$(SPL_)MULTI_DTB_FIT) += boot_fit.o common_fit.o +obj-$(CONFIG_$(SPL_TPL_)IMAGE_SIGN_INFO) += image-sig.o +obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-fit-sig.o +obj-$(CONFIG_$(SPL_TPL_)FIT_CIPHER) += image-cipher.o
+obj-$(CONFIG_CMD_ADTIMG) += image-android-dt.o
+ifdef CONFIG_SPL_BUILD +obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o +endif diff --git a/common/android_ab.c b/boot/android_ab.c similarity index 100% rename from common/android_ab.c rename to boot/android_ab.c diff --git a/common/boot_fit.c b/boot/boot_fit.c similarity index 100% rename from common/boot_fit.c rename to boot/boot_fit.c diff --git a/common/bootm.c b/boot/bootm.c similarity index 100% rename from common/bootm.c rename to boot/bootm.c diff --git a/common/bootm_os.c b/boot/bootm_os.c similarity index 100% rename from common/bootm_os.c rename to boot/bootm_os.c diff --git a/common/bootretry.c b/boot/bootretry.c similarity index 100% rename from common/bootretry.c rename to boot/bootretry.c diff --git a/common/common_fit.c b/boot/common_fit.c similarity index 100% rename from common/common_fit.c rename to boot/common_fit.c diff --git a/common/fdt_region.c b/boot/fdt_region.c similarity index 100% rename from common/fdt_region.c rename to boot/fdt_region.c diff --git a/common/image-android-dt.c b/boot/image-android-dt.c similarity index 100% rename from common/image-android-dt.c rename to boot/image-android-dt.c diff --git a/common/image-android.c b/boot/image-android.c similarity index 100% rename from common/image-android.c rename to boot/image-android.c diff --git a/common/image-board.c b/boot/image-board.c similarity index 100% rename from common/image-board.c rename to boot/image-board.c diff --git a/common/image-cipher.c b/boot/image-cipher.c similarity index 100% rename from common/image-cipher.c rename to boot/image-cipher.c diff --git a/common/image-fdt.c b/boot/image-fdt.c similarity index 100% rename from common/image-fdt.c rename to boot/image-fdt.c diff --git a/common/image-fit-sig.c b/boot/image-fit-sig.c similarity index 100% rename from common/image-fit-sig.c rename to boot/image-fit-sig.c diff --git a/common/image-fit.c b/boot/image-fit.c similarity index 100% rename from common/image-fit.c rename to boot/image-fit.c diff --git a/common/image-host.c b/boot/image-host.c similarity index 100% rename from common/image-host.c rename to boot/image-host.c diff --git a/common/image-sig.c b/boot/image-sig.c similarity index 100% rename from common/image-sig.c rename to boot/image-sig.c diff --git a/common/image.c b/boot/image.c similarity index 100% rename from common/image.c rename to boot/image.c diff --git a/common/Kconfig b/common/Kconfig index d6f77ab7b9c..fdcf4536d0f 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -1,5 +1,3 @@ -source "common/Kconfig.boot"
menu "Console"
config MENU diff --git a/common/Makefile b/common/Makefile index e7839027b6c..afaf8e5048a 100644 --- a/common/Makefile +++ b/common/Makefile @@ -11,21 +11,12 @@ obj-y += exports.o obj-$(CONFIG_HUSH_PARSER) += cli_hush.o obj-$(CONFIG_AUTOBOOT) += autoboot.o
-# This option is not just y/n - it can have a numeric value -ifdef CONFIG_BOOT_RETRY_TIME -obj-y += bootretry.o -endif
# # boards obj-y += board_f.o obj-y += board_r.o obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
-obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o -obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o -obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o
obj-$(CONFIG_CMD_BEDBUG) += bedbug.o obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o obj-$(CONFIG_MII) += miiphyutil.o @@ -65,7 +56,6 @@ ifdef CONFIG_SPL_BUILD ifdef CONFIG_SPL_DFU obj-$(CONFIG_DFU_OVER_USB) += dfu.o endif -obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o obj-$(CONFIG_SPL_NET) += miiphyutil.o obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o
@@ -101,23 +91,11 @@ obj-y += malloc_simple.o endif endif
-obj-y += image.o image-board.o obj-$(CONFIG_$(SPL_TPL_)HASH) += hash.o -obj-$(CONFIG_ANDROID_AB) += android_ab.o -obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o -obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o -obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += fdt_region.o -obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o -obj-$(CONFIG_$(SPL_)MULTI_DTB_FIT) += boot_fit.o common_fit.o -obj-$(CONFIG_$(SPL_TPL_)IMAGE_SIGN_INFO) += image-sig.o -obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-fit-sig.o -obj-$(CONFIG_$(SPL_TPL_)FIT_CIPHER) += image-cipher.o obj-$(CONFIG_IO_TRACE) += iotrace.o obj-y += memsize.o obj-y += stdio.o
-obj-$(CONFIG_CMD_ADTIMG) += image-android-dt.o
ifdef CONFIG_CMD_EEPROM_LAYOUT obj-y += eeprom/eeprom_field.o eeprom/eeprom_layout.o endif diff --git a/doc/android/boot-image.rst b/doc/android/boot-image.rst index fa8f2a47ee3..71db02521b0 100644 --- a/doc/android/boot-image.rst +++ b/doc/android/boot-image.rst @@ -139,7 +139,7 @@ overview on the whole Android 10 boot process can be found at [8]_. C API for working with Android Boot Image format
-.. kernel-doc:: common/image-android.c +.. kernel-doc:: boot/image-android.c :internal:
References diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index 6f26eb1fa1f..06f27dee3d1 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -92,10 +92,10 @@ libs-y += common/init/
# Special handling for a few options which support SPL/TPL ifeq ($(CONFIG_TPL_BUILD),y) -libs-$(CONFIG_TPL_LIBCOMMON_SUPPORT) += common/ cmd/ env/ +libs-$(CONFIG_TPL_LIBCOMMON_SUPPORT) += boot/ common/ cmd/ env/ libs-$(CONFIG_TPL_LIBGENERIC_SUPPORT) += lib/ else -libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += common/ cmd/ env/ +libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += boot/ common/ cmd/ env/ libs-$(CONFIG_SPL_LIBGENERIC_SUPPORT) += lib/ ifdef CONFIG_SPL_FRAMEWORK libs-$(CONFIG_PARTITIONS) += disk/ diff --git a/tools/Makefile b/tools/Makefile index 999fd465316..6519a66e9a0 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -76,9 +76,9 @@ hostprogs-$(CONFIG_TOOLS_LIBCRYPTO) += fit_info fit_check_sign
hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
-FIT_OBJS-y := fit_common.o fit_image.o image-host.o common/image-fit.o -FIT_SIG_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := image-sig-host.o common/image-fit-sig.o -FIT_CIPHER_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := common/image-cipher.o +FIT_OBJS-y := fit_common.o fit_image.o image-host.o boot/image-fit.o +FIT_SIG_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := image-sig-host.o boot/image-fit-sig.o +FIT_CIPHER_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := boot/image-cipher.o
# The following files are synced with upstream DTC. # Use synced versions from scripts/dtc/libfdt/. @@ -106,14 +106,14 @@ dumpimage-mkimage-objs := aisimage.o \ $(FIT_OBJS-y) \ $(FIT_SIG_OBJS-y) \ $(FIT_CIPHER_OBJS-y) \
common/fdt_region.o \
common/bootm.o \
boot/fdt_region.o \
boot/bootm.o \ lib/crc32.o \ default_image.o \ lib/fdtdec_common.o \ lib/fdtdec.o \
common/image.o \
common/image-host.o \
boot/image.o \
boot/image-host.o \ imagetool.o \ imximage.o \ imx8image.o \
@@ -227,7 +227,7 @@ hostprogs-$(CONFIG_ARCH_OCTEON) += update_octeon_header update_octeon_header-objs := update_octeon_header.o lib/crc32.o
hostprogs-y += fdtgrep -fdtgrep-objs += $(LIBFDT_OBJS) common/fdt_region.o fdtgrep.o +fdtgrep-objs += $(LIBFDT_OBJS) boot/fdt_region.o fdtgrep.o
ifneq ($(TOOLS_ONLY),y) hostprogs-y += spl_size_limit @@ -254,7 +254,7 @@ HOSTCFLAGS_sha512.o := -pedantic -DCONFIG_SHA512 -DCONFIG_SHA384 quiet_cmd_wrap = WRAP $@ cmd_wrap = echo "#include <../$(patsubst $(obj)/%,%,$@)>" >$@
-$(obj)/lib/%.c $(obj)/common/%.c $(obj)/env/%.c: +$(obj)/boot/%.c $(obj)/common/%.c $(obj)/env/%.c $(obj)/lib/%.c: $(call cmd,wrap)
clean-dirs := lib common
2.33.0.1079.g6e70778dc9-goog

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 12:47:54PM -0600, Simon Glass wrote:
Quite a lot of the code in common/relates to booting and images. Before adding more it seems like a good time to move the code into its own directory.
Most files with 'boot' or 'image' in them are moved, except:
- autoboot.c which relates to U-Boot automatically running a script
- bootstage.c which relates to U-Boot timing
Drop the removal of boot* files from the output directory, since this interfers with the symlinks created by tools and there does not appear to be any such file from my brief testing.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com
Applied to u-boot/master, thanks!

Put the function comments in the header file so that the full API can we examined in one place.
Expand the comments to cover parameters and return values.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/pxe_utils.c | 45 ----------------------------- cmd/pxe_utils.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 48 deletions(-)
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 067c24e5ff4..d7f4017efeb 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -32,16 +32,6 @@
bool is_pxe;
-/* - * Convert an ethaddr from the environment to the format used by pxelinux - * filenames based on mac addresses. Convert's ':' to '-', and adds "01-" to - * the beginning of the ethernet address to indicate a hardware type of - * Ethernet. Also converts uppercase hex characters into lowercase, to match - * pxelinux's behavior. - * - * Returns 1 for success, -ENOENT if 'ethaddr' is undefined in the - * environment, or some other value < 0 on error. - */ int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -146,13 +136,6 @@ static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path, return do_getfile(cmdtp, relfile, addr_buf); }
-/* - * Retrieve the file at 'file_path' to the locate given by 'file_addr'. If - * 'bootfile' was specified in the environment, the path to bootfile will be - * prepended to 'file_path' and the resulting path will be used. - * - * Returns 1 on success, or < 0 for error. - */ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, unsigned long file_addr) { @@ -187,13 +170,6 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
-/* - * Retrieves a file in the 'pxelinux.cfg' folder. Since this uses get_pxe_file - * to do the hard work, the location of the 'pxelinux.cfg' folder is generated - * from the bootfile path, as described above. - * - * Returns 1 on success or < 0 on error. - */ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, unsigned long pxefile_addr_r) { @@ -1309,15 +1285,6 @@ void destroy_pxe_menu(struct pxe_menu *cfg) free(cfg); }
-/* - * Entry point for parsing a pxe file. This is only used for the top level - * file. - * - * Returns NULL if there is an error, otherwise, returns a pointer to a - * pxe_menu struct populated with the results of parsing the pxe file (and any - * files it includes). The resulting pxe_menu struct can be free()'d by using - * the destroy_pxe_menu() function. - */ struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) { struct pxe_menu *cfg; @@ -1415,18 +1382,6 @@ static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) } }
-/* - * Boot the system as prescribed by a pxe_menu. - * - * Use the menu system to either get the user's choice or the default, based - * on config or user input. If there is no default or user's choice, - * attempted to boot labels in the order they were given in pxe files. - * If the default or user's choice fails to boot, attempt to boot other - * labels in the order they were given in pxe files. - * - * If this function returns, there weren't any labels that successfully - * booted, or the user interrupted the menu selection via ctrl+c. - */ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) { void *choice; diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index bf58e15347c..441beefa2bc 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -80,12 +80,83 @@ extern bool is_pxe; extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, char *file_addr); void destroy_pxe_menu(struct pxe_menu *cfg); + +/** + * get_pxe_file() - Read a file + * + * Retrieve the file at 'file_path' to the locate given by 'file_addr'. If + * 'bootfile' was specified in the environment, the path to bootfile will be + * prepended to 'file_path' and the resulting path will be used. + * + * @cmdtp: Pointer to command-table entry for the initiating command + * @file_path: Path to file + * @file_addr: Address to place file + * Returns 1 on success, or < 0 for error + */ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, - unsigned long file_addr); + ulong file_addr); + +/** + * get_pxelinux_path() - Read a file from the same place as pxelinux.cfg + * + * Retrieves a file in the 'pxelinux.cfg' folder. Since this uses get_pxe_file() + * to do the hard work, the location of the 'pxelinux.cfg' folder is generated + * from the bootfile path, as described in get_pxe_file(). + * + * @cmdtp: Pointer to command-table entry for the initiating command + * @file: Relative path to file + * @pxefile_addr_r: Address to load file + * Returns 1 on success or < 0 on error. + */ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, - unsigned long pxefile_addr_r); + ulong pxefile_addr_r); + +/** + * handle_pxe_menu() - Boot the system as prescribed by a pxe_menu. + * + * Use the menu system to either get the user's choice or the default, based + * on config or user input. If there is no default or user's choice, + * attempted to boot labels in the order they were given in pxe files. + * If the default or user's choice fails to boot, attempt to boot other + * labels in the order they were given in pxe files. + * + * If this function returns, there weren't any labels that successfully + * booted, or the user interrupted the menu selection via ctrl+c. + * + * @cmdtp: Pointer to command-table entry for the initiating command + * @cfg: PXE menu + */ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg); -struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg); + +/** + * parse_pxefile() - Parsing a pxe file + * + * This is only used for the top-level file. + * + * @cmdtp: Pointer to command-table entry for the initiating command + * @menucfg: Address of PXE file + * + * Returns NULL if there is an error, otherwise, returns a pointer to a + * pxe_menu struct populated with the results of parsing the pxe file (and any + * files it includes). The resulting pxe_menu struct can be free()'d by using + * the destroy_pxe_menu() function. + */ +struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg); + +/** + * format_mac_pxe() - Convert a MAC address to PXE format + * + * Convert an ethaddr from the environment to the format used by pxelinux + * filenames based on mac addresses. Convert's ':' to '-', and adds "01-" to + * the beginning of the ethernet address to indicate a hardware type of + * Ethernet. Also converts uppercase hex characters into lowercase, to match + * pxelinux's behavior. + * + * @outbuf: Buffer to hold the output (must hold 22 bytes) + * @outbuf_len: Length of buffer + * Returns 1 for success, -ENOENT if 'ethaddr' is undefined in the + * environment, or some other value < 0 on error. + */ int format_mac_pxe(char *outbuf, size_t outbuf_len);
#endif /* __PXE_UTILS_H */

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:49 PM Simon Glass sjg@chromium.org wrote:
Put the function comments in the header file so that the full API can we examined in one place.
Expand the comments to cover parameters and return values.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/pxe_utils.c | 45 ----------------------------- cmd/pxe_utils.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 48 deletions(-)
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 067c24e5ff4..d7f4017efeb 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -32,16 +32,6 @@
bool is_pxe;
-/*
- Convert an ethaddr from the environment to the format used by pxelinux
- filenames based on mac addresses. Convert's ':' to '-', and adds "01-" to
- the beginning of the ethernet address to indicate a hardware type of
- Ethernet. Also converts uppercase hex characters into lowercase, to match
- pxelinux's behavior.
- Returns 1 for success, -ENOENT if 'ethaddr' is undefined in the
- environment, or some other value < 0 on error.
- */
int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -146,13 +136,6 @@ static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path, return do_getfile(cmdtp, relfile, addr_buf); }
-/*
- Retrieve the file at 'file_path' to the locate given by 'file_addr'. If
- 'bootfile' was specified in the environment, the path to bootfile will be
- prepended to 'file_path' and the resulting path will be used.
- Returns 1 on success, or < 0 for error.
- */
int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, unsigned long file_addr) { @@ -187,13 +170,6 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
-/*
- Retrieves a file in the 'pxelinux.cfg' folder. Since this uses get_pxe_file
- to do the hard work, the location of the 'pxelinux.cfg' folder is generated
- from the bootfile path, as described above.
- Returns 1 on success or < 0 on error.
- */
int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, unsigned long pxefile_addr_r) { @@ -1309,15 +1285,6 @@ void destroy_pxe_menu(struct pxe_menu *cfg) free(cfg); }
-/*
- Entry point for parsing a pxe file. This is only used for the top level
- file.
- Returns NULL if there is an error, otherwise, returns a pointer to a
- pxe_menu struct populated with the results of parsing the pxe file (and any
- files it includes). The resulting pxe_menu struct can be free()'d by using
- the destroy_pxe_menu() function.
- */
struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) { struct pxe_menu *cfg; @@ -1415,18 +1382,6 @@ static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) } }
-/*
- Boot the system as prescribed by a pxe_menu.
- Use the menu system to either get the user's choice or the default, based
- on config or user input. If there is no default or user's choice,
- attempted to boot labels in the order they were given in pxe files.
- If the default or user's choice fails to boot, attempt to boot other
- labels in the order they were given in pxe files.
- If this function returns, there weren't any labels that successfully
- booted, or the user interrupted the menu selection via ctrl+c.
- */
void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) { void *choice; diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index bf58e15347c..441beefa2bc 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -80,12 +80,83 @@ extern bool is_pxe; extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, char *file_addr); void destroy_pxe_menu(struct pxe_menu *cfg);
+/**
- get_pxe_file() - Read a file
- Retrieve the file at 'file_path' to the locate given by 'file_addr'. If
- 'bootfile' was specified in the environment, the path to bootfile will be
- prepended to 'file_path' and the resulting path will be used.
- @cmdtp: Pointer to command-table entry for the initiating command
- @file_path: Path to file
- @file_addr: Address to place file
- Returns 1 on success, or < 0 for error
- */
int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
unsigned long file_addr);
ulong file_addr);
+/**
- get_pxelinux_path() - Read a file from the same place as pxelinux.cfg
- Retrieves a file in the 'pxelinux.cfg' folder. Since this uses get_pxe_file()
- to do the hard work, the location of the 'pxelinux.cfg' folder is generated
- from the bootfile path, as described in get_pxe_file().
- @cmdtp: Pointer to command-table entry for the initiating command
- @file: Relative path to file
- @pxefile_addr_r: Address to load file
- Returns 1 on success or < 0 on error.
- */
int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file,
unsigned long pxefile_addr_r);
ulong pxefile_addr_r);
+/**
- handle_pxe_menu() - Boot the system as prescribed by a pxe_menu.
- Use the menu system to either get the user's choice or the default, based
- on config or user input. If there is no default or user's choice,
- attempted to boot labels in the order they were given in pxe files.
- If the default or user's choice fails to boot, attempt to boot other
- labels in the order they were given in pxe files.
- If this function returns, there weren't any labels that successfully
- booted, or the user interrupted the menu selection via ctrl+c.
- @cmdtp: Pointer to command-table entry for the initiating command
- @cfg: PXE menu
- */
void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg); -struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg);
+/**
- parse_pxefile() - Parsing a pxe file
- This is only used for the top-level file.
- @cmdtp: Pointer to command-table entry for the initiating command
- @menucfg: Address of PXE file
- Returns NULL if there is an error, otherwise, returns a pointer to a
- pxe_menu struct populated with the results of parsing the pxe file (and any
- files it includes). The resulting pxe_menu struct can be free()'d by using
- the destroy_pxe_menu() function.
- */
+struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg);
+/**
- format_mac_pxe() - Convert a MAC address to PXE format
- Convert an ethaddr from the environment to the format used by pxelinux
- filenames based on mac addresses. Convert's ':' to '-', and adds "01-" to
- the beginning of the ethernet address to indicate a hardware type of
- Ethernet. Also converts uppercase hex characters into lowercase, to match
- pxelinux's behavior.
- @outbuf: Buffer to hold the output (must hold 22 bytes)
- @outbuf_len: Length of buffer
- Returns 1 for success, -ENOENT if 'ethaddr' is undefined in the
- environment, or some other value < 0 on error.
- */
int format_mac_pxe(char *outbuf, size_t outbuf_len);
#endif /* __PXE_UTILS_H */
2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On 10/14/21 20:47, Simon Glass wrote:
Put the function comments in the header file so that the full API can we examined in one place.
In a follow up patch you could include the header file in the generated HTML documentation of doc/api/.
Best regards
Heinrich
Expand the comments to cover parameters and return values.
Signed-off-by: Simon Glasssjg@chromium.org

On Thu, Oct 14, 2021 at 12:47:55PM -0600, Simon Glass wrote:
Put the function comments in the header file so that the full API can we examined in one place.
Expand the comments to cover parameters and return values.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

At present the PXE functions pass around a pointer to command-table entry which is very strange. It is only needed in a few places and it is odd to pass around a data structure from another module in this way.
For bootmethod we will need to provide some context information when reading files.
Create a PXE context struct to hold the command-table-entry pointer and pass that around instead. We can then add more things to the context as needed.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/pxe.c | 28 +++++++++-------- cmd/pxe_utils.c | 80 ++++++++++++++++++++++++++----------------------- cmd/pxe_utils.h | 43 +++++++++++++++++++------- cmd/sysboot.c | 8 +++-- 4 files changed, 97 insertions(+), 62 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 46ac08fa3a0..17ce54fc049 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -43,7 +43,7 @@ static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path, * * Returns 1 on success or < 0 on error. */ -static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_uuid_path(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char *uuid_str;
@@ -52,7 +52,7 @@ static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) if (!uuid_str) return -ENOENT;
- return get_pxelinux_path(cmdtp, uuid_str, pxefile_addr_r); + return get_pxelinux_path(ctx, uuid_str, pxefile_addr_r); }
/* @@ -61,7 +61,7 @@ static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) * * Returns 1 on success or < 0 on error. */ -static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_mac_path(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char mac_str[21]; int err; @@ -71,7 +71,7 @@ static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) if (err < 0) return err;
- return get_pxelinux_path(cmdtp, mac_str, pxefile_addr_r); + return get_pxelinux_path(ctx, mac_str, pxefile_addr_r); }
/* @@ -81,7 +81,7 @@ static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) * * Returns 1 on success or < 0 on error. */ -static int pxe_ipaddr_paths(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char ip_addr[9]; int mask_pos, err; @@ -89,7 +89,7 @@ static int pxe_ipaddr_paths(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) sprintf(ip_addr, "%08X", ntohl(net_ip.s_addr));
for (mask_pos = 7; mask_pos >= 0; mask_pos--) { - err = get_pxelinux_path(cmdtp, ip_addr, pxefile_addr_r); + err = get_pxelinux_path(ctx, ip_addr, pxefile_addr_r);
if (err > 0) return err; @@ -118,8 +118,10 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *pxefile_addr_str; unsigned long pxefile_addr_r; + struct pxe_context ctx; int err, i = 0;
+ pxe_setup_ctx(&ctx, cmdtp); do_getfile = do_get_tftp;
if (argc != 1) @@ -139,16 +141,16 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) * Keep trying paths until we successfully get a file we're looking * for. */ - if (pxe_uuid_path(cmdtp, pxefile_addr_r) > 0 || - pxe_mac_path(cmdtp, pxefile_addr_r) > 0 || - pxe_ipaddr_paths(cmdtp, pxefile_addr_r) > 0) { + if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 || + pxe_mac_path(&ctx, pxefile_addr_r) > 0 || + pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) { printf("Config file found\n");
return 0; }
while (pxe_default_paths[i]) { - if (get_pxelinux_path(cmdtp, pxe_default_paths[i], + if (get_pxelinux_path(&ctx, pxe_default_paths[i], pxefile_addr_r) > 0) { printf("Config file found\n"); return 0; @@ -172,7 +174,9 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) unsigned long pxefile_addr_r; struct pxe_menu *cfg; char *pxefile_addr_str; + struct pxe_context ctx;
+ pxe_setup_ctx(&ctx, cmdtp); do_getfile = do_get_tftp;
if (argc == 1) { @@ -191,14 +195,14 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
- cfg = parse_pxefile(cmdtp, pxefile_addr_r); + cfg = parse_pxefile(&ctx, pxefile_addr_r);
if (!cfg) { printf("Error parsing config file\n"); return 1; }
- handle_pxe_menu(cmdtp, cfg); + handle_pxe_menu(&ctx, cfg);
destroy_pxe_menu(cfg);
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index d7f4017efeb..280be55d9b3 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -105,7 +105,7 @@ int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, * * Returns 1 for success, or < 0 on error. */ -static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path, +static int get_relfile(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { size_t path_len; @@ -133,10 +133,10 @@ static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
- return do_getfile(cmdtp, relfile, addr_buf); + return do_getfile(ctx->cmdtp, relfile, addr_buf); }
-int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, +int get_pxe_file(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { unsigned long config_file_size; @@ -144,7 +144,7 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, int err; char *buf;
- err = get_relfile(cmdtp, file_path, file_addr); + err = get_relfile(ctx, file_path, file_addr);
if (err < 0) return err; @@ -170,7 +170,7 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
-int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, +int get_pxelinux_path(struct pxe_context *ctx, const char *file, unsigned long pxefile_addr_r) { size_t base_len = strlen(PXELINUX_DIR); @@ -184,7 +184,7 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file,
sprintf(path, PXELINUX_DIR "%s", file);
- return get_pxe_file(cmdtp, path, pxefile_addr_r); + return get_pxe_file(ctx, path, pxefile_addr_r); }
/* @@ -194,7 +194,7 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, * * Returns 1 on success or < 0 on error. */ -static int get_relfile_envaddr(struct cmd_tbl *cmdtp, const char *file_path, +static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, const char *envaddr_name) { unsigned long file_addr; @@ -208,7 +208,7 @@ static int get_relfile_envaddr(struct cmd_tbl *cmdtp, const char *file_path, if (strict_strtoul(envaddr, 16, &file_addr) < 0) return -EINVAL;
- return get_relfile(cmdtp, file_path, file_addr); + return get_relfile(ctx, file_path, file_addr); }
/* @@ -317,7 +317,8 @@ static int label_localboot(struct pxe_label *label) * Loads fdt overlays specified in 'fdtoverlays'. */ #ifdef CONFIG_OF_LIBFDT_OVERLAY -static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label) +static void label_boot_fdtoverlay(struct pxe_context *ctx, + struct pxe_label *label) { char *fdtoverlay = label->fdtoverlays; struct fdt_header *working_fdt; @@ -367,7 +368,7 @@ static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label goto skip_overlay;
/* Load overlay file */ - err = get_relfile_envaddr(cmdtp, overlayfile, + err = get_relfile_envaddr(ctx, overlayfile, "fdtoverlay_addr_r"); if (err < 0) { printf("Failed loading overlay %s\n", overlayfile); @@ -414,7 +415,7 @@ skip_overlay: * If the label specifies an 'append' line, its contents will overwrite that * of the 'bootargs' environment variable. */ -static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) +static int label_boot(struct pxe_context *ctx, struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; char initrd_str[28]; @@ -443,7 +444,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) }
if (label->initrd) { - if (get_relfile_envaddr(cmdtp, label->initrd, "ramdisk_addr_r") < 0) { + if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r") < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return 1; @@ -456,7 +457,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) bootm_argc = 3; }
- if (get_relfile_envaddr(cmdtp, label->kernel, "kernel_addr_r") < 0) { + if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r") < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); return 1; @@ -596,7 +597,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) }
if (fdtfile) { - int err = get_relfile_envaddr(cmdtp, fdtfile, + int err = get_relfile_envaddr(ctx, fdtfile, "fdt_addr_r");
free(fdtfilefree); @@ -612,7 +613,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
#ifdef CONFIG_OF_LIBFDT_OVERLAY if (label->fdtoverlays) - label_boot_fdtoverlay(cmdtp, label); + label_boot_fdtoverlay(ctx, label); #endif } else { bootm_argv[3] = NULL; @@ -632,16 +633,16 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) buf = map_sysmem(kernel_addr, 0); /* Try bootm for legacy and FIT format image */ if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID) - do_bootm(cmdtp, 0, bootm_argc, bootm_argv); + do_bootm(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting an AArch64 Linux kernel image */ else if (IS_ENABLED(CONFIG_CMD_BOOTI)) - do_booti(cmdtp, 0, bootm_argc, bootm_argv); + do_booti(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting a Image */ else if (IS_ENABLED(CONFIG_CMD_BOOTZ)) - do_bootz(cmdtp, 0, bootm_argc, bootm_argv); + do_bootz(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting an x86_64 Linux kernel image */ else if (IS_ENABLED(CONFIG_CMD_ZBOOT)) - do_zboot_parent(cmdtp, 0, bootm_argc, bootm_argv, NULL); + do_zboot_parent(ctx->cmdtp, 0, bootm_argc, bootm_argv, NULL);
unmap_sysmem(buf);
@@ -917,7 +918,7 @@ static int parse_integer(char **c, int *dst) return 1; }
-static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, +static int parse_pxefile_top(struct pxe_context *ctx, char *p, ulong base, struct pxe_menu *cfg, int nest_level);
/* @@ -928,7 +929,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, * include, nest_level has already been incremented and doesn't need to be * incremented here. */ -static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, +static int handle_include(struct pxe_context *ctx, char **c, unsigned long base, struct pxe_menu *cfg, int nest_level) { char *include_path; @@ -944,7 +945,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, return err; }
- err = get_pxe_file(cmdtp, include_path, base); + err = get_pxe_file(ctx, include_path, base);
if (err < 0) { printf("Couldn't retrieve %s\n", include_path); @@ -952,7 +953,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, }
buf = map_sysmem(base, 0); - ret = parse_pxefile_top(cmdtp, buf, base, cfg, nest_level); + ret = parse_pxefile_top(ctx, buf, base, cfg, nest_level); unmap_sysmem(buf);
return ret; @@ -968,7 +969,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, * nest_level should be 1 when parsing the top level pxe file, 2 when parsing * a file it includes, 3 when parsing a file included by that file, and so on. */ -static int parse_menu(struct cmd_tbl *cmdtp, char **c, struct pxe_menu *cfg, +static int parse_menu(struct pxe_context *ctx, char **c, struct pxe_menu *cfg, unsigned long base, int nest_level) { struct token t; @@ -984,7 +985,7 @@ static int parse_menu(struct cmd_tbl *cmdtp, char **c, struct pxe_menu *cfg, break;
case T_INCLUDE: - err = handle_include(cmdtp, c, base, cfg, nest_level + 1); + err = handle_include(ctx, c, base, cfg, nest_level + 1); break;
case T_BACKGROUND: @@ -1186,7 +1187,7 @@ static int parse_label(char **c, struct pxe_menu *cfg) * * Returns 1 on success, < 0 on error. */ -static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, +static int parse_pxefile_top(struct pxe_context *ctx, char *p, unsigned long base, struct pxe_menu *cfg, int nest_level) { struct token t; @@ -1209,7 +1210,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, switch (t.type) { case T_MENU: cfg->prompt = 1; - err = parse_menu(cmdtp, &p, cfg, + err = parse_menu(ctx, &p, cfg, base + ALIGN(strlen(b) + 1, 4), nest_level); break; @@ -1236,7 +1237,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, break;
case T_INCLUDE: - err = handle_include(cmdtp, &p, + err = handle_include(ctx, &p, base + ALIGN(strlen(b), 4), cfg, nest_level + 1); break; @@ -1263,7 +1264,6 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, }
/* - * Free the memory used by a pxe_menu and its labels. */ void destroy_pxe_menu(struct pxe_menu *cfg) { @@ -1285,7 +1285,7 @@ void destroy_pxe_menu(struct pxe_menu *cfg) free(cfg); }
-struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) +struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) { struct pxe_menu *cfg; char *buf; @@ -1301,7 +1301,7 @@ struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) INIT_LIST_HEAD(&cfg->labels);
buf = map_sysmem(menucfg, 0); - r = parse_pxefile_top(cmdtp, buf, menucfg, cfg, 1); + r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1); unmap_sysmem(buf);
if (r < 0) { @@ -1369,7 +1369,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) /* * Try to boot any labels we have yet to attempt to boot. */ -static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) +static void boot_unattempted_labels(struct pxe_context *ctx, + struct pxe_menu *cfg) { struct list_head *pos; struct pxe_label *label; @@ -1378,11 +1379,11 @@ static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) label = list_entry(pos, struct pxe_label, list);
if (!label->attempted) - label_boot(cmdtp, label); + label_boot(ctx, label); } }
-void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) +void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) { void *choice; struct menu *m; @@ -1391,7 +1392,7 @@ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) if (IS_ENABLED(CONFIG_CMD_BMP)) { /* display BMP if available */ if (cfg->bmp) { - if (get_relfile(cmdtp, cfg->bmp, image_load_addr)) { + if (get_relfile(ctx, cfg->bmp, image_load_addr)) { if (CONFIG_IS_ENABLED(CMD_CLS)) run_command("cls", 0); bmp_display(image_load_addr, @@ -1423,12 +1424,17 @@ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) */
if (err == 1) { - err = label_boot(cmdtp, choice); + err = label_boot(ctx, choice); if (!err) return; } else if (err != -ENOENT) { return; }
- boot_unattempted_labels(cmdtp, cfg); + boot_unattempted_labels(ctx, cfg); +} + +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp) +{ + ctx->cmdtp = cmdtp; } diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index 441beefa2bc..cd0d3371765 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -79,6 +79,23 @@ extern bool is_pxe;
extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, char *file_addr); + +/** + * struct pxe_context - context information for PXE parsing + * + * @cmdtp: Pointer to command table to use when calling other commands + */ +struct pxe_context { + struct cmd_tbl *cmdtp; +}; + +/** + * destroy_pxe_menu() - Destroy an allocated pxe structure + * + * Free the memory used by a pxe_menu and its labels + * + * @cfg: Config to destroy, previous returned from parse_pxefile() + */ void destroy_pxe_menu(struct pxe_menu *cfg);
/** @@ -88,12 +105,12 @@ void destroy_pxe_menu(struct pxe_menu *cfg); * 'bootfile' was specified in the environment, the path to bootfile will be * prepended to 'file_path' and the resulting path will be used. * - * @cmdtp: Pointer to command-table entry for the initiating command + * @ctx: PXE context * @file_path: Path to file * @file_addr: Address to place file * Returns 1 on success, or < 0 for error */ -int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, +int get_pxe_file(struct pxe_context *ctx, const char *file_path, ulong file_addr);
/** @@ -103,12 +120,12 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, * to do the hard work, the location of the 'pxelinux.cfg' folder is generated * from the bootfile path, as described in get_pxe_file(). * - * @cmdtp: Pointer to command-table entry for the initiating command + * @ctx: PXE context * @file: Relative path to file * @pxefile_addr_r: Address to load file * Returns 1 on success or < 0 on error. */ -int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, +int get_pxelinux_path(struct pxe_context *ctx, const char *file, ulong pxefile_addr_r);
/** @@ -123,25 +140,23 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, * If this function returns, there weren't any labels that successfully * booted, or the user interrupted the menu selection via ctrl+c. * - * @cmdtp: Pointer to command-table entry for the initiating command + * @ctx: PXE context * @cfg: PXE menu */ -void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg); +void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg);
/** * parse_pxefile() - Parsing a pxe file * * This is only used for the top-level file. * - * @cmdtp: Pointer to command-table entry for the initiating command - * @menucfg: Address of PXE file - * + * @ctx: PXE context (provided by the caller) * Returns NULL if there is an error, otherwise, returns a pointer to a * pxe_menu struct populated with the results of parsing the pxe file (and any * files it includes). The resulting pxe_menu struct can be free()'d by using * the destroy_pxe_menu() function. */ -struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg); +struct pxe_menu *parse_pxefile(struct pxe_context *ctx, ulong menucfg);
/** * format_mac_pxe() - Convert a MAC address to PXE format @@ -159,4 +174,12 @@ struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg); */ int format_mac_pxe(char *outbuf, size_t outbuf_len);
+/** + * pxe_setup_ctx() - Setup a new PXE context + * + * @ctx: Context to set up + * @cmdtp: Command table entry which started this action + */ +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp); + #endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index af6a2f1b7f1..9ba713c8aae 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -59,6 +59,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r; + struct pxe_context ctx; struct pxe_menu *cfg; char *pxefile_addr_str; char *filename; @@ -90,6 +91,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
+ pxe_setup_ctx(&ctx, cmdtp); if (strstr(argv[3], "ext2")) { do_getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) { @@ -108,12 +110,12 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
- if (get_pxe_file(cmdtp, filename, pxefile_addr_r) < 0) { + if (get_pxe_file(&ctx, filename, pxefile_addr_r) < 0) { printf("Error reading config file\n"); return 1; }
- cfg = parse_pxefile(cmdtp, pxefile_addr_r); + cfg = parse_pxefile(&ctx, pxefile_addr_r);
if (!cfg) { printf("Error parsing config file\n"); @@ -123,7 +125,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, if (prompt) cfg->prompt = 1;
- handle_pxe_menu(cmdtp, cfg); + handle_pxe_menu(&ctx, cfg);
destroy_pxe_menu(cfg);

OK nice
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:49 PM Simon Glass sjg@chromium.org wrote:
At present the PXE functions pass around a pointer to command-table entry which is very strange. It is only needed in a few places and it is odd to pass around a data structure from another module in this way.
For bootmethod we will need to provide some context information when reading files.
Create a PXE context struct to hold the command-table-entry pointer and pass that around instead. We can then add more things to the context as needed.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/pxe.c | 28 +++++++++-------- cmd/pxe_utils.c | 80 ++++++++++++++++++++++++++----------------------- cmd/pxe_utils.h | 43 +++++++++++++++++++------- cmd/sysboot.c | 8 +++-- 4 files changed, 97 insertions(+), 62 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 46ac08fa3a0..17ce54fc049 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -43,7 +43,7 @@ static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path,
- Returns 1 on success or < 0 on error.
*/ -static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_uuid_path(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char *uuid_str;
@@ -52,7 +52,7 @@ static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) if (!uuid_str) return -ENOENT;
return get_pxelinux_path(cmdtp, uuid_str, pxefile_addr_r);
return get_pxelinux_path(ctx, uuid_str, pxefile_addr_r);
}
/* @@ -61,7 +61,7 @@ static int pxe_uuid_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r)
- Returns 1 on success or < 0 on error.
*/ -static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_mac_path(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char mac_str[21]; int err; @@ -71,7 +71,7 @@ static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) if (err < 0) return err;
return get_pxelinux_path(cmdtp, mac_str, pxefile_addr_r);
return get_pxelinux_path(ctx, mac_str, pxefile_addr_r);
}
/* @@ -81,7 +81,7 @@ static int pxe_mac_path(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r)
- Returns 1 on success or < 0 on error.
*/ -static int pxe_ipaddr_paths(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) +static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_r) { char ip_addr[9]; int mask_pos, err; @@ -89,7 +89,7 @@ static int pxe_ipaddr_paths(struct cmd_tbl *cmdtp, unsigned long pxefile_addr_r) sprintf(ip_addr, "%08X", ntohl(net_ip.s_addr));
for (mask_pos = 7; mask_pos >= 0; mask_pos--) {
err = get_pxelinux_path(cmdtp, ip_addr, pxefile_addr_r);
err = get_pxelinux_path(ctx, ip_addr, pxefile_addr_r); if (err > 0) return err;
@@ -118,8 +118,10 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *pxefile_addr_str; unsigned long pxefile_addr_r;
struct pxe_context ctx; int err, i = 0;
pxe_setup_ctx(&ctx, cmdtp); do_getfile = do_get_tftp; if (argc != 1)
@@ -139,16 +141,16 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) * Keep trying paths until we successfully get a file we're looking * for. */
if (pxe_uuid_path(cmdtp, pxefile_addr_r) > 0 ||
pxe_mac_path(cmdtp, pxefile_addr_r) > 0 ||
pxe_ipaddr_paths(cmdtp, pxefile_addr_r) > 0) {
if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) { printf("Config file found\n"); return 0; } while (pxe_default_paths[i]) {
if (get_pxelinux_path(cmdtp, pxe_default_paths[i],
if (get_pxelinux_path(&ctx, pxe_default_paths[i], pxefile_addr_r) > 0) { printf("Config file found\n"); return 0;
@@ -172,7 +174,9 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) unsigned long pxefile_addr_r; struct pxe_menu *cfg; char *pxefile_addr_str;
struct pxe_context ctx;
pxe_setup_ctx(&ctx, cmdtp); do_getfile = do_get_tftp; if (argc == 1) {
@@ -191,14 +195,14 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
cfg = parse_pxefile(cmdtp, pxefile_addr_r);
cfg = parse_pxefile(&ctx, pxefile_addr_r); if (!cfg) { printf("Error parsing config file\n"); return 1; }
handle_pxe_menu(cmdtp, cfg);
handle_pxe_menu(&ctx, cfg); destroy_pxe_menu(cfg);
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index d7f4017efeb..280be55d9b3 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -105,7 +105,7 @@ int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path,
- Returns 1 for success, or < 0 on error.
*/ -static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path, +static int get_relfile(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { size_t path_len; @@ -133,10 +133,10 @@ static int get_relfile(struct cmd_tbl *cmdtp, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
return do_getfile(cmdtp, relfile, addr_buf);
return do_getfile(ctx->cmdtp, relfile, addr_buf);
}
-int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, +int get_pxe_file(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { unsigned long config_file_size; @@ -144,7 +144,7 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, int err; char *buf;
err = get_relfile(cmdtp, file_path, file_addr);
err = get_relfile(ctx, file_path, file_addr); if (err < 0) return err;
@@ -170,7 +170,7 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
-int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, +int get_pxelinux_path(struct pxe_context *ctx, const char *file, unsigned long pxefile_addr_r) { size_t base_len = strlen(PXELINUX_DIR); @@ -184,7 +184,7 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file,
sprintf(path, PXELINUX_DIR "%s", file);
return get_pxe_file(cmdtp, path, pxefile_addr_r);
return get_pxe_file(ctx, path, pxefile_addr_r);
}
/* @@ -194,7 +194,7 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file,
- Returns 1 on success or < 0 on error.
*/ -static int get_relfile_envaddr(struct cmd_tbl *cmdtp, const char *file_path, +static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, const char *envaddr_name) { unsigned long file_addr; @@ -208,7 +208,7 @@ static int get_relfile_envaddr(struct cmd_tbl *cmdtp, const char *file_path, if (strict_strtoul(envaddr, 16, &file_addr) < 0) return -EINVAL;
return get_relfile(cmdtp, file_path, file_addr);
return get_relfile(ctx, file_path, file_addr);
}
/* @@ -317,7 +317,8 @@ static int label_localboot(struct pxe_label *label)
- Loads fdt overlays specified in 'fdtoverlays'.
*/ #ifdef CONFIG_OF_LIBFDT_OVERLAY -static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label) +static void label_boot_fdtoverlay(struct pxe_context *ctx,
struct pxe_label *label)
{ char *fdtoverlay = label->fdtoverlays; struct fdt_header *working_fdt; @@ -367,7 +368,7 @@ static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label goto skip_overlay;
/* Load overlay file */
err = get_relfile_envaddr(cmdtp, overlayfile,
err = get_relfile_envaddr(ctx, overlayfile, "fdtoverlay_addr_r"); if (err < 0) { printf("Failed loading overlay %s\n", overlayfile);
@@ -414,7 +415,7 @@ skip_overlay:
- If the label specifies an 'append' line, its contents will overwrite that
- of the 'bootargs' environment variable.
*/ -static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) +static int label_boot(struct pxe_context *ctx, struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; char initrd_str[28]; @@ -443,7 +444,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) }
if (label->initrd) {
if (get_relfile_envaddr(cmdtp, label->initrd, "ramdisk_addr_r") < 0) {
if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r") < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return 1;
@@ -456,7 +457,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) bootm_argc = 3; }
if (get_relfile_envaddr(cmdtp, label->kernel, "kernel_addr_r") < 0) {
if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r") < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); return 1;
@@ -596,7 +597,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) }
if (fdtfile) {
int err = get_relfile_envaddr(cmdtp, fdtfile,
int err = get_relfile_envaddr(ctx, fdtfile, "fdt_addr_r"); free(fdtfilefree);
@@ -612,7 +613,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
#ifdef CONFIG_OF_LIBFDT_OVERLAY if (label->fdtoverlays)
label_boot_fdtoverlay(cmdtp, label);
label_boot_fdtoverlay(ctx, label);
#endif } else { bootm_argv[3] = NULL; @@ -632,16 +633,16 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) buf = map_sysmem(kernel_addr, 0); /* Try bootm for legacy and FIT format image */ if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID)
do_bootm(cmdtp, 0, bootm_argc, bootm_argv);
do_bootm(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting an AArch64 Linux kernel image */ else if (IS_ENABLED(CONFIG_CMD_BOOTI))
do_booti(cmdtp, 0, bootm_argc, bootm_argv);
do_booti(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting a Image */ else if (IS_ENABLED(CONFIG_CMD_BOOTZ))
do_bootz(cmdtp, 0, bootm_argc, bootm_argv);
do_bootz(ctx->cmdtp, 0, bootm_argc, bootm_argv); /* Try booting an x86_64 Linux kernel image */ else if (IS_ENABLED(CONFIG_CMD_ZBOOT))
do_zboot_parent(cmdtp, 0, bootm_argc, bootm_argv, NULL);
do_zboot_parent(ctx->cmdtp, 0, bootm_argc, bootm_argv, NULL); unmap_sysmem(buf);
@@ -917,7 +918,7 @@ static int parse_integer(char **c, int *dst) return 1; }
-static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, +static int parse_pxefile_top(struct pxe_context *ctx, char *p, ulong base, struct pxe_menu *cfg, int nest_level);
/* @@ -928,7 +929,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base,
- include, nest_level has already been incremented and doesn't need to be
- incremented here.
*/ -static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, +static int handle_include(struct pxe_context *ctx, char **c, unsigned long base, struct pxe_menu *cfg, int nest_level) { char *include_path; @@ -944,7 +945,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, return err; }
err = get_pxe_file(cmdtp, include_path, base);
err = get_pxe_file(ctx, include_path, base); if (err < 0) { printf("Couldn't retrieve %s\n", include_path);
@@ -952,7 +953,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base, }
buf = map_sysmem(base, 0);
ret = parse_pxefile_top(cmdtp, buf, base, cfg, nest_level);
ret = parse_pxefile_top(ctx, buf, base, cfg, nest_level); unmap_sysmem(buf); return ret;
@@ -968,7 +969,7 @@ static int handle_include(struct cmd_tbl *cmdtp, char **c, unsigned long base,
- nest_level should be 1 when parsing the top level pxe file, 2 when parsing
- a file it includes, 3 when parsing a file included by that file, and so on.
*/ -static int parse_menu(struct cmd_tbl *cmdtp, char **c, struct pxe_menu *cfg, +static int parse_menu(struct pxe_context *ctx, char **c, struct pxe_menu *cfg, unsigned long base, int nest_level) { struct token t; @@ -984,7 +985,7 @@ static int parse_menu(struct cmd_tbl *cmdtp, char **c, struct pxe_menu *cfg, break;
case T_INCLUDE:
err = handle_include(cmdtp, c, base, cfg, nest_level + 1);
err = handle_include(ctx, c, base, cfg, nest_level + 1); break; case T_BACKGROUND:
@@ -1186,7 +1187,7 @@ static int parse_label(char **c, struct pxe_menu *cfg)
- Returns 1 on success, < 0 on error.
*/ -static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, +static int parse_pxefile_top(struct pxe_context *ctx, char *p, unsigned long base, struct pxe_menu *cfg, int nest_level) { struct token t; @@ -1209,7 +1210,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, switch (t.type) { case T_MENU: cfg->prompt = 1;
err = parse_menu(cmdtp, &p, cfg,
err = parse_menu(ctx, &p, cfg, base + ALIGN(strlen(b) + 1, 4), nest_level); break;
@@ -1236,7 +1237,7 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, break;
case T_INCLUDE:
err = handle_include(cmdtp, &p,
err = handle_include(ctx, &p, base + ALIGN(strlen(b), 4), cfg, nest_level + 1); break;
@@ -1263,7 +1264,6 @@ static int parse_pxefile_top(struct cmd_tbl *cmdtp, char *p, unsigned long base, }
/*
*/
- Free the memory used by a pxe_menu and its labels.
void destroy_pxe_menu(struct pxe_menu *cfg) { @@ -1285,7 +1285,7 @@ void destroy_pxe_menu(struct pxe_menu *cfg) free(cfg); }
-struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) +struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) { struct pxe_menu *cfg; char *buf; @@ -1301,7 +1301,7 @@ struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, unsigned long menucfg) INIT_LIST_HEAD(&cfg->labels);
buf = map_sysmem(menucfg, 0);
r = parse_pxefile_top(cmdtp, buf, menucfg, cfg, 1);
r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1); unmap_sysmem(buf); if (r < 0) {
@@ -1369,7 +1369,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) /*
- Try to boot any labels we have yet to attempt to boot.
*/ -static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) +static void boot_unattempted_labels(struct pxe_context *ctx,
struct pxe_menu *cfg)
{ struct list_head *pos; struct pxe_label *label; @@ -1378,11 +1379,11 @@ static void boot_unattempted_labels(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) label = list_entry(pos, struct pxe_label, list);
if (!label->attempted)
label_boot(cmdtp, label);
label_boot(ctx, label); }
}
-void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) +void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) { void *choice; struct menu *m; @@ -1391,7 +1392,7 @@ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) if (IS_ENABLED(CONFIG_CMD_BMP)) { /* display BMP if available */ if (cfg->bmp) {
if (get_relfile(cmdtp, cfg->bmp, image_load_addr)) {
if (get_relfile(ctx, cfg->bmp, image_load_addr)) { if (CONFIG_IS_ENABLED(CMD_CLS)) run_command("cls", 0); bmp_display(image_load_addr,
@@ -1423,12 +1424,17 @@ void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg) */
if (err == 1) {
err = label_boot(cmdtp, choice);
err = label_boot(ctx, choice); if (!err) return; } else if (err != -ENOENT) { return; }
boot_unattempted_labels(cmdtp, cfg);
boot_unattempted_labels(ctx, cfg);
+}
+void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp) +{
ctx->cmdtp = cmdtp;
} diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index 441beefa2bc..cd0d3371765 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -79,6 +79,23 @@ extern bool is_pxe;
extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, char *file_addr);
+/**
- struct pxe_context - context information for PXE parsing
- @cmdtp: Pointer to command table to use when calling other commands
- */
+struct pxe_context {
struct cmd_tbl *cmdtp;
+};
+/**
- destroy_pxe_menu() - Destroy an allocated pxe structure
- Free the memory used by a pxe_menu and its labels
- @cfg: Config to destroy, previous returned from parse_pxefile()
- */
void destroy_pxe_menu(struct pxe_menu *cfg);
/** @@ -88,12 +105,12 @@ void destroy_pxe_menu(struct pxe_menu *cfg);
- 'bootfile' was specified in the environment, the path to bootfile will be
- prepended to 'file_path' and the resulting path will be used.
- @cmdtp: Pointer to command-table entry for the initiating command
*/
- @ctx: PXE context
- @file_path: Path to file
- @file_addr: Address to place file
- Returns 1 on success, or < 0 for error
-int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path, +int get_pxe_file(struct pxe_context *ctx, const char *file_path, ulong file_addr);
/** @@ -103,12 +120,12 @@ int get_pxe_file(struct cmd_tbl *cmdtp, const char *file_path,
- to do the hard work, the location of the 'pxelinux.cfg' folder is generated
- from the bootfile path, as described in get_pxe_file().
- @cmdtp: Pointer to command-table entry for the initiating command
*/
- @ctx: PXE context
- @file: Relative path to file
- @pxefile_addr_r: Address to load file
- Returns 1 on success or < 0 on error.
-int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file, +int get_pxelinux_path(struct pxe_context *ctx, const char *file, ulong pxefile_addr_r);
/** @@ -123,25 +140,23 @@ int get_pxelinux_path(struct cmd_tbl *cmdtp, const char *file,
- If this function returns, there weren't any labels that successfully
- booted, or the user interrupted the menu selection via ctrl+c.
- @cmdtp: Pointer to command-table entry for the initiating command
*/
- @ctx: PXE context
- @cfg: PXE menu
-void handle_pxe_menu(struct cmd_tbl *cmdtp, struct pxe_menu *cfg); +void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg);
/**
- parse_pxefile() - Parsing a pxe file
- This is only used for the top-level file.
- @cmdtp: Pointer to command-table entry for the initiating command
- @menucfg: Address of PXE file
*/
- @ctx: PXE context (provided by the caller)
- Returns NULL if there is an error, otherwise, returns a pointer to a
- pxe_menu struct populated with the results of parsing the pxe file (and any
- files it includes). The resulting pxe_menu struct can be free()'d by using
- the destroy_pxe_menu() function.
-struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg); +struct pxe_menu *parse_pxefile(struct pxe_context *ctx, ulong menucfg);
/**
- format_mac_pxe() - Convert a MAC address to PXE format
@@ -159,4 +174,12 @@ struct pxe_menu *parse_pxefile(struct cmd_tbl *cmdtp, ulong menucfg); */ int format_mac_pxe(char *outbuf, size_t outbuf_len);
+/**
- pxe_setup_ctx() - Setup a new PXE context
- @ctx: Context to set up
- @cmdtp: Command table entry which started this action
- */
+void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index af6a2f1b7f1..9ba713c8aae 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -59,6 +59,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r;
struct pxe_context ctx; struct pxe_menu *cfg; char *pxefile_addr_str; char *filename;
@@ -90,6 +91,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
pxe_setup_ctx(&ctx, cmdtp); if (strstr(argv[3], "ext2")) { do_getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {
@@ -108,12 +110,12 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
if (get_pxe_file(cmdtp, filename, pxefile_addr_r) < 0) {
if (get_pxe_file(&ctx, filename, pxefile_addr_r) < 0) { printf("Error reading config file\n"); return 1; }
cfg = parse_pxefile(cmdtp, pxefile_addr_r);
cfg = parse_pxefile(&ctx, pxefile_addr_r); if (!cfg) { printf("Error parsing config file\n");
@@ -123,7 +125,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, if (prompt) cfg->prompt = 1;
handle_pxe_menu(cmdtp, cfg);
handle_pxe_menu(&ctx, cfg); destroy_pxe_menu(cfg);
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:47:56PM -0600, Simon Glass wrote:
At present the PXE functions pass around a pointer to command-table entry which is very strange. It is only needed in a few places and it is odd to pass around a data structure from another module in this way.
For bootmethod we will need to provide some context information when reading files.
Create a PXE context struct to hold the command-table-entry pointer and pass that around instead. We can then add more things to the context as needed.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Rather than having a global variable, pass the function as part of the context.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/pxe.c | 10 ++++------ cmd/pxe_utils.c | 9 ++++----- cmd/pxe_utils.h | 20 +++++++++++++++++--- cmd/sysboot.c | 20 ++++++++++---------- 4 files changed, 35 insertions(+), 24 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 17ce54fc049..70dbde3a636 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -24,7 +24,7 @@ const char *pxe_default_paths[] = { NULL };
-static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_tftp(struct pxe_context *ctx, const char *file_path, char *file_addr) { char *tftp_argv[] = {"tftp", NULL, NULL, NULL}; @@ -32,7 +32,7 @@ static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path, tftp_argv[1] = file_addr; tftp_argv[2] = (void *)file_path;
- if (do_tftpb(cmdtp, 0, 3, tftp_argv)) + if (do_tftpb(ctx->cmdtp, 0, 3, tftp_argv)) return -ENOENT;
return 1; @@ -121,8 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
- pxe_setup_ctx(&ctx, cmdtp); - do_getfile = do_get_tftp; + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp);
if (argc != 1) return CMD_RET_USAGE; @@ -176,8 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
- pxe_setup_ctx(&ctx, cmdtp); - do_getfile = do_get_tftp; + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp);
if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r"); diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 280be55d9b3..2caae6d1555 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -94,9 +94,6 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, return 1; }
-int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, - char *file_addr); - /* * As in pxelinux, paths to files referenced from files we retrieve are * relative to the location of bootfile. get_relfile takes such a path and @@ -133,7 +130,7 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
- return do_getfile(ctx->cmdtp, relfile, addr_buf); + return ctx->getfile(ctx, relfile, addr_buf); }
int get_pxe_file(struct pxe_context *ctx, const char *file_path, @@ -1434,7 +1431,9 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) boot_unattempted_labels(ctx, cfg); }
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp) +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, + pxe_getfile_func getfile) { ctx->cmdtp = cmdtp; + ctx->getfile = getfile; } diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index cd0d3371765..ca2696f48b0 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -77,16 +77,28 @@ struct pxe_menu {
extern bool is_pxe;
-extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path, - char *file_addr); +struct pxe_context; +typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, + char *file_addr);
/** * struct pxe_context - context information for PXE parsing * * @cmdtp: Pointer to command table to use when calling other commands + * @getfile: Function called by PXE to read a file */ struct pxe_context { struct cmd_tbl *cmdtp; + /** + * getfile() - read a file + * + * @ctx: PXE context + * @file_path: Path to the file + * @file_addr: String containing the hex address to put the file in + * memory + * Return 0 if OK, -ve on error + */ + pxe_getfile_func getfile; };
/** @@ -179,7 +191,9 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len); * * @ctx: Context to set up * @cmdtp: Command table entry which started this action + * @getfile: Function to call to read a file */ -void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp); +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, + pxe_getfile_func getfile);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 9ba713c8aae..082f23543d1 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -8,7 +8,7 @@
static char *fs_argv[5];
-static int do_get_ext2(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_ext2(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_EXT2 @@ -16,13 +16,13 @@ static int do_get_ext2(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
- if (!do_ext2load(cmdtp, 0, 5, fs_argv)) + if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv)) return 1; #endif return -ENOENT; }
-static int do_get_fat(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_fat(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_FAT @@ -30,13 +30,13 @@ static int do_get_fat(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
- if (!do_fat_fsload(cmdtp, 0, 5, fs_argv)) + if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv)) return 1; #endif return -ENOENT; }
-static int do_get_any(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_any(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_FS_GENERIC @@ -44,7 +44,7 @@ static int do_get_any(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
- if (!do_load(cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) + if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) return 1; #endif return -ENOENT; @@ -91,13 +91,13 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
- pxe_setup_ctx(&ctx, cmdtp); + pxe_setup_ctx(&ctx, cmdtp, NULL); if (strstr(argv[3], "ext2")) { - do_getfile = do_get_ext2; + ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) { - do_getfile = do_get_fat; + ctx.getfile = do_get_fat; } else if (strstr(argv[3], "any")) { - do_getfile = do_get_any; + ctx.getfile = do_get_any; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1;

OK nice
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:49 PM Simon Glass sjg@chromium.org wrote:
Rather than having a global variable, pass the function as part of the context.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/pxe.c | 10 ++++------ cmd/pxe_utils.c | 9 ++++----- cmd/pxe_utils.h | 20 +++++++++++++++++--- cmd/sysboot.c | 20 ++++++++++---------- 4 files changed, 35 insertions(+), 24 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 17ce54fc049..70dbde3a636 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -24,7 +24,7 @@ const char *pxe_default_paths[] = { NULL };
-static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_tftp(struct pxe_context *ctx, const char *file_path, char *file_addr) { char *tftp_argv[] = {"tftp", NULL, NULL, NULL}; @@ -32,7 +32,7 @@ static int do_get_tftp(struct cmd_tbl *cmdtp, const char *file_path, tftp_argv[1] = file_addr; tftp_argv[2] = (void *)file_path;
if (do_tftpb(cmdtp, 0, 3, tftp_argv))
if (do_tftpb(ctx->cmdtp, 0, 3, tftp_argv)) return -ENOENT; return 1;
@@ -121,8 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
pxe_setup_ctx(&ctx, cmdtp);
do_getfile = do_get_tftp;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp); if (argc != 1) return CMD_RET_USAGE;
@@ -176,8 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
pxe_setup_ctx(&ctx, cmdtp);
do_getfile = do_get_tftp;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp); if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r");
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 280be55d9b3..2caae6d1555 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -94,9 +94,6 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, return 1; }
-int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path,
char *file_addr);
/*
- As in pxelinux, paths to files referenced from files we retrieve are
- relative to the location of bootfile. get_relfile takes such a path and
@@ -133,7 +130,7 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
return do_getfile(ctx->cmdtp, relfile, addr_buf);
return ctx->getfile(ctx, relfile, addr_buf);
}
int get_pxe_file(struct pxe_context *ctx, const char *file_path, @@ -1434,7 +1431,9 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) boot_unattempted_labels(ctx, cfg); }
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp) +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile)
{ ctx->cmdtp = cmdtp;
ctx->getfile = getfile;
} diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index cd0d3371765..ca2696f48b0 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -77,16 +77,28 @@ struct pxe_menu {
extern bool is_pxe;
-extern int (*do_getfile)(struct cmd_tbl *cmdtp, const char *file_path,
char *file_addr);
+struct pxe_context; +typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
char *file_addr);
/**
- struct pxe_context - context information for PXE parsing
- @cmdtp: Pointer to command table to use when calling other commands
*/
- @getfile: Function called by PXE to read a file
struct pxe_context { struct cmd_tbl *cmdtp;
/**
* getfile() - read a file
*
* @ctx: PXE context
* @file_path: Path to the file
* @file_addr: String containing the hex address to put the file in
* memory
* Return 0 if OK, -ve on error
*/
pxe_getfile_func getfile;
};
/** @@ -179,7 +191,9 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
- @ctx: Context to set up
- @cmdtp: Command table entry which started this action
*/
- @getfile: Function to call to read a file
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp); +void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 9ba713c8aae..082f23543d1 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -8,7 +8,7 @@
static char *fs_argv[5];
-static int do_get_ext2(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_ext2(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_EXT2 @@ -16,13 +16,13 @@ static int do_get_ext2(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_ext2load(cmdtp, 0, 5, fs_argv))
if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv)) return 1;
#endif return -ENOENT; }
-static int do_get_fat(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_fat(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_FAT @@ -30,13 +30,13 @@ static int do_get_fat(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_fat_fsload(cmdtp, 0, 5, fs_argv))
if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv)) return 1;
#endif return -ENOENT; }
-static int do_get_any(struct cmd_tbl *cmdtp, const char *file_path, +static int do_get_any(struct pxe_context *ctx, const char *file_path, char *file_addr) { #ifdef CONFIG_CMD_FS_GENERIC @@ -44,7 +44,7 @@ static int do_get_any(struct cmd_tbl *cmdtp, const char *file_path, fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_load(cmdtp, 0, 5, fs_argv, FS_TYPE_ANY))
if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) return 1;
#endif return -ENOENT; @@ -91,13 +91,13 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
pxe_setup_ctx(&ctx, cmdtp);
pxe_setup_ctx(&ctx, cmdtp, NULL); if (strstr(argv[3], "ext2")) {
do_getfile = do_get_ext2;
ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {
do_getfile = do_get_fat;
ctx.getfile = do_get_fat; } else if (strstr(argv[3], "any")) {
do_getfile = do_get_any;
ctx.getfile = do_get_any; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1;
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:47:57PM -0600, Simon Glass wrote:
Rather than having a global variable, pass the function as part of the context.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Allow the caller to provide some info which is passed back to the readfile() method.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/pxe.c | 4 ++-- cmd/pxe_utils.c | 3 ++- cmd/pxe_utils.h | 6 +++++- cmd/sysboot.c | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 70dbde3a636..d79b9b733d7 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,7 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp); + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL);
if (argc != 1) return CMD_RET_USAGE; @@ -175,7 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp); + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL);
if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r"); diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 2caae6d1555..5ad6d3e3d44 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1432,8 +1432,9 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) }
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile) + pxe_getfile_func getfile, void *userdata) { ctx->cmdtp = cmdtp; ctx->getfile = getfile; + ctx->userdata = userdata; } diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index ca2696f48b0..921455f694e 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -86,6 +86,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, * * @cmdtp: Pointer to command table to use when calling other commands * @getfile: Function called by PXE to read a file + * @userdata: Data the caller requires for @getfile */ struct pxe_context { struct cmd_tbl *cmdtp; @@ -99,6 +100,8 @@ struct pxe_context { * Return 0 if OK, -ve on error */ pxe_getfile_func getfile; + + void *userdata; };
/** @@ -192,8 +195,9 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len); * @ctx: Context to set up * @cmdtp: Command table entry which started this action * @getfile: Function to call to read a file + * @userdata: Data the caller requires for @getfile - stored in ctx->userdata */ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile); + pxe_getfile_func getfile, void *userdata);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 082f23543d1..5615e81e9ca 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -91,7 +91,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
- pxe_setup_ctx(&ctx, cmdtp, NULL); + pxe_setup_ctx(&ctx, cmdtp, NULL, NULL); if (strstr(argv[3], "ext2")) { ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {

OK nice
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:49 PM Simon Glass sjg@chromium.org wrote:
Allow the caller to provide some info which is passed back to the readfile() method.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/pxe.c | 4 ++-- cmd/pxe_utils.c | 3 ++- cmd/pxe_utils.h | 6 +++++- cmd/sysboot.c | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 70dbde3a636..d79b9b733d7 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,7 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp);
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL); if (argc != 1) return CMD_RET_USAGE;
@@ -175,7 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp);
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL); if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r");
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 2caae6d1555..5ad6d3e3d44 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -1432,8 +1432,9 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) }
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile)
pxe_getfile_func getfile, void *userdata)
{ ctx->cmdtp = cmdtp; ctx->getfile = getfile;
ctx->userdata = userdata;
} diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index ca2696f48b0..921455f694e 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -86,6 +86,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
- @cmdtp: Pointer to command table to use when calling other commands
- @getfile: Function called by PXE to read a file
*/
- @userdata: Data the caller requires for @getfile
struct pxe_context { struct cmd_tbl *cmdtp; @@ -99,6 +100,8 @@ struct pxe_context { * Return 0 if OK, -ve on error */ pxe_getfile_func getfile;
void *userdata;
};
/** @@ -192,8 +195,9 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
- @ctx: Context to set up
- @cmdtp: Command table entry which started this action
- @getfile: Function to call to read a file
*/
- @userdata: Data the caller requires for @getfile - stored in ctx->userdata
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile);
pxe_getfile_func getfile, void *userdata);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 082f23543d1..5615e81e9ca 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -91,7 +91,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
pxe_setup_ctx(&ctx, cmdtp, NULL);
pxe_setup_ctx(&ctx, cmdtp, NULL, NULL); if (strstr(argv[3], "ext2")) { ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:47:58PM -0600, Simon Glass wrote:
Allow the caller to provide some info which is passed back to the readfile() method.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Move this into the context to avoid a global variable. Also rename it since the current name does not explain what it actually affects.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/pxe.c | 6 ++---- cmd/pxe_utils.c | 13 +++++++------ cmd/pxe_utils.h | 8 +++++--- cmd/sysboot.c | 4 +--- 4 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index d79b9b733d7..17fe364bed9 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,7 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL); + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
if (argc != 1) return CMD_RET_USAGE; @@ -175,7 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL); + pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r"); @@ -235,8 +235,6 @@ static int do_pxe(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (argc < 2) return CMD_RET_USAGE;
- is_pxe = true; - /* drop initial "pxe" arg */ argc--; argv++; diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 5ad6d3e3d44..7d15c75dd87 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -30,8 +30,6 @@
#define MAX_TFTP_PATH_LEN 512
-bool is_pxe; - int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -58,13 +56,13 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) * be interpreted as "don't prepend anything to paths". */ static int get_bootfile_path(const char *file_path, char *bootfile_path, - size_t bootfile_path_size) + size_t bootfile_path_size, bool allow_abs_path) { char *bootfile, *last_slash; size_t path_len = 0;
/* Only syslinux allows absolute paths */ - if (file_path[0] == '/' && !is_pxe) + if (file_path[0] == '/' && allow_abs_path) goto ret;
bootfile = from_env("bootfile"); @@ -110,7 +108,8 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, char addr_buf[18]; int err;
- err = get_bootfile_path(file_path, relfile, sizeof(relfile)); + err = get_bootfile_path(file_path, relfile, sizeof(relfile), + ctx->allow_abs_path);
if (err < 0) return err; @@ -1432,9 +1431,11 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) }
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile, void *userdata) + pxe_getfile_func getfile, void *userdata, + bool allow_abs_path) { ctx->cmdtp = cmdtp; ctx->getfile = getfile; ctx->userdata = userdata; + ctx->allow_abs_path = allow_abs_path; } diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index 921455f694e..6681442ea55 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -75,8 +75,6 @@ struct pxe_menu { struct list_head labels; };
-extern bool is_pxe; - struct pxe_context; typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, char *file_addr); @@ -87,6 +85,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, * @cmdtp: Pointer to command table to use when calling other commands * @getfile: Function called by PXE to read a file * @userdata: Data the caller requires for @getfile + * @allow_abs_path: true to allow absolute paths */ struct pxe_context { struct cmd_tbl *cmdtp; @@ -102,6 +101,7 @@ struct pxe_context { pxe_getfile_func getfile;
void *userdata; + bool allow_abs_path; };
/** @@ -196,8 +196,10 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len); * @cmdtp: Command table entry which started this action * @getfile: Function to call to read a file * @userdata: Data the caller requires for @getfile - stored in ctx->userdata + * @allow_abs_path: true to allow absolute paths */ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile, void *userdata); + pxe_getfile_func getfile, void *userdata, + bool allow_abs_path);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 5615e81e9ca..85fa5d8aa01 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -65,8 +65,6 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *filename; int prompt = 0;
- is_pxe = false; - if (argc > 1 && strstr(argv[1], "-p")) { prompt = 1; argc--; @@ -91,7 +89,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
- pxe_setup_ctx(&ctx, cmdtp, NULL, NULL); + pxe_setup_ctx(&ctx, cmdtp, NULL, NULL, true); if (strstr(argv[3], "ext2")) { ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {

OK nice
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:49 PM Simon Glass sjg@chromium.org wrote:
Move this into the context to avoid a global variable. Also rename it since the current name does not explain what it actually affects.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/pxe.c | 6 ++---- cmd/pxe_utils.c | 13 +++++++------ cmd/pxe_utils.h | 8 +++++--- cmd/sysboot.c | 4 +--- 4 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index d79b9b733d7..17fe364bed9 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,7 +121,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL);
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false); if (argc != 1) return CMD_RET_USAGE;
@@ -175,7 +175,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) char *pxefile_addr_str; struct pxe_context ctx;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL);
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false); if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r");
@@ -235,8 +235,6 @@ static int do_pxe(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (argc < 2) return CMD_RET_USAGE;
is_pxe = true;
/* drop initial "pxe" arg */ argc--; argv++;
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c index 5ad6d3e3d44..7d15c75dd87 100644 --- a/cmd/pxe_utils.c +++ b/cmd/pxe_utils.c @@ -30,8 +30,6 @@
#define MAX_TFTP_PATH_LEN 512
-bool is_pxe;
int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -58,13 +56,13 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len)
- be interpreted as "don't prepend anything to paths".
*/ static int get_bootfile_path(const char *file_path, char *bootfile_path,
size_t bootfile_path_size)
size_t bootfile_path_size, bool allow_abs_path)
{ char *bootfile, *last_slash; size_t path_len = 0;
/* Only syslinux allows absolute paths */
if (file_path[0] == '/' && !is_pxe)
if (file_path[0] == '/' && allow_abs_path) goto ret; bootfile = from_env("bootfile");
@@ -110,7 +108,8 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, char addr_buf[18]; int err;
err = get_bootfile_path(file_path, relfile, sizeof(relfile));
err = get_bootfile_path(file_path, relfile, sizeof(relfile),
ctx->allow_abs_path); if (err < 0) return err;
@@ -1432,9 +1431,11 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) }
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata)
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path)
{ ctx->cmdtp = cmdtp; ctx->getfile = getfile; ctx->userdata = userdata;
ctx->allow_abs_path = allow_abs_path;
} diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h index 921455f694e..6681442ea55 100644 --- a/cmd/pxe_utils.h +++ b/cmd/pxe_utils.h @@ -75,8 +75,6 @@ struct pxe_menu { struct list_head labels; };
-extern bool is_pxe;
struct pxe_context; typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, char *file_addr); @@ -87,6 +85,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
- @cmdtp: Pointer to command table to use when calling other commands
- @getfile: Function called by PXE to read a file
- @userdata: Data the caller requires for @getfile
*/
- @allow_abs_path: true to allow absolute paths
struct pxe_context { struct cmd_tbl *cmdtp; @@ -102,6 +101,7 @@ struct pxe_context { pxe_getfile_func getfile;
void *userdata;
bool allow_abs_path;
};
/** @@ -196,8 +196,10 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
- @cmdtp: Command table entry which started this action
- @getfile: Function to call to read a file
- @userdata: Data the caller requires for @getfile - stored in ctx->userdata
*/
- @allow_abs_path: true to allow absolute paths
void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata);
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path);
#endif /* __PXE_UTILS_H */ diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 5615e81e9ca..85fa5d8aa01 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -65,8 +65,6 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *filename; int prompt = 0;
is_pxe = false;
if (argc > 1 && strstr(argv[1], "-p")) { prompt = 1; argc--;
@@ -91,7 +89,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
pxe_setup_ctx(&ctx, cmdtp, NULL, NULL);
pxe_setup_ctx(&ctx, cmdtp, NULL, NULL, true); if (strstr(argv[3], "ext2")) { ctx.getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:47:59PM -0600, Simon Glass wrote:
Move this into the context to avoid a global variable. Also rename it since the current name does not explain what it actually affects.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/Makefile | 3 +++ {cmd => boot}/pxe_utils.c | 0 cmd/Makefile | 4 ++-- cmd/sysboot.c | 2 +- {cmd => include}/pxe_utils.h | 0 5 files changed, 6 insertions(+), 3 deletions(-) rename {cmd => boot}/pxe_utils.c (100%) rename {cmd => include}/pxe_utils.h (100%)
diff --git a/boot/Makefile b/boot/Makefile index a19e85cf6c8..2938c3f1458 100644 --- a/boot/Makefile +++ b/boot/Makefile @@ -14,6 +14,9 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o
+obj-$(CONFIG_CMD_PXE) += pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += pxe_utils.o + endif
obj-y += image.o image-board.o diff --git a/cmd/pxe_utils.c b/boot/pxe_utils.c similarity index 100% rename from cmd/pxe_utils.c rename to boot/pxe_utils.c diff --git a/cmd/Makefile b/cmd/Makefile index ed3669411e6..891819ae0f6 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -123,7 +123,7 @@ obj-$(CONFIG_CMD_PINMUX) += pinmux.o obj-$(CONFIG_CMD_PMC) += pmc.o obj-$(CONFIG_CMD_PSTORE) += pstore.o obj-$(CONFIG_CMD_PWM) += pwm.o -obj-$(CONFIG_CMD_PXE) += pxe.o pxe_utils.o +obj-$(CONFIG_CMD_PXE) += pxe.o obj-$(CONFIG_CMD_WOL) += wol.o obj-$(CONFIG_CMD_QFW) += qfw.o obj-$(CONFIG_CMD_READ) += read.o @@ -145,7 +145,7 @@ obj-$(CONFIG_CMD_SETEXPR_FMT) += printf.o obj-$(CONFIG_CMD_SPI) += spi.o obj-$(CONFIG_CMD_STRINGS) += strings.o obj-$(CONFIG_CMD_SMC) += smccc.o -obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o obj-$(CONFIG_CMD_STACKPROTECTOR_TEST) += stackprot_test.o obj-$(CONFIG_CMD_TERMINAL) += terminal.o obj-$(CONFIG_CMD_TIME) += time.o diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 85fa5d8aa01..b81255e155a 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -4,7 +4,7 @@ #include <command.h> #include <env.h> #include <fs.h> -#include "pxe_utils.h" +#include <pxe_utils.h>
static char *fs_argv[5];
diff --git a/cmd/pxe_utils.h b/include/pxe_utils.h similarity index 100% rename from cmd/pxe_utils.h rename to include/pxe_utils.h

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/Makefile | 3 +++ {cmd => boot}/pxe_utils.c | 0 cmd/Makefile | 4 ++-- cmd/sysboot.c | 2 +- {cmd => include}/pxe_utils.h | 0 5 files changed, 6 insertions(+), 3 deletions(-) rename {cmd => boot}/pxe_utils.c (100%) rename {cmd => include}/pxe_utils.h (100%)
diff --git a/boot/Makefile b/boot/Makefile index a19e85cf6c8..2938c3f1458 100644 --- a/boot/Makefile +++ b/boot/Makefile @@ -14,6 +14,9 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o
+obj-$(CONFIG_CMD_PXE) += pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += pxe_utils.o
endif
obj-y += image.o image-board.o diff --git a/cmd/pxe_utils.c b/boot/pxe_utils.c similarity index 100% rename from cmd/pxe_utils.c rename to boot/pxe_utils.c diff --git a/cmd/Makefile b/cmd/Makefile index ed3669411e6..891819ae0f6 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -123,7 +123,7 @@ obj-$(CONFIG_CMD_PINMUX) += pinmux.o obj-$(CONFIG_CMD_PMC) += pmc.o obj-$(CONFIG_CMD_PSTORE) += pstore.o obj-$(CONFIG_CMD_PWM) += pwm.o -obj-$(CONFIG_CMD_PXE) += pxe.o pxe_utils.o +obj-$(CONFIG_CMD_PXE) += pxe.o obj-$(CONFIG_CMD_WOL) += wol.o obj-$(CONFIG_CMD_QFW) += qfw.o obj-$(CONFIG_CMD_READ) += read.o @@ -145,7 +145,7 @@ obj-$(CONFIG_CMD_SETEXPR_FMT) += printf.o obj-$(CONFIG_CMD_SPI) += spi.o obj-$(CONFIG_CMD_STRINGS) += strings.o obj-$(CONFIG_CMD_SMC) += smccc.o -obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o obj-$(CONFIG_CMD_STACKPROTECTOR_TEST) += stackprot_test.o obj-$(CONFIG_CMD_TERMINAL) += terminal.o obj-$(CONFIG_CMD_TIME) += time.o diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 85fa5d8aa01..b81255e155a 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -4,7 +4,7 @@ #include <command.h> #include <env.h> #include <fs.h> -#include "pxe_utils.h" +#include <pxe_utils.h>
static char *fs_argv[5];
diff --git a/cmd/pxe_utils.h b/include/pxe_utils.h similarity index 100% rename from cmd/pxe_utils.h rename to include/pxe_utils.h -- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:00PM -0600, Simon Glass wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB <hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
Do you have any suggestions for me to try?
thanks,
adam
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/Makefile | 3 +++ {cmd => boot}/pxe_utils.c | 0 cmd/Makefile | 4 ++-- cmd/sysboot.c | 2 +- {cmd => include}/pxe_utils.h | 0 5 files changed, 6 insertions(+), 3 deletions(-) rename {cmd => boot}/pxe_utils.c (100%) rename {cmd => include}/pxe_utils.h (100%)
diff --git a/boot/Makefile b/boot/Makefile index a19e85cf6c8..2938c3f1458 100644 --- a/boot/Makefile +++ b/boot/Makefile @@ -14,6 +14,9 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o bootm_os.o obj-$(CONFIG_CMD_BOOTI) += bootm.o bootm_os.o
+obj-$(CONFIG_CMD_PXE) += pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += pxe_utils.o
endif
obj-y += image.o image-board.o diff --git a/cmd/pxe_utils.c b/boot/pxe_utils.c similarity index 100% rename from cmd/pxe_utils.c rename to boot/pxe_utils.c diff --git a/cmd/Makefile b/cmd/Makefile index ed3669411e6..891819ae0f6 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -123,7 +123,7 @@ obj-$(CONFIG_CMD_PINMUX) += pinmux.o obj-$(CONFIG_CMD_PMC) += pmc.o obj-$(CONFIG_CMD_PSTORE) += pstore.o obj-$(CONFIG_CMD_PWM) += pwm.o -obj-$(CONFIG_CMD_PXE) += pxe.o pxe_utils.o +obj-$(CONFIG_CMD_PXE) += pxe.o obj-$(CONFIG_CMD_WOL) += wol.o obj-$(CONFIG_CMD_QFW) += qfw.o obj-$(CONFIG_CMD_READ) += read.o @@ -145,7 +145,7 @@ obj-$(CONFIG_CMD_SETEXPR_FMT) += printf.o obj-$(CONFIG_CMD_SPI) += spi.o obj-$(CONFIG_CMD_STRINGS) += strings.o obj-$(CONFIG_CMD_SMC) += smccc.o -obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o pxe_utils.o +obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o obj-$(CONFIG_CMD_STACKPROTECTOR_TEST) += stackprot_test.o obj-$(CONFIG_CMD_TERMINAL) += terminal.o obj-$(CONFIG_CMD_TIME) += time.o diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 85fa5d8aa01..b81255e155a 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -4,7 +4,7 @@ #include <command.h> #include <env.h> #include <fs.h> -#include "pxe_utils.h" +#include <pxe_utils.h>
static char *fs_argv[5];
diff --git a/cmd/pxe_utils.h b/include/pxe_utils.h similarity index 100% rename from cmd/pxe_utils.h rename to include/pxe_utils.h -- 2.33.0.1079.g6e70778dc9-goog

On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.

Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
Regards, Simon

On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
+ Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
adam
Regards, Simon

On Thu, Feb 10, 2022 at 7:56 AM Adam Ford aford173@gmail.com wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
adam
Regards, Simon

Hi Adam,
On Thu, 10 Feb 2022 at 06:57, Adam Ford aford173@gmail.com wrote:
On Thu, Feb 10, 2022 at 7:56 AM Adam Ford aford173@gmail.com wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Another thing that might help is to put your revert in a branch and then:
buildman -b <branch> <board>
then
buildman -b <branch> <board> -sB
which will show function changes.
But more directly, the DRAM calculation should be something you can print out and debug (perhaps with DEBUG_UART) and see where it is going wrong.
Regards, Simon

On Thu, Feb 10, 2022 at 8:32 AM Simon Glass sjg@chromium.org wrote:
Hi Adam,
On Thu, 10 Feb 2022 at 06:57, Adam Ford aford173@gmail.com wrote:
On Thu, Feb 10, 2022 at 7:56 AM Adam Ford aford173@gmail.com wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > Move the header file into the main include/ directory so we can use it > from the bootmethod code. Move the C file into boot/ since it relates to > booting. > +cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Another thing that might help is to put your revert in a branch and then:
buildman -b <branch> <board>
then
buildman -b <branch> <board> -sB
which will show function changes.
But more directly, the DRAM calculation should be something you can print out and debug (perhaps with DEBUG_UART) and see where it is going wrong.
I have some meetings, but I'll try that this weekend. I was able to narrow the specific file to pxe_utils.o. If I add 1 line to the Makefile, the issue goes away: CFLAGS_REMOVE_pxe_utils.o := $(LTO_CFLAGS)
Would this be acceptable? I haven't tested this, but I am guessing any OMAP3 board with LTO would be affected (maybe others), and I have 5. :-(
adam
Regards, Simon

On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling like just how we remove the LTO flags from arch/arm/mach-omap2/omap3/board.o something else might also need that, OR digging more to find out issue LTO is exposing in terms of variables being in the data and not BSS section and needing initialization or similar.

On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote:
Move the header file into the main include/ directory so we can use it from the bootmethod code. Move the C file into boot/ since it relates to booting.
+cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; * reserve memory for U-Boot code, data & bss 8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
adam
like just how we remove the LTO flags from arch/arm/mach-omap2/omap3/board.o something else might also need that, OR digging more to find out issue LTO is exposing in terms of variables being in the data and not BSS section and needing initialization or similar.
-- Tom

On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote:
On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > Move the header file into the main include/ directory so we can use it > from the bootmethod code. Move the C file into boot/ since it relates to > booting. > +cc lokeshvutla@ti.com
Simon,
I can't explain why, but with git bisect, it appears this patch breaks my omap3_logic board (DM3730) by making it wrongly think there is 4GB of RAM, when in reality there is only 256MB. We have both 256MB and 512MB parts, and the automatic memory detection has always 'just worked' in the past.
With this patch now, I see: U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 4 GiB
<hang>
With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe global"), it properly detects the RAM and fully boots.
U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600)
OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit DRAM: 256 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0 Loading Environment from NAND... OK OMAP die ID: 619e00029ff800000168300f1502501f Net: eth0: ethernet@08000000 Hit any key to stop autoboot: 0 OMAP Logic #
I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all defined, so I am having a hard time understanding why this would change behavior or stomp on the the structure that knows the memory size.
If I jump ahead to the current 'master' 531c0089457:("Merge branch '2022-02-08-TI-platform-updates') and revert this patch, my board boots correctly again, but I am struggling to understand why.
- Marek Behún
Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.

On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote:
On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > Move the header file into the main include/ directory so we can use it > > from the bootmethod code. Move the C file into boot/ since it relates to > > booting. > > > +cc lokeshvutla@ti.com > > Simon, > > I can't explain why, but with git bisect, it appears this patch breaks > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > of RAM, when in reality there is only 256MB. We have both 256MB and > 512MB parts, and the automatic memory detection has always 'just > worked' in the past. > > With this patch now, I see: > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > DRAM: 4 GiB > <hang> > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > global"), it properly detects the RAM and fully boots. > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > DRAM: 256 MiB > NAND: 512 MiB > MMC: OMAP SD/MMC: 0 > Loading Environment from NAND... OK > OMAP die ID: 619e00029ff800000168300f1502501f > Net: eth0: ethernet@08000000 > Hit any key to stop autoboot: 0 > OMAP Logic # > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > defined, so I am having a hard time understanding why this would > change behavior or stomp on the the structure that knows the memory > size. > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > '2022-02-08-TI-platform-updates') and revert this patch, my board > boots correctly again, but I am struggling to understand why.
- Marek Behún
> > Do you have any suggestions for me to try?
I would suggest objdump disassemble U-Boot before/after and see what functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
-- Tom

On Fri, Feb 11, 2022 at 10:39:30AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote:
Hi,
On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote: > > On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > > > Move the header file into the main include/ directory so we can use it > > > from the bootmethod code. Move the C file into boot/ since it relates to > > > booting. > > > > > +cc lokeshvutla@ti.com > > > > Simon, > > > > I can't explain why, but with git bisect, it appears this patch breaks > > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > > of RAM, when in reality there is only 256MB. We have both 256MB and > > 512MB parts, and the automatic memory detection has always 'just > > worked' in the past. > > > > With this patch now, I see: > > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > DRAM: 4 GiB > > <hang> > > > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > > global"), it properly detects the RAM and fully boots. > > > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > DRAM: 256 MiB > > NAND: 512 MiB > > MMC: OMAP SD/MMC: 0 > > Loading Environment from NAND... OK > > OMAP die ID: 619e00029ff800000168300f1502501f > > Net: eth0: ethernet@08000000 > > Hit any key to stop autoboot: 0 > > OMAP Logic # > > > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > > defined, so I am having a hard time understanding why this would > > change behavior or stomp on the the structure that knows the memory > > size. > > > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > > '2022-02-08-TI-platform-updates') and revert this patch, my board > > boots correctly again, but I am struggling to understand why.
- Marek Behún
> > > > Do you have any suggestions for me to try? > > I would suggest objdump disassemble U-Boot before/after and see what > functions have changed.
Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
OK. FWIW, if it's easier to build and test, I would suggest also trying CFLAGS_REMOVE_xxx.o := $(LTO_CFLAGS) for all of the obj files under arch/arm/ and board/ and then if that also works correctly, re-adding the flags a directory, then file, at a time until you've narrowed it down.

On Fri, Feb 11, 2022 at 10:44 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 10:39:30AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote:
On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote: > > Hi, > > On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote: > > > > On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > > > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > > > > > Move the header file into the main include/ directory so we can use it > > > > from the bootmethod code. Move the C file into boot/ since it relates to > > > > booting. > > > > > > > +cc lokeshvutla@ti.com > > > > > > Simon, > > > > > > I can't explain why, but with git bisect, it appears this patch breaks > > > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > > > of RAM, when in reality there is only 256MB. We have both 256MB and > > > 512MB parts, and the automatic memory detection has always 'just > > > worked' in the past. > > > > > > With this patch now, I see: > > > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > DRAM: 4 GiB > > > <hang> > > > > > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > > > global"), it properly detects the RAM and fully boots. > > > > > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > DRAM: 256 MiB > > > NAND: 512 MiB > > > MMC: OMAP SD/MMC: 0 > > > Loading Environment from NAND... OK > > > OMAP die ID: 619e00029ff800000168300f1502501f > > > Net: eth0: ethernet@08000000 > > > Hit any key to stop autoboot: 0 > > > OMAP Logic # > > > > > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > > > defined, so I am having a hard time understanding why this would > > > change behavior or stomp on the the structure that knows the memory > > > size. > > > > > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > > > '2022-02-08-TI-platform-updates') and revert this patch, my board > > > boots correctly again, but I am struggling to understand why.
- Marek Behún
> > > > > > Do you have any suggestions for me to try? > > > > I would suggest objdump disassemble U-Boot before/after and see what > > functions have changed. > > Keep an eye out for a BSS variable that is used before relocation, perhaps?
I am still investigating, but disabling LTO appears to fix the issue for me. I'd like to keep LTO, so I'm going to attempt to focus on the differences in the affected functions and how this patch makes LTO behave differently.
The disassembly of U-Boot is large, so it's going to take me a bit of time to investigate. If someone has any LTO-related suggestions that I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
OK. FWIW, if it's easier to build and test, I would suggest also trying CFLAGS_REMOVE_xxx.o := $(LTO_CFLAGS) for all of the obj files under arch/arm/ and board/ and then if that also works correctly, re-adding the flags a directory, then file, at a time until you've narrowed it down.
If I'm understanding this correctly, does this mean that you think it's the stuff that's calling the pxe_utils.o and not the pxe_utils.o itself? Doing the CFLAGS_REMOVE on the pxe_utils.o fixes the issue.
adam
-- Tom

On Fri, Feb 11, 2022 at 11:10:43AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:44 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 10:39:30AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote:
On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote: > On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote: > > > > Hi, > > > > On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote: > > > > > > On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > > > > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > > > > > > > Move the header file into the main include/ directory so we can use it > > > > > from the bootmethod code. Move the C file into boot/ since it relates to > > > > > booting. > > > > > > > > > +cc lokeshvutla@ti.com > > > > > > > > Simon, > > > > > > > > I can't explain why, but with git bisect, it appears this patch breaks > > > > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > > > > of RAM, when in reality there is only 256MB. We have both 256MB and > > > > 512MB parts, and the automatic memory detection has always 'just > > > > worked' in the past. > > > > > > > > With this patch now, I see: > > > > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > DRAM: 4 GiB > > > > <hang> > > > > > > > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > > > > global"), it properly detects the RAM and fully boots. > > > > > > > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > DRAM: 256 MiB > > > > NAND: 512 MiB > > > > MMC: OMAP SD/MMC: 0 > > > > Loading Environment from NAND... OK > > > > OMAP die ID: 619e00029ff800000168300f1502501f > > > > Net: eth0: ethernet@08000000 > > > > Hit any key to stop autoboot: 0 > > > > OMAP Logic # > > > > > > > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > > > > defined, so I am having a hard time understanding why this would > > > > change behavior or stomp on the the structure that knows the memory > > > > size. > > > > > > > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > > > > '2022-02-08-TI-platform-updates') and revert this patch, my board > > > > boots correctly again, but I am struggling to understand why. > + Marek Behún > > > > > > > > > Do you have any suggestions for me to try? > > > > > > I would suggest objdump disassemble U-Boot before/after and see what > > > functions have changed. > > > > Keep an eye out for a BSS variable that is used before relocation, perhaps? > > I am still investigating, but disabling LTO appears to fix the issue > for me. I'd like to keep LTO, so I'm going to attempt to focus on the > differences in the affected functions and how this patch makes LTO > behave differently. > > The disassembly of U-Boot is large, so it's going to take me a bit of > time to investigate. If someone has any LTO-related suggestions that > I could try, I'd be open to try them too.
Wait, the disassembly is large, or the differences between the disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump
broken-working.diff
cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
OK. FWIW, if it's easier to build and test, I would suggest also trying CFLAGS_REMOVE_xxx.o := $(LTO_CFLAGS) for all of the obj files under arch/arm/ and board/ and then if that also works correctly, re-adding the flags a directory, then file, at a time until you've narrowed it down.
If I'm understanding this correctly, does this mean that you think it's the stuff that's calling the pxe_utils.o and not the pxe_utils.o itself? Doing the CFLAGS_REMOVE on the pxe_utils.o fixes the issue.
I think that the change here caused LTO to shuffle files around when linking the resulting binary and exposed a previously existing issue. The closer to root cause is some other early object, likely related to DDR detection, is doing something "special" and failing under LTO. Not LTO'ing that object would be a starting point to seeing what a more proper root fix is.

On Fri, Feb 11, 2022 at 11:13 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 11:10:43AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:44 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 10:39:30AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote:
On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote: > > On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote: > > On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote: > > > > > > Hi, > > > > > > On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote: > > > > > > > > On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > > > > > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > > > > > > > > > Move the header file into the main include/ directory so we can use it > > > > > > from the bootmethod code. Move the C file into boot/ since it relates to > > > > > > booting. > > > > > > > > > > > +cc lokeshvutla@ti.com > > > > > > > > > > Simon, > > > > > > > > > > I can't explain why, but with git bisect, it appears this patch breaks > > > > > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > > > > > of RAM, when in reality there is only 256MB. We have both 256MB and > > > > > 512MB parts, and the automatic memory detection has always 'just > > > > > worked' in the past. > > > > > > > > > > With this patch now, I see: > > > > > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > > DRAM: 4 GiB > > > > > <hang> > > > > > > > > > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > > > > > global"), it properly detects the RAM and fully boots. > > > > > > > > > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > > DRAM: 256 MiB > > > > > NAND: 512 MiB > > > > > MMC: OMAP SD/MMC: 0 > > > > > Loading Environment from NAND... OK > > > > > OMAP die ID: 619e00029ff800000168300f1502501f > > > > > Net: eth0: ethernet@08000000 > > > > > Hit any key to stop autoboot: 0 > > > > > OMAP Logic # > > > > > > > > > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > > > > > defined, so I am having a hard time understanding why this would > > > > > change behavior or stomp on the the structure that knows the memory > > > > > size. > > > > > > > > > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > > > > > '2022-02-08-TI-platform-updates') and revert this patch, my board > > > > > boots correctly again, but I am struggling to understand why. > > + Marek Behún > > > > > > > > > > > > Do you have any suggestions for me to try? > > > > > > > > I would suggest objdump disassemble U-Boot before/after and see what > > > > functions have changed. > > > > > > Keep an eye out for a BSS variable that is used before relocation, perhaps? > > > > I am still investigating, but disabling LTO appears to fix the issue > > for me. I'd like to keep LTO, so I'm going to attempt to focus on the > > differences in the affected functions and how this patch makes LTO > > behave differently. > > > > The disassembly of U-Boot is large, so it's going to take me a bit of > > time to investigate. If someone has any LTO-related suggestions that > > I could try, I'd be open to try them too. > > Wait, the disassembly is large, or the differences between the > disassembly, before/after this change alone, are large? It's feeling
I will be the first to admit thatI am not very good with the assembly side of things, but this is what I did:
git checkout master make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > broken.dump git revert 262cfb5b15420a1aea465745a821e684b3dfa153 make CROSS_COMPILE=arm-linux-gnueabihf- -j8 arm-linux-gnueabihf-objdump -S u-boot > working.dump
diff --side-by-side --suppress-common-lines broken.dump working.dump > broken-working.diff cat -n broken-working.diff
The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
When I disable LTO for just pxe_utils.o and redo the same exercise, the diff file with common-lines removed is 266573 lines long.
Maybe I am not using objdump correctly. I am not all that familiar with this code either, so I am not sure which variables should be in BSS. I did a search in both working and non-working dumps to look for keyworks like BSS, but from what I can tell, both have similar functions:
gd->mon_len = (ulong)&__bss_end - (ulong)_start; /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start;
- reserve memory for U-Boot code, data & bss
8011051a <clear_bss>: #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) CLEAR_BSS CLEAR_BSS
When I grepped for mon_len, both sets of dumps looked nearly identical:
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80112724 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap];
aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); 80110398 <setup_mon_len>: static int setup_mon_len(void) gd->mon_len = (ulong)&__bss_end - (ulong)_start; 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; gd->mon_len = (ulong)&__bss_end - (ulong)_start; gd->ram_top = board_get_usable_ram_top(gd->mon_len); gd->relocaddr -= gd->mon_len; gd->mon_len >> 10, gd->relocaddr); ip = mon_lengths[yleap]; aford@aford-OptiPlex-7050:~/src/u-boot$
Since I think I narrowed it down to the pxe_utils.o file, I thought I'd do an objdump of both the working and non-working versions of pxe_utils.o and this is where it got interesting.
With LTO building pxe_utils.o, the dump looks empty:
arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump cat pxe-notworking.dump
boot/pxe_utils.o: file format elf32-littlearm
^-- no actual code dump If I take the working version of this same file without LTO enabled and do a dump, and it's 2291 lines long and full of functions.
I tried adding some __used to the non-static function names, but that didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
OK. FWIW, if it's easier to build and test, I would suggest also trying CFLAGS_REMOVE_xxx.o := $(LTO_CFLAGS) for all of the obj files under arch/arm/ and board/ and then if that also works correctly, re-adding the flags a directory, then file, at a time until you've narrowed it down.
If I'm understanding this correctly, does this mean that you think it's the stuff that's calling the pxe_utils.o and not the pxe_utils.o itself? Doing the CFLAGS_REMOVE on the pxe_utils.o fixes the issue.
I think that the change here caused LTO to shuffle files around when linking the resulting binary and exposed a previously existing issue. The closer to root cause is some other early object, likely related to DDR detection, is doing something "special" and failing under LTO. Not LTO'ing that object would be a starting point to seeing what a more proper root fix is.
Tom, Thanks for the suggestions. I have it booting again by making some functions __used while making others static and eliminating some function prototypes in header files. The file changes are mostly around the ddr initialization and sys_info.c.
My next question is who is the TI maintainer? I thought it used to be Lokesh, but his e-mail bounced and get_maintainer script just returns the u-boot mailing list.
thanks,
adam
-- Tom

On Fri, Feb 11, 2022 at 07:09:45PM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 11:13 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 11:10:43AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:44 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 10:39:30AM -0600, Adam Ford wrote:
On Fri, Feb 11, 2022 at 10:12 AM Tom Rini trini@konsulko.com wrote:
On Fri, Feb 11, 2022 at 09:50:32AM -0600, Adam Ford wrote: > On Thu, Feb 10, 2022 at 8:57 AM Tom Rini trini@konsulko.com wrote: > > > > On Thu, Feb 10, 2022 at 07:56:52AM -0600, Adam Ford wrote: > > > On Wed, Feb 9, 2022 at 11:16 AM Simon Glass sjg@chromium.org wrote: > > > > > > > > Hi, > > > > > > > > On Wed, 9 Feb 2022 at 05:32, Tom Rini trini@konsulko.com wrote: > > > > > > > > > > On Wed, Feb 09, 2022 at 05:40:03AM -0600, Adam Ford wrote: > > > > > > On Thu, Oct 14, 2021 at 1:50 PM Simon Glass sjg@chromium.org wrote: > > > > > > > > > > > > > > Move the header file into the main include/ directory so we can use it > > > > > > > from the bootmethod code. Move the C file into boot/ since it relates to > > > > > > > booting. > > > > > > > > > > > > > +cc lokeshvutla@ti.com > > > > > > > > > > > > Simon, > > > > > > > > > > > > I can't explain why, but with git bisect, it appears this patch breaks > > > > > > my omap3_logic board (DM3730) by making it wrongly think there is 4GB > > > > > > of RAM, when in reality there is only 256MB. We have both 256MB and > > > > > > 512MB parts, and the automatic memory detection has always 'just > > > > > > worked' in the past. > > > > > > > > > > > > With this patch now, I see: > > > > > > U-Boot 2022.01-rc1-00185-g262cfb5b15 (Feb 09 2022 - 05:23:42 -0600) > > > > > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > > > DRAM: 4 GiB > > > > > > <hang> > > > > > > > > > > > > With the previous commit, 8018b9af57b5 ("pxe: Tidy up the is_pxe > > > > > > global"), it properly detects the RAM and fully boots. > > > > > > > > > > > > U-Boot 2022.01-rc1-00184-g8018b9af57 (Feb 09 2022 - 05:21:39 -0600) > > > > > > > > > > > > OMAP3630/3730-GP ES1.2, CPU-OPP2, L3-200MHz, Max CPU Clock 1 GHz > > > > > > Model: LogicPD Zoom DM3730 Torpedo + Wireless Development Kit > > > > > > DRAM: 256 MiB > > > > > > NAND: 512 MiB > > > > > > MMC: OMAP SD/MMC: 0 > > > > > > Loading Environment from NAND... OK > > > > > > OMAP die ID: 619e00029ff800000168300f1502501f > > > > > > Net: eth0: ethernet@08000000 > > > > > > Hit any key to stop autoboot: 0 > > > > > > OMAP Logic # > > > > > > > > > > > > I have CONFIG_CMD_BOOTM, CONFIG_CMD_PXE and CONFIG_CMD_SYSBOOT all > > > > > > defined, so I am having a hard time understanding why this would > > > > > > change behavior or stomp on the the structure that knows the memory > > > > > > size. > > > > > > > > > > > > If I jump ahead to the current 'master' 531c0089457:("Merge branch > > > > > > '2022-02-08-TI-platform-updates') and revert this patch, my board > > > > > > boots correctly again, but I am struggling to understand why. > > > + Marek Behún > > > > > > > > > > > > > > > Do you have any suggestions for me to try? > > > > > > > > > > I would suggest objdump disassemble U-Boot before/after and see what > > > > > functions have changed. > > > > > > > > Keep an eye out for a BSS variable that is used before relocation, perhaps? > > > > > > I am still investigating, but disabling LTO appears to fix the issue > > > for me. I'd like to keep LTO, so I'm going to attempt to focus on the > > > differences in the affected functions and how this patch makes LTO > > > behave differently. > > > > > > The disassembly of U-Boot is large, so it's going to take me a bit of > > > time to investigate. If someone has any LTO-related suggestions that > > > I could try, I'd be open to try them too. > > > > Wait, the disassembly is large, or the differences between the > > disassembly, before/after this change alone, are large? It's feeling > > I will be the first to admit thatI am not very good with the assembly > side of things, but this is what I did: > > git checkout master > make CROSS_COMPILE=arm-linux-gnueabihf- -j8 > arm-linux-gnueabihf-objdump -S u-boot > broken.dump > git revert 262cfb5b15420a1aea465745a821e684b3dfa153 > make CROSS_COMPILE=arm-linux-gnueabihf- -j8 > arm-linux-gnueabihf-objdump -S u-boot > working.dump > > diff --side-by-side --suppress-common-lines broken.dump working.dump > > broken-working.diff > cat -n broken-working.diff > > The broken-working.diff file with common lines suppressed is 236256 lines long.
OK, I just use '-d' and not '-S', which might help a little bit. But you're probably going to still need to edit the dumps and just globally change all of the addresses to 'XXXXXXXX' so that you'll end up hopefully only seeing where functions were optimized differently. But it might well end up being a bit trickier than that.
It looks like none of the object files are showing any content with objdump when LTO is enabled. With a little google search, it appears we need lto-dump. I have some more meetings, but I'll try to spend some more time on it this weekend.
> When I disable LTO for just pxe_utils.o and redo the same exercise, > the diff file with common-lines removed is 266573 lines long. > > Maybe I am not using objdump correctly. I am not all that familiar > with this code either, so I am not sure which variables should be in > BSS. I did a search in both working and non-working dumps to look for > keyworks like BSS, but from what I can tell, both have similar > functions: > > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ > gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > * reserve memory for U-Boot code, data & bss > 8011051a <clear_bss>: > #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS) > CLEAR_BSS > #if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS) > CLEAR_BSS > CLEAR_BSS > > When I grepped for mon_len, both sets of dumps looked nearly identical: > > aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len working.dump > lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); > 80112724 <setup_mon_len>: > static int setup_mon_len(void) > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > 80112726: 4903 ldr r1, [pc, #12] ; (80112734 <setup_mon_len+0x10>) > 80112728: 4b03 ldr r3, [pc, #12] ; (80112738 <setup_mon_len+0x14>) > gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > gd->ram_top = board_get_usable_ram_top(gd->mon_len); > gd->relocaddr -= gd->mon_len; > gd->mon_len >> 10, gd->relocaddr); > ip = mon_lengths[yleap]; > > > aford@aford-OptiPlex-7050:~/src/u-boot$ grep mon_len broken.dump > lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len); > 80110398 <setup_mon_len>: > static int setup_mon_len(void) > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > 8011039a: 4903 ldr r1, [pc, #12] ; (801103a8 <setup_mon_len+0x10>) > 8011039c: 4b03 ldr r3, [pc, #12] ; (801103ac <setup_mon_len+0x14>) > gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; > gd->mon_len = (ulong)&__bss_end - (ulong)_start; > gd->ram_top = board_get_usable_ram_top(gd->mon_len); > gd->relocaddr -= gd->mon_len; > gd->mon_len >> 10, gd->relocaddr); > ip = mon_lengths[yleap]; > aford@aford-OptiPlex-7050:~/src/u-boot$ > > Since I think I narrowed it down to the pxe_utils.o file, I thought > I'd do an objdump of both the working and non-working versions of > pxe_utils.o and this is where it got interesting. > > With LTO building pxe_utils.o, the dump looks empty: > > arm-linux-gnueabihf-objdump -S boot/pxe_utils.o > pxe-notworking.dump > cat pxe-notworking.dump > > boot/pxe_utils.o: file format elf32-littlearm > > ^-- no actual code dump > If I take the working version of this same file without LTO enabled > and do a dump, and it's 2291 lines long and full of functions. > > I tried adding some __used to the non-static function names, but that > didn't appear to make any difference to the objdump of pxe_utils.o
I feel like it can't be pxe_utils.o itself but rather how LTO is behaving before/after that change and sorting the object files differently. If modifying the dumps like I suggested above doesn't lead
That's what I was thinking too.
to more clues, and it doesn't seem to matter what toolchain is used (are you using the gcc-11 from kernel.org that we use in docker and buildman?), I'll try and look as well.
I am using GCC 11, but I'm using the version that come with Ubuntu 21.10:
Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.2.0 (Ubuntu 11.2.0-5ubuntu1)
OK. FWIW, if it's easier to build and test, I would suggest also trying CFLAGS_REMOVE_xxx.o := $(LTO_CFLAGS) for all of the obj files under arch/arm/ and board/ and then if that also works correctly, re-adding the flags a directory, then file, at a time until you've narrowed it down.
If I'm understanding this correctly, does this mean that you think it's the stuff that's calling the pxe_utils.o and not the pxe_utils.o itself? Doing the CFLAGS_REMOVE on the pxe_utils.o fixes the issue.
I think that the change here caused LTO to shuffle files around when linking the resulting binary and exposed a previously existing issue. The closer to root cause is some other early object, likely related to DDR detection, is doing something "special" and failing under LTO. Not LTO'ing that object would be a starting point to seeing what a more proper root fix is.
Tom, Thanks for the suggestions. I have it booting again by making some functions __used while making others static and eliminating some function prototypes in header files. The file changes are mostly around the ddr initialization and sys_info.c.
My next question is who is the TI maintainer? I thought it used to be Lokesh, but his e-mail bounced and get_maintainer script just returns the u-boot mailing list.
Hunh, I guess I need to fix the entry since, hey, it's me. Thanks for digging in here!

Some of these functions are a big vague in the comments. Tidy them up a bit.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 189 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 138 insertions(+), 51 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 7d15c75dd87..7a2213a5925 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -30,6 +30,21 @@
#define MAX_TFTP_PATH_LEN 512
+/** + * format_mac_pxe() - obtain a MAC address in the PXE format + * + * This produces a MAC-address string in the format for the current ethernet + * device: + * + * 01-aa-bb-cc-dd-ee-ff + * + * where aa-ff is the MAC address in hex + * + * @outbuf: Buffer to write string to + * @outbuf_len: length of buffer + * @return 1 if OK, -ENOSPC if buffer is too small, -ENOENT is there is no + * current ethernet device + */ int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -37,7 +52,7 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) if (outbuf_len < 21) { printf("outbuf is too small (%zd < 21)\n", outbuf_len);
- return -EINVAL; + return -ENOSPC; }
if (!eth_env_get_enetaddr_by_index("eth", eth_get_dev_index(), ethaddr)) @@ -50,10 +65,20 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) return 1; }
-/* - * Returns the directory the file specified in the bootfile env variable is +/** + * get_bootfile_path() - Figure out the path of a file to read + * + * Returns the directory the file specified in the 'bootfile' env variable is * in. If bootfile isn't defined in the environment, return NULL, which should * be interpreted as "don't prepend anything to paths". + * + * @file_path: File path to read (relative to the PXE file) + * @bootfile_path: Place to put the bootfile path + * @bootfile_path_size: Size of @bootfile_path in bytes + * @allow_abs_path: true to allow an absolute path (where @file_path starts with + * '/', false to return an empty path (and success) in that case + * Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the + * resulting path */ static int get_bootfile_path(const char *file_path, char *bootfile_path, size_t bootfile_path_size, bool allow_abs_path) @@ -81,7 +106,7 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, printf("bootfile_path too small. (%zd < %zd)\n", bootfile_path_size, path_len);
- return -1; + return -ENOSPC; }
strncpy(bootfile_path, bootfile, path_len); @@ -92,13 +117,18 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, return 1; }
-/* +/** + * get_relfile() - read a file relative to the PXE file + * * As in pxelinux, paths to files referenced from files we retrieve are * relative to the location of bootfile. get_relfile takes such a path and * joins it with the bootfile path to get the full path to the target file. If * the bootfile path is NULL, we use file_path as is. * - * Returns 1 for success, or < 0 on error. + * @ctx: PXE context + * @file_path: File path to read (relative to the PXE file) + * @file_addr: Address to load file to + * Returns 1 for success, or < 0 on error */ static int get_relfile(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) @@ -132,6 +162,16 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, return ctx->getfile(ctx, relfile, addr_buf); }
+/** + * get_pxe_file() - read a file + * + * The file is read and nul-terminated + * + * @ctx: PXE context + * @file_path: File path to read (relative to the PXE file) + * @file_addr: Address to load file to + * Returns 1 for success, or < 0 on error + */ int get_pxe_file(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { @@ -166,6 +206,14 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
+/** + * get_pxelinux_path() - Get a file in the pxelinux.cfg/ directory + * + * @ctx: PXE context + * @file: Filename to process (relative to pxelinux.cfg/) + * Returns 1 for success, -ENAMETOOLONG if the resulting path is too long. + * or other value < 0 on other error + */ int get_pxelinux_path(struct pxe_context *ctx, const char *file, unsigned long pxefile_addr_r) { @@ -183,12 +231,20 @@ int get_pxelinux_path(struct pxe_context *ctx, const char *file, return get_pxe_file(ctx, path, pxefile_addr_r); }
-/* +/** + * get_relfile_envaddr() - read a file to an address in an env var + * * Wrapper to make it easier to store the file at file_path in the location * specified by envaddr_name. file_path will be joined to the bootfile path, * if any is specified. * - * Returns 1 on success or < 0 on error. + * @ctx: PXE context + * @file_path: File path to read (relative to the PXE file) + * @envaddr_name: Name of environment variable which contains the address to + * load to + * Returns 1 on success, -ENOENT if @envaddr_name does not exist as an + * environment variable, -EINVAL if its format is not valid hex, or other + * value < 0 on other error */ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, const char *envaddr_name) @@ -207,11 +263,13 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, return get_relfile(ctx, file_path, file_addr); }
-/* +/** + * label_create() - crate a new PXE label + * * Allocates memory for and initializes a pxe_label. This uses malloc, so the * result must be free()'d to reclaim the memory. * - * Returns NULL if malloc fails. + * Returns a pointer to the label, or NULL if out of memory */ static struct pxe_label *label_create(void) { @@ -227,13 +285,18 @@ static struct pxe_label *label_create(void) return label; }
-/* - * Free the memory used by a pxe_label, including that used by its name, - * kernel, append and initrd members, if they're non NULL. +/** + * label_destroy() - free the memory used by a pxe_label + * + * This frees @label itself as well as memory used by its name, + * kernel, config, append, initrd, fdt, fdtdir and fdtoverlay members, if + * they're non-NULL. * * So - be sure to only use dynamically allocated memory for the members of * the pxe_label struct, unless you want to clean it up first. These are * currently only created by the pxe file parsing code. + * + * @label: Label to free */ static void label_destroy(struct pxe_label *label) { @@ -264,11 +327,13 @@ static void label_destroy(struct pxe_label *label) free(label); }
-/* - * Print a label and its string members if they're defined. +/** + * label_print() - Print a label and its string members if they're defined * * This is passed as a callback to the menu code for displaying each * menu entry. + * + * @data: Label to print (is cast to struct pxe_label *) */ static void label_print(void *data) { @@ -278,14 +343,16 @@ static void label_print(void *data) printf("%s:\t%s\n", label->num, c); }
-/* - * Boot a label that specified 'localboot'. This requires that the 'localcmd' - * environment variable is defined. Its contents will be executed as U-Boot - * command. If the label specified an 'append' line, its contents will be - * used to overwrite the contents of the 'bootargs' environment variable prior - * to running 'localcmd'. +/** + * label_localboot() - Boot a label that specified 'localboot' + * + * This requires that the 'localcmd' environment variable is defined. Its + * contents will be executed as U-Boot commands. If the label specified an + * 'append' line, its contents will be used to overwrite the contents of the + * 'bootargs' environment variable prior to running 'localcmd'. * - * Returns 1 on success or < 0 on error. + * @label: Label to process + * Returns 1 on success or < 0 on error */ static int label_localboot(struct pxe_label *label) { @@ -309,8 +376,11 @@ static int label_localboot(struct pxe_label *label) return run_command_list(localcmd, strlen(localcmd), 0); }
-/* - * Loads fdt overlays specified in 'fdtoverlays'. +/** + * label_boot_fdtoverlay() - Loads fdt overlays specified in 'fdtoverlays' + * + * @ctx: PXE context + * @label: Label to process */ #ifdef CONFIG_OF_LIBFDT_OVERLAY static void label_boot_fdtoverlay(struct pxe_context *ctx, @@ -396,8 +466,8 @@ skip_overlay: } #endif
-/* - * Boot according to the contents of a pxe_label. +/** + * label_boot() - Boot according to the contents of a pxe_label * * If we can't boot for any reason, we return. A successful boot never * returns. @@ -410,6 +480,11 @@ skip_overlay: * * If the label specifies an 'append' line, its contents will overwrite that * of the 'bootargs' environment variable. + * + * @ctx: PXE context + * @label: Label to process + * Returns does not return on success, otherwise returns 0 if a localboot + * label was processed, or 1 on error */ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) { @@ -648,9 +723,7 @@ cleanup: return 1; }
-/* - * Tokens for the pxe file parser. - */ +/** enum token_type - Tokens for the pxe file parser */ enum token_type { T_EOL, T_STRING, @@ -676,17 +749,13 @@ enum token_type { T_INVALID };
-/* - * A token - given by a value and a type. - */ +/** struct token - token - given by a value and a type */ struct token { char *val; enum token_type type; };
-/* - * Keywords recognized. - */ +/* Keywords recognized */ static const struct token keywords[] = { {"menu", T_MENU}, {"title", T_TITLE}, @@ -711,7 +780,9 @@ static const struct token keywords[] = { {NULL, T_INVALID} };
-/* +/** + * enum lex_state - lexer state + * * Since pxe(linux) files don't have a token to identify the start of a * literal, we have to keep track of when we're in a state where a literal is * expected vs when we're in a state a keyword is expected. @@ -722,11 +793,10 @@ enum lex_state { L_SLITERAL };
-/* - * get_string retrieves a string from *p and stores it as a token in - * *t. +/** + * get_string() - retrieves a string from *p and stores it as a token in *t. * - * get_string used for scanning both string literals and keywords. + * This is used for scanning both string literals and keywords. * * Characters from *p are copied into t-val until a character equal to * delim is found, or a NUL byte is reached. If delim has the special value of @@ -739,9 +809,15 @@ enum lex_state { * The location of *p is updated to point to the first character after the end * of the token - the ending delimiter. * - * On success, the new value of t->val is returned. Memory for t->val is - * allocated using malloc and must be free()'d to reclaim it. If insufficient - * memory is available, NULL is returned. + * Memory for t->val is allocated using malloc and must be free()'d to reclaim + * it. + * + * @p: Points to a pointer to the current position in the input being processed. + * Updated to point at the first character after the current token + * @t: Pointers to a token to fill in + * @delim: Delimiter character to look for, either newline or space + * @lower: true to convert the string to lower case when storing + * Returns the new value of t->val, on success, NULL if out of memory */ static char *get_string(char **p, struct token *t, char delim, int lower) { @@ -792,8 +868,11 @@ static char *get_string(char **p, struct token *t, char delim, int lower) return t->val; }
-/* - * Populate a keyword token with a type and value. +/** + * get_keyword() - Populate a keyword token with a type and value + * + * Updates the ->type field based on the keyword string in @val + * @t: Token to populate */ static void get_keyword(struct token *t) { @@ -807,11 +886,14 @@ static void get_keyword(struct token *t) } }
-/* - * Get the next token. We have to keep track of which state we're in to know - * if we're looking to get a string literal or a keyword. +/** + * get_token() - Get the next token + * + * We have to keep track of which state we're in to know if we're looking to get + * a string literal or a keyword. * - * *p is updated to point at the first character after the current token. + * @p: Points to a pointer to the current position in the input being processed. + * Updated to point at the first character after the current token */ static void get_token(char **p, struct token *t, enum lex_state state) { @@ -855,8 +937,13 @@ static void get_token(char **p, struct token *t, enum lex_state state) *p = c; }
-/* - * Increment *c until we get to the end of the current line, or EOF. +/** + * eol_or_eof() - Find end of line + * + * Increment *c until we get to the end of the current line, or EOF + * + * @c: Points to a pointer to the current position in the input being processed. + * Updated to point at the first character after the current token */ static void eol_or_eof(char **c) {

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:50 PM Simon Glass sjg@chromium.org wrote:
Some of these functions are a big vague in the comments. Tidy them up a bit.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 189 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 138 insertions(+), 51 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 7d15c75dd87..7a2213a5925 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -30,6 +30,21 @@
#define MAX_TFTP_PATH_LEN 512
+/**
- format_mac_pxe() - obtain a MAC address in the PXE format
- This produces a MAC-address string in the format for the current ethernet
- device:
- 01-aa-bb-cc-dd-ee-ff
- where aa-ff is the MAC address in hex
- @outbuf: Buffer to write string to
- @outbuf_len: length of buffer
- @return 1 if OK, -ENOSPC if buffer is too small, -ENOENT is there is no
current ethernet device
- */
int format_mac_pxe(char *outbuf, size_t outbuf_len) { uchar ethaddr[6]; @@ -37,7 +52,7 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) if (outbuf_len < 21) { printf("outbuf is too small (%zd < 21)\n", outbuf_len);
return -EINVAL;
return -ENOSPC; } if (!eth_env_get_enetaddr_by_index("eth", eth_get_dev_index(), ethaddr))
@@ -50,10 +65,20 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) return 1; }
-/*
- Returns the directory the file specified in the bootfile env variable is
+/**
- get_bootfile_path() - Figure out the path of a file to read
- Returns the directory the file specified in the 'bootfile' env variable is
- in. If bootfile isn't defined in the environment, return NULL, which should
- be interpreted as "don't prepend anything to paths".
- @file_path: File path to read (relative to the PXE file)
- @bootfile_path: Place to put the bootfile path
- @bootfile_path_size: Size of @bootfile_path in bytes
- @allow_abs_path: true to allow an absolute path (where @file_path starts with
'/', false to return an empty path (and success) in that case
- Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the
*/
resulting path
static int get_bootfile_path(const char *file_path, char *bootfile_path, size_t bootfile_path_size, bool allow_abs_path) @@ -81,7 +106,7 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, printf("bootfile_path too small. (%zd < %zd)\n", bootfile_path_size, path_len);
return -1;
return -ENOSPC; } strncpy(bootfile_path, bootfile, path_len);
@@ -92,13 +117,18 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, return 1; }
-/* +/**
- get_relfile() - read a file relative to the PXE file
- As in pxelinux, paths to files referenced from files we retrieve are
- relative to the location of bootfile. get_relfile takes such a path and
- joins it with the bootfile path to get the full path to the target file. If
- the bootfile path is NULL, we use file_path as is.
- Returns 1 for success, or < 0 on error.
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @file_addr: Address to load file to
*/
- Returns 1 for success, or < 0 on error
static int get_relfile(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) @@ -132,6 +162,16 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, return ctx->getfile(ctx, relfile, addr_buf); }
+/**
- get_pxe_file() - read a file
- The file is read and nul-terminated
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @file_addr: Address to load file to
- Returns 1 for success, or < 0 on error
- */
int get_pxe_file(struct pxe_context *ctx, const char *file_path, unsigned long file_addr) { @@ -166,6 +206,14 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path,
#define PXELINUX_DIR "pxelinux.cfg/"
+/**
- get_pxelinux_path() - Get a file in the pxelinux.cfg/ directory
- @ctx: PXE context
- @file: Filename to process (relative to pxelinux.cfg/)
- Returns 1 for success, -ENAMETOOLONG if the resulting path is too long.
or other value < 0 on other error
- */
int get_pxelinux_path(struct pxe_context *ctx, const char *file, unsigned long pxefile_addr_r) { @@ -183,12 +231,20 @@ int get_pxelinux_path(struct pxe_context *ctx, const char *file, return get_pxe_file(ctx, path, pxefile_addr_r); }
-/* +/**
- get_relfile_envaddr() - read a file to an address in an env var
- Wrapper to make it easier to store the file at file_path in the location
- specified by envaddr_name. file_path will be joined to the bootfile path,
- if any is specified.
- Returns 1 on success or < 0 on error.
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @envaddr_name: Name of environment variable which contains the address to
load to
- Returns 1 on success, -ENOENT if @envaddr_name does not exist as an
environment variable, -EINVAL if its format is not valid hex, or other
*/
value < 0 on other error
static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, const char *envaddr_name) @@ -207,11 +263,13 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, return get_relfile(ctx, file_path, file_addr); }
-/* +/**
- label_create() - crate a new PXE label
- Allocates memory for and initializes a pxe_label. This uses malloc, so the
- result must be free()'d to reclaim the memory.
- Returns NULL if malloc fails.
*/
- Returns a pointer to the label, or NULL if out of memory
static struct pxe_label *label_create(void) { @@ -227,13 +285,18 @@ static struct pxe_label *label_create(void) return label; }
-/*
- Free the memory used by a pxe_label, including that used by its name,
- kernel, append and initrd members, if they're non NULL.
+/**
- label_destroy() - free the memory used by a pxe_label
- This frees @label itself as well as memory used by its name,
- kernel, config, append, initrd, fdt, fdtdir and fdtoverlay members, if
- they're non-NULL.
- So - be sure to only use dynamically allocated memory for the members of
- the pxe_label struct, unless you want to clean it up first. These are
- currently only created by the pxe file parsing code.
*/
- @label: Label to free
static void label_destroy(struct pxe_label *label) { @@ -264,11 +327,13 @@ static void label_destroy(struct pxe_label *label) free(label); }
-/*
- Print a label and its string members if they're defined.
+/**
- label_print() - Print a label and its string members if they're defined
- This is passed as a callback to the menu code for displaying each
- menu entry.
*/
- @data: Label to print (is cast to struct pxe_label *)
static void label_print(void *data) { @@ -278,14 +343,16 @@ static void label_print(void *data) printf("%s:\t%s\n", label->num, c); }
-/*
- Boot a label that specified 'localboot'. This requires that the 'localcmd'
- environment variable is defined. Its contents will be executed as U-Boot
- command. If the label specified an 'append' line, its contents will be
- used to overwrite the contents of the 'bootargs' environment variable prior
- to running 'localcmd'.
+/**
- label_localboot() - Boot a label that specified 'localboot'
- This requires that the 'localcmd' environment variable is defined. Its
- contents will be executed as U-Boot commands. If the label specified an
- 'append' line, its contents will be used to overwrite the contents of the
- 'bootargs' environment variable prior to running 'localcmd'.
- Returns 1 on success or < 0 on error.
- @label: Label to process
*/
- Returns 1 on success or < 0 on error
static int label_localboot(struct pxe_label *label) { @@ -309,8 +376,11 @@ static int label_localboot(struct pxe_label *label) return run_command_list(localcmd, strlen(localcmd), 0); }
-/*
- Loads fdt overlays specified in 'fdtoverlays'.
+/**
- label_boot_fdtoverlay() - Loads fdt overlays specified in 'fdtoverlays'
- @ctx: PXE context
*/
- @label: Label to process
#ifdef CONFIG_OF_LIBFDT_OVERLAY static void label_boot_fdtoverlay(struct pxe_context *ctx, @@ -396,8 +466,8 @@ skip_overlay: } #endif
-/*
- Boot according to the contents of a pxe_label.
+/**
- label_boot() - Boot according to the contents of a pxe_label
- If we can't boot for any reason, we return. A successful boot never
- returns.
@@ -410,6 +480,11 @@ skip_overlay:
- If the label specifies an 'append' line, its contents will overwrite that
- of the 'bootargs' environment variable.
- @ctx: PXE context
- @label: Label to process
- Returns does not return on success, otherwise returns 0 if a localboot
*/
label was processed, or 1 on error
static int label_boot(struct pxe_context *ctx, struct pxe_label *label) { @@ -648,9 +723,7 @@ cleanup: return 1; }
-/*
- Tokens for the pxe file parser.
- */
+/** enum token_type - Tokens for the pxe file parser */ enum token_type { T_EOL, T_STRING, @@ -676,17 +749,13 @@ enum token_type { T_INVALID };
-/*
- A token - given by a value and a type.
- */
+/** struct token - token - given by a value and a type */ struct token { char *val; enum token_type type; };
-/*
- Keywords recognized.
- */
+/* Keywords recognized */ static const struct token keywords[] = { {"menu", T_MENU}, {"title", T_TITLE}, @@ -711,7 +780,9 @@ static const struct token keywords[] = { {NULL, T_INVALID} };
-/* +/**
- enum lex_state - lexer state
- Since pxe(linux) files don't have a token to identify the start of a
- literal, we have to keep track of when we're in a state where a literal is
- expected vs when we're in a state a keyword is expected.
@@ -722,11 +793,10 @@ enum lex_state { L_SLITERAL };
-/*
- get_string retrieves a string from *p and stores it as a token in
- *t.
+/**
- get_string() - retrieves a string from *p and stores it as a token in *t.
- get_string used for scanning both string literals and keywords.
- This is used for scanning both string literals and keywords.
- Characters from *p are copied into t-val until a character equal to
- delim is found, or a NUL byte is reached. If delim has the special value of
@@ -739,9 +809,15 @@ enum lex_state {
- The location of *p is updated to point to the first character after the end
- of the token - the ending delimiter.
- On success, the new value of t->val is returned. Memory for t->val is
- allocated using malloc and must be free()'d to reclaim it. If insufficient
- memory is available, NULL is returned.
- Memory for t->val is allocated using malloc and must be free()'d to reclaim
- it.
- @p: Points to a pointer to the current position in the input being processed.
Updated to point at the first character after the current token
- @t: Pointers to a token to fill in
- @delim: Delimiter character to look for, either newline or space
- @lower: true to convert the string to lower case when storing
*/
- Returns the new value of t->val, on success, NULL if out of memory
static char *get_string(char **p, struct token *t, char delim, int lower) { @@ -792,8 +868,11 @@ static char *get_string(char **p, struct token *t, char delim, int lower) return t->val; }
-/*
- Populate a keyword token with a type and value.
+/**
- get_keyword() - Populate a keyword token with a type and value
- Updates the ->type field based on the keyword string in @val
*/
- @t: Token to populate
static void get_keyword(struct token *t) { @@ -807,11 +886,14 @@ static void get_keyword(struct token *t) } }
-/*
- Get the next token. We have to keep track of which state we're in to know
- if we're looking to get a string literal or a keyword.
+/**
- get_token() - Get the next token
- We have to keep track of which state we're in to know if we're looking to get
- a string literal or a keyword.
- *p is updated to point at the first character after the current token.
- @p: Points to a pointer to the current position in the input being processed.
*/
Updated to point at the first character after the current token
static void get_token(char **p, struct token *t, enum lex_state state) { @@ -855,8 +937,13 @@ static void get_token(char **p, struct token *t, enum lex_state state) *p = c; }
-/*
- Increment *c until we get to the end of the current line, or EOF.
+/**
- eol_or_eof() - Find end of line
- Increment *c until we get to the end of the current line, or EOF
- @c: Points to a pointer to the current position in the input being processed.
*/
Updated to point at the first character after the current token
static void eol_or_eof(char **c) { -- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:01PM -0600, Simon Glass wrote:
Some of these functions are a big vague in the comments. Tidy them up a bit.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

There are a few more blank lines than makes sense for readability. Also free() handles a NULL pointer so drop the pointless checks.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 66 ++++++++++-------------------------------------- 1 file changed, 13 insertions(+), 53 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 7a2213a5925..9f3edeab06a 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -51,7 +51,6 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len)
if (outbuf_len < 21) { printf("outbuf is too small (%zd < 21)\n", outbuf_len); - return -ENOSPC; }
@@ -91,12 +90,10 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, goto ret;
bootfile = from_env("bootfile"); - if (!bootfile) goto ret;
last_slash = strrchr(bootfile, '/'); - if (!last_slash) goto ret;
@@ -140,7 +137,6 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
err = get_bootfile_path(file_path, relfile, sizeof(relfile), ctx->allow_abs_path); - if (err < 0) return err;
@@ -181,7 +177,6 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path, char *buf;
err = get_relfile(ctx, file_path, file_addr); - if (err < 0) return err;
@@ -190,7 +185,6 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path, * and add the NUL byte. */ tftp_filesize = from_env("filesize"); - if (!tftp_filesize) return -ENOENT;
@@ -253,7 +247,6 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, char *envaddr;
envaddr = from_env(envaddr_name); - if (!envaddr) return -ENOENT;
@@ -276,7 +269,6 @@ static struct pxe_label *label_create(void) struct pxe_label *label;
label = malloc(sizeof(struct pxe_label)); - if (!label) return NULL;
@@ -300,30 +292,14 @@ static struct pxe_label *label_create(void) */ static void label_destroy(struct pxe_label *label) { - if (label->name) - free(label->name); - - if (label->kernel) - free(label->kernel); - - if (label->config) - free(label->config); - - if (label->append) - free(label->append); - - if (label->initrd) - free(label->initrd); - - if (label->fdt) - free(label->fdt); - - if (label->fdtdir) - free(label->fdtdir); - - if (label->fdtoverlays) - free(label->fdtoverlays); - + free(label->name); + free(label->kernel); + free(label->config); + free(label->append); + free(label->initrd); + free(label->fdt); + free(label->fdtdir); + free(label->fdtoverlays); free(label); }
@@ -359,7 +335,6 @@ static int label_localboot(struct pxe_label *label) char *localcmd;
localcmd = from_env("localcmd"); - if (!localcmd) return -ENOENT;
@@ -718,8 +693,8 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) unmap_sysmem(buf);
cleanup: - if (fit_addr) - free(fit_addr); + free(fit_addr); + return 1; }
@@ -832,7 +807,6 @@ static char *get_string(char **p, struct token *t, char delim, int lower) */ b = *p; e = *p; - while (*e) { if ((delim == ' ' && isspace(*e)) || delim == *e) break; @@ -858,11 +832,8 @@ static char *get_string(char **p, struct token *t, char delim, int lower)
t->val[len] = '\0';
- /* - * Update *p so the caller knows where to continue scanning. - */ + /* Update *p so the caller knows where to continue scanning */ *p = e; - t->type = T_STRING;
return t->val; @@ -988,7 +959,6 @@ static int parse_integer(char **c, int *dst) char *s = *c;
get_token(c, &t, L_SLITERAL); - if (t.type != T_STRING) { printf("Expected string: %.*s\n", (int)(*c - s), s); return -EINVAL; @@ -1022,14 +992,12 @@ static int handle_include(struct pxe_context *ctx, char **c, unsigned long base, int ret;
err = parse_sliteral(c, &include_path); - if (err < 0) { printf("Expected include path: %.*s\n", (int)(*c - s), s); return err; }
err = get_pxe_file(ctx, include_path, base); - if (err < 0) { printf("Couldn't retrieve %s\n", include_path); return err; @@ -1079,7 +1047,6 @@ static int parse_menu(struct pxe_context *ctx, char **c, struct pxe_menu *cfg, printf("Ignoring malformed menu command: %.*s\n", (int)(*c - s), s); } - if (err < 0) return err;
@@ -1353,11 +1320,8 @@ void destroy_pxe_menu(struct pxe_menu *cfg) struct list_head *pos, *n; struct pxe_label *label;
- if (cfg->title) - free(cfg->title); - - if (cfg->default_label) - free(cfg->default_label); + free(cfg->title); + free(cfg->default_label);
list_for_each_safe(pos, n, &cfg->labels) { label = list_entry(pos, struct pxe_label, list); @@ -1375,7 +1339,6 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) int r;
cfg = malloc(sizeof(struct pxe_menu)); - if (!cfg) return NULL;
@@ -1386,7 +1349,6 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) buf = map_sysmem(menucfg, 0); r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1); unmap_sysmem(buf); - if (r < 0) { destroy_pxe_menu(cfg); return NULL; @@ -1413,7 +1375,6 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) */ m = menu_create(cfg->title, DIV_ROUND_UP(cfg->timeout, 10), cfg->prompt, NULL, label_print, NULL, NULL); - if (!m) return NULL;
@@ -1492,7 +1453,6 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) return;
err = menu_get_choice(m, &choice); - menu_destroy(m);
/*

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:50 PM Simon Glass sjg@chromium.org wrote:
There are a few more blank lines than makes sense for readability. Also free() handles a NULL pointer so drop the pointless checks.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 66 ++++++++++-------------------------------------- 1 file changed, 13 insertions(+), 53 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 7a2213a5925..9f3edeab06a 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -51,7 +51,6 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len)
if (outbuf_len < 21) { printf("outbuf is too small (%zd < 21)\n", outbuf_len);
return -ENOSPC; }
@@ -91,12 +90,10 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path, goto ret;
bootfile = from_env("bootfile");
if (!bootfile) goto ret; last_slash = strrchr(bootfile, '/');
if (!last_slash) goto ret;
@@ -140,7 +137,6 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
err = get_bootfile_path(file_path, relfile, sizeof(relfile), ctx->allow_abs_path);
if (err < 0) return err;
@@ -181,7 +177,6 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path, char *buf;
err = get_relfile(ctx, file_path, file_addr);
if (err < 0) return err;
@@ -190,7 +185,6 @@ int get_pxe_file(struct pxe_context *ctx, const char *file_path, * and add the NUL byte. */ tftp_filesize = from_env("filesize");
if (!tftp_filesize) return -ENOENT;
@@ -253,7 +247,6 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, char *envaddr;
envaddr = from_env(envaddr_name);
if (!envaddr) return -ENOENT;
@@ -276,7 +269,6 @@ static struct pxe_label *label_create(void) struct pxe_label *label;
label = malloc(sizeof(struct pxe_label));
if (!label) return NULL;
@@ -300,30 +292,14 @@ static struct pxe_label *label_create(void) */ static void label_destroy(struct pxe_label *label) {
if (label->name)
free(label->name);
if (label->kernel)
free(label->kernel);
if (label->config)
free(label->config);
if (label->append)
free(label->append);
if (label->initrd)
free(label->initrd);
if (label->fdt)
free(label->fdt);
if (label->fdtdir)
free(label->fdtdir);
if (label->fdtoverlays)
free(label->fdtoverlays);
free(label->name);
free(label->kernel);
free(label->config);
free(label->append);
free(label->initrd);
free(label->fdt);
free(label->fdtdir);
free(label->fdtoverlays); free(label);
}
@@ -359,7 +335,6 @@ static int label_localboot(struct pxe_label *label) char *localcmd;
localcmd = from_env("localcmd");
if (!localcmd) return -ENOENT;
@@ -718,8 +693,8 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) unmap_sysmem(buf);
cleanup:
if (fit_addr)
free(fit_addr);
free(fit_addr);
return 1;
}
@@ -832,7 +807,6 @@ static char *get_string(char **p, struct token *t, char delim, int lower) */ b = *p; e = *p;
while (*e) { if ((delim == ' ' && isspace(*e)) || delim == *e) break;
@@ -858,11 +832,8 @@ static char *get_string(char **p, struct token *t, char delim, int lower)
t->val[len] = '\0';
/*
* Update *p so the caller knows where to continue scanning.
*/
/* Update *p so the caller knows where to continue scanning */ *p = e;
t->type = T_STRING; return t->val;
@@ -988,7 +959,6 @@ static int parse_integer(char **c, int *dst) char *s = *c;
get_token(c, &t, L_SLITERAL);
if (t.type != T_STRING) { printf("Expected string: %.*s\n", (int)(*c - s), s); return -EINVAL;
@@ -1022,14 +992,12 @@ static int handle_include(struct pxe_context *ctx, char **c, unsigned long base, int ret;
err = parse_sliteral(c, &include_path);
if (err < 0) { printf("Expected include path: %.*s\n", (int)(*c - s), s); return err; } err = get_pxe_file(ctx, include_path, base);
if (err < 0) { printf("Couldn't retrieve %s\n", include_path); return err;
@@ -1079,7 +1047,6 @@ static int parse_menu(struct pxe_context *ctx, char **c, struct pxe_menu *cfg, printf("Ignoring malformed menu command: %.*s\n", (int)(*c - s), s); }
if (err < 0) return err;
@@ -1353,11 +1320,8 @@ void destroy_pxe_menu(struct pxe_menu *cfg) struct list_head *pos, *n; struct pxe_label *label;
if (cfg->title)
free(cfg->title);
if (cfg->default_label)
free(cfg->default_label);
free(cfg->title);
free(cfg->default_label); list_for_each_safe(pos, n, &cfg->labels) { label = list_entry(pos, struct pxe_label, list);
@@ -1375,7 +1339,6 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) int r;
cfg = malloc(sizeof(struct pxe_menu));
if (!cfg) return NULL;
@@ -1386,7 +1349,6 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg) buf = map_sysmem(menucfg, 0); r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1); unmap_sysmem(buf);
if (r < 0) { destroy_pxe_menu(cfg); return NULL;
@@ -1413,7 +1375,6 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg) */ m = menu_create(cfg->title, DIV_ROUND_UP(cfg->timeout, 10), cfg->prompt, NULL, label_print, NULL, NULL);
if (!m) return NULL;
@@ -1492,7 +1453,6 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) return;
err = menu_get_choice(m, &choice);
menu_destroy(m); /*
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:02PM -0600, Simon Glass wrote:
There are a few more blank lines than makes sense for readability. Also free() handles a NULL pointer so drop the pointless checks.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Both the syslinux and pxe commands use essentially the same code to parse and run extlinux.conf files. Move this into a common function.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 20 ++++++++++++++++++++ cmd/pxe.c | 15 ++++----------- cmd/sysboot.c | 18 ++++-------------- include/pxe_utils.h | 9 +++++++++ 4 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 9f3edeab06a..225729ce57f 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -1486,3 +1486,23 @@ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, ctx->userdata = userdata; ctx->allow_abs_path = allow_abs_path; } + +int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt) +{ + struct pxe_menu *cfg; + + cfg = parse_pxefile(ctx, pxefile_addr_r); + if (!cfg) { + printf("Error parsing config file\n"); + return 1; + } + + if (prompt) + cfg->prompt = 1; + + handle_pxe_menu(ctx, cfg); + + destroy_pxe_menu(cfg); + + return 0; +} diff --git a/cmd/pxe.c b/cmd/pxe.c index 17fe364bed9..4fa51d2e053 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -171,9 +171,9 @@ static int do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r; - struct pxe_menu *cfg; char *pxefile_addr_str; struct pxe_context ctx; + int ret;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
@@ -193,16 +193,9 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
- cfg = parse_pxefile(&ctx, pxefile_addr_r); - - if (!cfg) { - printf("Error parsing config file\n"); - return 1; - } - - handle_pxe_menu(&ctx, cfg); - - destroy_pxe_menu(cfg); + ret = pxe_process(&ctx, pxefile_addr_r, false); + if (ret) + return CMD_RET_FAILURE;
copy_filename(net_boot_file_name, "", sizeof(net_boot_file_name));
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index b81255e155a..7ee14df79e5 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -60,10 +60,10 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, { unsigned long pxefile_addr_r; struct pxe_context ctx; - struct pxe_menu *cfg; char *pxefile_addr_str; char *filename; int prompt = 0; + int ret;
if (argc > 1 && strstr(argv[1], "-p")) { prompt = 1; @@ -113,19 +113,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
- cfg = parse_pxefile(&ctx, pxefile_addr_r); - - if (!cfg) { - printf("Error parsing config file\n"); - return 1; - } - - if (prompt) - cfg->prompt = 1; - - handle_pxe_menu(&ctx, cfg); - - destroy_pxe_menu(cfg); + ret = pxe_process(&ctx, pxefile_addr_r, prompt); + if (ret) + return CMD_RET_FAILURE;
return 0; } diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 6681442ea55..0cae0dabec3 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -202,4 +202,13 @@ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, pxe_getfile_func getfile, void *userdata, bool allow_abs_path);
+/** + * pxe_process() - Process a PXE file through to boot + * + * @ctx: PXE context created with pxe_setup_ctx() + * @pxefile_addr_r: Address to load file + * @prompt: Force a prompt for the user + */ +int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt); + #endif /* __PXE_UTILS_H */

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:51 PM Simon Glass sjg@chromium.org wrote:
Both the syslinux and pxe commands use essentially the same code to parse and run extlinux.conf files. Move this into a common function.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 20 ++++++++++++++++++++ cmd/pxe.c | 15 ++++----------- cmd/sysboot.c | 18 ++++-------------- include/pxe_utils.h | 9 +++++++++ 4 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 9f3edeab06a..225729ce57f 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -1486,3 +1486,23 @@ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, ctx->userdata = userdata; ctx->allow_abs_path = allow_abs_path; }
+int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt) +{
struct pxe_menu *cfg;
cfg = parse_pxefile(ctx, pxefile_addr_r);
if (!cfg) {
printf("Error parsing config file\n");
return 1;
}
if (prompt)
cfg->prompt = 1;
handle_pxe_menu(ctx, cfg);
destroy_pxe_menu(cfg);
return 0;
+} diff --git a/cmd/pxe.c b/cmd/pxe.c index 17fe364bed9..4fa51d2e053 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -171,9 +171,9 @@ static int do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r;
struct pxe_menu *cfg; char *pxefile_addr_str; struct pxe_context ctx;
int ret; pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
@@ -193,16 +193,9 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
cfg = parse_pxefile(&ctx, pxefile_addr_r);
if (!cfg) {
printf("Error parsing config file\n");
return 1;
}
handle_pxe_menu(&ctx, cfg);
destroy_pxe_menu(cfg);
ret = pxe_process(&ctx, pxefile_addr_r, false);
if (ret)
return CMD_RET_FAILURE; copy_filename(net_boot_file_name, "", sizeof(net_boot_file_name));
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index b81255e155a..7ee14df79e5 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -60,10 +60,10 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, { unsigned long pxefile_addr_r; struct pxe_context ctx;
struct pxe_menu *cfg; char *pxefile_addr_str; char *filename; int prompt = 0;
int ret; if (argc > 1 && strstr(argv[1], "-p")) { prompt = 1;
@@ -113,19 +113,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
cfg = parse_pxefile(&ctx, pxefile_addr_r);
if (!cfg) {
printf("Error parsing config file\n");
return 1;
}
if (prompt)
cfg->prompt = 1;
handle_pxe_menu(&ctx, cfg);
destroy_pxe_menu(cfg);
ret = pxe_process(&ctx, pxefile_addr_r, prompt);
if (ret)
return CMD_RET_FAILURE; return 0;
} diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 6681442ea55..0cae0dabec3 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -202,4 +202,13 @@ void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, pxe_getfile_func getfile, void *userdata, bool allow_abs_path);
+/**
- pxe_process() - Process a PXE file through to boot
- @ctx: PXE context created with pxe_setup_ctx()
- @pxefile_addr_r: Address to load file
- @prompt: Force a prompt for the user
- */
+int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt);
#endif /* __PXE_UTILS_H */
2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:03PM -0600, Simon Glass wrote:
Both the syslinux and pxe commands use essentially the same code to parse and run extlinux.conf files. Move this into a common function.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

The 'bootfile' environment variable is read in the bowels of pxe_util to provide a directory to which all loaded files are relative.
This is not obvious from the API to PXE and it is strange to make the caller set an environment variable rather than pass this as a parameter.
The code is also convoluted, which this feature implemented by get_bootfile_path().
Update the API to improve this. Unfortunately this means that pxe_setup_ctx() can fail, so add error checking.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 60 ++++++++++++++++++++++++++++----------------- cmd/pxe.c | 18 +++++++++++--- cmd/sysboot.c | 15 +++++++++--- include/pxe_utils.h | 19 +++++++++++--- 4 files changed, 79 insertions(+), 33 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 225729ce57f..c04be110ea4 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -67,10 +67,10 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) /** * get_bootfile_path() - Figure out the path of a file to read * - * Returns the directory the file specified in the 'bootfile' env variable is - * in. If bootfile isn't defined in the environment, return NULL, which should - * be interpreted as "don't prepend anything to paths". + * Copies the boot directory into the supplied buffer. If there is no boot + * directory, set it to "" * + * @ctx: PXE context * @file_path: File path to read (relative to the PXE file) * @bootfile_path: Place to put the bootfile path * @bootfile_path_size: Size of @bootfile_path in bytes @@ -79,34 +79,25 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) * Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the * resulting path */ -static int get_bootfile_path(const char *file_path, char *bootfile_path, - size_t bootfile_path_size, bool allow_abs_path) +static int get_bootfile_path(struct pxe_context *ctx, const char *file_path, + char *bootfile_path, size_t bootfile_path_size, + bool allow_abs_path) { - char *bootfile, *last_slash; size_t path_len = 0;
/* Only syslinux allows absolute paths */ if (file_path[0] == '/' && allow_abs_path) goto ret;
- bootfile = from_env("bootfile"); - if (!bootfile) - goto ret; - - last_slash = strrchr(bootfile, '/'); - if (!last_slash) - goto ret; - - path_len = (last_slash - bootfile) + 1; - - if (bootfile_path_size < path_len) { + path_len = strlen(ctx->bootdir); + if (bootfile_path_size < path_len + 1) { printf("bootfile_path too small. (%zd < %zd)\n", bootfile_path_size, path_len);
return -ENOSPC; }
- strncpy(bootfile_path, bootfile, path_len); + strncpy(bootfile_path, ctx->bootdir, path_len);
ret: bootfile_path[path_len] = '\0'; @@ -135,7 +126,7 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, char addr_buf[18]; int err;
- err = get_bootfile_path(file_path, relfile, sizeof(relfile), + err = get_bootfile_path(ctx, file_path, relfile, sizeof(relfile), ctx->allow_abs_path); if (err < 0) return err; @@ -1477,14 +1468,39 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) boot_unattempted_labels(ctx, cfg); }
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile, void *userdata, - bool allow_abs_path) +int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, + pxe_getfile_func getfile, void *userdata, + bool allow_abs_path, const char *bootfile) { + const char *last_slash; + size_t path_len = 0; + + memset(ctx, '\0', sizeof(*ctx)); ctx->cmdtp = cmdtp; ctx->getfile = getfile; ctx->userdata = userdata; ctx->allow_abs_path = allow_abs_path; + + /* figure out the boot directory, if there is one */ + if (bootfile && strlen(bootfile) >= MAX_TFTP_PATH_LEN) + return -ENOSPC; + ctx->bootdir = strdup(bootfile ? bootfile : ""); + if (!ctx->bootdir) + return -ENOMEM; + + if (bootfile) { + last_slash = strrchr(bootfile, '/'); + if (last_slash) + path_len = (last_slash - bootfile) + 1; + } + ctx->bootdir[path_len] = '\0'; + + return 0; +} + +void pxe_destroy_ctx(struct pxe_context *ctx) +{ + free(ctx->bootdir); }
int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt) diff --git a/cmd/pxe.c b/cmd/pxe.c index 4fa51d2e053..e319db51ef5 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,8 +121,6 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false); - if (argc != 1) return CMD_RET_USAGE;
@@ -136,6 +134,11 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (err < 0) return 1;
+ if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false, + env_get("bootfile"))) { + printf("Out of memory\n"); + return CMD_RET_FAILURE; + } /* * Keep trying paths until we successfully get a file we're looking * for. @@ -144,6 +147,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) pxe_mac_path(&ctx, pxefile_addr_r) > 0 || pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) { printf("Config file found\n"); + pxe_destroy_ctx(&ctx);
return 0; } @@ -152,12 +156,14 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (get_pxelinux_path(&ctx, pxe_default_paths[i], pxefile_addr_r) > 0) { printf("Config file found\n"); + pxe_destroy_ctx(&ctx); return 0; } i++; }
printf("Config file not found\n"); + pxe_destroy_ctx(&ctx);
return 1; } @@ -175,8 +181,6 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int ret;
- pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false); - if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r"); if (!pxefile_addr_str) @@ -193,7 +197,13 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
+ if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false, + env_get("bootfile"))) { + printf("Out of memory\n"); + return CMD_RET_FAILURE; + } ret = pxe_process(&ctx, pxefile_addr_r, false); + pxe_destroy_ctx(&ctx); if (ret) return CMD_RET_FAILURE;
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 7ee14df79e5..c45fed774d6 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -59,6 +59,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r; + pxe_getfile_func getfile; struct pxe_context ctx; char *pxefile_addr_str; char *filename; @@ -89,13 +90,12 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
- pxe_setup_ctx(&ctx, cmdtp, NULL, NULL, true); if (strstr(argv[3], "ext2")) { - ctx.getfile = do_get_ext2; + getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) { - ctx.getfile = do_get_fat; + getfile = do_get_fat; } else if (strstr(argv[3], "any")) { - ctx.getfile = do_get_any; + getfile = do_get_any; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1; @@ -108,12 +108,19 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
+ if (pxe_setup_ctx(&ctx, cmdtp, getfile, NULL, true, filename)) { + printf("Out of memory\n"); + return CMD_RET_FAILURE; + } + if (get_pxe_file(&ctx, filename, pxefile_addr_r) < 0) { printf("Error reading config file\n"); + pxe_destroy_ctx(&ctx); return 1; }
ret = pxe_process(&ctx, pxefile_addr_r, prompt); + pxe_destroy_ctx(&ctx); if (ret) return CMD_RET_FAILURE;
diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 0cae0dabec3..543d0245c8a 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -86,6 +86,8 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, * @getfile: Function called by PXE to read a file * @userdata: Data the caller requires for @getfile * @allow_abs_path: true to allow absolute paths + * @bootdir: Directory that files are loaded from ("" if no directory). This is + * allocated */ struct pxe_context { struct cmd_tbl *cmdtp; @@ -102,6 +104,7 @@ struct pxe_context {
void *userdata; bool allow_abs_path; + char *bootdir; };
/** @@ -197,10 +200,20 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len); * @getfile: Function to call to read a file * @userdata: Data the caller requires for @getfile - stored in ctx->userdata * @allow_abs_path: true to allow absolute paths + * @bootfile: Bootfile whose directory loaded files are relative to, NULL if + * none + * @return 0 if OK, -ENOMEM if out of memory */ -void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, - pxe_getfile_func getfile, void *userdata, - bool allow_abs_path); +int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, + pxe_getfile_func getfile, void *userdata, + bool allow_abs_path, const char *bootfile); + +/** + * pxe_destroy_ctx() - Destroy a PXE context + * + * @ctx: Context to destroy + */ +void pxe_destroy_ctx(struct pxe_context *ctx);
/** * pxe_process() - Process a PXE file through to boot

OK its really needed!
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:50 PM Simon Glass sjg@chromium.org wrote:
The 'bootfile' environment variable is read in the bowels of pxe_util to provide a directory to which all loaded files are relative.
This is not obvious from the API to PXE and it is strange to make the caller set an environment variable rather than pass this as a parameter.
The code is also convoluted, which this feature implemented by get_bootfile_path().
Update the API to improve this. Unfortunately this means that pxe_setup_ctx() can fail, so add error checking.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 60 ++++++++++++++++++++++++++++----------------- cmd/pxe.c | 18 +++++++++++--- cmd/sysboot.c | 15 +++++++++--- include/pxe_utils.h | 19 +++++++++++--- 4 files changed, 79 insertions(+), 33 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 225729ce57f..c04be110ea4 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -67,10 +67,10 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) /**
- get_bootfile_path() - Figure out the path of a file to read
- Returns the directory the file specified in the 'bootfile' env variable is
- in. If bootfile isn't defined in the environment, return NULL, which should
- be interpreted as "don't prepend anything to paths".
- Copies the boot directory into the supplied buffer. If there is no boot
- directory, set it to ""
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @bootfile_path: Place to put the bootfile path
- @bootfile_path_size: Size of @bootfile_path in bytes
@@ -79,34 +79,25 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len)
- Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the
resulting path
*/ -static int get_bootfile_path(const char *file_path, char *bootfile_path,
size_t bootfile_path_size, bool allow_abs_path)
+static int get_bootfile_path(struct pxe_context *ctx, const char *file_path,
char *bootfile_path, size_t bootfile_path_size,
bool allow_abs_path)
{
char *bootfile, *last_slash; size_t path_len = 0; /* Only syslinux allows absolute paths */ if (file_path[0] == '/' && allow_abs_path) goto ret;
bootfile = from_env("bootfile");
if (!bootfile)
goto ret;
last_slash = strrchr(bootfile, '/');
if (!last_slash)
goto ret;
path_len = (last_slash - bootfile) + 1;
if (bootfile_path_size < path_len) {
path_len = strlen(ctx->bootdir);
if (bootfile_path_size < path_len + 1) { printf("bootfile_path too small. (%zd < %zd)\n", bootfile_path_size, path_len); return -ENOSPC; }
strncpy(bootfile_path, bootfile, path_len);
strncpy(bootfile_path, ctx->bootdir, path_len);
ret: bootfile_path[path_len] = '\0';
@@ -135,7 +126,7 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, char addr_buf[18]; int err;
err = get_bootfile_path(file_path, relfile, sizeof(relfile),
err = get_bootfile_path(ctx, file_path, relfile, sizeof(relfile), ctx->allow_abs_path); if (err < 0) return err;
@@ -1477,14 +1468,39 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) boot_unattempted_labels(ctx, cfg); }
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path)
+int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path, const char *bootfile)
{
const char *last_slash;
size_t path_len = 0;
memset(ctx, '\0', sizeof(*ctx)); ctx->cmdtp = cmdtp; ctx->getfile = getfile; ctx->userdata = userdata; ctx->allow_abs_path = allow_abs_path;
/* figure out the boot directory, if there is one */
if (bootfile && strlen(bootfile) >= MAX_TFTP_PATH_LEN)
return -ENOSPC;
ctx->bootdir = strdup(bootfile ? bootfile : "");
if (!ctx->bootdir)
return -ENOMEM;
if (bootfile) {
last_slash = strrchr(bootfile, '/');
if (last_slash)
path_len = (last_slash - bootfile) + 1;
}
ctx->bootdir[path_len] = '\0';
return 0;
+}
+void pxe_destroy_ctx(struct pxe_context *ctx) +{
free(ctx->bootdir);
}
int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt) diff --git a/cmd/pxe.c b/cmd/pxe.c index 4fa51d2e053..e319db51ef5 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -121,8 +121,6 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int err, i = 0;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
if (argc != 1) return CMD_RET_USAGE;
@@ -136,6 +134,11 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (err < 0) return 1;
if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
env_get("bootfile"))) {
printf("Out of memory\n");
return CMD_RET_FAILURE;
} /* * Keep trying paths until we successfully get a file we're looking * for.
@@ -144,6 +147,7 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) pxe_mac_path(&ctx, pxefile_addr_r) > 0 || pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) { printf("Config file found\n");
pxe_destroy_ctx(&ctx); return 0; }
@@ -152,12 +156,14 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (get_pxelinux_path(&ctx, pxe_default_paths[i], pxefile_addr_r) > 0) { printf("Config file found\n");
pxe_destroy_ctx(&ctx); return 0; } i++; } printf("Config file not found\n");
pxe_destroy_ctx(&ctx); return 1;
} @@ -175,8 +181,6 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) struct pxe_context ctx; int ret;
pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false);
if (argc == 1) { pxefile_addr_str = from_env("pxefile_addr_r"); if (!pxefile_addr_str)
@@ -193,7 +197,13 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; }
if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
env_get("bootfile"))) {
printf("Out of memory\n");
return CMD_RET_FAILURE;
} ret = pxe_process(&ctx, pxefile_addr_r, false);
pxe_destroy_ctx(&ctx); if (ret) return CMD_RET_FAILURE;
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 7ee14df79e5..c45fed774d6 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -59,6 +59,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r;
pxe_getfile_func getfile; struct pxe_context ctx; char *pxefile_addr_str; char *filename;
@@ -89,13 +90,12 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, env_set("bootfile", filename); }
pxe_setup_ctx(&ctx, cmdtp, NULL, NULL, true); if (strstr(argv[3], "ext2")) {
ctx.getfile = do_get_ext2;
getfile = do_get_ext2; } else if (strstr(argv[3], "fat")) {
ctx.getfile = do_get_fat;
getfile = do_get_fat; } else if (strstr(argv[3], "any")) {
ctx.getfile = do_get_any;
getfile = do_get_any; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1;
@@ -108,12 +108,19 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, return 1; }
if (pxe_setup_ctx(&ctx, cmdtp, getfile, NULL, true, filename)) {
printf("Out of memory\n");
return CMD_RET_FAILURE;
}
if (get_pxe_file(&ctx, filename, pxefile_addr_r) < 0) { printf("Error reading config file\n");
pxe_destroy_ctx(&ctx); return 1; } ret = pxe_process(&ctx, pxefile_addr_r, prompt);
pxe_destroy_ctx(&ctx); if (ret) return CMD_RET_FAILURE;
diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 0cae0dabec3..543d0245c8a 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -86,6 +86,8 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
- @getfile: Function called by PXE to read a file
- @userdata: Data the caller requires for @getfile
- @allow_abs_path: true to allow absolute paths
- @bootdir: Directory that files are loaded from ("" if no directory). This is
*/
allocated
struct pxe_context { struct cmd_tbl *cmdtp; @@ -102,6 +104,7 @@ struct pxe_context {
void *userdata; bool allow_abs_path;
char *bootdir;
};
/** @@ -197,10 +200,20 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
- @getfile: Function to call to read a file
- @userdata: Data the caller requires for @getfile - stored in ctx->userdata
- @allow_abs_path: true to allow absolute paths
- @bootfile: Bootfile whose directory loaded files are relative to, NULL if
none
*/
- @return 0 if OK, -ENOMEM if out of memory
-void pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path);
+int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
pxe_getfile_func getfile, void *userdata,
bool allow_abs_path, const char *bootfile);
+/**
- pxe_destroy_ctx() - Destroy a PXE context
- @ctx: Context to destroy
- */
+void pxe_destroy_ctx(struct pxe_context *ctx);
/**
- pxe_process() - Process a PXE file through to boot
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:04PM -0600, Simon Glass wrote:
The 'bootfile' environment variable is read in the bowels of pxe_util to provide a directory to which all loaded files are relative.
This is not obvious from the API to PXE and it is strange to make the caller set an environment variable rather than pass this as a parameter.
The code is also convoluted, which this feature implemented by get_bootfile_path().
Update the API to improve this. Unfortunately this means that pxe_setup_ctx() can fail, so add error checking.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

This function no longer makes sense, since it is pretty easy to prepend the boot directory to the filename. Drop it and update its only caller.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 53 +++++---------------------------------------- include/pxe_utils.h | 3 ++- 2 files changed, 7 insertions(+), 49 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index c04be110ea4..f36f1f8a60c 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -64,47 +64,6 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) return 1; }
-/** - * get_bootfile_path() - Figure out the path of a file to read - * - * Copies the boot directory into the supplied buffer. If there is no boot - * directory, set it to "" - * - * @ctx: PXE context - * @file_path: File path to read (relative to the PXE file) - * @bootfile_path: Place to put the bootfile path - * @bootfile_path_size: Size of @bootfile_path in bytes - * @allow_abs_path: true to allow an absolute path (where @file_path starts with - * '/', false to return an empty path (and success) in that case - * Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the - * resulting path - */ -static int get_bootfile_path(struct pxe_context *ctx, const char *file_path, - char *bootfile_path, size_t bootfile_path_size, - bool allow_abs_path) -{ - size_t path_len = 0; - - /* Only syslinux allows absolute paths */ - if (file_path[0] == '/' && allow_abs_path) - goto ret; - - path_len = strlen(ctx->bootdir); - if (bootfile_path_size < path_len + 1) { - printf("bootfile_path too small. (%zd < %zd)\n", - bootfile_path_size, path_len); - - return -ENOSPC; - } - - strncpy(bootfile_path, ctx->bootdir, path_len); - - ret: - bootfile_path[path_len] = '\0'; - - return 1; -} - /** * get_relfile() - read a file relative to the PXE file * @@ -124,15 +83,13 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, size_t path_len; char relfile[MAX_TFTP_PATH_LEN + 1]; char addr_buf[18]; - int err;
- err = get_bootfile_path(ctx, file_path, relfile, sizeof(relfile), - ctx->allow_abs_path); - if (err < 0) - return err; + if (file_path[0] == '/' && ctx->allow_abs_path) + *relfile = '\0'; + else + strncpy(relfile, ctx->bootdir, MAX_TFTP_PATH_LEN);
- path_len = strlen(file_path); - path_len += strlen(relfile); + path_len = strlen(file_path) + strlen(relfile);
if (path_len > MAX_TFTP_PATH_LEN) { printf("Base path too long (%s%s)\n", relfile, file_path); diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 543d0245c8a..8b50f2e6861 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -202,7 +202,8 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len); * @allow_abs_path: true to allow absolute paths * @bootfile: Bootfile whose directory loaded files are relative to, NULL if * none - * @return 0 if OK, -ENOMEM if out of memory + * @return 0 if OK, -ENOMEM if out of memory, -E2BIG if bootfile is larger than + * MAX_TFTP_PATH_LEN bytes */ int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, pxe_getfile_func getfile, void *userdata,

OK
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:50 PM Simon Glass sjg@chromium.org wrote:
This function no longer makes sense, since it is pretty easy to prepend the boot directory to the filename. Drop it and update its only caller.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 53 +++++---------------------------------------- include/pxe_utils.h | 3 ++- 2 files changed, 7 insertions(+), 49 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index c04be110ea4..f36f1f8a60c 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -64,47 +64,6 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) return 1; }
-/**
- get_bootfile_path() - Figure out the path of a file to read
- Copies the boot directory into the supplied buffer. If there is no boot
- directory, set it to ""
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @bootfile_path: Place to put the bootfile path
- @bootfile_path_size: Size of @bootfile_path in bytes
- @allow_abs_path: true to allow an absolute path (where @file_path starts with
'/', false to return an empty path (and success) in that case
- Returns 1 for success, -ENOSPC if bootfile_path_size is to small to hold the
resulting path
- */
-static int get_bootfile_path(struct pxe_context *ctx, const char *file_path,
char *bootfile_path, size_t bootfile_path_size,
bool allow_abs_path)
-{
size_t path_len = 0;
/* Only syslinux allows absolute paths */
if (file_path[0] == '/' && allow_abs_path)
goto ret;
path_len = strlen(ctx->bootdir);
if (bootfile_path_size < path_len + 1) {
printf("bootfile_path too small. (%zd < %zd)\n",
bootfile_path_size, path_len);
return -ENOSPC;
}
strncpy(bootfile_path, ctx->bootdir, path_len);
- ret:
bootfile_path[path_len] = '\0';
return 1;
-}
/**
- get_relfile() - read a file relative to the PXE file
@@ -124,15 +83,13 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, size_t path_len; char relfile[MAX_TFTP_PATH_LEN + 1]; char addr_buf[18];
int err;
err = get_bootfile_path(ctx, file_path, relfile, sizeof(relfile),
ctx->allow_abs_path);
if (err < 0)
return err;
if (file_path[0] == '/' && ctx->allow_abs_path)
*relfile = '\0';
else
strncpy(relfile, ctx->bootdir, MAX_TFTP_PATH_LEN);
path_len = strlen(file_path);
path_len += strlen(relfile);
path_len = strlen(file_path) + strlen(relfile); if (path_len > MAX_TFTP_PATH_LEN) { printf("Base path too long (%s%s)\n", relfile, file_path);
diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 543d0245c8a..8b50f2e6861 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -202,7 +202,8 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
- @allow_abs_path: true to allow absolute paths
- @bootfile: Bootfile whose directory loaded files are relative to, NULL if
none
- @return 0 if OK, -ENOMEM if out of memory
- @return 0 if OK, -ENOMEM if out of memory, -E2BIG if bootfile is larger than
*/
MAX_TFTP_PATH_LEN bytes
int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp, pxe_getfile_func getfile, void *userdata, -- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:05PM -0600, Simon Glass wrote:
This function no longer makes sense, since it is pretty easy to prepend the boot directory to the filename. Drop it and update its only caller.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Add test and a comment for this function.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
include/vsprintf.h | 13 ++++++++++++- test/print_ut.c | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/include/vsprintf.h b/include/vsprintf.h index 83d187e53d4..4479df0af3f 100644 --- a/include/vsprintf.h +++ b/include/vsprintf.h @@ -172,7 +172,18 @@ int sprintf(char *buf, const char *fmt, ...) * See the vsprintf() documentation for format string extensions over C99. */ int vsprintf(char *buf, const char *fmt, va_list args); -char *simple_itoa(ulong i); + +/** + * simple_itoa() - convert an unsigned integer to a string + * + * This returns a static string containing the decimal representation of the + * given value. The returned value may be overwritten by other calls to the + * same function, so should be used immediately + * + * @val: Value to convert + * @return string containing the decimal representation of @val + */ +char *simple_itoa(ulong val);
/** * Format a string and place it in a buffer diff --git a/test/print_ut.c b/test/print_ut.c index 11d8580e55c..4fbb15b6d3c 100644 --- a/test/print_ut.c +++ b/test/print_ut.c @@ -10,6 +10,7 @@ #include <log.h> #include <mapmem.h> #include <version_string.h> +#include <vsprintf.h> #include <test/suites.h> #include <test/test.h> #include <test/ut.h> @@ -328,6 +329,22 @@ static int print_do_hex_dump(struct unit_test_state *uts) } PRINT_TEST(print_do_hex_dump, UT_TESTF_CONSOLE_REC);
+static int print_itoa(struct unit_test_state *uts) +{ + ut_asserteq_str("123", simple_itoa(123)); + ut_asserteq_str("0", simple_itoa(0)); + ut_asserteq_str("2147483647", simple_itoa(0x7fffffff)); + ut_asserteq_str("4294967295", simple_itoa(0xffffffff)); + if (sizeof(ulong) == 8) { + ut_asserteq_str("9223372036854775807", + simple_itoa((1UL << 63) - 1)); + ut_asserteq_str("18446744073709551615", simple_itoa(-1)); + } + + return 0; +} +PRINT_TEST(print_itoa, 0); + int do_ut_print(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct unit_test *tests = UNIT_TEST_SUITE_START(print_test);

Reviewed-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 12:48:06PM -0600, Simon Glass wrote:
Add test and a comment for this function.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com
Applied to u-boot/master, thanks!

Add an xtoa() function, similar to itoa() but for hex instead.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
include/vsprintf.h | 16 ++++++++++++++-- lib/vsprintf.c | 20 ++++++++++++++++++-- test/print_ut.c | 24 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-)
diff --git a/include/vsprintf.h b/include/vsprintf.h index 4479df0af3f..b4746301462 100644 --- a/include/vsprintf.h +++ b/include/vsprintf.h @@ -177,14 +177,26 @@ int vsprintf(char *buf, const char *fmt, va_list args); * simple_itoa() - convert an unsigned integer to a string * * This returns a static string containing the decimal representation of the - * given value. The returned value may be overwritten by other calls to the - * same function, so should be used immediately + * given value. The returned value may be overwritten by other calls to other + * simple_... functions, so should be used immediately * * @val: Value to convert * @return string containing the decimal representation of @val */ char *simple_itoa(ulong val);
+/** + * simple_xtoa() - convert an unsigned integer to a hex string + * + * This returns a static string containing the hexadecimal representation of the + * given value. The returned value may be overwritten by other calls to other + * simple_... functions, so should be used immediately + * + * @val: Value to convert + * @return string containing the hexecimal representation of @val + */ +char *simple_xtoa(ulong num); + /** * Format a string and place it in a buffer * diff --git a/lib/vsprintf.c b/lib/vsprintf.c index d7ee35b4773..e634bd70b66 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -816,11 +816,12 @@ int vprintf(const char *fmt, va_list args) } #endif
+static char local_toa[22]; + char *simple_itoa(ulong i) { /* 21 digits plus null terminator, good for 64-bit or smaller ints */ - static char local[22]; - char *p = &local[21]; + char *p = &local_toa[21];
*p-- = '\0'; do { @@ -830,6 +831,21 @@ char *simple_itoa(ulong i) return p + 1; }
+char *simple_xtoa(ulong num) +{ + /* 16 digits plus nul terminator, good for 64-bit or smaller ints */ + char *p = &local_toa[17]; + + *--p = '\0'; + do { + p -= 2; + hex_byte_pack(p, num & 0xff); + num >>= 8; + } while (num > 0); + + return p; +} + /* We don't seem to have %'d in U-Boot */ void print_grouped_ull(unsigned long long int_val, int digits) { diff --git a/test/print_ut.c b/test/print_ut.c index 4fbb15b6d3c..152a8c3334f 100644 --- a/test/print_ut.c +++ b/test/print_ut.c @@ -335,16 +335,40 @@ static int print_itoa(struct unit_test_state *uts) ut_asserteq_str("0", simple_itoa(0)); ut_asserteq_str("2147483647", simple_itoa(0x7fffffff)); ut_asserteq_str("4294967295", simple_itoa(0xffffffff)); + + /* Use #ifdef here to avoid a compiler warning on 32-bit machines */ +#ifdef CONFIG_PHYS_64BIT if (sizeof(ulong) == 8) { ut_asserteq_str("9223372036854775807", simple_itoa((1UL << 63) - 1)); ut_asserteq_str("18446744073709551615", simple_itoa(-1)); } +#endif /* CONFIG_PHYS_64BIT */
return 0; } PRINT_TEST(print_itoa, 0);
+static int print_xtoa(struct unit_test_state *uts) +{ + ut_asserteq_str("7f", simple_xtoa(127)); + ut_asserteq_str("00", simple_xtoa(0)); + ut_asserteq_str("7fffffff", simple_xtoa(0x7fffffff)); + ut_asserteq_str("ffffffff", simple_xtoa(0xffffffff)); + + /* Use #ifdef here to avoid a compiler warning on 32-bit machines */ +#ifdef CONFIG_PHYS_64BIT + if (sizeof(ulong) == 8) { + ut_asserteq_str("7fffffffffffffff", + simple_xtoa((1UL << 63) - 1)); + ut_asserteq_str("ffffffffffffffff", simple_xtoa(-1)); + } +#endif /* CONFIG_PHYS_64BIT */ + + return 0; +} +PRINT_TEST(print_xtoa, 0); + int do_ut_print(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct unit_test *tests = UNIT_TEST_SUITE_START(print_test);

OK will be usefull
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 12:48:07PM -0600, Simon Glass wrote:
Add an xtoa() function, similar to itoa() but for hex instead.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com
Applied to u-boot/master, thanks!

It is pretty strange that the pxe code uses the 'filesize' environment variable find the size of a file it has just read.
Partly this is because it uses the command-line interpreter to parse its request to load the file.
As a first step towards unwinding this, return it directly from the getfile() function. This makes the code a bit longer, for now, but will be cleaned up in future patches.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
boot/pxe_utils.c | 70 ++++++++++++++++++++++++++++----------------- cmd/pxe.c | 7 ++++- cmd/sysboot.c | 21 ++++++++++++-- include/pxe_utils.h | 13 ++++++++- 4 files changed, 79 insertions(+), 32 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index f36f1f8a60c..e377e16be56 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -30,6 +30,20 @@
#define MAX_TFTP_PATH_LEN 512
+int pxe_get_file_size(ulong *sizep) +{ + const char *val; + + val = from_env("filesize"); + if (!val) + return -ENOENT; + + if (strict_strtoul(val, 16, sizep) < 0) + return -EINVAL; + + return 0; +} + /** * format_mac_pxe() - obtain a MAC address in the PXE format * @@ -75,14 +89,17 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len) * @ctx: PXE context * @file_path: File path to read (relative to the PXE file) * @file_addr: Address to load file to + * @filesizep: If not NULL, returns the file size in bytes * Returns 1 for success, or < 0 on error */ static int get_relfile(struct pxe_context *ctx, const char *file_path, - unsigned long file_addr) + unsigned long file_addr, ulong *filesizep) { size_t path_len; char relfile[MAX_TFTP_PATH_LEN + 1]; char addr_buf[18]; + ulong size; + int ret;
if (file_path[0] == '/' && ctx->allow_abs_path) *relfile = '\0'; @@ -103,7 +120,13 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
- return ctx->getfile(ctx, relfile, addr_buf); + ret = ctx->getfile(ctx, relfile, addr_buf, &size); + if (ret < 0) + return log_msg_ret("get", ret); + if (filesizep) + *filesizep = size; + + return 1; }
/** @@ -117,29 +140,17 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path, * Returns 1 for success, or < 0 on error */ int get_pxe_file(struct pxe_context *ctx, const char *file_path, - unsigned long file_addr) + ulong file_addr) { - unsigned long config_file_size; - char *tftp_filesize; + ulong size; int err; char *buf;
- err = get_relfile(ctx, file_path, file_addr); + err = get_relfile(ctx, file_path, file_addr, &size); if (err < 0) return err;
- /* - * the file comes without a NUL byte at the end, so find out its size - * and add the NUL byte. - */ - tftp_filesize = from_env("filesize"); - if (!tftp_filesize) - return -ENOENT; - - if (strict_strtoul(tftp_filesize, 16, &config_file_size) < 0) - return -EINVAL; - - buf = map_sysmem(file_addr + config_file_size, 1); + buf = map_sysmem(file_addr + size, 1); *buf = '\0'; unmap_sysmem(buf);
@@ -184,12 +195,13 @@ int get_pxelinux_path(struct pxe_context *ctx, const char *file, * @file_path: File path to read (relative to the PXE file) * @envaddr_name: Name of environment variable which contains the address to * load to + * @filesizep: Returns the file size in bytes * Returns 1 on success, -ENOENT if @envaddr_name does not exist as an * environment variable, -EINVAL if its format is not valid hex, or other * value < 0 on other error */ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, - const char *envaddr_name) + const char *envaddr_name, ulong *filesizep) { unsigned long file_addr; char *envaddr; @@ -201,7 +213,7 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, if (strict_strtoul(envaddr, 16, &file_addr) < 0) return -EINVAL;
- return get_relfile(ctx, file_path, file_addr); + return get_relfile(ctx, file_path, file_addr, filesizep); }
/** @@ -357,8 +369,8 @@ static void label_boot_fdtoverlay(struct pxe_context *ctx, goto skip_overlay;
/* Load overlay file */ - err = get_relfile_envaddr(ctx, overlayfile, - "fdtoverlay_addr_r"); + err = get_relfile_envaddr(ctx, overlayfile, "fdtoverlay_addr_r", + NULL); if (err < 0) { printf("Failed loading overlay %s\n", overlayfile); goto skip_overlay; @@ -438,7 +450,10 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) }
if (label->initrd) { - if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r") < 0) { + ulong size; + + if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r", + &size) < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return 1; @@ -447,11 +462,12 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) bootm_argv[2] = initrd_str; strncpy(bootm_argv[2], env_get("ramdisk_addr_r"), 18); strcat(bootm_argv[2], ":"); - strncat(bootm_argv[2], env_get("filesize"), 9); + strcat(bootm_argv[2], simple_xtoa(size)); bootm_argc = 3; }
- if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r") < 0) { + if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r", + NULL) < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); return 1; @@ -592,7 +608,7 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
if (fdtfile) { int err = get_relfile_envaddr(ctx, fdtfile, - "fdt_addr_r"); + "fdt_addr_r", NULL);
free(fdtfilefree); if (err < 0) { @@ -1384,7 +1400,7 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) if (IS_ENABLED(CONFIG_CMD_BMP)) { /* display BMP if available */ if (cfg->bmp) { - if (get_relfile(ctx, cfg->bmp, image_load_addr)) { + if (get_relfile(ctx, cfg->bmp, image_load_addr, NULL)) { if (CONFIG_IS_ENABLED(CMD_CLS)) run_command("cls", 0); bmp_display(image_load_addr, diff --git a/cmd/pxe.c b/cmd/pxe.c index e319db51ef5..81703386c42 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -25,15 +25,20 @@ const char *pxe_default_paths[] = { };
static int do_get_tftp(struct pxe_context *ctx, const char *file_path, - char *file_addr) + char *file_addr, ulong *sizep) { char *tftp_argv[] = {"tftp", NULL, NULL, NULL}; + int ret;
tftp_argv[1] = file_addr; tftp_argv[2] = (void *)file_path;
if (do_tftpb(ctx->cmdtp, 0, 3, tftp_argv)) return -ENOENT; + ret = pxe_get_file_size(sizep); + if (ret) + return log_msg_ret("tftp", ret); + ctx->pxe_file_size = *sizep;
return 1; } diff --git a/cmd/sysboot.c b/cmd/sysboot.c index c45fed774d6..6344ecd357b 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -9,43 +9,58 @@ static char *fs_argv[5];
static int do_get_ext2(struct pxe_context *ctx, const char *file_path, - char *file_addr) + char *file_addr, ulong *sizep) { #ifdef CONFIG_CMD_EXT2 + int ret; + fs_argv[0] = "ext2load"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv)) return 1; + ret = pxe_get_file_size(sizep); + if (ret) + return log_msg_ret("tftp", ret); #endif return -ENOENT; }
static int do_get_fat(struct pxe_context *ctx, const char *file_path, - char *file_addr) + char *file_addr, ulong *sizep) { #ifdef CONFIG_CMD_FAT + int ret; + fs_argv[0] = "fatload"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv)) return 1; + ret = pxe_get_file_size(sizep); + if (ret) + return log_msg_ret("tftp", ret); #endif return -ENOENT; }
static int do_get_any(struct pxe_context *ctx, const char *file_path, - char *file_addr) + char *file_addr, ulong *sizep) { #ifdef CONFIG_CMD_FS_GENERIC + int ret; + fs_argv[0] = "load"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path;
if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) return 1; + ret = pxe_get_file_size(sizep); + if (ret) + return log_msg_ret("tftp", ret); #endif return -ENOENT; } diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 8b50f2e6861..194a5ed8cc7 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -77,7 +77,7 @@ struct pxe_menu {
struct pxe_context; typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, - char *file_addr); + char *file_addr, ulong *filesizep);
/** * struct pxe_context - context information for PXE parsing @@ -88,6 +88,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path, * @allow_abs_path: true to allow absolute paths * @bootdir: Directory that files are loaded from ("" if no directory). This is * allocated + * @pxe_file_size: Size of the PXE file */ struct pxe_context { struct cmd_tbl *cmdtp; @@ -98,6 +99,7 @@ struct pxe_context { * @file_path: Path to the file * @file_addr: String containing the hex address to put the file in * memory + * @filesizep: Returns the file size in bytes * Return 0 if OK, -ve on error */ pxe_getfile_func getfile; @@ -105,6 +107,7 @@ struct pxe_context { void *userdata; bool allow_abs_path; char *bootdir; + ulong pxe_file_size; };
/** @@ -225,4 +228,12 @@ void pxe_destroy_ctx(struct pxe_context *ctx); */ int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt);
+/** + * pxe_get_file_size() - Read the value of the 'filesize' environment variable + * + * @sizep: Place to put the value + * @return 0 if OK, -ENOENT if no such variable, -EINVAL if format is invalid + */ +int pxe_get_file_size(ulong *sizep); + #endif /* __PXE_UTILS_H */

OK will be usefull
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:51 PM Simon Glass sjg@chromium.org wrote:
It is pretty strange that the pxe code uses the 'filesize' environment variable find the size of a file it has just read.
Partly this is because it uses the command-line interpreter to parse its request to load the file.
As a first step towards unwinding this, return it directly from the getfile() function. This makes the code a bit longer, for now, but will be cleaned up in future patches.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
boot/pxe_utils.c | 70 ++++++++++++++++++++++++++++----------------- cmd/pxe.c | 7 ++++- cmd/sysboot.c | 21 ++++++++++++-- include/pxe_utils.h | 13 ++++++++- 4 files changed, 79 insertions(+), 32 deletions(-)
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index f36f1f8a60c..e377e16be56 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -30,6 +30,20 @@
#define MAX_TFTP_PATH_LEN 512
+int pxe_get_file_size(ulong *sizep) +{
const char *val;
val = from_env("filesize");
if (!val)
return -ENOENT;
if (strict_strtoul(val, 16, sizep) < 0)
return -EINVAL;
return 0;
+}
/**
- format_mac_pxe() - obtain a MAC address in the PXE format
@@ -75,14 +89,17 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len)
- @ctx: PXE context
- @file_path: File path to read (relative to the PXE file)
- @file_addr: Address to load file to
*/
- @filesizep: If not NULL, returns the file size in bytes
- Returns 1 for success, or < 0 on error
static int get_relfile(struct pxe_context *ctx, const char *file_path,
unsigned long file_addr)
unsigned long file_addr, ulong *filesizep)
{ size_t path_len; char relfile[MAX_TFTP_PATH_LEN + 1]; char addr_buf[18];
ulong size;
int ret; if (file_path[0] == '/' && ctx->allow_abs_path) *relfile = '\0';
@@ -103,7 +120,13 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
sprintf(addr_buf, "%lx", file_addr);
return ctx->getfile(ctx, relfile, addr_buf);
ret = ctx->getfile(ctx, relfile, addr_buf, &size);
if (ret < 0)
return log_msg_ret("get", ret);
if (filesizep)
*filesizep = size;
return 1;
}
/** @@ -117,29 +140,17 @@ static int get_relfile(struct pxe_context *ctx, const char *file_path,
- Returns 1 for success, or < 0 on error
*/ int get_pxe_file(struct pxe_context *ctx, const char *file_path,
unsigned long file_addr)
ulong file_addr)
{
unsigned long config_file_size;
char *tftp_filesize;
ulong size; int err; char *buf;
err = get_relfile(ctx, file_path, file_addr);
err = get_relfile(ctx, file_path, file_addr, &size); if (err < 0) return err;
/*
* the file comes without a NUL byte at the end, so find out its size
* and add the NUL byte.
*/
tftp_filesize = from_env("filesize");
if (!tftp_filesize)
return -ENOENT;
if (strict_strtoul(tftp_filesize, 16, &config_file_size) < 0)
return -EINVAL;
buf = map_sysmem(file_addr + config_file_size, 1);
buf = map_sysmem(file_addr + size, 1); *buf = '\0'; unmap_sysmem(buf);
@@ -184,12 +195,13 @@ int get_pxelinux_path(struct pxe_context *ctx, const char *file,
- @file_path: File path to read (relative to the PXE file)
- @envaddr_name: Name of environment variable which contains the address to
load to
*/
- @filesizep: Returns the file size in bytes
- Returns 1 on success, -ENOENT if @envaddr_name does not exist as an
environment variable, -EINVAL if its format is not valid hex, or other
value < 0 on other error
static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path,
const char *envaddr_name)
const char *envaddr_name, ulong *filesizep)
{ unsigned long file_addr; char *envaddr; @@ -201,7 +213,7 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, if (strict_strtoul(envaddr, 16, &file_addr) < 0) return -EINVAL;
return get_relfile(ctx, file_path, file_addr);
return get_relfile(ctx, file_path, file_addr, filesizep);
}
/** @@ -357,8 +369,8 @@ static void label_boot_fdtoverlay(struct pxe_context *ctx, goto skip_overlay;
/* Load overlay file */
err = get_relfile_envaddr(ctx, overlayfile,
"fdtoverlay_addr_r");
err = get_relfile_envaddr(ctx, overlayfile, "fdtoverlay_addr_r",
NULL); if (err < 0) { printf("Failed loading overlay %s\n", overlayfile); goto skip_overlay;
@@ -438,7 +450,10 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) }
if (label->initrd) {
if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r") < 0) {
ulong size;
if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r",
&size) < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return 1;
@@ -447,11 +462,12 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) bootm_argv[2] = initrd_str; strncpy(bootm_argv[2], env_get("ramdisk_addr_r"), 18); strcat(bootm_argv[2], ":");
strncat(bootm_argv[2], env_get("filesize"), 9);
strcat(bootm_argv[2], simple_xtoa(size)); bootm_argc = 3; }
if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r") < 0) {
if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r",
NULL) < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); return 1;
@@ -592,7 +608,7 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
if (fdtfile) { int err = get_relfile_envaddr(ctx, fdtfile,
"fdt_addr_r");
"fdt_addr_r", NULL); free(fdtfilefree); if (err < 0) {
@@ -1384,7 +1400,7 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg) if (IS_ENABLED(CONFIG_CMD_BMP)) { /* display BMP if available */ if (cfg->bmp) {
if (get_relfile(ctx, cfg->bmp, image_load_addr)) {
if (get_relfile(ctx, cfg->bmp, image_load_addr, NULL)) { if (CONFIG_IS_ENABLED(CMD_CLS)) run_command("cls", 0); bmp_display(image_load_addr,
diff --git a/cmd/pxe.c b/cmd/pxe.c index e319db51ef5..81703386c42 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -25,15 +25,20 @@ const char *pxe_default_paths[] = { };
static int do_get_tftp(struct pxe_context *ctx, const char *file_path,
char *file_addr)
char *file_addr, ulong *sizep)
{ char *tftp_argv[] = {"tftp", NULL, NULL, NULL};
int ret; tftp_argv[1] = file_addr; tftp_argv[2] = (void *)file_path; if (do_tftpb(ctx->cmdtp, 0, 3, tftp_argv)) return -ENOENT;
ret = pxe_get_file_size(sizep);
if (ret)
return log_msg_ret("tftp", ret);
ctx->pxe_file_size = *sizep; return 1;
} diff --git a/cmd/sysboot.c b/cmd/sysboot.c index c45fed774d6..6344ecd357b 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -9,43 +9,58 @@ static char *fs_argv[5];
static int do_get_ext2(struct pxe_context *ctx, const char *file_path,
char *file_addr)
char *file_addr, ulong *sizep)
{ #ifdef CONFIG_CMD_EXT2
int ret;
fs_argv[0] = "ext2load"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path; if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv)) return 1;
ret = pxe_get_file_size(sizep);
if (ret)
return log_msg_ret("tftp", ret);
#endif return -ENOENT; }
static int do_get_fat(struct pxe_context *ctx, const char *file_path,
char *file_addr)
char *file_addr, ulong *sizep)
{ #ifdef CONFIG_CMD_FAT
int ret;
fs_argv[0] = "fatload"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path; if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv)) return 1;
ret = pxe_get_file_size(sizep);
if (ret)
return log_msg_ret("tftp", ret);
#endif return -ENOENT; }
static int do_get_any(struct pxe_context *ctx, const char *file_path,
char *file_addr)
char *file_addr, ulong *sizep)
{ #ifdef CONFIG_CMD_FS_GENERIC
int ret;
fs_argv[0] = "load"; fs_argv[3] = file_addr; fs_argv[4] = (void *)file_path; if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) return 1;
ret = pxe_get_file_size(sizep);
if (ret)
return log_msg_ret("tftp", ret);
#endif return -ENOENT; } diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 8b50f2e6861..194a5ed8cc7 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -77,7 +77,7 @@ struct pxe_menu {
struct pxe_context; typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
char *file_addr);
char *file_addr, ulong *filesizep);
/**
- struct pxe_context - context information for PXE parsing
@@ -88,6 +88,7 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
- @allow_abs_path: true to allow absolute paths
- @bootdir: Directory that files are loaded from ("" if no directory). This is
allocated
*/
- @pxe_file_size: Size of the PXE file
struct pxe_context { struct cmd_tbl *cmdtp; @@ -98,6 +99,7 @@ struct pxe_context { * @file_path: Path to the file * @file_addr: String containing the hex address to put the file in * memory
* @filesizep: Returns the file size in bytes * Return 0 if OK, -ve on error */ pxe_getfile_func getfile;
@@ -105,6 +107,7 @@ struct pxe_context { void *userdata; bool allow_abs_path; char *bootdir;
ulong pxe_file_size;
};
/** @@ -225,4 +228,12 @@ void pxe_destroy_ctx(struct pxe_context *ctx); */ int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt);
+/**
- pxe_get_file_size() - Read the value of the 'filesize' environment variable
- @sizep: Place to put the value
- @return 0 if OK, -ENOENT if no such variable, -EINVAL if format is invalid
- */
+int pxe_get_file_size(ulong *sizep);
#endif /* __PXE_UTILS_H */
2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:08PM -0600, Simon Glass wrote:
It is pretty strange that the pxe code uses the 'filesize' environment variable find the size of a file it has just read.
Partly this is because it uses the command-line interpreter to parse its request to load the file.
As a first step towards unwinding this, return it directly from the getfile() function. This makes the code a bit longer, for now, but will be cleaned up in future patches.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

The only difference between the three helpers is the filesystem type. Factor this out and call the filesystem functions directly, instead of through the command-line interpreter. This allows the file size to be obtained directly, instead of via an environment variable.
We cannot do the same thing with PXE's tftpboot since there is no API at present to obtain information about the file that was read. So there is no point in changing pxe_getfile_func to use a ulong for the address, for example.
This is as far as the refactoring can go for the present.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
cmd/sysboot.c | 94 ++++++++++++++++++++------------------------------- 1 file changed, 36 insertions(+), 58 deletions(-)
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 6344ecd357b..04c07020269 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -6,63 +6,40 @@ #include <fs.h> #include <pxe_utils.h>
-static char *fs_argv[5]; - -static int do_get_ext2(struct pxe_context *ctx, const char *file_path, - char *file_addr, ulong *sizep) +/** + * struct sysboot_info - useful information for sysboot helpers + * + * @fstype: Filesystem type (FS_TYPE_...) + * @ifname: Interface name (e.g. "ide", "scsi") + * @dev_part_str is in the format: + * <dev>.<hw_part>:<part> where <dev> is the device number, + * <hw_part> is the optional hardware partition number and + * <part> is the partition number + */ +struct sysboot_info { + int fstype; + const char *ifname; + const char *dev_part_str; +}; + +static int sysboot_read_file(struct pxe_context *ctx, const char *file_path, + char *file_addr, ulong *sizep) { -#ifdef CONFIG_CMD_EXT2 + struct sysboot_info *info = ctx->userdata; + loff_t len_read; + ulong addr; int ret;
- fs_argv[0] = "ext2load"; - fs_argv[3] = file_addr; - fs_argv[4] = (void *)file_path; - - if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv)) - return 1; - ret = pxe_get_file_size(sizep); + addr = simple_strtoul(file_addr, NULL, 16); + ret = fs_set_blk_dev(info->ifname, info->dev_part_str, info->fstype); if (ret) - return log_msg_ret("tftp", ret); -#endif - return -ENOENT; -} - -static int do_get_fat(struct pxe_context *ctx, const char *file_path, - char *file_addr, ulong *sizep) -{ -#ifdef CONFIG_CMD_FAT - int ret; - - fs_argv[0] = "fatload"; - fs_argv[3] = file_addr; - fs_argv[4] = (void *)file_path; - - if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv)) - return 1; - ret = pxe_get_file_size(sizep); + return ret; + ret = fs_read(file_path, addr, 0, 0, &len_read); if (ret) - return log_msg_ret("tftp", ret); -#endif - return -ENOENT; -} - -static int do_get_any(struct pxe_context *ctx, const char *file_path, - char *file_addr, ulong *sizep) -{ -#ifdef CONFIG_CMD_FS_GENERIC - int ret; - - fs_argv[0] = "load"; - fs_argv[3] = file_addr; - fs_argv[4] = (void *)file_path; + return ret; + *sizep = len_read;
- if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY)) - return 1; - ret = pxe_get_file_size(sizep); - if (ret) - return log_msg_ret("tftp", ret); -#endif - return -ENOENT; + return 0; }
/* @@ -74,9 +51,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r; - pxe_getfile_func getfile; struct pxe_context ctx; char *pxefile_addr_str; + struct sysboot_info info; char *filename; int prompt = 0; int ret; @@ -106,24 +83,25 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, }
if (strstr(argv[3], "ext2")) { - getfile = do_get_ext2; + info.fstype = FS_TYPE_EXT; } else if (strstr(argv[3], "fat")) { - getfile = do_get_fat; + info.fstype = FS_TYPE_FAT; } else if (strstr(argv[3], "any")) { - getfile = do_get_any; + info.fstype = FS_TYPE_ANY; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1; } - fs_argv[1] = argv[1]; - fs_argv[2] = argv[2]; + info.ifname = argv[1]; + info.dev_part_str = argv[2];
if (strict_strtoul(pxefile_addr_str, 16, &pxefile_addr_r) < 0) { printf("Invalid pxefile address: %s\n", pxefile_addr_str); return 1; }
- if (pxe_setup_ctx(&ctx, cmdtp, getfile, NULL, true, filename)) { + if (pxe_setup_ctx(&ctx, cmdtp, sysboot_read_file, &info, true, + filename)) { printf("Out of memory\n"); return CMD_RET_FAILURE; }

OK is clear
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:51 PM Simon Glass sjg@chromium.org wrote:
The only difference between the three helpers is the filesystem type. Factor this out and call the filesystem functions directly, instead of through the command-line interpreter. This allows the file size to be obtained directly, instead of via an environment variable.
We cannot do the same thing with PXE's tftpboot since there is no API at present to obtain information about the file that was read. So there is no point in changing pxe_getfile_func to use a ulong for the address, for example.
This is as far as the refactoring can go for the present.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
cmd/sysboot.c | 94 ++++++++++++++++++++------------------------------- 1 file changed, 36 insertions(+), 58 deletions(-)
diff --git a/cmd/sysboot.c b/cmd/sysboot.c index 6344ecd357b..04c07020269 100644 --- a/cmd/sysboot.c +++ b/cmd/sysboot.c @@ -6,63 +6,40 @@ #include <fs.h> #include <pxe_utils.h>
-static char *fs_argv[5];
-static int do_get_ext2(struct pxe_context *ctx, const char *file_path,
char *file_addr, ulong *sizep)
+/**
- struct sysboot_info - useful information for sysboot helpers
- @fstype: Filesystem type (FS_TYPE_...)
- @ifname: Interface name (e.g. "ide", "scsi")
- @dev_part_str is in the format:
<dev>.<hw_part>:<part> where <dev> is the device number,
<hw_part> is the optional hardware partition number and
<part> is the partition number
- */
+struct sysboot_info {
int fstype;
const char *ifname;
const char *dev_part_str;
+};
+static int sysboot_read_file(struct pxe_context *ctx, const char *file_path,
char *file_addr, ulong *sizep)
{ -#ifdef CONFIG_CMD_EXT2
struct sysboot_info *info = ctx->userdata;
loff_t len_read;
ulong addr; int ret;
fs_argv[0] = "ext2load";
fs_argv[3] = file_addr;
fs_argv[4] = (void *)file_path;
if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv))
return 1;
ret = pxe_get_file_size(sizep);
addr = simple_strtoul(file_addr, NULL, 16);
ret = fs_set_blk_dev(info->ifname, info->dev_part_str, info->fstype); if (ret)
return log_msg_ret("tftp", ret);
-#endif
return -ENOENT;
-}
-static int do_get_fat(struct pxe_context *ctx, const char *file_path,
char *file_addr, ulong *sizep)
-{ -#ifdef CONFIG_CMD_FAT
int ret;
fs_argv[0] = "fatload";
fs_argv[3] = file_addr;
fs_argv[4] = (void *)file_path;
if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv))
return 1;
ret = pxe_get_file_size(sizep);
return ret;
ret = fs_read(file_path, addr, 0, 0, &len_read); if (ret)
return log_msg_ret("tftp", ret);
-#endif
return -ENOENT;
-}
-static int do_get_any(struct pxe_context *ctx, const char *file_path,
char *file_addr, ulong *sizep)
-{ -#ifdef CONFIG_CMD_FS_GENERIC
int ret;
fs_argv[0] = "load";
fs_argv[3] = file_addr;
fs_argv[4] = (void *)file_path;
return ret;
*sizep = len_read;
if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY))
return 1;
ret = pxe_get_file_size(sizep);
if (ret)
return log_msg_ret("tftp", ret);
-#endif
return -ENOENT;
return 0;
}
/* @@ -74,9 +51,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { unsigned long pxefile_addr_r;
pxe_getfile_func getfile; struct pxe_context ctx; char *pxefile_addr_str;
struct sysboot_info info; char *filename; int prompt = 0; int ret;
@@ -106,24 +83,25 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc, }
if (strstr(argv[3], "ext2")) {
getfile = do_get_ext2;
info.fstype = FS_TYPE_EXT; } else if (strstr(argv[3], "fat")) {
getfile = do_get_fat;
info.fstype = FS_TYPE_FAT; } else if (strstr(argv[3], "any")) {
getfile = do_get_any;
info.fstype = FS_TYPE_ANY; } else { printf("Invalid filesystem: %s\n", argv[3]); return 1; }
fs_argv[1] = argv[1];
fs_argv[2] = argv[2];
info.ifname = argv[1];
info.dev_part_str = argv[2]; if (strict_strtoul(pxefile_addr_str, 16, &pxefile_addr_r) < 0) { printf("Invalid pxefile address: %s\n", pxefile_addr_str); return 1; }
if (pxe_setup_ctx(&ctx, cmdtp, getfile, NULL, true, filename)) {
if (pxe_setup_ctx(&ctx, cmdtp, sysboot_read_file, &info, true,
filename)) { printf("Out of memory\n"); return CMD_RET_FAILURE; }
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:09PM -0600, Simon Glass wrote:
The only difference between the three helpers is the filesystem type. Factor this out and call the filesystem functions directly, instead of through the command-line interpreter. This allows the file size to be obtained directly, instead of via an environment variable.
We cannot do the same thing with PXE's tftpboot since there is no API at present to obtain information about the file that was read. So there is no point in changing pxe_getfile_func to use a ulong for the address, for example.
This is as far as the refactoring can go for the present.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Move this over to the new rST format.
Signed-off-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
doc/{README.distro => develop/distro.rst} | 177 ++++++++++------------ doc/develop/index.rst | 1 + 2 files changed, 80 insertions(+), 98 deletions(-) rename doc/{README.distro => develop/distro.rst} (76%)
diff --git a/doc/README.distro b/doc/develop/distro.rst similarity index 76% rename from doc/README.distro rename to doc/develop/distro.rst index fa8cec11028..c522be69349 100644 --- a/doc/README.distro +++ b/doc/develop/distro.rst @@ -1,9 +1,4 @@ -SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2014 Red Hat Inc. - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. - * Copyright (C) 2015 K. Merker merker@debian.org - */ +.. SPDX-License-Identifier: GPL-2.0+
Generic Distro Configuration Concept ==================================== @@ -73,9 +68,8 @@ Boot Configuration Files
The standard format for boot configuration files is that of extlinux.conf, as handled by U-Boot's "syslinux" (disk) or "pxe boot" (network). This is roughly -as specified at: +as specified at BootLoaderSpec_:
-http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/
... with the exceptions that the BootLoaderSpec document:
@@ -87,73 +81,70 @@ http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ * Does not document the fdtdir option, which automatically selects the DTB to pass to the kernel.
-One example extlinux.conf generated by the Fedora installer is: +One example extlinux.conf generated by the Fedora installer is::
------------------------------------------------------------- -# extlinux.conf generated by anaconda + # extlinux.conf generated by anaconda
-ui menu.c32 + ui menu.c32
-menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options. -menu title Fedora Boot Options. -menu hidden + menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options. + menu title Fedora Boot Options. + menu hidden
-timeout 50 -#totaltimeout 9000 + timeout 50 + #totaltimeout 9000
-default Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide) + default Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide)
-label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl) 22 (Rawhide) - kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl - append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf - fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl - initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl.img + label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl) 22 (Rawhide) + kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl + append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf + fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl + initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl.img
-label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide) - kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae - append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf - fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae - initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae.img + label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide) + kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae + append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf + fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae + initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae.img
-label Fedora-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc (0-rescue-8f6ba7b039524e0eb957d2c9203f04bc) - kernel /boot/vmlinuz-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc - initrd /boot/initramfs-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc.img - append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 - fdtdir /boot/dtb-3.16.0-0.rc6.git1.1.fc22.armv7hl+lpae ------------------------------------------------------------- + label Fedora-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc (0-rescue-8f6ba7b039524e0eb957d2c9203f04bc) + kernel /boot/vmlinuz-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc + initrd /boot/initramfs-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc.img + append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 + fdtdir /boot/dtb-3.16.0-0.rc6.git1.1.fc22.armv7hl+lpae
-Another hand-crafted network boot configuration file is:
------------------------------------------------------------- -TIMEOUT 100 +Another hand-crafted network boot configuration file is::
-MENU TITLE TFTP boot options + TIMEOUT 100
-LABEL jetson-tk1-emmc - MENU LABEL ../zImage root on Jetson TK1 eMMC - LINUX ../zImage - FDTDIR ../ - APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=80a5a8e9-c744-491a-93c1-4f4194fd690b + MENU TITLE TFTP boot options
-LABEL venice2-emmc - MENU LABEL ../zImage root on Venice2 eMMC - LINUX ../zImage - FDTDIR ../ - APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=5f71e06f-be08-48ed-b1ef-ee4800cc860f + LABEL jetson-tk1-emmc + MENU LABEL ../zImage root on Jetson TK1 eMMC + LINUX ../zImage + FDTDIR ../ + APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=80a5a8e9-c744-491a-93c1-4f4194fd690b
-LABEL sdcard - MENU LABEL ../zImage, root on 2GB sdcard - LINUX ../zImage - FDTDIR ../ - APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=b2f82cda-2535-4779-b467-094a210fbae7 + LABEL venice2-emmc + MENU LABEL ../zImage root on Venice2 eMMC + LINUX ../zImage + FDTDIR ../ + APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=5f71e06f-be08-48ed-b1ef-ee4800cc860f
-LABEL fedora-installer-fk - MENU LABEL Fedora installer w/ Fedora kernel - LINUX fedora-installer/vmlinuz - INITRD fedora-installer/initrd.img.orig - FDTDIR fedora-installer/dtb - APPEND loglevel=8 ip=dhcp inst.repo=http://10.0.0.2/mirrors/fedora/linux/development/rawhide/armhfp/os/ rd.shell cma=64M ------------------------------------------------------------- + LABEL sdcard + MENU LABEL ../zImage, root on 2GB sdcard + LINUX ../zImage + FDTDIR ../ + APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=b2f82cda-2535-4779-b467-094a210fbae7 + + LABEL fedora-installer-fk + MENU LABEL Fedora installer w/ Fedora kernel + LINUX fedora-installer/vmlinuz + INITRD fedora-installer/initrd.img.orig + FDTDIR fedora-installer/dtb + APPEND loglevel=8 ip=dhcp inst.repo=http://10.0.0.2/mirrors/fedora/linux/development/rawhide/armhfp/os/ rd.shell cma=64M
U-Boot Implementation ===================== @@ -166,13 +157,11 @@ a line with "CONFIG_DISTRO_DEFAULTS=y". If you want to enable this from Kconfig itself, for e.g. all boards using a specific SoC then add a "imply DISTRO_DEFAULTS" to your SoC CONFIG option.
-In your board configuration file, include the following: +In your board configuration file, include the following::
------------------------------------------------------------- -#ifndef CONFIG_SPL_BUILD -#include <config_distro_bootcmd.h> -#endif ------------------------------------------------------------- + #ifndef CONFIG_SPL_BUILD + #include <config_distro_bootcmd.h> + #endif
The first of those headers primarily enables a core set of U-Boot features, such as support for MBR and GPT partitions, ext* and FAT filesystems, booting @@ -205,7 +194,6 @@ CONFIG_EXTRA_ENV_SETTINGS in the board's U-Boot configuration file, so that the user doesn't have to configure them.
fdt_addr: - Mandatory for any system that provides the DTB in HW (e.g. ROM) and wishes to pass that DTB to Linux, rather than loading a DTB from the boot filesystem. Prohibited for any other system. @@ -214,7 +202,6 @@ fdt_addr: address.
fdt_addr_r: - Mandatory. The location in RAM where the DTB will be loaded or copied to when processing the fdtdir/devicetreedir or fdt/devicetree options in extlinux.conf. @@ -225,7 +212,6 @@ fdt_addr_r: A size of 1MB for the FDT/DTB seems reasonable.
fdtfile: - Mandatory. the name of the DTB file for the specific board for instance the espressobin v5 board the value is "marvell/armada-3720-espressobin.dtb" while on a clearfog pro it is "armada-388-clearfog-pro.dtb" in the case of @@ -236,16 +222,14 @@ fdtfile: SoC vendor directories.
ramdisk_addr_r: - Mandatory. The location in RAM where the initial ramdisk will be loaded to when processing the initrd option in extlinux.conf.
- It is recommended that this location be highest in RAM out of fdt_addr_, + It is recommended that this location be highest in RAM out of fdt_addr_r, kernel_addr_r, and ramdisk_addr_r, so that the RAM disk can vary in size and use any available RAM.
kernel_addr_r: - Mandatory. The location in RAM where the kernel will be loaded to when processing the kernel option in the extlinux.conf.
@@ -270,14 +254,12 @@ kernel_comp_size: size has to at least the size of loaded image for decompression to succeed.
pxefile_addr_r: - Mandatory. The location in RAM where extlinux.conf will be loaded to prior to processing.
A size of 1MB for extlinux.conf is more than adequate.
scriptaddr: - Mandatory, if the boot script is boot.scr rather than extlinux.conf. The location in RAM where boot.scr will be loaded to prior to execution.
@@ -292,24 +274,22 @@ MEM_LAYOUT_ENV_SETTINGS in include/configs/tegra124-common.h. Boot Target Configuration -------------------------
-<config_distro_bootcmd.h> defines $bootcmd and many helper command variables -that automatically search attached disks for boot configuration files and -execute them. Boards must provide configure <config_distro_bootcmd.h> so that -it supports the correct set of possible boot device types. To provide this +The `config_distro_bootcmd.h` file defines $bootcmd and many helper command +variables that automatically search attached disks for boot configuration files +and execute them. Boards must provide configure <config_distro_bootcmd.h> so +that it supports the correct set of possible boot device types. To provide this configuration, simply define macro BOOT_TARGET_DEVICES prior to including -<config_distro_bootcmd.h>. For example: - ------------------------------------------------------------- -#ifndef CONFIG_SPL_BUILD -#define BOOT_TARGET_DEVICES(func) \ - func(MMC, mmc, 1) \ - func(MMC, mmc, 0) \ - func(USB, usb, 0) \ - func(PXE, pxe, na) \ - func(DHCP, dhcp, na) -#include <config_distro_bootcmd.h> -#endif ------------------------------------------------------------- +<config_distro_bootcmd.h>. For example:: + + #ifndef CONFIG_SPL_BUILD + #define BOOT_TARGET_DEVICES(func) \ + func(MMC, mmc, 1) \ + func(MMC, mmc, 0) \ + func(USB, usb, 0) \ + func(PXE, pxe, na) \ + func(DHCP, dhcp, na) + #include <config_distro_bootcmd.h> + #endif
Each entry in the macro defines a single boot device (e.g. a specific eMMC device or SD card) or type of boot device (e.g. USB disk). The parameters to @@ -328,7 +308,6 @@ up by <config_distro_bootcmd.h>. After this, various environment variables may be altered to influence the boot process:
boot_targets: - The list of boot locations searched.
Example: mmc0, mmc1, usb, pxe @@ -336,7 +315,6 @@ boot_targets: Entries may be removed or re-ordered in this list to affect the boot order.
boot_prefixes: - For disk-based booting, the list of directories within a partition that are searched for boot configuration files (extlinux.conf, boot.scr).
@@ -346,7 +324,6 @@ boot_prefixes: directories which are searched.
boot_scripts: - The name of U-Boot style boot.scr files that $bootcmd searches for.
Example: boot.scr.uimg boot.scr @@ -358,17 +335,14 @@ boot_scripts: filenames which are supported.
scan_dev_for_extlinux: - If you want to disable extlinux.conf on all disks, set the value to something innocuous, e.g. setenv scan_dev_for_extlinux true.
scan_dev_for_scripts: - If you want to disable boot.scr on all disks, set the value to something innocuous, e.g. setenv scan_dev_for_scripts true.
boot_net_usb_start: - If you want to prevent USB enumeration by distro boot commands which execute network operations, set the value to something innocuous, e.g. setenv boot_net_usb_start true. This would be useful if you know your Ethernet @@ -376,7 +350,6 @@ boot_net_usb_start: avoiding unnecessary actions.
boot_net_pci_enum: - If you want to prevent PCI enumeration by distro boot commands which execute network operations, set the value to something innocuous, e.g. setenv boot_net_pci_enum true. This would be useful if you know your Ethernet @@ -412,10 +385,12 @@ Examples: The list of possible targets consists of:
- network targets + * dhcp * pxe
- storage targets (to which a device number must be appended) + * mmc * sata * scsi @@ -428,3 +403,9 @@ of the boot environment and are not guaranteed to exist or work in the same way in future u-boot versions. In particular the <device type>_boot variables (e.g. mmc_boot, usb_boot) are a strictly internal implementation detail and must not be used as a public interface. + +.. _BootLoaderSpec: http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ + +.. sectionauthor:: (C) Copyright 2014 Red Hat Inc. +.. sectionauthor:: Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. +.. sectionauthor:: Copyright (C) 2015 K. Merker merker@debian.org diff --git a/doc/develop/index.rst b/doc/develop/index.rst index 5e064a4dac1..b3871b16f35 100644 --- a/doc/develop/index.rst +++ b/doc/develop/index.rst @@ -14,6 +14,7 @@ Implementation commands config_binding devicetree/index + distro driver-model/index global_data logging

OK
Reviewed on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:52 PM Simon Glass sjg@chromium.org wrote:
Move this over to the new rST format.
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v1)
doc/{README.distro => develop/distro.rst} | 177 ++++++++++------------ doc/develop/index.rst | 1 + 2 files changed, 80 insertions(+), 98 deletions(-) rename doc/{README.distro => develop/distro.rst} (76%)
diff --git a/doc/README.distro b/doc/develop/distro.rst similarity index 76% rename from doc/README.distro rename to doc/develop/distro.rst index fa8cec11028..c522be69349 100644 --- a/doc/README.distro +++ b/doc/develop/distro.rst @@ -1,9 +1,4 @@ -SPDX-License-Identifier: GPL-2.0+ -/*
- (C) Copyright 2014 Red Hat Inc.
- Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
- Copyright (C) 2015 K. Merker merker@debian.org
- */
+.. SPDX-License-Identifier: GPL-2.0+
Generic Distro Configuration Concept
@@ -73,9 +68,8 @@ Boot Configuration Files
The standard format for boot configuration files is that of extlinux.conf, as handled by U-Boot's "syslinux" (disk) or "pxe boot" (network). This is roughly -as specified at: +as specified at BootLoaderSpec_:
-http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/
... with the exceptions that the BootLoaderSpec document:
@@ -87,73 +81,70 @@ http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/
- Does not document the fdtdir option, which automatically selects the DTB to pass to the kernel.
-One example extlinux.conf generated by the Fedora installer is: +One example extlinux.conf generated by the Fedora installer is::
-# extlinux.conf generated by anaconda
- # extlinux.conf generated by anaconda
-ui menu.c32
- ui menu.c32
-menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options. -menu title Fedora Boot Options. -menu hidden
- menu autoboot Welcome to Fedora. Automatic boot in # second{,s}. Press a key for options.
- menu title Fedora Boot Options.
- menu hidden
-timeout 50 -#totaltimeout 9000
- timeout 50
- #totaltimeout 9000
-default Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide)
- default Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide)
-label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl) 22 (Rawhide)
kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf
fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl
initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl.img
- label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl) 22 (Rawhide)
kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf
fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl
initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl.img
-label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide)
kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf
fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae
initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae.img
- label Fedora (3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae) 22 (Rawhide)
kernel /boot/vmlinuz-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8 LANG=en_US.UTF-8 drm.debug=0xf
fdtdir /boot/dtb-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae
initrd /boot/initramfs-3.17.0-0.rc4.git2.1.fc22.armv7hl+lpae.img
-label Fedora-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc (0-rescue-8f6ba7b039524e0eb957d2c9203f04bc)
kernel /boot/vmlinuz-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc
initrd /boot/initramfs-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc.img
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8
fdtdir /boot/dtb-3.16.0-0.rc6.git1.1.fc22.armv7hl+lpae
- label Fedora-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc (0-rescue-8f6ba7b039524e0eb957d2c9203f04bc)
kernel /boot/vmlinuz-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc
initrd /boot/initramfs-0-rescue-8f6ba7b039524e0eb957d2c9203f04bc.img
append ro root=UUID=8eac677f-8ea8-4270-8479-d5ddbb797450 console=ttyS0,115200n8
fdtdir /boot/dtb-3.16.0-0.rc6.git1.1.fc22.armv7hl+lpae
-Another hand-crafted network boot configuration file is:
-TIMEOUT 100 +Another hand-crafted network boot configuration file is::
-MENU TITLE TFTP boot options
- TIMEOUT 100
-LABEL jetson-tk1-emmc
MENU LABEL ../zImage root on Jetson TK1 eMMC
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=80a5a8e9-c744-491a-93c1-4f4194fd690b
- MENU TITLE TFTP boot options
-LABEL venice2-emmc
MENU LABEL ../zImage root on Venice2 eMMC
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=5f71e06f-be08-48ed-b1ef-ee4800cc860f
- LABEL jetson-tk1-emmc
MENU LABEL ../zImage root on Jetson TK1 eMMC
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=80a5a8e9-c744-491a-93c1-4f4194fd690b
-LABEL sdcard
MENU LABEL ../zImage, root on 2GB sdcard
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=b2f82cda-2535-4779-b467-094a210fbae7
- LABEL venice2-emmc
MENU LABEL ../zImage root on Venice2 eMMC
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=5f71e06f-be08-48ed-b1ef-ee4800cc860f
-LABEL fedora-installer-fk
MENU LABEL Fedora installer w/ Fedora kernel
LINUX fedora-installer/vmlinuz
INITRD fedora-installer/initrd.img.orig
FDTDIR fedora-installer/dtb
APPEND loglevel=8 ip=dhcp inst.repo=http://10.0.0.2/mirrors/fedora/linux/development/rawhide/armhfp/os/ rd.shell cma=64M
- LABEL sdcard
MENU LABEL ../zImage, root on 2GB sdcard
LINUX ../zImage
FDTDIR ../
APPEND console=ttyS0,115200n8 console=tty1 loglevel=8 rootwait rw earlyprintk root=PARTUUID=b2f82cda-2535-4779-b467-094a210fbae7
- LABEL fedora-installer-fk
MENU LABEL Fedora installer w/ Fedora kernel
LINUX fedora-installer/vmlinuz
INITRD fedora-installer/initrd.img.orig
FDTDIR fedora-installer/dtb
APPEND loglevel=8 ip=dhcp inst.repo=http://10.0.0.2/mirrors/fedora/linux/development/rawhide/armhfp/os/ rd.shell cma=64M
U-Boot Implementation
@@ -166,13 +157,11 @@ a line with "CONFIG_DISTRO_DEFAULTS=y". If you want to enable this from Kconfig itself, for e.g. all boards using a specific SoC then add a "imply DISTRO_DEFAULTS" to your SoC CONFIG option.
-In your board configuration file, include the following: +In your board configuration file, include the following::
-#ifndef CONFIG_SPL_BUILD -#include <config_distro_bootcmd.h>
-#endif
- #ifndef CONFIG_SPL_BUILD
- #include <config_distro_bootcmd.h>
- #endif
The first of those headers primarily enables a core set of U-Boot features, such as support for MBR and GPT partitions, ext* and FAT filesystems, booting @@ -205,7 +194,6 @@ CONFIG_EXTRA_ENV_SETTINGS in the board's U-Boot configuration file, so that the user doesn't have to configure them.
fdt_addr:
- Mandatory for any system that provides the DTB in HW (e.g. ROM) and wishes to pass that DTB to Linux, rather than loading a DTB from the boot filesystem. Prohibited for any other system.
@@ -214,7 +202,6 @@ fdt_addr: address.
fdt_addr_r:
- Mandatory. The location in RAM where the DTB will be loaded or copied to when processing the fdtdir/devicetreedir or fdt/devicetree options in extlinux.conf.
@@ -225,7 +212,6 @@ fdt_addr_r: A size of 1MB for the FDT/DTB seems reasonable.
fdtfile:
- Mandatory. the name of the DTB file for the specific board for instance the espressobin v5 board the value is "marvell/armada-3720-espressobin.dtb" while on a clearfog pro it is "armada-388-clearfog-pro.dtb" in the case of
@@ -236,16 +222,14 @@ fdtfile: SoC vendor directories.
ramdisk_addr_r:
Mandatory. The location in RAM where the initial ramdisk will be loaded to when processing the initrd option in extlinux.conf.
It is recommended that this location be highest in RAM out of fdt_addr_,
- It is recommended that this location be highest in RAM out of fdt_addr_r, kernel_addr_r, and ramdisk_addr_r, so that the RAM disk can vary in size and use any available RAM.
kernel_addr_r:
- Mandatory. The location in RAM where the kernel will be loaded to when processing the kernel option in the extlinux.conf.
@@ -270,14 +254,12 @@ kernel_comp_size: size has to at least the size of loaded image for decompression to succeed.
pxefile_addr_r:
Mandatory. The location in RAM where extlinux.conf will be loaded to prior to processing.
A size of 1MB for extlinux.conf is more than adequate.
scriptaddr:
- Mandatory, if the boot script is boot.scr rather than extlinux.conf. The location in RAM where boot.scr will be loaded to prior to execution.
@@ -292,24 +274,22 @@ MEM_LAYOUT_ENV_SETTINGS in include/configs/tegra124-common.h. Boot Target Configuration
-<config_distro_bootcmd.h> defines $bootcmd and many helper command variables -that automatically search attached disks for boot configuration files and -execute them. Boards must provide configure <config_distro_bootcmd.h> so that -it supports the correct set of possible boot device types. To provide this +The `config_distro_bootcmd.h` file defines $bootcmd and many helper command +variables that automatically search attached disks for boot configuration files +and execute them. Boards must provide configure <config_distro_bootcmd.h> so +that it supports the correct set of possible boot device types. To provide this configuration, simply define macro BOOT_TARGET_DEVICES prior to including -<config_distro_bootcmd.h>. For example:
-#ifndef CONFIG_SPL_BUILD -#define BOOT_TARGET_DEVICES(func) \
func(MMC, mmc, 1) \
func(MMC, mmc, 0) \
func(USB, usb, 0) \
func(PXE, pxe, na) \
func(DHCP, dhcp, na)
-#include <config_distro_bootcmd.h>
-#endif
+<config_distro_bootcmd.h>. For example::
- #ifndef CONFIG_SPL_BUILD
- #define BOOT_TARGET_DEVICES(func) \
func(MMC, mmc, 1) \
func(MMC, mmc, 0) \
func(USB, usb, 0) \
func(PXE, pxe, na) \
func(DHCP, dhcp, na)
- #include <config_distro_bootcmd.h>
- #endif
Each entry in the macro defines a single boot device (e.g. a specific eMMC device or SD card) or type of boot device (e.g. USB disk). The parameters to @@ -328,7 +308,6 @@ up by <config_distro_bootcmd.h>. After this, various environment variables may be altered to influence the boot process:
boot_targets:
The list of boot locations searched.
Example: mmc0, mmc1, usb, pxe
@@ -336,7 +315,6 @@ boot_targets: Entries may be removed or re-ordered in this list to affect the boot order.
boot_prefixes:
- For disk-based booting, the list of directories within a partition that are searched for boot configuration files (extlinux.conf, boot.scr).
@@ -346,7 +324,6 @@ boot_prefixes: directories which are searched.
boot_scripts:
The name of U-Boot style boot.scr files that $bootcmd searches for.
Example: boot.scr.uimg boot.scr
@@ -358,17 +335,14 @@ boot_scripts: filenames which are supported.
scan_dev_for_extlinux:
- If you want to disable extlinux.conf on all disks, set the value to something innocuous, e.g. setenv scan_dev_for_extlinux true.
scan_dev_for_scripts:
- If you want to disable boot.scr on all disks, set the value to something innocuous, e.g. setenv scan_dev_for_scripts true.
boot_net_usb_start:
- If you want to prevent USB enumeration by distro boot commands which execute network operations, set the value to something innocuous, e.g. setenv boot_net_usb_start true. This would be useful if you know your Ethernet
@@ -376,7 +350,6 @@ boot_net_usb_start: avoiding unnecessary actions.
boot_net_pci_enum:
- If you want to prevent PCI enumeration by distro boot commands which execute network operations, set the value to something innocuous, e.g. setenv boot_net_pci_enum true. This would be useful if you know your Ethernet
@@ -412,10 +385,12 @@ Examples: The list of possible targets consists of:
- network targets
- dhcp
- pxe
- storage targets (to which a device number must be appended)
- mmc
- sata
- scsi
@@ -428,3 +403,9 @@ of the boot environment and are not guaranteed to exist or work in the same way in future u-boot versions. In particular the <device type>_boot variables (e.g. mmc_boot, usb_boot) are a strictly internal implementation detail and must not be used as a public interface.
+.. _BootLoaderSpec: http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/
+.. sectionauthor:: (C) Copyright 2014 Red Hat Inc. +.. sectionauthor:: Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. +.. sectionauthor:: Copyright (C) 2015 K. Merker merker@debian.org diff --git a/doc/develop/index.rst b/doc/develop/index.rst index 5e064a4dac1..b3871b16f35 100644 --- a/doc/develop/index.rst +++ b/doc/develop/index.rst @@ -14,6 +14,7 @@ Implementation commands config_binding devicetree/index
- distro driver-model/index global_data logging
-- 2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:10PM -0600, Simon Glass wrote:
Move this over to the new rST format.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

Refactor this code so that we can call the 'pxe get' command without going through the command-line interpreter. This makes it easier to get the information we need, without going through environment variables.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v3: - Rebase to -master
Changes in v2: - Rebase to -next - Split out from the bootmethod patches
cmd/pxe.c | 92 +++++++++++++++++++++++++++++---------------- include/pxe_utils.h | 14 +++++++ 2 files changed, 73 insertions(+), 33 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 81703386c42..db8e4697f24 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -104,6 +104,49 @@ static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_
return -ENOENT; } + +int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep) +{ + struct cmd_tbl cmdtp[] = {}; /* dummy */ + struct pxe_context ctx; + int i; + + if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false, + env_get("bootfile"))) + return -ENOMEM; + /* + * Keep trying paths until we successfully get a file we're looking + * for. + */ + if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 || + pxe_mac_path(&ctx, pxefile_addr_r) > 0 || + pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) + goto done; + + i = 0; + while (pxe_default_paths[i]) { + if (get_pxelinux_path(&ctx, pxe_default_paths[i], + pxefile_addr_r) > 0) + goto done; + i++; + } + + pxe_destroy_ctx(&ctx); + + return -ENOENT; +done: + *bootdirp = env_get("bootfile"); + + /* + * The PXE file size is returned but not the name. It is probably not + * that useful. + */ + *sizep = ctx.pxe_file_size; + pxe_destroy_ctx(&ctx); + + return 0; +} + /* * Entry point for the 'pxe get' command. * This Follows pxelinux's rules to download a config file from a tftp server. @@ -122,9 +165,10 @@ static int do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *pxefile_addr_str; - unsigned long pxefile_addr_r; - struct pxe_context ctx; - int err, i = 0; + ulong pxefile_addr_r; + char *fname; + ulong size; + int ret;
if (argc != 1) return CMD_RET_USAGE; @@ -134,43 +178,25 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (!pxefile_addr_str) return 1;
- err = strict_strtoul(pxefile_addr_str, 16, + ret = strict_strtoul(pxefile_addr_str, 16, (unsigned long *)&pxefile_addr_r); - if (err < 0) + if (ret < 0) return 1;
- if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false, - env_get("bootfile"))) { + ret = pxe_get(pxefile_addr_r, &fname, &size); + switch (ret) { + case 0: + printf("Config file '%s' found\n", fname); + break; + case -ENOMEM: printf("Out of memory\n"); return CMD_RET_FAILURE; + default: + printf("Config file not found\n"); + return CMD_RET_FAILURE; } - /* - * Keep trying paths until we successfully get a file we're looking - * for. - */ - if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 || - pxe_mac_path(&ctx, pxefile_addr_r) > 0 || - pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) { - printf("Config file found\n"); - pxe_destroy_ctx(&ctx); - - return 0; - } - - while (pxe_default_paths[i]) { - if (get_pxelinux_path(&ctx, pxe_default_paths[i], - pxefile_addr_r) > 0) { - printf("Config file found\n"); - pxe_destroy_ctx(&ctx); - return 0; - } - i++; - } - - printf("Config file not found\n"); - pxe_destroy_ctx(&ctx);
- return 1; + return 0; }
/* diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 194a5ed8cc7..b7037f841a6 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -236,4 +236,18 @@ int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt); */ int pxe_get_file_size(ulong *sizep);
+/** + * pxe_get() - Get the PXE file from the server + * + * This tries various filenames to obtain a PXE file + * + * @pxefile_addr_r: Address to put file + * @bootdirp: Returns the boot filename, or NULL if none. This is the 'bootfile' + * option provided by the DHCP server. If none, returns NULL. For example, + * "rpi/info", which indicates that all files should be fetched from the + * "rpi/" subdirectory + * @sizep: Size of the PXE file (not bootfile) + */ +int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep); + #endif /* __PXE_UTILS_H */

OK nice its will be usefull
Reviewed and Tested on -master Mon 18 Oct 2021 04:40:29 PM CST Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com

On Thu, Oct 14, 2021 at 9:51 PM Simon Glass sjg@chromium.org wrote:
Refactor this code so that we can call the 'pxe get' command without going through the command-line interpreter. This makes it easier to get the information we need, without going through environment variables.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v3:
- Rebase to -master
Changes in v2:
- Rebase to -next
- Split out from the bootmethod patches
cmd/pxe.c | 92 +++++++++++++++++++++++++++++---------------- include/pxe_utils.h | 14 +++++++ 2 files changed, 73 insertions(+), 33 deletions(-)
diff --git a/cmd/pxe.c b/cmd/pxe.c index 81703386c42..db8e4697f24 100644 --- a/cmd/pxe.c +++ b/cmd/pxe.c @@ -104,6 +104,49 @@ static int pxe_ipaddr_paths(struct pxe_context *ctx, unsigned long pxefile_addr_
return -ENOENT;
}
+int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep) +{
struct cmd_tbl cmdtp[] = {}; /* dummy */
struct pxe_context ctx;
int i;
if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
env_get("bootfile")))
return -ENOMEM;
/*
* Keep trying paths until we successfully get a file we're looking
* for.
*/
if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0)
goto done;
i = 0;
while (pxe_default_paths[i]) {
if (get_pxelinux_path(&ctx, pxe_default_paths[i],
pxefile_addr_r) > 0)
goto done;
i++;
}
pxe_destroy_ctx(&ctx);
return -ENOENT;
+done:
*bootdirp = env_get("bootfile");
/*
* The PXE file size is returned but not the name. It is probably not
* that useful.
*/
*sizep = ctx.pxe_file_size;
pxe_destroy_ctx(&ctx);
return 0;
+}
/*
- Entry point for the 'pxe get' command.
- This Follows pxelinux's rules to download a config file from a tftp server.
@@ -122,9 +165,10 @@ static int do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { char *pxefile_addr_str;
unsigned long pxefile_addr_r;
struct pxe_context ctx;
int err, i = 0;
ulong pxefile_addr_r;
char *fname;
ulong size;
int ret; if (argc != 1) return CMD_RET_USAGE;
@@ -134,43 +178,25 @@ do_pxe_get(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) if (!pxefile_addr_str) return 1;
err = strict_strtoul(pxefile_addr_str, 16,
ret = strict_strtoul(pxefile_addr_str, 16, (unsigned long *)&pxefile_addr_r);
if (err < 0)
if (ret < 0) return 1;
if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
env_get("bootfile"))) {
ret = pxe_get(pxefile_addr_r, &fname, &size);
switch (ret) {
case 0:
printf("Config file '%s' found\n", fname);
break;
case -ENOMEM: printf("Out of memory\n"); return CMD_RET_FAILURE;
default:
printf("Config file not found\n");
return CMD_RET_FAILURE; }
/*
* Keep trying paths until we successfully get a file we're looking
* for.
*/
if (pxe_uuid_path(&ctx, pxefile_addr_r) > 0 ||
pxe_mac_path(&ctx, pxefile_addr_r) > 0 ||
pxe_ipaddr_paths(&ctx, pxefile_addr_r) > 0) {
printf("Config file found\n");
pxe_destroy_ctx(&ctx);
return 0;
}
while (pxe_default_paths[i]) {
if (get_pxelinux_path(&ctx, pxe_default_paths[i],
pxefile_addr_r) > 0) {
printf("Config file found\n");
pxe_destroy_ctx(&ctx);
return 0;
}
i++;
}
printf("Config file not found\n");
pxe_destroy_ctx(&ctx);
return 1;
return 0;
}
/* diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 194a5ed8cc7..b7037f841a6 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -236,4 +236,18 @@ int pxe_process(struct pxe_context *ctx, ulong pxefile_addr_r, bool prompt); */ int pxe_get_file_size(ulong *sizep);
+/**
- pxe_get() - Get the PXE file from the server
- This tries various filenames to obtain a PXE file
- @pxefile_addr_r: Address to put file
- @bootdirp: Returns the boot filename, or NULL if none. This is the 'bootfile'
option provided by the DHCP server. If none, returns NULL. For example,
"rpi/info", which indicates that all files should be fetched from the
"rpi/" subdirectory
- @sizep: Size of the PXE file (not bootfile)
- */
+int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep);
#endif /* __PXE_UTILS_H */
2.33.0.1079.g6e70778dc9-goog
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On Thu, Oct 14, 2021 at 12:48:11PM -0600, Simon Glass wrote:
Refactor this code so that we can call the 'pxe get' command without going through the command-line interpreter. This makes it easier to get the information we need, without going through environment variables.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Artem Lapkin email2tema@gmail.com Tested-by: Artem Lapkin email2tema@gmail.com Reviewed-by: Ramon Fried rfried.dev@gmail.com
Applied to u-boot/master, thanks!

hi Simon
I am still testing this patchset for master branch! need more time (but looks like works)
BTW: i have get some problems from prev your commits for example unbootable raw initrd images https://patchwork.ozlabs.org/project/uboot/patch/20211015101501.4091141-1-ar... i have send this patch maybe your can identificate problem more properly (to much changes from v2021.07 - v2021.10 boot process for v2021.07 works well )
Tnx for your work
On Fri, Oct 15, 2021 at 2:48 AM Simon Glass sjg@chromium.org wrote:
This collects together the patches previously sent relating to PXE.
Firstly, it moves the boot code out of common/ and into a new boot/ directory. This helps to collect these related files in one place, as common/ is quite large.
Secondly, it provides patache so clean up the PXE code and refactor it into something closer to a module that can be called, teasing apart its reliance on the command-line interpreter to access filesystems and the like. Also it now uses function arguments and its own context struct internally rather than environment variables, which is very hard to follow. No core functional change is intended.
Changes in v3:
- Rebase to -master
Changes in v2:
- Rebase to -next
- Split out from the bootmethod patches
Simon Glass (18): Create a new boot/ directory pxe: Move API comments to the header files pxe: Use a context pointer pxe: Move do_getfile() into the context pxe: Add a userdata field to the context pxe: Tidy up the is_pxe global pxe: Move pxe_utils files pxe: Tidy up some comments in pxe_utils pxe: Tidy up code style a little in pxe_utils pxe: Move common parsing coding into pxe_util pxe: Clean up the use of bootfile pxe: Drop get_bootfile_path() lib: Add tests for simple_itoa() lib: Add a function to convert a string to a hex value pxe: Return the file size from the getfile() function pxe: Refactor sysboot to have one helper doc: Move distro boot doc to rST pxe: Allow calling the pxe_get logic directly
Kconfig | 2 + Makefile | 3 +- README | 1 + common/Kconfig.boot => boot/Kconfig | 0 boot/Makefile | 37 ++ {common => boot}/android_ab.c | 0 {common => boot}/boot_fit.c | 0 {common => boot}/bootm.c | 0 {common => boot}/bootm_os.c | 0 {common => boot}/bootretry.c | 0 {common => boot}/common_fit.c | 0 {common => boot}/fdt_region.c | 0 {common => boot}/image-android-dt.c | 0 {common => boot}/image-android.c | 0 {common => boot}/image-board.c | 0 {common => boot}/image-cipher.c | 0 {common => boot}/image-fdt.c | 0 {common => boot}/image-fit-sig.c | 0 {common => boot}/image-fit.c | 0 {common => boot}/image-host.c | 0 {common => boot}/image-sig.c | 0 {common => boot}/image.c | 0 {cmd => boot}/pxe_utils.c | 512 +++++++++++----------- cmd/Makefile | 4 +- cmd/pxe.c | 136 +++--- cmd/pxe_utils.h | 91 ---- cmd/sysboot.c | 114 +++-- common/Kconfig | 2 - common/Makefile | 22 - doc/android/boot-image.rst | 2 +- doc/{README.distro => develop/distro.rst} | 177 ++++---- doc/develop/index.rst | 1 + include/pxe_utils.h | 253 +++++++++++ include/vsprintf.h | 25 +- lib/vsprintf.c | 20 +- scripts/Makefile.spl | 4 +- test/print_ut.c | 41 ++ tools/Makefile | 18 +- 38 files changed, 874 insertions(+), 591 deletions(-) rename common/Kconfig.boot => boot/Kconfig (100%) create mode 100644 boot/Makefile rename {common => boot}/android_ab.c (100%) rename {common => boot}/boot_fit.c (100%) rename {common => boot}/bootm.c (100%) rename {common => boot}/bootm_os.c (100%) rename {common => boot}/bootretry.c (100%) rename {common => boot}/common_fit.c (100%) rename {common => boot}/fdt_region.c (100%) rename {common => boot}/image-android-dt.c (100%) rename {common => boot}/image-android.c (100%) rename {common => boot}/image-board.c (100%) rename {common => boot}/image-cipher.c (100%) rename {common => boot}/image-fdt.c (100%) rename {common => boot}/image-fit-sig.c (100%) rename {common => boot}/image-fit.c (100%) rename {common => boot}/image-host.c (100%) rename {common => boot}/image-sig.c (100%) rename {common => boot}/image.c (100%) rename {cmd => boot}/pxe_utils.c (74%) delete mode 100644 cmd/pxe_utils.h rename doc/{README.distro => develop/distro.rst} (76%) create mode 100644 include/pxe_utils.h
-- 2.33.0.1079.g6e70778dc9-goog

Hi Ramon,
On Thu, 14 Oct 2021 at 12:48, Simon Glass sjg@chromium.org wrote:
This collects together the patches previously sent relating to PXE.
Firstly, it moves the boot code out of common/ and into a new boot/ directory. This helps to collect these related files in one place, as common/ is quite large.
Secondly, it provides patache so clean up the PXE code and refactor it into something closer to a module that can be called, teasing apart its reliance on the command-line interpreter to access filesystems and the like. Also it now uses function arguments and its own context struct internally rather than environment variables, which is very hard to follow. No core functional change is intended.
Changes in v3:
- Rebase to -master
Changes in v2:
- Rebase to -next
- Split out from the bootmethod patches
Simon Glass (18): Create a new boot/ directory pxe: Move API comments to the header files pxe: Use a context pointer pxe: Move do_getfile() into the context pxe: Add a userdata field to the context pxe: Tidy up the is_pxe global pxe: Move pxe_utils files pxe: Tidy up some comments in pxe_utils pxe: Tidy up code style a little in pxe_utils pxe: Move common parsing coding into pxe_util pxe: Clean up the use of bootfile pxe: Drop get_bootfile_path() lib: Add tests for simple_itoa() lib: Add a function to convert a string to a hex value pxe: Return the file size from the getfile() function pxe: Refactor sysboot to have one helper doc: Move distro boot doc to rST pxe: Allow calling the pxe_get logic directly
Kconfig | 2 + Makefile | 3 +- README | 1 + common/Kconfig.boot => boot/Kconfig | 0 boot/Makefile | 37 ++ {common => boot}/android_ab.c | 0 {common => boot}/boot_fit.c | 0 {common => boot}/bootm.c | 0 {common => boot}/bootm_os.c | 0 {common => boot}/bootretry.c | 0 {common => boot}/common_fit.c | 0 {common => boot}/fdt_region.c | 0 {common => boot}/image-android-dt.c | 0 {common => boot}/image-android.c | 0 {common => boot}/image-board.c | 0 {common => boot}/image-cipher.c | 0 {common => boot}/image-fdt.c | 0 {common => boot}/image-fit-sig.c | 0 {common => boot}/image-fit.c | 0 {common => boot}/image-host.c | 0 {common => boot}/image-sig.c | 0 {common => boot}/image.c | 0 {cmd => boot}/pxe_utils.c | 512 +++++++++++----------- cmd/Makefile | 4 +- cmd/pxe.c | 136 +++--- cmd/pxe_utils.h | 91 ---- cmd/sysboot.c | 114 +++-- common/Kconfig | 2 - common/Makefile | 22 - doc/android/boot-image.rst | 2 +- doc/{README.distro => develop/distro.rst} | 177 ++++---- doc/develop/index.rst | 1 + include/pxe_utils.h | 253 +++++++++++ include/vsprintf.h | 25 +- lib/vsprintf.c | 20 +- scripts/Makefile.spl | 4 +- test/print_ut.c | 41 ++ tools/Makefile | 18 +- 38 files changed, 874 insertions(+), 591 deletions(-) rename common/Kconfig.boot => boot/Kconfig (100%) create mode 100644 boot/Makefile rename {common => boot}/android_ab.c (100%) rename {common => boot}/boot_fit.c (100%) rename {common => boot}/bootm.c (100%) rename {common => boot}/bootm_os.c (100%) rename {common => boot}/bootretry.c (100%) rename {common => boot}/common_fit.c (100%) rename {common => boot}/fdt_region.c (100%) rename {common => boot}/image-android-dt.c (100%) rename {common => boot}/image-android.c (100%) rename {common => boot}/image-board.c (100%) rename {common => boot}/image-cipher.c (100%) rename {common => boot}/image-fdt.c (100%) rename {common => boot}/image-fit-sig.c (100%) rename {common => boot}/image-fit.c (100%) rename {common => boot}/image-host.c (100%) rename {common => boot}/image-sig.c (100%) rename {common => boot}/image.c (100%) rename {cmd => boot}/pxe_utils.c (74%) delete mode 100644 cmd/pxe_utils.h rename doc/{README.distro => develop/distro.rst} (76%) create mode 100644 include/pxe_utils.h
-- 2.33.0.1079.g6e70778dc9-goog
I see this series is assigned to you in patchwork. Did you see it? It looks like you are network maintainer but that doesn't include the PXE files for some reason...
Regards, Simon
participants (7)
-
Adam Ford
-
art
-
Art Nikpal
-
Heinrich Schuchardt
-
Ramon Fried
-
Simon Glass
-
Tom Rini