On 1/8/22 7:03 AM, Andy Lutomirski wrote: > On 1/7/22 15:52, Ammar Faizi wrote: >> There was a controversial discussion about the wording in the System >> V ABI document regarding what registers the kernel is allowed to >> clobber when the userspace executes syscall. >> >> The resolution of the discussion was reviewing the clobber list in >> the glibc source. For a historical reason in the glibc source, the >> kernel must restore all registers before returning to the userspace >> (except for rax, rcx and r11). >> >> Link: https://lore.kernel.org/lkml/alpine.LSU.2.20.2110131601000.26294@wotan.suse.de/ >> Link: https://gitlab.com/x86-psABIs/x86-64-ABI/-/merge_requests/25 >> >> This adds info about registers on exit. >> >> Cc: Andy Lutomirski >> Cc: Thomas Gleixner >> Cc: Ingo Molnar >> Cc: Borislav Petkov >> Cc: Dave Hansen >> Cc: "H. Peter Anvin" >> Cc: Michael Matz >> Cc: "H.J. Lu" >> Cc: Willy Tarreau >> Cc: x86-ml >> Cc: lkml >> Cc: GNU/Weeb Mailing List >> Signed-off-by: Ammar Faizi >> --- [...] >> diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S >> index e432dd075291..1111fff2e05f 100644 >> --- a/arch/x86/entry/entry_64.S >> +++ b/arch/x86/entry/entry_64.S >> @@ -79,6 +79,19 @@ >> * >> * Only called from user space. >> * >> + * Registers on exit: >> + * rax syscall return value >> + * rcx return address >> + * r11 rflags >> + * >> + * For a historical reason in the glibc source, the kernel must restore all >> + * registers except the rax (syscall return value) before returning to the >> + * userspace. >> + * >> + * In other words, with respect to the userspace, when the kernel returns >> + * to the userspace, only 3 registers are clobbered, they are rax, rcx, >> + * and r11. >> + * > > I would say this much more concisely: > > The Linux kernel preserves all registers (even C callee-clobbered > registers) except for rax, rcx and r11 across system calls, and > existing user code relies on this behavior. Agree, I will take that as Suggested-by in the v2. -- Ammar Faizi