diff options
author | peter <peter@FreeBSD.org> | 2008-03-23 22:44:56 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2008-03-23 22:44:56 +0000 |
commit | 075e9da352c061364ed797a96cc7df3d3a7d1a0a (patch) | |
tree | c344120484f0026511a46760959e314b776d240e /sys/amd64/ia32 | |
parent | fb74f62b24c43c7cc8805f33c598d246a929f9f0 (diff) | |
download | FreeBSD-src-075e9da352c061364ed797a96cc7df3d3a7d1a0a.zip FreeBSD-src-075e9da352c061364ed797a96cc7df3d3a7d1a0a.tar.gz |
Protect the setting of the fsbase/gsbase MSR registers and the
pcb_[fg]sbase values with a critical section, like the rest of the kernel.
Diffstat (limited to 'sys/amd64/ia32')
-rw-r--r-- | sys/amd64/ia32/ia32_signal.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/amd64/ia32/ia32_signal.c b/sys/amd64/ia32/ia32_signal.c index a6d82a4..5849d0d 100644 --- a/sys/amd64/ia32/ia32_signal.c +++ b/sys/amd64/ia32/ia32_signal.c @@ -715,10 +715,12 @@ ia32_setregs(td, entry, stack, ps_strings) struct trapframe *regs = td->td_frame; struct pcb *pcb = td->td_pcb; + critical_enter(); wrmsr(MSR_FSBASE, 0); wrmsr(MSR_KGSBASE, 0); /* User value while we're in the kernel */ pcb->pcb_fsbase = 0; pcb->pcb_gsbase = 0; + critical_exit(); load_ds(_udatasel); load_es(_udatasel); load_fs(_udatasel); |