summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/fpu.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-07-19 19:09:12 +0000
committerkib <kib@FreeBSD.org>2012-07-19 19:09:12 +0000
commitebf0cf4fd1e5909a88ee09a6231268d30c9f14d7 (patch)
treebe675caf28ff4a939913574d8fc2b7e490e94fd0 /sys/amd64/amd64/fpu.c
parent223e24232e0e22efa530b704fdcd40845e18cce8 (diff)
downloadFreeBSD-src-ebf0cf4fd1e5909a88ee09a6231268d30c9f14d7.zip
FreeBSD-src-ebf0cf4fd1e5909a88ee09a6231268d30c9f14d7.tar.gz
Introduce curpcb magic variable, similar to curthread, which is MD
amd64. It is implemented as __pure2 inline with non-volatile asm read from pcpu, which allows a compiler to cache its results. Convert most PCPU_GET(pcb) and curthread->td_pcb accesses into curpcb. Note that __curthread() uses magic value 0 as an offsetof(struct pcpu, pc_curthread). It seems to be done this way due to machine/pcpu.h needs to be processed before sys/pcpu.h, because machine/pcpu.h contributes machine-depended fields to the struct pcpu definition. As result, machine/pcpu.h cannot use struct pcpu yet. The __curpcb() also uses a magic constant instead of offsetof(struct pcpu, pc_curpcb) for the same reason. The constants are now defined as symbols and CTASSERTs are added to ensure that future KBI changes do not break the code. Requested and reviewed by: bde MFC after: 3 weeks
Diffstat (limited to 'sys/amd64/amd64/fpu.c')
-rw-r--r--sys/amd64/amd64/fpu.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c
index f88aba7..fe4bcf1 100644
--- a/sys/amd64/amd64/fpu.c
+++ b/sys/amd64/amd64/fpu.c
@@ -327,7 +327,7 @@ fpuexit(struct thread *td)
critical_enter();
if (curthread == PCPU_GET(fpcurthread)) {
stop_emulating();
- fpusave(PCPU_GET(curpcb)->pcb_save);
+ fpusave(curpcb->pcb_save);
start_emulating();
PCPU_SET(fpcurthread, 0);
}
@@ -547,7 +547,7 @@ fputrap_x87(void)
* wherever they are.
*/
if (PCPU_GET(fpcurthread) != curthread) {
- pcb_save = PCPU_GET(curpcb)->pcb_save;
+ pcb_save = curpcb->pcb_save;
control = pcb_save->sv_env.en_cw;
status = pcb_save->sv_env.en_sw;
} else {
@@ -567,7 +567,7 @@ fputrap_sse(void)
critical_enter();
if (PCPU_GET(fpcurthread) != curthread)
- mxcsr = PCPU_GET(curpcb)->pcb_save->sv_env.en_mxcsr;
+ mxcsr = curpcb->pcb_save->sv_env.en_mxcsr;
else
stmxcsr(&mxcsr);
critical_exit();
@@ -609,7 +609,7 @@ fpudna(void)
* Record new context early in case frstor causes a trap.
*/
PCPU_SET(fpcurthread, curthread);
- pcb = PCPU_GET(curpcb);
+ pcb = curpcb;
fpu_clean_state();
@@ -970,7 +970,7 @@ fpu_kern_thread(u_int flags)
{
struct pcb *pcb;
- pcb = PCPU_GET(curpcb);
+ pcb = curpcb;
KASSERT((curthread->td_pflags & TDP_KTHREAD) != 0,
("Only kthread may use fpu_kern_thread"));
KASSERT(pcb->pcb_save == get_pcb_user_save_pcb(pcb),
@@ -987,5 +987,5 @@ is_fpu_kern_thread(u_int flags)
if ((curthread->td_pflags & TDP_KTHREAD) == 0)
return (0);
- return ((PCPU_GET(curpcb)->pcb_flags & PCB_KERNFPU) != 0);
+ return ((curpcb->pcb_flags & PCB_KERNFPU) != 0);
}
OpenPOWER on IntegriCloud