[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