[PATCH v2] fastboot: Add OEM run command

Patrick DELAUNAY patrick.delaunay at foss.st.com
Mon Dec 5 20:04:30 CET 2022


Hi,

On 12/2/22 22:03, Sean Anderson wrote:
> This adds the UUU UCmd functionality as an OEM command. While the
> fastboot tool allows sending arbitrary commands as long as they are
> prefixed with "oem". This allows running generic U-Boot commands over
> fastboot without UUU, which is especially useful when not using USB.
> This is really the route we should have gone in the first place when
> adding these commands.
>
> While we're here, clean up the Kconfig a bit.
>
> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
> ---
>
> Changes in v2:
> - Document usage
> - Keep enum in order
>
>   doc/android/fastboot.rst      | 15 +++++++++++++++
>   drivers/fastboot/Kconfig      | 10 +++++-----
>   drivers/fastboot/fb_command.c |  4 ++++
>   include/fastboot.h            |  1 +
>   4 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
> index 7611f07038..7f343d5dfc 100644
> --- a/doc/android/fastboot.rst
> +++ b/doc/android/fastboot.rst
> @@ -28,6 +28,7 @@ The following OEM commands are supported (if enabled):
>   - ``oem partconf`` - this executes ``mmc partconf %x <arg> 0`` to configure eMMC
>     with <arg> = boot_ack boot_partition
>   - ``oem bootbus``  - this executes ``mmc bootbus %x %s`` to configure eMMC
> +- ``oem run`` - this executes an arbitrary U-Boot command
>   
>   Support for both eMMC and NAND devices is included.
>   
> @@ -127,6 +128,19 @@ Boot command
>   When executing the fastboot ``boot`` command, if ``fastboot_bootcmd`` is set
>   then that will be executed in place of ``bootm <CONFIG_FASTBOOT_BUF_ADDR>``.
>   
> +Running Shell Commands
> +----------------------
> +
> +Normally, arbitrary U-Boot command execution is not enabled. This is so
> +fastboot can be used to update systems using verified boot. However, such
> +functionality can be useful for production or when verified boot is not in use.
> +Enable ``CONFIG_FASTBOOT_UUU_SUPPORT`` to use this functionality. This will
> +enable the ``UCmd`` and ``ACmd`` commands for use with UUU [3]_. It also
> +enables the ``oem run`` command, which can be used with the fastboot client.
> +For example, to print "Hello world", run::
> +
> +    $ fastboot oem run:echo Hello world
> +
>   Partition Names
>   ---------------
>   
> @@ -232,3 +246,4 @@ References
>   
>   .. [1] :doc:`fastboot-protocol`
>   .. [2] https://developer.android.com/studio/releases/platform-tools
> +.. [3] https://github.com/NXPmicro/mfgtools
> diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
> index b97c67bf60..8f2d52cb8a 100644
> --- a/drivers/fastboot/Kconfig
> +++ b/drivers/fastboot/Kconfig
> @@ -80,12 +80,12 @@ config FASTBOOT_FLASH
>   	  this to enable the "fastboot flash" command.
>   
>   config FASTBOOT_UUU_SUPPORT
> -	bool "Enable FASTBOOT i.MX UUU special command"
> +	bool "Enable running arbitrary commands from FASTBOOT"
>   	help
> -	  The fastboot protocol includes "UCmd" and "ACmd" command.
> -	  Be aware that you provide full access to any U-Boot command,
> -	  including working with memory and may open a huge backdoor,
> -	  when enabling this option.
> +	  This extends the fastboot protocol with the "UCmd" and "ACmd"
> +	  commands, as well as the "oem run" command.  These commands provide
> +	  full access to any U-Boot command, including working with memory.
> +	  This may open a huge backdoor if you are using verified boot.
>   

why the support of "oem run" generic support is include in the IMX config CONFIG_FASTBOOT_UUU_SUPPORT

"UCmd" and "Acmd" are imx additions in fastboot standard for UUU support

https://android.googlesource.com/platform/system/core/+/2ec418a4c98f6e8f95395456e1ad4c2956cac007/fastboot/fastboot_protocol.txt

but "oem run" can be see as generic U-Boot 'oem' command to execute 
U-boot command.


for me I see 2 separate configs to handle other platform than IMX ones (with UUU support)


config FASTBOOT_CMD_OEM_RUN
	bool "Enable fastboot oem run command"

config FASTBOOT_UUU_SUPPORT
	bool "Enable FASTBOOT i.MX UUU special command"
	select FASTBOOT_CMD_OEM_RUN


PS: FASTBOOT_UUU_SUPPORT could depends on CONFIG_ARCH_IMX*


>   choice
>   	prompt "Flash provider for FASTBOOT"
> diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
> index 98eccc3455..1732406c18 100644
> --- a/drivers/fastboot/fb_command.c
> +++ b/drivers/fastboot/fb_command.c
> @@ -123,6 +123,10 @@ static const struct {
>   	},
>   #endif
>   #if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
> +	[FASTBOOT_COMMAND_OEM_RUN] = {
> +		.command = "oem run",
> +		.dispatch = run_ucmd,
> +	},


  #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_RUN)
	[FASTBOOT_COMMAND_OEM_RUN] = {
		.command = "oem run",
		.dispatch = run_ucmd,
	},

#endif

#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)

	[FASTBOOT_COMMAND_UCMD] = {
  		.command = "UCmd",
  		.dispatch = run_ucmd,


That allows other platform to enable  FASTBOOT_CMD_OEM_RUN but not 
FASTBOOT_UUU_SUPPORT.


>   	[FASTBOOT_COMMAND_UCMD] = {
>   		.command = "UCmd",
>   		.dispatch = run_ucmd,
> diff --git a/include/fastboot.h b/include/fastboot.h
> index 57daaf1298..8b6b4b934a 100644
> --- a/include/fastboot.h
> +++ b/include/fastboot.h
> @@ -45,6 +45,7 @@ enum {
>   	FASTBOOT_COMMAND_OEM_BOOTBUS,
>   #endif
>   #if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
> +	FASTBOOT_COMMAND_OEM_RUN,
>   	FASTBOOT_COMMAND_ACMD,
>   	FASTBOOT_COMMAND_UCMD,
>   #endif

+#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_RUN)

+	FASTBOOT_COMMAND_OEM_RUN,
+#endif


and also some stuff to compile the fucntion run_ucmd()


PS: we have many #if CONFIG is the fastboot source code

       they can be replaced by CONFIG_IS_ENABLED macro and 
__maybe_unused in .h and .c  ?

       and that avoids the compilation issue => let the linker remove 
the used functions

for example

enum {

	FASTBOOT_COMMAND_GETVAR = 0,
	FASTBOOT_COMMAND_DOWNLOAD,
	CONFIG_IS_ENABLED(FASTBOOT_FLASH, (FASTBOOT_COMMAND_FLASH,))
	CONFIG_IS_ENABLED(FASTBOOT_FLASH, (FASTBOOT_COMMAND_ERASE,))
	FASTBOOT_COMMAND_BOOT,
	FASTBOOT_COMMAND_CONTINUE,
	FASTBOOT_COMMAND_REBOOT,
	FASTBOOT_COMMAND_REBOOT_BOOTLOADER,
	FASTBOOT_COMMAND_REBOOT_FASTBOOTD,
	FASTBOOT_COMMAND_REBOOT_RECOVERY,
	FASTBOOT_COMMAND_SET_ACTIVE,
	CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT, (FASTBOOT_COMMAND_OEM_FORMAT,))
	CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF, (FASTBOOT_COMMAND_OEM_PARTCONF,))
	CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS, (FASTBOOT_COMMAND_OEM_BOOTBUS,))
	CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (FASTBOOT_COMMAND_ACMD,))
	CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (FASTBOOT_COMMAND_UCMD,))
	FASTBOOT_COMMAND_COUNT
};

...

ommands[FASTBOOT_COMMAND_COUNT] = {
[FASTBOOT_COMMAND_GETVAR] = {
.command = "getvar",
.dispatch = getvar
},
[FASTBOOT_COMMAND_DOWNLOAD] = {
.command = "download",
.dispatch = download
},
CONFIG_IS_ENABLED(FASTBOOT_FLASH, (
[FASTBOOT_COMMAND_FLASH] = {
.command = "flash",
.dispatch = flash
},
[FASTBOOT_COMMAND_ERASE] = {
.command = "erase",
.dispatch = erase
},
))
....
staticvoid__maybe_unused erase(char*cmd_parameter, char*response)
{
if(CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC))
fastboot_mmc_erase(cmd_parameter, response);
if(CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND))
fastboot_nand_erase(cmd_parameter, response);
}


regards

Patrick



More information about the U-Boot mailing list