Messages in this thread |  | | Date | Thu, 2 Jul 2020 21:17:55 +0100 | From | Al Viro <> | Subject | Re: objtool clac/stac handling change.. |
| |
On Thu, Jul 02, 2020 at 12:52:27PM -0700, Linus Torvalds wrote: > On Thu, Jul 2, 2020 at 6:32 AM Michael Ellerman <mpe@ellerman.id.au> wrote: > > > > Probably the simplest option for us is to just handle it in our > > unsafe_op_wrap(). I'll try and come up with something tomorrow. > > IMy suggestion was to basically just always handle it in all exception cases. > > And note that IU don't mean the fault handler: obviously page faults > (or unaligned faults or whatever) can happen while in a user access > region. > > But I mean any time fixup_exception() triggers. > > For x86, this is in fact particularly natural: it involves just always > clearing the AC bit in the "struct pt_regs" that fixup_exception() > gets anyway. We can do it without even bothering with checking for > CLAC/STAC support, since without it, AC is meaningless in kernel mode > anyway, but also because doing "user_access_end()" in the exception > would be pointless: AC is restored by the exception routine, so on x86 > you *have* to do it by just modifying the return state.
What about
static inline int copy_xregs_to_user(struct xregs_state __user *buf) { [...] stac(); XSTATE_OP(XSAVE, buf, -1, -1, err); clac(); where XSTATE_OP() is #define XSTATE_OP(op, st, lmask, hmask, err) \ asm volatile("1:" op "\n\t" \ "xor %[err], %[err]\n" \ "2:\n\t" \ ".pushsection .fixup,\"ax\"\n\t" \ "3: movl $-2,%[err]\n\t" \ "jmp 2b\n\t" \ ".popsection\n\t" \ _ASM_EXTABLE(1b, 3b) \ : [err] "=r" (err) \ : "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \ : "memory")
Rely upon objtool not noticing that we have, in effect, clac() in a state where AC is already cleared? We could massage that thing to take a label, but it wouldn't be pretty...
|  |