Skip to content

Commit

Permalink
i386 pcpu: fix clobbers, suppress warnings, and clean up
Browse files Browse the repository at this point in the history
 - 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
  • Loading branch information
rlibby committed Jul 3, 2024
1 parent 1edf61f commit ab92c99
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 31 deletions.
47 changes: 20 additions & 27 deletions sys/i386/include/pcpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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); \
} \
Expand All @@ -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)
Expand All @@ -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; \
} \
Expand All @@ -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; \
})

Expand Down
8 changes: 4 additions & 4 deletions sys/i386/include/pcpu_aux.h
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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())
Expand Down

0 comments on commit ab92c99

Please sign in to comment.