All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/1] Introduce fastboot oem board command
@ 2024-04-08 10:15 Alexey Romanov
  2024-04-08 10:15 ` [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand Alexey Romanov
  2024-04-16  8:05 ` [PATCH v3 0/1] Introduce fastboot oem board command Mattijs Korpershoek
  0 siblings, 2 replies; 5+ messages in thread
From: Alexey Romanov @ 2024-04-08 10:15 UTC (permalink / raw)
  To: sjg, hs, sean.anderson, dimorinny, mkorpershoek, patrick.delaunay
  Cc: kernel, u-boot, Alexey Romanov

Changes V1 -> V2 [1]:
  - Added an example of using the command as requested
    by Sean Anderson [2].

Changes V2 -> V3 [3]:
  - Rebase over uboot/master.
  - Add documentation.
  - Remove example added in V2 [1].

Links:
    [1] https://lore.kernel.org/all/20231228152522.83291-1-avromanov@salutedevices.com/
    [2] https://lore.kernel.org/all/72ac233d-c18d-4f57-bc66-451fe0bd2997@seco.com/
    [3] https://lore.kernel.org/all/20240201092027.6258-1-avromanov@salutedevices.com/

Alexey Romanov (1):
  fastboot: introduce 'oem board' subcommand

 doc/android/fastboot.rst      | 18 ++++++++++++++++++
 drivers/fastboot/Kconfig      |  7 +++++++
 drivers/fastboot/fb_command.c | 30 ++++++++++++++++++++++++++++++
 include/fastboot.h            |  1 +
 4 files changed, 56 insertions(+)

-- 
2.34.1


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

* [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand
  2024-04-08 10:15 [PATCH v3 0/1] Introduce fastboot oem board command Alexey Romanov
@ 2024-04-08 10:15 ` Alexey Romanov
  2024-04-09  9:44   ` Mattijs Korpershoek
  2024-04-09 14:44   ` Quentin Schulz
  2024-04-16  8:05 ` [PATCH v3 0/1] Introduce fastboot oem board command Mattijs Korpershoek
  1 sibling, 2 replies; 5+ messages in thread
From: Alexey Romanov @ 2024-04-08 10:15 UTC (permalink / raw)
  To: sjg, hs, sean.anderson, dimorinny, mkorpershoek, patrick.delaunay
  Cc: kernel, u-boot, Alexey Romanov

Currently, fastboot protocol in U-Boot has no opportunity
to execute vendor custom code with verifed boot. This patch
introduce new fastboot subcommand fastboot oem board:<cmd>,
which allow to run custom oem_board function.

Default implementation is __weak. Vendor must redefine it in
board/ folder with his own logic.

For example, some vendors have their custom nand/emmc partition
flashing or erasing. Here some typical command for such use cases:

- flashing:

  $ fastboot stage bootloader.img
  $ fastboot oem board:write_bootloader

- erasing:

  $ fastboot oem board:erase_env

Signed-off-by: Alexey Romanov <avromanov@salutedevices.com>
---
 doc/android/fastboot.rst      | 18 ++++++++++++++++++
 drivers/fastboot/Kconfig      |  7 +++++++
 drivers/fastboot/fb_command.c | 30 ++++++++++++++++++++++++++++++
 include/fastboot.h            |  1 +
 4 files changed, 56 insertions(+)

diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
index 05d8f77759..2020590657 100644
--- a/doc/android/fastboot.rst
+++ b/doc/android/fastboot.rst
@@ -30,6 +30,7 @@ The following OEM commands are supported (if enabled):
 - ``oem bootbus``  - this executes ``mmc bootbus %x %s`` to configure eMMC
 - ``oem run`` - this executes an arbitrary U-Boot command
 - ``oem console`` - this dumps U-Boot console record buffer
+- ``oem board`` - this executes an custom board function which is defined by vendor
 
 Support for both eMMC and NAND devices is included.
 
@@ -246,6 +247,23 @@ including multiple commands (using e.g. ``;`` or ``&&``) and control structures
 (``if``, ``while``, etc.). The exit code of ``fastboot`` will reflect the exit
 code of the command you ran.
 
+Running Custom Vendor Code
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+U-Boot allows you to execute custom fastboot logic, which can be defined
+in board/ files. It can still be used for production devices with verified
+boot, because vendor define logic at compile time by overriding weak
+implementation of fastboot_oem_board() function. The attacker will
+not able to execute his commands / code. For example, this can be useful
+for custom flashing or erasing protocols::
+
+    $ fastboot stage bootloader.img
+    $ fastboot oem board:write_bootloader
+
+In this case, ``cmd_parameter`` argument of the function ``fastboot_oem_board()``
+will contain string "write_bootloader" and ``data`` argument is a pointer to
+fastboot input buffer, which containing the contents of bootloader.img file.
+
 References
 ----------
 
diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
index 5e5855a76c..937a39f54a 100644
--- a/drivers/fastboot/Kconfig
+++ b/drivers/fastboot/Kconfig
@@ -249,6 +249,13 @@ config FASTBOOT_CMD_OEM_CONSOLE
 	  Add support for the "oem console" command to input and read console
 	  record buffer.
 
+config FASTBOOT_OEM_BOARD
+	bool "Enable the 'oem board' command"
+	help
+	  This extends the fastboot protocol with an "oem board" command. This
+	  command allows running vendor custom code defined in board/ files.
+	  Otherwise, it will do nothing and send fastboot fail.
+
 endif # FASTBOOT
 
 endmenu
diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
index f95f4e4ae1..96c27afc60 100644
--- a/drivers/fastboot/fb_command.c
+++ b/drivers/fastboot/fb_command.c
@@ -42,6 +42,7 @@ static void oem_format(char *, char *);
 static void oem_partconf(char *, char *);
 static void oem_bootbus(char *, char *);
 static void oem_console(char *, char *);
+static void oem_board(char *, char *);
 static void run_ucmd(char *, char *);
 static void run_acmd(char *, char *);
 
@@ -113,6 +114,10 @@ static const struct {
 		.command = "oem console",
 		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_CONSOLE, (oem_console), (NULL))
 	},
+	[FASTBOOT_COMMAND_OEM_BOARD] = {
+		.command = "oem board",
+		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_OEM_BOARD, (oem_board), (NULL))
+	},
 	[FASTBOOT_COMMAND_UCMD] = {
 		.command = "UCmd",
 		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (run_ucmd), (NULL))
@@ -542,3 +547,28 @@ static void __maybe_unused oem_console(char *cmd_parameter, char *response)
 	else
 		fastboot_response(FASTBOOT_MULTIRESPONSE_START, response, NULL);
 }
+
+/**
+ * fastboot_oem_board() - Execute the OEM board command. This is default
+ * weak implementation, which may be overwritten in board/ files.
+ *
+ * @cmd_parameter: Pointer to command parameter
+ * @data: Pointer to fastboot input buffer
+ * @size: Size of the fastboot input buffer
+ * @response: Pointer to fastboot response buffer
+ */
+void __weak fastboot_oem_board(char *cmd_parameter, void *data, u32 size, char *response)
+{
+	fastboot_fail("oem board function not defined", response);
+}
+
+/**
+ * oem_board() - Execute the OEM board command
+ *
+ * @cmd_parameter: Pointer to command parameter
+ * @response: Pointer to fastboot response buffer
+ */
+static void __maybe_unused oem_board(char *cmd_parameter, char *response)
+{
+	fastboot_oem_board(cmd_parameter, fastboot_buf_addr, image_size, response);
+}
diff --git a/include/fastboot.h b/include/fastboot.h
index 1e7920eb91..2ca1b907a5 100644
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -48,6 +48,7 @@ enum {
 	FASTBOOT_COMMAND_OEM_BOOTBUS,
 	FASTBOOT_COMMAND_OEM_RUN,
 	FASTBOOT_COMMAND_OEM_CONSOLE,
+	FASTBOOT_COMMAND_OEM_BOARD,
 	FASTBOOT_COMMAND_ACMD,
 	FASTBOOT_COMMAND_UCMD,
 	FASTBOOT_COMMAND_COUNT
-- 
2.34.1


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

* Re: [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand
  2024-04-08 10:15 ` [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand Alexey Romanov
@ 2024-04-09  9:44   ` Mattijs Korpershoek
  2024-04-09 14:44   ` Quentin Schulz
  1 sibling, 0 replies; 5+ messages in thread
From: Mattijs Korpershoek @ 2024-04-09  9:44 UTC (permalink / raw)
  To: Alexey Romanov, sjg, hs, sean.anderson, dimorinny,
	patrick.delaunay
  Cc: kernel, u-boot, Alexey Romanov

Hi Alexey,

Thank you for the patch.

On lun., avril 08, 2024 at 13:15, Alexey Romanov <avromanov@salutedevices.com> wrote:

> Currently, fastboot protocol in U-Boot has no opportunity
> to execute vendor custom code with verifed boot. This patch
> introduce new fastboot subcommand fastboot oem board:<cmd>,
> which allow to run custom oem_board function.
>
> Default implementation is __weak. Vendor must redefine it in
> board/ folder with his own logic.
>
> For example, some vendors have their custom nand/emmc partition
> flashing or erasing. Here some typical command for such use cases:
>
> - flashing:
>
>   $ fastboot stage bootloader.img
>   $ fastboot oem board:write_bootloader
>
> - erasing:
>
>   $ fastboot oem board:erase_env
>
> Signed-off-by: Alexey Romanov <avromanov@salutedevices.com>

Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>

Thank you for being patient on this topic!

I'll be awaiting 2 more days and will apply to the u-boot-dfu if no
other remarks have been made.


> ---
>  doc/android/fastboot.rst      | 18 ++++++++++++++++++
>  drivers/fastboot/Kconfig      |  7 +++++++
>  drivers/fastboot/fb_command.c | 30 ++++++++++++++++++++++++++++++
>  include/fastboot.h            |  1 +
>  4 files changed, 56 insertions(+)
>
> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
> index 05d8f77759..2020590657 100644
> --- a/doc/android/fastboot.rst
> +++ b/doc/android/fastboot.rst
> @@ -30,6 +30,7 @@ The following OEM commands are supported (if enabled):
>  - ``oem bootbus``  - this executes ``mmc bootbus %x %s`` to configure eMMC
>  - ``oem run`` - this executes an arbitrary U-Boot command
>  - ``oem console`` - this dumps U-Boot console record buffer
> +- ``oem board`` - this executes an custom board function which is defined by vendor
>  
>  Support for both eMMC and NAND devices is included.
>  
> @@ -246,6 +247,23 @@ including multiple commands (using e.g. ``;`` or ``&&``) and control structures
>  (``if``, ``while``, etc.). The exit code of ``fastboot`` will reflect the exit
>  code of the command you ran.
>  
> +Running Custom Vendor Code
> +^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +U-Boot allows you to execute custom fastboot logic, which can be defined
> +in board/ files. It can still be used for production devices with verified
> +boot, because vendor define logic at compile time by overriding weak
> +implementation of fastboot_oem_board() function. The attacker will
> +not able to execute his commands / code. For example, this can be useful
> +for custom flashing or erasing protocols::
> +
> +    $ fastboot stage bootloader.img
> +    $ fastboot oem board:write_bootloader
> +
> +In this case, ``cmd_parameter`` argument of the function ``fastboot_oem_board()``
> +will contain string "write_bootloader" and ``data`` argument is a pointer to
> +fastboot input buffer, which containing the contents of bootloader.img file.
> +
>  References
>  ----------
>  
> diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
> index 5e5855a76c..937a39f54a 100644
> --- a/drivers/fastboot/Kconfig
> +++ b/drivers/fastboot/Kconfig
> @@ -249,6 +249,13 @@ config FASTBOOT_CMD_OEM_CONSOLE
>  	  Add support for the "oem console" command to input and read console
>  	  record buffer.
>  
> +config FASTBOOT_OEM_BOARD
> +	bool "Enable the 'oem board' command"
> +	help
> +	  This extends the fastboot protocol with an "oem board" command. This
> +	  command allows running vendor custom code defined in board/ files.
> +	  Otherwise, it will do nothing and send fastboot fail.
> +
>  endif # FASTBOOT
>  
>  endmenu
> diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
> index f95f4e4ae1..96c27afc60 100644
> --- a/drivers/fastboot/fb_command.c
> +++ b/drivers/fastboot/fb_command.c
> @@ -42,6 +42,7 @@ static void oem_format(char *, char *);
>  static void oem_partconf(char *, char *);
>  static void oem_bootbus(char *, char *);
>  static void oem_console(char *, char *);
> +static void oem_board(char *, char *);
>  static void run_ucmd(char *, char *);
>  static void run_acmd(char *, char *);
>  
> @@ -113,6 +114,10 @@ static const struct {
>  		.command = "oem console",
>  		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_CONSOLE, (oem_console), (NULL))
>  	},
> +	[FASTBOOT_COMMAND_OEM_BOARD] = {
> +		.command = "oem board",
> +		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_OEM_BOARD, (oem_board), (NULL))
> +	},
>  	[FASTBOOT_COMMAND_UCMD] = {
>  		.command = "UCmd",
>  		.dispatch = CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (run_ucmd), (NULL))
> @@ -542,3 +547,28 @@ static void __maybe_unused oem_console(char *cmd_parameter, char *response)
>  	else
>  		fastboot_response(FASTBOOT_MULTIRESPONSE_START, response, NULL);
>  }
> +
> +/**
> + * fastboot_oem_board() - Execute the OEM board command. This is default
> + * weak implementation, which may be overwritten in board/ files.
> + *
> + * @cmd_parameter: Pointer to command parameter
> + * @data: Pointer to fastboot input buffer
> + * @size: Size of the fastboot input buffer
> + * @response: Pointer to fastboot response buffer
> + */
> +void __weak fastboot_oem_board(char *cmd_parameter, void *data, u32 size, char *response)
> +{
> +	fastboot_fail("oem board function not defined", response);
> +}
> +
> +/**
> + * oem_board() - Execute the OEM board command
> + *
> + * @cmd_parameter: Pointer to command parameter
> + * @response: Pointer to fastboot response buffer
> + */
> +static void __maybe_unused oem_board(char *cmd_parameter, char *response)
> +{
> +	fastboot_oem_board(cmd_parameter, fastboot_buf_addr, image_size, response);
> +}
> diff --git a/include/fastboot.h b/include/fastboot.h
> index 1e7920eb91..2ca1b907a5 100644
> --- a/include/fastboot.h
> +++ b/include/fastboot.h
> @@ -48,6 +48,7 @@ enum {
>  	FASTBOOT_COMMAND_OEM_BOOTBUS,
>  	FASTBOOT_COMMAND_OEM_RUN,
>  	FASTBOOT_COMMAND_OEM_CONSOLE,
> +	FASTBOOT_COMMAND_OEM_BOARD,
>  	FASTBOOT_COMMAND_ACMD,
>  	FASTBOOT_COMMAND_UCMD,
>  	FASTBOOT_COMMAND_COUNT
> -- 
> 2.34.1

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

* Re: [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand
  2024-04-08 10:15 ` [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand Alexey Romanov
  2024-04-09  9:44   ` Mattijs Korpershoek
@ 2024-04-09 14:44   ` Quentin Schulz
  1 sibling, 0 replies; 5+ messages in thread
From: Quentin Schulz @ 2024-04-09 14:44 UTC (permalink / raw)
  To: Alexey Romanov, sjg, hs, sean.anderson, dimorinny, mkorpershoek,
	patrick.delaunay
  Cc: kernel, u-boot

Hi Alexey,

On 4/8/24 12:15, Alexey Romanov wrote:
> Currently, fastboot protocol in U-Boot has no opportunity
> to execute vendor custom code with verifed boot. This patch
> introduce new fastboot subcommand fastboot oem board:<cmd>,
> which allow to run custom oem_board function.
> 
> Default implementation is __weak. Vendor must redefine it in
> board/ folder with his own logic.
> 
> For example, some vendors have their custom nand/emmc partition
> flashing or erasing. Here some typical command for such use cases:
> 
> - flashing:
> 
>    $ fastboot stage bootloader.img
>    $ fastboot oem board:write_bootloader
> 
> - erasing:
> 
>    $ fastboot oem board:erase_env
> 
> Signed-off-by: Alexey Romanov <avromanov@salutedevices.com>
> ---
>   doc/android/fastboot.rst      | 18 ++++++++++++++++++
>   drivers/fastboot/Kconfig      |  7 +++++++
>   drivers/fastboot/fb_command.c | 30 ++++++++++++++++++++++++++++++
>   include/fastboot.h            |  1 +
>   4 files changed, 56 insertions(+)
> 
> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
> index 05d8f77759..2020590657 100644
> --- a/doc/android/fastboot.rst
> +++ b/doc/android/fastboot.rst
> @@ -30,6 +30,7 @@ The following OEM commands are supported (if enabled):
>   - ``oem bootbus``  - this executes ``mmc bootbus %x %s`` to configure eMMC
>   - ``oem run`` - this executes an arbitrary U-Boot command
>   - ``oem console`` - this dumps U-Boot console record buffer
> +- ``oem board`` - this executes an custom board function which is defined by vendor

s/an/a/

+the vendor? (missing "the")

>   
>   Support for both eMMC and NAND devices is included.
>   
> @@ -246,6 +247,23 @@ including multiple commands (using e.g. ``;`` or ``&&``) and control structures
>   (``if``, ``while``, etc.). The exit code of ``fastboot`` will reflect the exit
>   code of the command you ran.
>   
> +Running Custom Vendor Code
> +^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +U-Boot allows you to execute custom fastboot logic, which can be defined
> +in board/ files. It can still be used for production devices with verified
> +boot, because vendor define logic at compile time by overriding weak

s/vendor define/the vendor defines/

Suggestion:

Replace "by overriding weak implementation of fastboot_oem_board()" with 
"by implementing fastboot_oem_board()", the weak symbol is an 
implementation detail I don't think we need to keep in the documentation?

> +implementation of fastboot_oem_board() function. The attacker will
> +not able to execute his commands / code. For example, this can be useful

+be able (missing be)

s/his/custom/ or s/his/their/

> +for custom flashing or erasing protocols::
> +
> +    $ fastboot stage bootloader.img
> +    $ fastboot oem board:write_bootloader
> +
> +In this case, ``cmd_parameter`` argument of the function ``fastboot_oem_board()``
> +will contain string "write_bootloader" and ``data`` argument is a pointer to
> +fastboot input buffer, which containing the contents of bootloader.img file.
> +

Either

-which (remove "which")

s/which containing/which contains/

Cheers,
Quentin

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

* Re: [PATCH v3 0/1] Introduce fastboot oem board command
  2024-04-08 10:15 [PATCH v3 0/1] Introduce fastboot oem board command Alexey Romanov
  2024-04-08 10:15 ` [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand Alexey Romanov
@ 2024-04-16  8:05 ` Mattijs Korpershoek
  1 sibling, 0 replies; 5+ messages in thread
From: Mattijs Korpershoek @ 2024-04-16  8:05 UTC (permalink / raw)
  To: sjg, hs, sean.anderson, dimorinny, patrick.delaunay,
	Alexey Romanov
  Cc: kernel, u-boot

Hi,

On Mon, 08 Apr 2024 13:15:51 +0300, Alexey Romanov wrote:
> Changes V1 -> V2 [1]:
>   - Added an example of using the command as requested
>     by Sean Anderson [2].
> 
> Changes V2 -> V3 [3]:
>   - Rebase over uboot/master.
>   - Add documentation.
>   - Remove example added in V2 [1].
> 
> [...]

Thanks, Applied to https://source.denx.de/u-boot/custodians/u-boot-dfu (u-boot-dfu-next)

[1/1] fastboot: introduce 'oem board' subcommand
      https://source.denx.de/u-boot/custodians/u-boot-dfu/-/commit/78ae23de701bd65501079b4c39158f152bfbafa9

--
Mattijs

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

end of thread, other threads:[~2024-04-16  8:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-08 10:15 [PATCH v3 0/1] Introduce fastboot oem board command Alexey Romanov
2024-04-08 10:15 ` [PATCH v3 1/1] fastboot: introduce 'oem board' subcommand Alexey Romanov
2024-04-09  9:44   ` Mattijs Korpershoek
2024-04-09 14:44   ` Quentin Schulz
2024-04-16  8:05 ` [PATCH v3 0/1] Introduce fastboot oem board command Mattijs Korpershoek

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.