On 2026-09-25 01:30 AM, Samiullah Khawaja wrote:
> Libvfio depends on an external dependency libuuid for parsing vf_tokens.
> Building it in cross compilation environments gives the following error,
> 
>  ld: cannot find -luuid: No such file or directory

It also complicates compiling with glibc alternatives like musl. See
https://lore.kernel.org/kvm/[email protected]/

Please mention that as well for historical context.

> As it is only used for parsing vf_tokens, remove the dependency by open
> coding the parser where it is required.
> 
> Tested by running vfio_pci_sriov_uapi_test selftest.
> 
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Samiullah Khawaja <[email protected]>
> ---
>  tools/testing/selftests/vfio/lib/libvfio.mk   |  2 -
>  .../selftests/vfio/lib/vfio_pci_device.c      | 57 ++++++++++++++++---
>  2 files changed, 50 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/testing/selftests/vfio/lib/libvfio.mk 
> b/tools/testing/selftests/vfio/lib/libvfio.mk
> index bcfa74ae040e..7d6916ca3940 100644
> --- a/tools/testing/selftests/vfio/lib/libvfio.mk
> +++ b/tools/testing/selftests/vfio/lib/libvfio.mk
> @@ -29,8 +29,6 @@ $(LIBVFIO_O_DIRS):
>  
>  CFLAGS += -I$(LIBVFIO_SRCDIR)/include
>  
> -LDLIBS += -luuid
> -
>  $(LIBVFIO_O): $(LIBVFIO_OUTPUT)/%.o : $(LIBVFIO_SRCDIR)/%.c | 
> $(LIBVFIO_O_DIRS)
>       $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
>  
> diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c 
> b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> index 4063a0e2b3df..774d1e90ec0e 100644
> --- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> +++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> @@ -23,11 +23,54 @@
>  #include <linux/types.h>
>  #include <linux/vfio.h>
>  
> -#include <uuid/uuid.h>
> -
>  #include "kselftest.h"
>  #include <libvfio.h>
>  
> +/*
> + * Minimal replacement for libuuid's uuid_parse(). libuuid is part of
> + * util-linux and is routinely absent from cross-compilation sysroots, which
> + * makes the vfio selftests unbuildable for non-native architectures. The 
> only
> + * thing needed from it is parsing a VF token, so open-code that instead.
> + */
> +#define VFIO_UUID_LEN                16
> +#define VFIO_UUID_STR_LEN    36
> +
> +static int vfio_uuid_hexval(char c)
> +{
> +     if (c >= '0' && c <= '9')
> +             return c - '0';
> +     if (c >= 'a' && c <= 'f')
> +             return c - 'a' + 10;
> +     if (c >= 'A' && c <= 'F')
> +             return c - 'A' + 10;
> +     return -1;
> +}
> +
> +static int vfio_uuid_parse(const char *in, unsigned char uu[VFIO_UUID_LEN])

Do we need the vfio_/VFIO_ prefixes now that we aren't linking libuuid?

> +{
> +     const char *p = in;
> +     int i, hi, lo;
> +
> +     if (strlen(in) != VFIO_UUID_STR_LEN)
> +             return -1;
> +
> +     for (i = 0; i < VFIO_UUID_LEN; i++) {
> +             if (i == 4 || i == 6 || i == 8 || i == 10) {
> +                     if (*p++ != '-')
> +                             return -1;
> +             }
> +
> +             hi = vfio_uuid_hexval(*p++);
> +             lo = vfio_uuid_hexval(*p++);
> +             if (hi < 0 || lo < 0)
> +                     return -1;
> +
> +             uu[i] = (hi << 4) | lo;
> +     }
> +
> +     return 0;
> +}

Please move the uuid changes into lib/uuid.c and
lib/include/libvfio/uuid.h in case we want to use them elsewhere in the
future.

> +
>  static void vfio_pci_irq_set(struct vfio_pci_device *device,
>                            u32 index, u32 vector, u32 count, int *fds)
>  {
> @@ -167,13 +210,13 @@ static void vfio_device_feature_set(int fd, u16 
> feature, void *data, size_t data
>  
>  void vfio_device_set_vf_token(int fd, const char *vf_token)
>  {
> -     uuid_t token_uuid = {0};
> +     unsigned char token_uuid[VFIO_UUID_LEN] = {0};

Any reason not to define a uuid_t?

>  
>       VFIO_ASSERT_NOT_NULL(vf_token, "vf_token is NULL");
> -     VFIO_ASSERT_EQ(uuid_parse(vf_token, token_uuid), 0);
> +     VFIO_ASSERT_EQ(vfio_uuid_parse(vf_token, token_uuid), 0);
>  
>       vfio_device_feature_set(fd, VFIO_DEVICE_FEATURE_PCI_VF_TOKEN,
> -                             token_uuid, sizeof(uuid_t));
> +                             token_uuid, sizeof(token_uuid));
>  }
>  
>  static void vfio_pci_region_get(struct vfio_pci_device *device, int index,
> @@ -415,10 +458,10 @@ int __vfio_device_bind_iommufd(int device_fd, int 
> iommufd, const char *vf_token)
>               .argsz = sizeof(args),
>               .iommufd = iommufd,
>       };
> -     uuid_t token_uuid;
> +     unsigned char token_uuid[VFIO_UUID_LEN];
>  
>       if (vf_token) {
> -             VFIO_ASSERT_EQ(uuid_parse(vf_token, token_uuid), 0);
> +             VFIO_ASSERT_EQ(vfio_uuid_parse(vf_token, token_uuid), 0);
>               args.flags |= VFIO_DEVICE_BIND_FLAG_TOKEN;
>               args.token_uuid_ptr = (u64)token_uuid;
>       }
> 
> base-commit: 3d7783543c2646af69ad65825e810060494bea21
> -- 
> 2.56.0.rc1.315.gc6ed9934b7-goog
> 

Reply via email to