modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host
authorMasahiro Yamada <masahiroy@kernel.org>
Sat, 7 Oct 2023 17:04:44 +0000 (02:04 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:59:28 +0000 (11:59 +0100)
[ Upstream commit 7f54e00e5842663c2cea501bbbdfa572c94348a3 ]

When MODULE_DEVICE_TABLE(tee, ) is built on a host with a different
endianness from the target architecture, it results in an incorrect
MODULE_ALIAS().

For example, see a case where drivers/char/hw_random/optee-rng.c
is built as a module for ARM little-endian.

If you build it on a little-endian host, you will get the correct
MODULE_ALIAS:

    $ grep MODULE_ALIAS drivers/char/hw_random/optee-rng.mod.c
    MODULE_ALIAS("tee:ab7a617c-b8e7-4d8f-8301-d09b61036b64*");

However, if you build it on a big-endian host, you will get a wrong
MODULE_ALIAS:

    $ grep MODULE_ALIAS drivers/char/hw_random/optee-rng.mod.c
    MODULE_ALIAS("tee:646b0361-9bd0-0183-8f4d-e7b87c617aab*");

The same problem also occurs when you enable CONFIG_CPU_BIG_ENDIAN,
and build it on a little-endian host.

This issue has been unnoticed because the ARM kernel is configured for
little-endian by default, and most likely built on a little-endian host
(cross-build on x86 or native-build on ARM).

The uuid field must not be reversed because uuid_t is an array of __u8.

Fixes: 0fc1db9d1059 ("tee: add bus driver framework for TEE based devices")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
scripts/mod/file2alias.c

index 7056751..70bf6a2 100644 (file)
@@ -1348,13 +1348,13 @@ static int do_typec_entry(const char *filename, void *symval, char *alias)
 /* Looks like: tee:uuid */
 static int do_tee_entry(const char *filename, void *symval, char *alias)
 {
-       DEF_FIELD(symval, tee_client_device_id, uuid);
+       DEF_FIELD_ADDR(symval, tee_client_device_id, uuid);
 
        sprintf(alias, "tee:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-               uuid.b[0], uuid.b[1], uuid.b[2], uuid.b[3], uuid.b[4],
-               uuid.b[5], uuid.b[6], uuid.b[7], uuid.b[8], uuid.b[9],
-               uuid.b[10], uuid.b[11], uuid.b[12], uuid.b[13], uuid.b[14],
-               uuid.b[15]);
+               uuid->b[0], uuid->b[1], uuid->b[2], uuid->b[3], uuid->b[4],
+               uuid->b[5], uuid->b[6], uuid->b[7], uuid->b[8], uuid->b[9],
+               uuid->b[10], uuid->b[11], uuid->b[12], uuid->b[13], uuid->b[14],
+               uuid->b[15]);
 
        add_wildcard(alias);
        return 1;