Skip to content

Commit

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

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

0 comments on commit 2730f42

Please sign in to comment.