diff options
author | jah <jah@FreeBSD.org> | 2017-02-17 07:08:37 +0000 |
---|---|---|
committer | jah <jah@FreeBSD.org> | 2017-02-17 07:08:37 +0000 |
commit | 536dcdb61e3b3c43dfaa64bed563f9631009f2c3 (patch) | |
tree | afd2eb11ad6e4147225017f45934ed707c0ecf79 /sys/i386/include | |
parent | 30bf84c65fcc59de889d3f51254eb5d3beb40cd8 (diff) | |
download | FreeBSD-src-536dcdb61e3b3c43dfaa64bed563f9631009f2c3.zip FreeBSD-src-536dcdb61e3b3c43dfaa64bed563f9631009f2c3.tar.gz |
MFC r312952:
Implement get_pcpu() for i386 and use it to replace pcpu_find(curcpu)
in the i386 pmap.
The curcpu macro loads the per-cpu data pointer as its first step,
so the remaining steps of pcpu_find(curcpu) are circular.
Diffstat (limited to 'sys/i386/include')
-rw-r--r-- | sys/i386/include/pcpu.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h index 3110f9f..1ec6f58 100644 --- a/sys/i386/include/pcpu.h +++ b/sys/i386/include/pcpu.h @@ -76,6 +76,7 @@ extern struct pcpu *pcpup; +#define get_pcpu() (pcpup) #define PCPU_GET(member) (pcpup->pc_ ## member) #define PCPU_ADD(member, val) (pcpup->pc_ ## member += (val)) #define PCPU_INC(member) PCPU_ADD(member, 1) @@ -196,6 +197,15 @@ extern struct pcpu *pcpup; } \ } while (0) +#define get_pcpu() __extension__ ({ \ + struct pcpu *__pc; \ + \ + __asm __volatile("movl %%fs:%1,%0" \ + : "=r" (__pc) \ + : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace)))); \ + __pc; \ +}) + #define PCPU_GET(member) __PCPU_GET(pc_ ## member) #define PCPU_ADD(member, val) __PCPU_ADD(pc_ ## member, val) #define PCPU_INC(member) __PCPU_INC(pc_ ## member) |