Re: [PATCH] x86/selftests: add clobbers for int80 on x86_64

From: Dmitry Safonov
Date: Fri Feb 10 2017 - 13:54:37 EST


On 02/10/2017 07:45 PM, Andy Lutomirski wrote:
On Fri, Feb 10, 2017 at 8:28 AM, Dmitry Safonov <dsafonov@xxxxxxxxxxxxx> wrote:
On 02/10/2017 07:13 PM, Andy Lutomirski wrote:

On Fri, Feb 10, 2017 at 3:52 AM, Dmitry Safonov <dsafonov@xxxxxxxxxxxxx>
wrote:

Kernel erases R8..R11 registers prior returning to userspace
from int80: https://lkml.org/lkml/2009/10/1/164

GCC can reuse this registers and doesn't expect them to change
during syscall invocation. I met this kind of bug in CRIU once
gcc 6.1 and clang stored local variables in those registers
and the kernel zerofied them during syscall:

https://github.com/xemul/criu/commit/990d33f1a1cdd17bca6c2eb059ab3be2564f7fa2

By that reason I suggest to add those registers to clobbers
in selftests.


Seems reasonable, but presumably INT80_CLOBBERS should be defined the
same way in all the tests. IOW, if the "flags" clobber is actually
needed, it should be "flags", INT80_CLOBBERS (possibly without the
comma if it's problematic).


Well, that was my initial attempt: I've defined it as:
+# define INT80_CLOBBERS , "r8", "r9", "r10", "r11"

But that hanging comma looks awful, so I added "flags" there.
And if I do define it without coma and leave it in asm statement,
32-bit version would be unhappy.
So, I found that it's easier to define it with flags included.


Woudl the right answer be to get rid of "flags" in the test where it
appears? I'm not sure it's needed in the first place.


I think it can live without it.
But I didn't want to change it in the same patch and wasn't sure if I
fail to see the reason for it.
So, I'll resend with flags removing, thanks.

--
Dmitry