All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow
@ 2021-10-14 18:47 Simon Glass
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
                   ` (19 more replies)
  0 siblings, 20 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply	[flat|nested] 90+ messages in thread

* [PATCH v3 01/18] Create a new boot/ directory
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-16  5:31   ` Art Nikpal
                     ` (2 more replies)
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
                   ` (18 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 02/18] pxe: Move API comments to the header files
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-18  8:42   ` art
                     ` (3 more replies)
  2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
                   ` (17 subsequent siblings)
  19 siblings, 4 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 03/18] pxe: Use a context pointer
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-18  8:45   ` art
                     ` (2 more replies)
  2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
                   ` (16 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 04/18] pxe: Move do_getfile() into the context
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (2 preceding siblings ...)
  2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-18  8:46   ` art
                     ` (2 more replies)
  2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
                   ` (15 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 05/18] pxe: Add a userdata field to the context
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (3 preceding siblings ...)
  2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-18  8:46   ` art
                     ` (2 more replies)
  2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
                   ` (14 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 06/18] pxe: Tidy up the is_pxe global
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (4 preceding siblings ...)
  2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
@ 2021-10-14 18:47 ` Simon Glass
  2021-10-18  8:47   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
                   ` (13 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:47 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 07/18] pxe: Move pxe_utils files
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (5 preceding siblings ...)
  2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:47   ` art
                     ` (3 more replies)
  2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
                   ` (12 subsequent siblings)
  19 siblings, 4 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (6 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:48   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
                   ` (11 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 09/18] pxe: Tidy up code style a little in pxe_utils
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (7 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:48   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
                   ` (10 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (8 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:49   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
                   ` (9 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 11/18] pxe: Clean up the use of bootfile
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (9 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:51   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
                   ` (8 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 12/18] pxe: Drop get_bootfile_path()
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (10 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:51   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 13/18] lib: Add tests for simple_itoa() Simon Glass
                   ` (7 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 13/18] lib: Add tests for simple_itoa()
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (11 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:30   ` art
  2021-11-12 15:40   ` Tom Rini
  2021-10-14 18:48 ` [PATCH v3 14/18] lib: Add a function to convert a string to a hex value Simon Glass
                   ` (6 subsequent siblings)
  19 siblings, 2 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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);
-- 
2.33.0.1079.g6e70778dc9-goog


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 14/18] lib: Add a function to convert a string to a hex value
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (12 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 13/18] lib: Add tests for simple_itoa() Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:52   ` art
  2021-11-12 15:40   ` Tom Rini
  2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
                   ` (5 subsequent siblings)
  19 siblings, 2 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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);
-- 
2.33.0.1079.g6e70778dc9-goog


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 15/18] pxe: Return the file size from the getfile() function
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (13 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 14/18] lib: Add a function to convert a string to a hex value Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:53   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
                   ` (4 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 16/18] pxe: Refactor sysboot to have one helper
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (14 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:54   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
                   ` (3 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 17/18] doc: Move distro boot doc to rST
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (15 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:55   ` art
                     ` (2 more replies)
  2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
                   ` (2 subsequent siblings)
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (16 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
@ 2021-10-14 18:48 ` Simon Glass
  2021-10-18  8:56   ` art
                     ` (2 more replies)
  2021-10-15 10:27 ` [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Art Nikpal
  2021-10-26  1:28 ` Simon Glass
  19 siblings, 3 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-14 18:48 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Simon Glass

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


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (17 preceding siblings ...)
  2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
@ 2021-10-15 10:27 ` Art Nikpal
  2021-10-26  1:28 ` Simon Glass
  19 siblings, 0 replies; 90+ messages in thread
From: Art Nikpal @ 2021-10-15 10:27 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes

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-art@khadas.com/
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
>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 01/18] Create a new boot/ directory
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
@ 2021-10-16  5:31   ` Art Nikpal
  2021-10-18  8:41   ` art
  2021-11-12 15:38   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Art Nikpal @ 2021-10-16  5:31 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes

>  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-art@khadas.com/

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
>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 13/18] lib: Add tests for simple_itoa()
  2021-10-14 18:48 ` [PATCH v3 13/18] lib: Add tests for simple_itoa() Simon Glass
@ 2021-10-18  8:30   ` art
  2021-11-12 15:40   ` Tom Rini
  1 sibling, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:30 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

Reviewed-by: Artem Lapkin <email2tema@gmail.com>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 01/18] Create a new boot/ directory
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
  2021-10-16  5:31   ` Art Nikpal
@ 2021-10-18  8:41   ` art
  2021-11-12 15:38   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:41 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes


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>




^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 02/18] pxe: Move API comments to the header files
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
@ 2021-10-18  8:42   ` art
  2021-11-09  8:07   ` Ramon Fried
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:42 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 03/18] pxe: Use a context pointer
  2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
@ 2021-10-18  8:45   ` art
  2021-11-09  8:08   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:45 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 04/18] pxe: Move do_getfile() into the context
  2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
@ 2021-10-18  8:46   ` art
  2021-11-09  8:11   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:46 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 05/18] pxe: Add a userdata field to the context
  2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
@ 2021-10-18  8:46   ` art
  2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:46 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 06/18] pxe: Tidy up the is_pxe global
  2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
@ 2021-10-18  8:47   ` art
  2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:47 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
@ 2021-10-18  8:47   ` art
  2021-11-09  8:10   ` Ramon Fried
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:47 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
@ 2021-10-18  8:48   ` art
  2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:48 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 09/18] pxe: Tidy up code style a little in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
@ 2021-10-18  8:48   ` art
  2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:48 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util
  2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
@ 2021-10-18  8:49   ` art
  2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:49 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 11/18] pxe: Clean up the use of bootfile
  2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
@ 2021-10-18  8:51   ` art
  2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:51 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>



^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 12/18] pxe: Drop get_bootfile_path()
  2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
@ 2021-10-18  8:51   ` art
  2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:51 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 14/18] lib: Add a function to convert a string to a hex value
  2021-10-14 18:48 ` [PATCH v3 14/18] lib: Add a function to convert a string to a hex value Simon Glass
@ 2021-10-18  8:52   ` art
  2021-11-12 15:40   ` Tom Rini
  1 sibling, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:52 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 15/18] pxe: Return the file size from the getfile() function
  2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
@ 2021-10-18  8:53   ` art
  2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:53 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 16/18] pxe: Refactor sysboot to have one helper
  2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
@ 2021-10-18  8:54   ` art
  2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:54 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 17/18] doc: Move distro boot doc to rST
  2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
@ 2021-10-18  8:55   ` art
  2021-11-09  8:08   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:55 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

OK

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


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly
  2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
@ 2021-10-18  8:56   ` art
  2021-11-09  8:07   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: art @ 2021-10-18  8:56 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow
  2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
                   ` (18 preceding siblings ...)
  2021-10-15 10:27 ` [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Art Nikpal
@ 2021-10-26  1:28 ` Simon Glass
  19 siblings, 0 replies; 90+ messages in thread
From: Simon Glass @ 2021-10-26  1:28 UTC (permalink / raw)
  To: U-Boot Mailing List
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Heinrich Schuchardt, Peter Hoyes, Ramon Fried

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 02/18] pxe: Move API comments to the header files
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
  2021-10-18  8:42   ` art
@ 2021-11-09  8:07   ` Ramon Fried
  2021-11-09  8:52   ` Heinrich Schuchardt
  2021-11-12 15:38   ` Tom Rini
  3 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:07 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly
  2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
  2021-10-18  8:56   ` art
@ 2021-11-09  8:07   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:07 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 03/18] pxe: Use a context pointer
  2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
  2021-10-18  8:45   ` art
@ 2021-11-09  8:08   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:08 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 17/18] doc: Move distro boot doc to rST
  2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
  2021-10-18  8:55   ` art
@ 2021-11-09  8:08   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:08 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 16/18] pxe: Refactor sysboot to have one helper
  2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
  2021-10-18  8:54   ` art
@ 2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:09 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 15/18] pxe: Return the file size from the getfile() function
  2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
  2021-10-18  8:53   ` art
@ 2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:09 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 12/18] pxe: Drop get_bootfile_path()
  2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
  2021-10-18  8:51   ` art
@ 2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:09 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 11/18] pxe: Clean up the use of bootfile
  2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
  2021-10-18  8:51   ` art
@ 2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:09 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util
  2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
  2021-10-18  8:49   ` art
@ 2021-11-09  8:09   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:09 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 09/18] pxe: Tidy up code style a little in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
  2021-10-18  8:48   ` art
@ 2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:10 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
  2021-10-18  8:48   ` art
@ 2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:10 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
  2021-10-18  8:47   ` art
@ 2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2022-02-09 11:40   ` Adam Ford
  3 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:10 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 06/18] pxe: Tidy up the is_pxe global
  2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
  2021-10-18  8:47   ` art
@ 2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:10 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 05/18] pxe: Add a userdata field to the context
  2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
  2021-10-18  8:46   ` art
@ 2021-11-09  8:10   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:10 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 04/18] pxe: Move do_getfile() into the context
  2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
  2021-10-18  8:46   ` art
@ 2021-11-09  8:11   ` Ramon Fried
  2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Ramon Fried @ 2021-11-09  8:11 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 02/18] pxe: Move API comments to the header files
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
  2021-10-18  8:42   ` art
  2021-11-09  8:07   ` Ramon Fried
@ 2021-11-09  8:52   ` Heinrich Schuchardt
  2021-11-12 15:38   ` Tom Rini
  3 siblings, 0 replies; 90+ messages in thread
From: Heinrich Schuchardt @ 2021-11-09  8:52 UTC (permalink / raw)
  To: Simon Glass
  Cc: Patrice Chotard, Artem Lapkin, Tom Rini, Joe Hershberger,
	Peter Hoyes, U-Boot Mailing List

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 Glass<sjg@chromium.org>
> ---

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 01/18] Create a new boot/ directory
  2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
  2021-10-16  5:31   ` Art Nikpal
  2021-10-18  8:41   ` art
@ 2021-11-12 15:38   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:38 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 817 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 02/18] pxe: Move API comments to the header files
  2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
                     ` (2 preceding siblings ...)
  2021-11-09  8:52   ` Heinrich Schuchardt
@ 2021-11-12 15:38   ` Tom Rini
  3 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:38 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 488 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 03/18] pxe: Use a context pointer
  2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
  2021-10-18  8:45   ` art
  2021-11-09  8:08   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 798 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 04/18] pxe: Move do_getfile() into the context
  2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
  2021-10-18  8:46   ` art
  2021-11-09  8:11   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 406 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 05/18] pxe: Add a userdata field to the context
  2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
  2021-10-18  8:46   ` art
  2021-11-09  8:10   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 411 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 06/18] pxe: Tidy up the is_pxe global
  2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
  2021-10-18  8:47   ` art
  2021-11-09  8:10   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 462 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
  2021-10-18  8:47   ` art
  2021-11-09  8:10   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2022-02-09 11:40   ` Adam Ford
  3 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 482 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
  2021-10-18  8:48   ` art
  2021-11-09  8:10   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 403 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 09/18] pxe: Tidy up code style a little in pxe_utils
  2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
  2021-10-18  8:48   ` art
  2021-11-09  8:10   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 458 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util
  2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
  2021-10-18  8:49   ` art
  2021-11-09  8:09   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 463 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 11/18] pxe: Clean up the use of bootfile
  2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
  2021-10-18  8:51   ` art
  2021-11-09  8:09   ` Ramon Fried
@ 2021-11-12 15:39   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 827 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 12/18] pxe: Drop get_bootfile_path()
  2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
  2021-10-18  8:51   ` art
  2021-11-09  8:09   ` Ramon Fried
@ 2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 470 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 13/18] lib: Add tests for simple_itoa()
  2021-10-14 18:48 ` [PATCH v3 13/18] lib: Add tests for simple_itoa() Simon Glass
  2021-10-18  8:30   ` art
@ 2021-11-12 15:40   ` Tom Rini
  1 sibling, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 263 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 14/18] lib: Add a function to convert a string to a hex value
  2021-10-14 18:48 ` [PATCH v3 14/18] lib: Add a function to convert a string to a hex value Simon Glass
  2021-10-18  8:52   ` art
@ 2021-11-12 15:40   ` Tom Rini
  1 sibling, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 335 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 15/18] pxe: Return the file size from the getfile() function
  2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
  2021-10-18  8:53   ` art
  2021-11-09  8:09   ` Ramon Fried
@ 2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 743 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 16/18] pxe: Refactor sysboot to have one helper
  2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
  2021-10-18  8:54   ` art
  2021-11-09  8:09   ` Ramon Fried
@ 2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 911 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 17/18] doc: Move distro boot doc to rST
  2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
  2021-10-18  8:55   ` art
  2021-11-09  8:08   ` Ramon Fried
@ 2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 310 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly
  2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
  2021-10-18  8:56   ` art
  2021-11-09  8:07   ` Ramon Fried
@ 2021-11-12 15:40   ` Tom Rini
  2 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2021-11-12 15:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 540 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
                     ` (2 preceding siblings ...)
  2021-11-12 15:39   ` Tom Rini
@ 2022-02-09 11:40   ` Adam Ford
  2022-02-09 12:32     ` Tom Rini
  3 siblings, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-09 11:40 UTC (permalink / raw)
  To: Simon Glass
  Cc: U-Boot Mailing List, Patrice Chotard, Artem Lapkin, Tom Rini,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes, Lokesh Vutla

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
>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-09 11:40   ` Adam Ford
@ 2022-02-09 12:32     ` Tom Rini
  2022-02-09 17:16       ` Simon Glass
  0 siblings, 1 reply; 90+ messages in thread
From: Tom Rini @ 2022-02-09 12:32 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 2103 bytes --]

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.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-09 12:32     ` Tom Rini
@ 2022-02-09 17:16       ` Simon Glass
  2022-02-10 13:56         ` Adam Ford
  0 siblings, 1 reply; 90+ messages in thread
From: Simon Glass @ 2022-02-09 17:16 UTC (permalink / raw)
  To: Tom Rini
  Cc: Adam Ford, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-09 17:16       ` Simon Glass
@ 2022-02-10 13:56         ` Adam Ford
  2022-02-10 13:57           ` Adam Ford
  2022-02-10 14:57           ` Tom Rini
  0 siblings, 2 replies; 90+ messages in thread
From: Adam Ford @ 2022-02-10 13:56 UTC (permalink / raw)
  To: Simon Glass
  Cc: Tom Rini, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-10 13:56         ` Adam Ford
@ 2022-02-10 13:57           ` Adam Ford
  2022-02-10 14:32             ` Simon Glass
  2022-02-10 14:57           ` Tom Rini
  1 sibling, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-10 13:57 UTC (permalink / raw)
  To: Simon Glass
  Cc: Tom Rini, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes,
	Marek Behún

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-10 13:57           ` Adam Ford
@ 2022-02-10 14:32             ` Simon Glass
  2022-02-10 14:41               ` Adam Ford
  0 siblings, 1 reply; 90+ messages in thread
From: Simon Glass @ 2022-02-10 14:32 UTC (permalink / raw)
  To: Adam Ford
  Cc: Tom Rini, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes,
	Marek Behún

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-10 14:32             ` Simon Glass
@ 2022-02-10 14:41               ` Adam Ford
  0 siblings, 0 replies; 90+ messages in thread
From: Adam Ford @ 2022-02-10 14:41 UTC (permalink / raw)
  To: Simon Glass
  Cc: Tom Rini, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes,
	Marek Behún

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-10 13:56         ` Adam Ford
  2022-02-10 13:57           ` Adam Ford
@ 2022-02-10 14:57           ` Tom Rini
  2022-02-11 15:50             ` Adam Ford
  1 sibling, 1 reply; 90+ messages in thread
From: Tom Rini @ 2022-02-10 14:57 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 3596 bytes --]

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.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-10 14:57           ` Tom Rini
@ 2022-02-11 15:50             ` Adam Ford
  2022-02-11 16:12               ` Tom Rini
  0 siblings, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-11 15:50 UTC (permalink / raw)
  To: Tom Rini
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 15:50             ` Adam Ford
@ 2022-02-11 16:12               ` Tom Rini
  2022-02-11 16:39                 ` Adam Ford
  0 siblings, 1 reply; 90+ messages in thread
From: Tom Rini @ 2022-02-11 16:12 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 8259 bytes --]

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.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 16:12               ` Tom Rini
@ 2022-02-11 16:39                 ` Adam Ford
  2022-02-11 16:44                   ` Tom Rini
  0 siblings, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-11 16:39 UTC (permalink / raw)
  To: Tom Rini
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 16:39                 ` Adam Ford
@ 2022-02-11 16:44                   ` Tom Rini
  2022-02-11 17:10                     ` Adam Ford
  0 siblings, 1 reply; 90+ messages in thread
From: Tom Rini @ 2022-02-11 16:44 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 9901 bytes --]

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.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 16:44                   ` Tom Rini
@ 2022-02-11 17:10                     ` Adam Ford
  2022-02-11 17:13                       ` Tom Rini
  0 siblings, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-11 17:10 UTC (permalink / raw)
  To: Tom Rini
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 17:10                     ` Adam Ford
@ 2022-02-11 17:13                       ` Tom Rini
  2022-02-12  1:09                         ` Adam Ford
  0 siblings, 1 reply; 90+ messages in thread
From: Tom Rini @ 2022-02-11 17:13 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 11447 bytes --]

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-11 17:13                       ` Tom Rini
@ 2022-02-12  1:09                         ` Adam Ford
  2022-02-12  1:43                           ` Tom Rini
  0 siblings, 1 reply; 90+ messages in thread
From: Adam Ford @ 2022-02-12  1:09 UTC (permalink / raw)
  To: Tom Rini
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

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

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH v3 07/18] pxe: Move pxe_utils files
  2022-02-12  1:09                         ` Adam Ford
@ 2022-02-12  1:43                           ` Tom Rini
  0 siblings, 0 replies; 90+ messages in thread
From: Tom Rini @ 2022-02-12  1:43 UTC (permalink / raw)
  To: Adam Ford
  Cc: Simon Glass, U-Boot Mailing List, Patrice Chotard, Artem Lapkin,
	Joe Hershberger, Heinrich Schuchardt, Peter Hoyes

[-- Attachment #1: Type: text/plain, Size: 12998 bytes --]

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!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

end of thread, other threads:[~2022-02-12  1:43 UTC | newest]

Thread overview: 90+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-14 18:47 [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Simon Glass
2021-10-14 18:47 ` [PATCH v3 01/18] Create a new boot/ directory Simon Glass
2021-10-16  5:31   ` Art Nikpal
2021-10-18  8:41   ` art
2021-11-12 15:38   ` Tom Rini
2021-10-14 18:47 ` [PATCH v3 02/18] pxe: Move API comments to the header files Simon Glass
2021-10-18  8:42   ` art
2021-11-09  8:07   ` Ramon Fried
2021-11-09  8:52   ` Heinrich Schuchardt
2021-11-12 15:38   ` Tom Rini
2021-10-14 18:47 ` [PATCH v3 03/18] pxe: Use a context pointer Simon Glass
2021-10-18  8:45   ` art
2021-11-09  8:08   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:47 ` [PATCH v3 04/18] pxe: Move do_getfile() into the context Simon Glass
2021-10-18  8:46   ` art
2021-11-09  8:11   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:47 ` [PATCH v3 05/18] pxe: Add a userdata field to " Simon Glass
2021-10-18  8:46   ` art
2021-11-09  8:10   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:47 ` [PATCH v3 06/18] pxe: Tidy up the is_pxe global Simon Glass
2021-10-18  8:47   ` art
2021-11-09  8:10   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 07/18] pxe: Move pxe_utils files Simon Glass
2021-10-18  8:47   ` art
2021-11-09  8:10   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2022-02-09 11:40   ` Adam Ford
2022-02-09 12:32     ` Tom Rini
2022-02-09 17:16       ` Simon Glass
2022-02-10 13:56         ` Adam Ford
2022-02-10 13:57           ` Adam Ford
2022-02-10 14:32             ` Simon Glass
2022-02-10 14:41               ` Adam Ford
2022-02-10 14:57           ` Tom Rini
2022-02-11 15:50             ` Adam Ford
2022-02-11 16:12               ` Tom Rini
2022-02-11 16:39                 ` Adam Ford
2022-02-11 16:44                   ` Tom Rini
2022-02-11 17:10                     ` Adam Ford
2022-02-11 17:13                       ` Tom Rini
2022-02-12  1:09                         ` Adam Ford
2022-02-12  1:43                           ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 08/18] pxe: Tidy up some comments in pxe_utils Simon Glass
2021-10-18  8:48   ` art
2021-11-09  8:10   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 09/18] pxe: Tidy up code style a little " Simon Glass
2021-10-18  8:48   ` art
2021-11-09  8:10   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 10/18] pxe: Move common parsing coding into pxe_util Simon Glass
2021-10-18  8:49   ` art
2021-11-09  8:09   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 11/18] pxe: Clean up the use of bootfile Simon Glass
2021-10-18  8:51   ` art
2021-11-09  8:09   ` Ramon Fried
2021-11-12 15:39   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 12/18] pxe: Drop get_bootfile_path() Simon Glass
2021-10-18  8:51   ` art
2021-11-09  8:09   ` Ramon Fried
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 13/18] lib: Add tests for simple_itoa() Simon Glass
2021-10-18  8:30   ` art
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 14/18] lib: Add a function to convert a string to a hex value Simon Glass
2021-10-18  8:52   ` art
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 15/18] pxe: Return the file size from the getfile() function Simon Glass
2021-10-18  8:53   ` art
2021-11-09  8:09   ` Ramon Fried
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 16/18] pxe: Refactor sysboot to have one helper Simon Glass
2021-10-18  8:54   ` art
2021-11-09  8:09   ` Ramon Fried
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 17/18] doc: Move distro boot doc to rST Simon Glass
2021-10-18  8:55   ` art
2021-11-09  8:08   ` Ramon Fried
2021-11-12 15:40   ` Tom Rini
2021-10-14 18:48 ` [PATCH v3 18/18] pxe: Allow calling the pxe_get logic directly Simon Glass
2021-10-18  8:56   ` art
2021-11-09  8:07   ` Ramon Fried
2021-11-12 15:40   ` Tom Rini
2021-10-15 10:27 ` [PATCH v3 00/18] pxe: Refactoring to tidy up and prepare for bootflow Art Nikpal
2021-10-26  1:28 ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.