On 10/11/18 8:15 AM, Yu-cheng Yu wrote:
> --- a/arch/x86/mm/fault.c
> +++ b/arch/x86/mm/fault.c
> @@ -1305,6 +1305,15 @@ __do_page_fault(struct pt_regs *regs, unsigned long 
> error_code,
>               error_code |= X86_PF_USER;
>               flags |= FAULT_FLAG_USER;
>       } else {
> +             /*
> +              * WRUSS is a kernel instruction and but writes
> +              * to user shadow stack.  When a fault occurs,
> +              * both X86_PF_USER and X86_PF_SHSTK are set.
> +              * Clear X86_PF_USER here.
> +              */
> +             if ((error_code & (X86_PF_USER | X86_PF_SHSTK)) ==
> +                 (X86_PF_USER | X86_PF_SHSTK))
> +                     error_code &= ~X86_PF_USER;
This hunk of code basically points out that the architecture of WRUSS is
broken for Linux.  The setting of X86_PF_USER for a ring-0 instruction
really is a mis-feature of the architecture for us and we *undo* it in
software which is unfortunate.  Wish I would have caught this earlier.

Andy, note that this is another case where hw_error_code and
sw_error_code will diverge, unfortunately.

Anyway, this is going to necessitate some comment updates in the page
fault code.  Yu-cheng, you are going to collide with some recent changes
I made to the page fault code.  Please be careful with the context when
you do the merge and make sure that all the new comments stay correct.

Reply via email to