aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64/include
diff options
context:
space:
mode:
authorRyan Libby <rlibby@FreeBSD.org>2024-07-03 15:36:31 +0000
committerRyan Libby <rlibby@FreeBSD.org>2024-07-03 15:36:31 +0000
commit2730f4291411be0adc1c6ec421f72e146556579c (patch)
tree03e4fc69dbb579ab33ec55aadc1979ef2ce8078a /sys/amd64/include
parentab92c99aa56fdec4a06f9af5f30f87ef08fbeb0e (diff)
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
Diffstat (limited to 'sys/amd64/include')
-rw-r--r--sys/amd64/include/pcpu.h51
-rw-r--r--sys/amd64/include/pcpu_aux.h4
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())