Messages in this thread | | | From | Andy Lutomirski <> | Date | Fri, 10 Apr 2015 13:52:57 -0700 | Subject | Re: [PATCH 7/8] x86: Add documentation for rd/wr fs/gs base |
| |
On Fri, Apr 10, 2015 at 1:46 PM, Andi Kleen <ak@linux.intel.com> wrote: >> If user code programs fs != 0 and fsbase != whatever is implied by fs >> and the GDT/LDT, what happens? > > We load the value from the LDT/GDT. > >> There's already a minor buglet in that >> area without wrfsbase, but fixing it would be a big performance hit >> because we don't have rdfsbase and rdgsbase to read the state >> efficiently. (Specifically, if we have gs == 0, gsbase == 0, but >> *saved* gsbase != 0, then we corrupt gsbase on context switch.) >> >> But, with the new instructions, we can do it simply, efficiently, and >> correctly in all cases. Let's do so. > > We would need an instruction to write the index without changing the base. > That's not what the new instructions do.
I think it's as simple as:
if (has fancy new feature) { prev->fsindex = [read fs]; prev->fsbase = rdfsbase(); prev->gsindex = [read gs]; prev->gsbase = [read gsbase];
load_fs(next->fsindex); wrfsbase(next->fsbase); write_gs_base_and_index(next->gsindex, next->gsbase); } else { do the old mess; }
Hmm. This may need a bit of thought wrt ptrace. We also need to consider what happens in the event that the selector load fails. Presumably we fall back to base == 0.
(Note: no matter what we do here, we at least need to think about ptrace. I would argue that poking a nonzero value into fs or gs from ptrace should zero the saved base register, even on old hardware. Presumably changing from nonzero to zero should also zero it.)
--Andy
| |