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.

Reply via email to