git: ab92c99aa56f - main - i386 pcpu: fix clobbers, suppress warnings, and clean up
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 03 Jul 2024 16:14:56 UTC
The branch main has been updated by rlibby:
URL: https://cgit.FreeBSD.org/src/commit/?id=ab92c99aa56fdec4a06f9af5f30f87ef08fbeb0e
commit ab92c99aa56fdec4a06f9af5f30f87ef08fbeb0e
Author: Ryan Libby <rlibby@FreeBSD.org>
AuthorDate: 2024-07-03 15:35:31 +0000
Commit: Ryan Libby <rlibby@FreeBSD.org>
CommitDate: 2024-07-03 15:35:31 +0000
i386 pcpu: fix clobbers, suppress warnings, and clean up
- 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/D45826
---
sys/i386/include/pcpu.h | 47 +++++++++++++++++++--------------------------
sys/i386/include/pcpu_aux.h | 8 ++++----
2 files changed, 24 insertions(+), 31 deletions(-)
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h
index ef3f5cc9dff7..d51763b20798 100644
--- a/sys/i386/include/pcpu.h
+++ b/sys/i386/include/pcpu.h
@@ -108,16 +108,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("movl %%fs:%1,%0; addl %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.
@@ -126,14 +118,13 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
__pcpu_type(name) __res; \
struct __s { \
u_char __b[MIN(sizeof(__res), 4)]; \
- } __s; \
+ }; \
\
if (sizeof(__res) == 1 || sizeof(__res) == 2 || \
sizeof(__res) == 4) { \
- __asm __volatile("mov %%fs:%1,%0" \
- : "=r" (__s) \
- : "m" (*(struct __s *)(__pcpu_offset(name)))); \
- *(struct __s *)(void *)&__res = __s; \
+ __asm __volatile("mov %%fs:%c1,%0" \
+ : "=r" (*(struct __s *)(void *)&__res) \
+ : "i" (__pcpu_offset(name))); \
} else { \
__res = *__PCPU_PTR(name); \
} \
@@ -148,15 +139,16 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
__pcpu_type(name) __val; \
struct __s { \
u_char __b[MIN(sizeof(__val), 4)]; \
- } __s; \
+ }; \
\
__val = (val); \
if (sizeof(__val) == 1 || sizeof(__val) == 2 || \
sizeof(__val) == 4) { \
- __s = *(struct __s *)(void *)&__val; \
- __asm __volatile("add %1,%%fs:%0" \
- : "=m" (*(struct __s *)(__pcpu_offset(name))) \
- : "r" (__s)); \
+ __asm __volatile("add %1,%%fs:%c0" \
+ : \
+ : "i" (__pcpu_offset(name)), \
+ "r" (*(struct __s *)(void *)&__val) \
+ : "cc", "memory"); \
} else \
*__PCPU_PTR(name) += __val; \
} while (0)
@@ -168,15 +160,16 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
__pcpu_type(name) __val; \
struct __s { \
u_char __b[MIN(sizeof(__val), 4)]; \
- } __s; \
+ }; \
\
__val = (val); \
if (sizeof(__val) == 1 || sizeof(__val) == 2 || \
sizeof(__val) == 4) { \
- __s = *(struct __s *)(void *)&__val; \
- __asm __volatile("mov %1,%%fs:%0" \
- : "=m" (*(struct __s *)(__pcpu_offset(name))) \
- : "r" (__s)); \
+ __asm __volatile("mov %1,%%fs:%c0" \
+ : \
+ : "i" (__pcpu_offset(name)), \
+ "r" (*(struct __s *)(void *)&__val) \
+ : "memory"); \
} else { \
*__PCPU_PTR(name) = __val; \
} \
@@ -185,9 +178,9 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
#define get_pcpu() __extension__ ({ \
struct pcpu *__pc; \
\
- __asm __volatile("movl %%fs:%1,%0" \
+ __asm __volatile("movl %%fs:%c1,%0" \
: "=r" (__pc) \
- : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace)))); \
+ : "i" (__pcpu_offset(pc_prvspace))); \
__pc; \
})
diff --git a/sys/i386/include/pcpu_aux.h b/sys/i386/include/pcpu_aux.h
index 9d15ee1f3ee3..a38faf9af964 100644
--- a/sys/i386/include/pcpu_aux.h
+++ b/sys/i386/include/pcpu_aux.h
@@ -49,8 +49,8 @@ __curthread(void)
{
struct thread *td;
- __asm("movl %%fs:%1,%0" : "=r" (td)
- : "m" (*(char *)offsetof(struct pcpu, pc_curthread)));
+ __asm("movl %%fs:%c1,%0" : "=r" (td)
+ : "i" (offsetof(struct pcpu, pc_curthread)));
return (td);
}
#define curthread (__curthread())
@@ -60,8 +60,8 @@ __curpcb(void)
{
struct pcb *pcb;
- __asm("movl %%fs:%1,%0" : "=r" (pcb)
- : "m" (*(char *)offsetof(struct pcpu, pc_curpcb)));
+ __asm("movl %%fs:%c1,%0" : "=r" (pcb)
+ : "i" (offsetof(struct pcpu, pc_curpcb)));
return (pcb);
}
#define curpcb (__curpcb())