[U-Boot] [PATCH v2 1/2] efi_loader: device_path: support Sandbox's "host" devices

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Sep 12 08:26:44 UTC 2019


On 9/12/19 6:52 AM, AKASHI Takahiro wrote:
> Sandbox's "host" devices are currently described as UCLASS_ROOT udevice
> with DEV_IF_HOST block device. As the current implementation of
> efi_device_path doesn't support such a type, any "host" device
> on sandbox cannot be seen as a distinct object.
>
> For example,
>   => host bind 0 /foo/disk.img
>
>   => efi devices
>   Scanning disk host0...
>   Found 1 disks
>   Device           Device Path
>   ================ ====================
>   0000000015c19970 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
>   0000000015c19d70 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
>
>   => efi dh
>   Handle           Protocols
>   ================ ====================
>   0000000015c19970 Device Path, Device Path To Text, Device Path Utilities, Unicode Collation 2, HII String, HII Database, HII Config Routing
>   0000000015c19ba0 Driver Binding
>   0000000015c19c10 Simple Text Output
>   0000000015c19c80 Simple Text Input, Simple Text Input Ex
>   0000000015c19d70 Block IO, Device Path, Simple File System

I applied you patch to efi/efi-2019-10 and executed 'bootefi selftest'

Without host:

Installed device path protocols:
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cb7b8)/HD(1,MBR,0xd1535d21,0x1,0x7f)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbba2)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbba2)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbc3)


With host file bound as device:

Installed device path protocols:
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)


/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,02)


/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,02)/HD(1,MBR,0x9b2103f1,0x800,0x3fffe)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cb7b8)/HD(1,MBR,0xd1535d21,0x1,0x7f)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbba2)


/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbba2)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbc3)


=> efidebug devices
Scanning disk host2...
Found 2 disks
Device           Device Path
================ ====================
0000000015e008b0 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
0000000015e00ec0
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,02)
0000000015e01050
/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,02)/HD(1,MBR,0x9b2103f1,0x800,0x3fffe)

This looks ok. Thanks for your contribution.

Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>


>
> As you can see here, efi_root (0x0000000015c19970) and host0 device
> (0x0000000015c19d70) has the same representation of device path.
>
> This is not only inconvenient, but also confusing since two different
> efi objects are associated with the same device path and
> efi_dp_find_obj() will possibly return a wrong result.
>
> Solution:
> Each "host" device should be given an additional device path node
> of "vendor device path" to make it distinguishable.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
>  include/efi_loader.h             |  8 ++++++++
>  lib/efi_loader/efi_device_path.c | 33 ++++++++++++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 5298ea7997f7..38330f2f5463 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -24,6 +24,10 @@
>  #define U_BOOT_GUID \
>  	EFI_GUID(0xe61d73b9, 0xa384, 0x4acc, \
>  		 0xae, 0xab, 0x82, 0xe8, 0x28, 0xf3, 0x62, 0x8b)
> +/* GUID used as host device on sandbox */
> +#define U_BOOT_HOST_DEV_GUID \
> +	EFI_GUID(0xbbe4e671, 0x5773, 0x4ea1, \
> +		 0x9a, 0xab, 0x3a, 0x7d, 0xbf, 0x40, 0xc4, 0x82)
>
>  /* Root node */
>  extern efi_handle_t efi_root;
> @@ -121,6 +125,10 @@ uint16_t *efi_dp_str(struct efi_device_path *dp);
>
>  /* GUID of the U-Boot root node */
>  extern const efi_guid_t efi_u_boot_guid;
> +#ifdef CONFIG_SANDBOX
> +/* GUID of U-Boot host device on sandbox */
> +extern const efi_guid_t efi_guid_host_dev;
> +#endif
>  /* GUID of the EFI_BLOCK_IO_PROTOCOL */
>  extern const efi_guid_t efi_block_io_guid;
>  extern const efi_guid_t efi_global_variable_guid;
> diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
> index eeeb80683607..611bab514286 100644
> --- a/lib/efi_loader/efi_device_path.c
> +++ b/lib/efi_loader/efi_device_path.c
> @@ -12,8 +12,13 @@
>  #include <mmc.h>
>  #include <efi_loader.h>
>  #include <part.h>
> +#include <sandboxblockdev.h>
>  #include <asm-generic/unaligned.h>
>
> +#ifdef CONFIG_SANDBOX
> +const efi_guid_t efi_guid_host_dev = U_BOOT_HOST_DEV_GUID;
> +#endif
> +
>  /* template END node: */
>  static const struct efi_device_path END = {
>  	.type     = DEVICE_PATH_TYPE_END,
> @@ -445,6 +450,16 @@ static unsigned dp_size(struct udevice *dev)
>  		case UCLASS_MMC:
>  			return dp_size(dev->parent) +
>  				sizeof(struct efi_device_path_sd_mmc_path);
> +#endif
> +#ifdef CONFIG_SANDBOX
> +		case UCLASS_ROOT:
> +			 /*
> +			  * Sandbox's host device will be represented
> +			  * as vendor device with extra one byte for
> +			  * device number
> +			  */
> +			return dp_size(dev->parent)
> +				+ sizeof(struct efi_device_path_vendor) + 1;
>  #endif
>  		default:
>  			return dp_size(dev->parent);
> @@ -505,6 +520,24 @@ static void *dp_fill(void *buf, struct udevice *dev)
>  #ifdef CONFIG_BLK
>  	case UCLASS_BLK:
>  		switch (dev->parent->uclass->uc_drv->id) {
> +#ifdef CONFIG_SANDBOX
> +		case UCLASS_ROOT: {
> +			/* stop traversing parents at this point: */
> +			struct efi_device_path_vendor *dp = buf;
> +			struct blk_desc *desc = dev_get_uclass_platdata(dev);
> +
> +			dp_fill(buf, dev->parent);
> +			dp = buf;
> +			++dp;
> +			dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
> +			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
> +			dp->dp.length = sizeof(*dp) + 1;
> +			memcpy(&dp->guid, &efi_guid_host_dev,
> +			       sizeof(efi_guid_t));
> +			dp->vendor_data[0] = desc->devnum;
> +			return &dp->vendor_data[1];
> +			}
> +#endif
>  #ifdef CONFIG_IDE
>  		case UCLASS_IDE: {
>  			struct efi_device_path_atapi *dp =
>



More information about the U-Boot mailing list