Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Aug 2021 19:34:57 GMT
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 130a690ae16e - main - Fix acpica macros that subtract null pointers
Message-ID:  <202108301934.17UJYvdh082751@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by dim:

URL: https://cgit.FreeBSD.org/src/commit/?id=130a690ae16e1b845629e586203b508eff699f38

commit 130a690ae16e1b845629e586203b508eff699f38
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2021-08-29 11:15:23 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2021-08-30 19:34:34 +0000

    Fix acpica macros that subtract null pointers
    
    Clang 13.0.0 produces a new -Werror warning about the ACPI_TO_INTEGER(p)
    and ACPI_OFFSET(d, f) macros in acpica's actypes.h:
    
        sys/contrib/dev/acpica/components/dispatcher/dsopcode.c:708:31: error: performing pointer subtraction with a null pointer has undefined behavior [-Werror,-Wnull-pointer-subtraction]
            ObjDesc->Region.Address = ACPI_PTR_TO_PHYSADDR (Table);
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
        sys/contrib/dev/acpica/include/actypes.h:664:41: note: expanded from macro 'ACPI_PTR_TO_PHYSADDR'
        #define ACPI_PTR_TO_PHYSADDR(i)         ACPI_TO_INTEGER(i)
                                                ^~~~~~~~~~~~~~~~~~
        sys/contrib/dev/acpica/include/actypes.h:661:41: note: expanded from macro 'ACPI_TO_INTEGER'
        #define ACPI_TO_INTEGER(p)              ACPI_PTR_DIFF (p, (void *) 0)
                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        sys/contrib/dev/acpica/include/actypes.h:656:82: note: expanded from macro 'ACPI_PTR_DIFF'
        #define ACPI_PTR_DIFF(a, b)             ((ACPI_SIZE) (ACPI_CAST_PTR (UINT8, (a)) - ACPI_CAST_PTR (UINT8, (b))))
                                                                                         ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
        1 error generated.
    
    This problem of undefined behavior was also reported to acpica by @cem
    in 2018: https://github.com/acpica/acpica/issues/407, but it seems there
    was never any fix committed for it upstream.
    
    Instead fix these locally, for ACPI_TO_INTEGER by simply casting the
    incoming pointer to ACPI_SIZE (which corresponds roughly to uintptr_t
    and size_t), and for ACPI_OFFSET by reusing our __offsetof definition
    from sys/cdefs.h.
    
    Reviewed by:    emaste, kib, imp
    MFC after:      3 days
    Differential Revision: https://reviews.freebsd.org/D31710
---
 sys/contrib/dev/acpica/include/actypes.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/sys/contrib/dev/acpica/include/actypes.h b/sys/contrib/dev/acpica/include/actypes.h
index e98e636a36a8..5069c59ee339 100644
--- a/sys/contrib/dev/acpica/include/actypes.h
+++ b/sys/contrib/dev/acpica/include/actypes.h
@@ -658,8 +658,13 @@ typedef UINT64                          ACPI_INTEGER;
 /* Pointer/Integer type conversions */
 
 #define ACPI_TO_POINTER(i)              ACPI_CAST_PTR (void, (ACPI_SIZE) (i))
+#ifdef __FreeBSD__
+#define ACPI_TO_INTEGER(p)              ((ACPI_SIZE) (p))
+#define ACPI_OFFSET(d, f)               ((ACPI_SIZE) __offsetof(d, f))
+#else
 #define ACPI_TO_INTEGER(p)              ACPI_PTR_DIFF (p, (void *) 0)
 #define ACPI_OFFSET(d, f)               ACPI_PTR_DIFF (&(((d *) 0)->f), (void *) 0)
+#endif
 #define ACPI_PHYSADDR_TO_PTR(i)         ACPI_TO_POINTER(i)
 #define ACPI_PTR_TO_PHYSADDR(i)         ACPI_TO_INTEGER(i)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202108301934.17UJYvdh082751>