The branch main has been updated by rlibby:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=2730f4291411be0adc1c6ec421f72e146556579c

commit 2730f4291411be0adc1c6ec421f72e146556579c
Author:     Ryan Libby <[email protected]>
AuthorDate: 2024-07-03 15:36:31 +0000
Commit:     Ryan Libby <[email protected]>
CommitDate: 2024-07-03 15:36:31 +0000

    amd64 pcpu: fix clobbers, suppress warnings, and clean up
    
    These changes mostly apply to the !__SEG_GS section, which is no longer
    the normal compilation path.  They're made to be consistent with changes
    to i386.
    
     - Add missing cc clobber to __PCPU_ADD (which is currently unused).
     - Allow the compiler the opportunity to marginally improve code
       generation from __PCPU_PTR by letting it figure out how to do the add
       (also removing the addition fixes a missing cc clobber).
     - Quiet gcc -Warray-bounds by using constant operands instead of bogus
       memory references.
     - Remove the struct __s __s temporaries, just cast through the type.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D45827
---
 sys/amd64/include/pcpu.h     | 51 +++++++++++++++++++-------------------------
 sys/amd64/include/pcpu_aux.h |  4 ++--
 2 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/sys/amd64/include/pcpu.h b/sys/amd64/include/pcpu.h
index fb49eb31ef8a..213790d245dc 100644
--- a/sys/amd64/include/pcpu.h
+++ b/sys/amd64/include/pcpu.h
@@ -182,16 +182,8 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache 
line");
 /*
  * Evaluates to the address of the per-cpu variable name.
  */
-#define        __PCPU_PTR(name) __extension__ ({                               
\
-       __pcpu_type(name) *__p;                                         \
-                                                                       \
-       __asm __volatile("movq %%gs:%1,%0; addq %2,%0"                  \
-           : "=r" (__p)                                                \
-           : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))),       \
-             "i" (__pcpu_offset(name)));                               \
-                                                                       \
-       __p;                                                            \
-})
+#define        __PCPU_PTR(name)                                                
\
+       (&get_pcpu()->name)
 
 /*
  * Evaluates to the value of the per-cpu variable name.
@@ -200,14 +192,13 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x 
cache line");
        __pcpu_type(name) __res;                                        \
        struct __s {                                                    \
                u_char  __b[MIN(sizeof(__pcpu_type(name)), 8)];         \
-       } __s;                                                          \
+       };                                                              \
                                                                        \
        if (sizeof(__res) == 1 || sizeof(__res) == 2 ||                 \
            sizeof(__res) == 4 || sizeof(__res) == 8) {                 \
-               __asm __volatile("mov %%gs:%1,%0"                       \
-                   : "=r" (__s)                                        \
-                   : "m" (*(struct __s *)(__pcpu_offset(name))));      \
-               *(struct __s *)(void *)&__res = __s;                    \
+               __asm __volatile("mov %%gs:%c1,%0"                      \
+                   : "=r" (*(struct __s *)(void *)&__res)              \
+                   : "i" (__pcpu_offset(name)));                       \
        } else {                                                        \
                __res = *__PCPU_PTR(name);                              \
        }                                                               \
@@ -222,15 +213,16 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x 
cache line");
        __pcpu_type(name) __val;                                        \
        struct __s {                                                    \
                u_char  __b[MIN(sizeof(__pcpu_type(name)), 8)];         \
-       } __s;                                                          \
+       };                                                              \
                                                                        \
        __val = (val);                                                  \
        if (sizeof(__val) == 1 || sizeof(__val) == 2 ||                 \
            sizeof(__val) == 4 || sizeof(__val) == 8) {                 \
-               __s = *(struct __s *)(void *)&__val;                    \
-               __asm __volatile("add %1,%%gs:%0"                       \
-                   : "=m" (*(struct __s *)(__pcpu_offset(name)))       \
-                   : "r" (__s));                                       \
+               __asm __volatile("add %1,%%gs:%c0"                      \
+                   :                                                   \
+                   : "i" (__pcpu_offset(name)),                        \
+                     "r" (*(struct __s *)(void *)&__val)               \
+                   : "cc", "memory");                                  \
        } else                                                          \
                *__PCPU_PTR(name) += __val;                             \
 } while (0)
@@ -238,30 +230,31 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x 
cache line");
 /*
  * Sets the value of the per-cpu variable name to value val.
  */
-#define        __PCPU_SET(name, val) {                                         
\
+#define        __PCPU_SET(name, val) do {                                      
\
        __pcpu_type(name) __val;                                        \
        struct __s {                                                    \
                u_char  __b[MIN(sizeof(__pcpu_type(name)), 8)];         \
-       } __s;                                                          \
+       };                                                              \
                                                                        \
        __val = (val);                                                  \
        if (sizeof(__val) == 1 || sizeof(__val) == 2 ||                 \
            sizeof(__val) == 4 || sizeof(__val) == 8) {                 \
-               __s = *(struct __s *)(void *)&__val;                    \
-               __asm __volatile("mov %1,%%gs:%0"                       \
-                   : "=m" (*(struct __s *)(__pcpu_offset(name)))       \
-                   : "r" (__s));                                       \
+               __asm __volatile("mov %1,%%gs:%c0"                      \
+                   :                                                   \
+                   : "i" (__pcpu_offset(name)),                        \
+                     "r" (*(struct __s *)(void *)&__val)               \
+                   : "memory");                                        \
        } else {                                                        \
                *__PCPU_PTR(name) = __val;                              \
        }                                                               \
-}
+} while (0)
 
 #define        get_pcpu() __extension__ ({                                     
\
        struct pcpu *__pc;                                              \
                                                                        \
-       __asm __volatile("movq %%gs:%1,%0"                              \
+       __asm __volatile("movq %%gs:%c1,%0"                             \
            : "=r" (__pc)                                               \
-           : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))));      \
+           : "i" (__pcpu_offset(pc_prvspace)));                        \
        __pc;                                                           \
 })
 #endif /* !__SEG_GS */
diff --git a/sys/amd64/include/pcpu_aux.h b/sys/amd64/include/pcpu_aux.h
index 9d776274a57d..6e27162e1fb4 100644
--- a/sys/amd64/include/pcpu_aux.h
+++ b/sys/amd64/include/pcpu_aux.h
@@ -54,8 +54,8 @@ __curthread(void)
 {
        struct thread *td;
 
-       __asm("movq %%gs:%P1,%0" : "=r" (td) : "n" (offsetof(struct pcpu,
-           pc_curthread)));
+       __asm("movq %%gs:%c1,%0" : "=r" (td)
+           : "i" (offsetof(struct pcpu, pc_curthread)));
        return (td);
 }
 #define        curthread               (__curthread())

Reply via email to