]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
modpost: fix acpi MODULE_DEVICE_TABLE built with mismatched endianness
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 3 Nov 2024 12:46:50 +0000 (21:46 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Sun, 3 Nov 2024 13:52:12 +0000 (22:52 +0900)
When CONFIG_SATA_AHCI_PLATFORM=m, modpost outputs incorect acpi
MODULE_ALIAS() if the endianness of the target and the build machine
do not match.

When the endianness of the target kernel and the build machine match,
the output is correct:

  $ grep 'MODULE_ALIAS("acpi' drivers/ata/ahci_platform.mod.c
  MODULE_ALIAS("acpi*:APMC0D33:*");
  MODULE_ALIAS("acpi*:010601:*");

However, when building a little-endian kernel on a big-endian machine
(or vice versa), the output is incorrect:

  $ grep 'MODULE_ALIAS("acpi' drivers/ata/ahci_platform.mod.c
  MODULE_ALIAS("acpi*:APMC0D33:*");
  MODULE_ALIAS("acpi*:0601??:*");

The 'cls' and 'cls_msk' fields are 32-bit.

DEF_FIELD() must be used instead of DEF_FIELD_ADDR() to correctly handle
endianness of these 32-bit fields.

The check 'if (cls)' was unnecessary; it never became NULL, as it was
the pointer to 'symval' plus the offset to the 'cls' field.

Fixes: 26095a01d359 ("ACPI / scan: Add support for ACPI _CLS device matching")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/mod/file2alias.c

index 99dce93a41888d486925344838bcb40917033cea..16154449dde1dc4c0174201f1568dedb11adc4f8 100644 (file)
@@ -567,12 +567,12 @@ static int do_acpi_entry(const char *filename,
                        void *symval, char *alias)
 {
        DEF_FIELD_ADDR(symval, acpi_device_id, id);
-       DEF_FIELD_ADDR(symval, acpi_device_id, cls);
-       DEF_FIELD_ADDR(symval, acpi_device_id, cls_msk);
+       DEF_FIELD(symval, acpi_device_id, cls);
+       DEF_FIELD(symval, acpi_device_id, cls_msk);
 
        if (id && strlen((const char *)*id))
                sprintf(alias, "acpi*:%s:*", *id);
-       else if (cls) {
+       else {
                int i, byte_shift, cnt = 0;
                unsigned int msk;
 
@@ -580,10 +580,10 @@ static int do_acpi_entry(const char *filename,
                cnt = 6;
                for (i = 1; i <= 3; i++) {
                        byte_shift = 8 * (3-i);
-                       msk = (*cls_msk >> byte_shift) & 0xFF;
+                       msk = (cls_msk >> byte_shift) & 0xFF;
                        if (msk)
                                sprintf(&alias[cnt], "%02x",
-                                       (*cls >> byte_shift) & 0xFF);
+                                       (cls >> byte_shift) & 0xFF);
                        else
                                sprintf(&alias[cnt], "??");
                        cnt += 2;