On Mon, Feb 25, 2019 at 4:53 AM Peter Zijlstra <[email protected]> wrote: > > Don't call load_gs_index() with AC set; delay the segment setting > until after the AC section. > > Signed-off-by: Peter Zijlstra (Intel) <[email protected]> > --- > arch/x86/ia32/ia32_signal.c | 29 +++++++++++++++++++---------- > 1 file changed, 19 insertions(+), 10 deletions(-) > > --- a/arch/x86/ia32/ia32_signal.c > +++ b/arch/x86/ia32/ia32_signal.c > @@ -60,17 +60,21 @@ > regs->seg = GET_SEG(seg) | 3; \ > } while (0) > > -#define RELOAD_SEG(seg) { \ > - unsigned int pre = GET_SEG(seg); \ > - unsigned int cur = get_user_seg(seg); \ > - pre |= 3; \ > - if (pre != cur) \ > - set_user_seg(seg, pre); \ > +#define LOAD_SEG(seg) { \ > + pre_##seg = 3 | GET_SEG(seg); \ > + cur_##seg = get_user_seg(seg); \ > +} > + > +#define RELOAD_SEG(seg) { \ > + if (pre_##seg != cur_##seg) \ > + set_user_seg(seg, pre_##seg); \ > }
This is so tangled. How about changing RELOAD_SEG to replace unsigned int pre = GET_SEG(seg); with unsigned int pre = (seg); to make it less magic. Then do: unsigned int gs = GET_SEG(gs); ... RELOAD_SEG(gs); And now the code actually does what it looks like it does.

