[PATCH] fastboot: add UUU command UCmd and ACmd support

Heiko Schocher hs at denx.de
Mon Feb 1 09:21:40 CET 2021


Hello Lukasz,

Am 01.02.21 um 08:56 schrieb Lukasz Majewski:
> Hi Heiko,
> 
>> Hello Roman,
>>
>> Am 27.01.21 um 10:34 schrieb Roman Stratiienko:
>>> Hello Heiko,
>>>
>>> Looks like these commands will provide full access to any u-boot
>>> commands, including working with memory.
>>> It can be used to read/set any registers/data which is not in the
>>> trust zone, thus opening a huge backdoor.
>>>
>>> This command could be useful for debug/CI purposes, but do you
>>> really want this in release builds?  
>>
>> Hmm.. indeed.
>>
>> I set the default to no not to yes, so you need
>> to enable it, and add a comment in Kconfig.
> 
> Do you plan to send another version of this patch? Or is it ready for
> being pull?

I send a v2 ... sorry, had not the time yet for it.

bye,
Heiko
> 
>>
>> Thanks!
>>
>> bye,
>> Heiko
>>>
>>> Best regards,
>>> Roman
>>>
>>> пн, 11 янв. 2021 г. в 12:19, Heiko Schocher <hs at denx.de>:  
>>>>
>>>> add support for the UUU commands ACmd and UCmd.
>>>>
>>>> Enable them through the Kconfig option
>>>> CONFIG_FASTBOOT_UUU_SUPPORT
>>>>
>>>> base was commit in NXP kernel
>>>> 9b149c2a2882: ("MLK-18591-3 android: Add FSL android fastboot
>>>> support")
>>>>
>>>> and ported it to current mainline. Tested this patch
>>>> on imx6ul based board.
>>>>
>>>> Signed-off-by: Heiko Schocher <hs at denx.de>
>>>> ---
>>>> azure build:
>>>> https://dev.azure.com/hs0298/hs/_build/results?buildId=57&view=results
>>>>
>>>> version uuu tool used for tests:
>>>> commit 3870fb781b35: ("fastboot: default to logical-block-size
>>>> 4096")
>>>>
>>>>  doc/android/fastboot-protocol.rst |  5 +++
>>>>  doc/android/fastboot.rst          |  2 +
>>>>  drivers/fastboot/Kconfig          |  7 ++++
>>>>  drivers/fastboot/fb_command.c     | 62
>>>> +++++++++++++++++++++++++++++++ drivers/usb/gadget/f_fastboot.c
>>>> | 17 +++++++++ include/fastboot.h                |  7 ++++
>>>>  6 files changed, 100 insertions(+)
>>>>
>>>> diff --git a/doc/android/fastboot-protocol.rst
>>>> b/doc/android/fastboot-protocol.rst index e723659e49c..e8cbd7f24ea
>>>> 100644 --- a/doc/android/fastboot-protocol.rst
>>>> +++ b/doc/android/fastboot-protocol.rst
>>>> @@ -144,6 +144,11 @@ Command Reference
>>>>
>>>>    "powerdown"          Power off the device.
>>>>
>>>> +  "ucmd"               execute any bootloader command and wait
>>>> until it
>>>> +                       finishs.
>>>> +
>>>> +  "acmd"               execute any bootloader command, do not
>>>> wait. +
>>>>  Client Variables
>>>>  ----------------
>>>>
>>>> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
>>>> index 2877c3cbaaa..b58d1b5b31a 100644
>>>> --- a/doc/android/fastboot.rst
>>>> +++ b/doc/android/fastboot.rst
>>>> @@ -19,6 +19,8 @@ The current implementation supports the
>>>> following standard commands:
>>>>  - ``reboot``
>>>>  - ``reboot-bootloader``
>>>>  - ``set_active`` (only a stub implementation which always
>>>> succeeds) +- ``ucmd`` (if enabled)
>>>> +- ``acmd`` (if enabled)
>>>>
>>>>  The following OEM commands are supported (if enabled):
>>>>
>>>> diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
>>>> index 4352ba67a71..b1f8cd74a15 100644
>>>> --- a/drivers/fastboot/Kconfig
>>>> +++ b/drivers/fastboot/Kconfig
>>>> @@ -72,6 +72,13 @@ config FASTBOOT_FLASH
>>>>           the downloaded image to a non-volatile storage device.
>>>> Define this to enable the "fastboot flash" command.
>>>>
>>>> +config FASTBOOT_UUU_SUPPORT
>>>> +       bool "Enable FASTBOOT i.MX UUU special command"
>>>> +       default y if ARCH_MX7 || ARCH_MX6 || ARCH_IMX8 ||
>>>> ARCH_IMX8M || ARCH_MX7ULP
>>>> +       select FSL_FASTBOOT
>>>> +       help
>>>> +         The fastboot protocol includes "UCmd" command and "ACmd"
>>>> command +
>>>>  choice
>>>>         prompt "Flash provider for FASTBOOT"
>>>>         depends on FASTBOOT_FLASH
>>>> diff --git a/drivers/fastboot/fb_command.c
>>>> b/drivers/fastboot/fb_command.c index d3c578672dc..31a47e46386
>>>> 100644 --- a/drivers/fastboot/fb_command.c
>>>> +++ b/drivers/fastboot/fb_command.c
>>>> @@ -43,6 +43,11 @@ static void reboot_recovery(char *, char *);
>>>>  static void oem_format(char *, char *);
>>>>  #endif
>>>>
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +static void run_ucmd(char *, char *);
>>>> +static void run_acmd(char *, char *);
>>>> +#endif
>>>> +
>>>>  static const struct {
>>>>         const char *command;
>>>>         void (*dispatch)(char *cmd_parameter, char *response);
>>>> @@ -99,6 +104,16 @@ static const struct {
>>>>                 .dispatch = oem_format,
>>>>         },
>>>>  #endif
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +       [FASTBOOT_COMMAND_UCMD] = {
>>>> +               .command = "UCmd",
>>>> +               .dispatch = run_ucmd,
>>>> +       },
>>>> +       [FASTBOOT_COMMAND_ACMD] = {
>>>> +               .command = "ACmd",
>>>> +               .dispatch = run_acmd,
>>>> +       },
>>>> +#endif
>>>>  };
>>>>
>>>>  /**
>>>> @@ -309,6 +324,53 @@ static void erase(char *cmd_parameter, char
>>>> *response) }
>>>>  #endif
>>>>
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +/**
>>>> + * run_ucmd() - Execute the UCmd command
>>>> + *
>>>> + * @cmd_parameter: Pointer to command parameter
>>>> + * @response: Pointer to fastboot response buffer
>>>> + */
>>>> +static void run_ucmd(char *cmd_parameter, char *response)
>>>> +{
>>>> +       if (!cmd_parameter) {
>>>> +               pr_err("missing slot suffix\n");
>>>> +               fastboot_fail("missing command", response);
>>>> +               return;
>>>> +       }
>>>> +
>>>> +       if (run_command(cmd_parameter, 0))
>>>> +               fastboot_fail("", response);
>>>> +       else
>>>> +               fastboot_okay(NULL, response);
>>>> +}
>>>> +
>>>> +static char g_a_cmd_buff[64];
>>>> +
>>>> +void fastboot_acmd_complete(void)
>>>> +{
>>>> +       run_command(g_a_cmd_buff, 0);
>>>> +}
>>>> +
>>>> +/**
>>>> + * run_acmd() - Execute the ACmd command
>>>> + *
>>>> + * @cmd_parameter: Pointer to command parameter
>>>> + * @response: Pointer to fastboot response buffer
>>>> + */
>>>> +static void run_acmd(char *cmd_parameter, char *response)
>>>> +{
>>>> +       if (!cmd_parameter) {
>>>> +               pr_err("missing slot suffix\n");
>>>> +               fastboot_fail("missing command", response);
>>>> +               return;
>>>> +       }
>>>> +
>>>> +       strcpy(g_a_cmd_buff, cmd_parameter);
>>>> +       fastboot_okay(NULL, response);
>>>> +}
>>>> +#endif
>>>> +
>>>>  /**
>>>>   * reboot_bootloader() - Sets reboot bootloader flag.
>>>>   *
>>>> diff --git a/drivers/usb/gadget/f_fastboot.c
>>>> b/drivers/usb/gadget/f_fastboot.c index d1d087e12b2..bf52d2505f4
>>>> 100644 --- a/drivers/usb/gadget/f_fastboot.c
>>>> +++ b/drivers/usb/gadget/f_fastboot.c
>>>> @@ -419,6 +419,18 @@ static void do_bootm_on_complete(struct
>>>> usb_ep *ep, struct usb_request *req) do_exit_on_complete(ep, req);
>>>>  }
>>>>
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +static void do_acmd_complete(struct usb_ep *ep, struct
>>>> usb_request *req) +{
>>>> +       /* When usb dequeue complete will be called
>>>> +        *  Need status value before call run_command.
>>>> +        * otherwise, host can't get last message.
>>>> +        */
>>>> +       if (req->status == 0)
>>>> +               fastboot_acmd_complete();
>>>> +}
>>>> +#endif
>>>> +
>>>>  static void rx_handler_command(struct usb_ep *ep, struct
>>>> usb_request *req) {
>>>>         char *cmdbuf = req->buf;
>>>> @@ -457,6 +469,11 @@ static void rx_handler_command(struct usb_ep
>>>> *ep, struct usb_request *req) case
>>>> FASTBOOT_COMMAND_REBOOT_RECOVERY: fastboot_func->in_req->complete
>>>> = compl_do_reset; break;
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +               case FASTBOOT_COMMAND_ACMD:
>>>> +                       fastboot_func->in_req->complete =
>>>> do_acmd_complete;
>>>> +                       break;
>>>> +#endif
>>>>                 }
>>>>         }
>>>>
>>>> diff --git a/include/fastboot.h b/include/fastboot.h
>>>> index 8e9ee80907d..ef8cd842bb3 100644
>>>> --- a/include/fastboot.h
>>>> +++ b/include/fastboot.h
>>>> @@ -38,6 +38,10 @@ enum {
>>>>  #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT)
>>>>         FASTBOOT_COMMAND_OEM_FORMAT,
>>>>  #endif
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +       FASTBOOT_COMMAND_ACMD,
>>>> +       FASTBOOT_COMMAND_UCMD,
>>>> +#endif
>>>>
>>>>         FASTBOOT_COMMAND_COUNT
>>>>  };
>>>> @@ -172,4 +176,7 @@ void fastboot_data_download(const void
>>>> *fastboot_data, */
>>>>  void fastboot_data_complete(char *response);
>>>>
>>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>>> +void fastboot_acmd_complete(void);
>>>> +#endif
>>>>  #endif /* _FASTBOOT_H_ */
>>>> --
>>>> 2.25.4
>>>>  
>>
> 
> 
> 
> 
> Best regards,
> 
> Lukasz Majewski
> 
> --
> 
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
> 

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: hs at denx.de


More information about the U-Boot mailing list