summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/pcpu.h
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-07-26 09:11:37 +0000
committerkib <kib@FreeBSD.org>2012-07-26 09:11:37 +0000
commitd3fc8e917d0e4229d20c4bce04b682b3710fd2dc (patch)
tree4905b5e976c538af72794522c674885170a7e457 /sys/i386/include/pcpu.h
parent4f8212948b54915e36ecbd960fbc2a55b56eab59 (diff)
downloadFreeBSD-src-d3fc8e917d0e4229d20c4bce04b682b3710fd2dc.zip
FreeBSD-src-d3fc8e917d0e4229d20c4bce04b682b3710fd2dc.tar.gz
MFamd64 r238623:
Introduce curpcb magic variable. Requested and reviewed by: bde MFC after: 3 weeks
Diffstat (limited to 'sys/i386/include/pcpu.h')
-rw-r--r--sys/i386/include/pcpu.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h
index aaba413..aa1066d 100644
--- a/sys/i386/include/pcpu.h
+++ b/sys/i386/include/pcpu.h
@@ -236,16 +236,36 @@ extern struct pcpu *pcpup;
#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member)
#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val)
+#define OFFSETOF_CURTHREAD 0
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnull-dereference"
+#endif
static __inline __pure2 struct thread *
__curthread(void)
{
struct thread *td;
- __asm("movl %%fs:0,%0" : "=r" (td));
+ __asm("movl %%fs:%1,%0" : "=r" (td)
+ : "m" (*(char *)OFFSETOF_CURTHREAD));
return (td);
}
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
#define curthread (__curthread())
+#define OFFSETOF_CURPCB 16
+static __inline __pure2 struct pcb *
+__curpcb(void)
+{
+ struct pcb *pcb;
+
+ __asm("movl %%fs:%1,%0" : "=r" (pcb) : "m" (*(char *)OFFSETOF_CURPCB));
+ return (pcb);
+}
+#define curpcb (__curpcb())
+
#else /* !lint || defined(__GNUCLIKE_ASM) && defined(__GNUCLIKE___TYPEOF) */
#error "this file needs to be ported to your compiler"
OpenPOWER on IntegriCloud