Re: [PATCH v1 2/3] x86/entry/64: Add info about registers on exit

From: Ammar Faizi
Date: Fri Jan 07 2022 - 19:38:22 EST


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@xxxxxxxxxxxxx/
Link: https://gitlab.com/x86-psABIs/x86-64-ABI/-/merge_requests/25

This adds info about registers on exit.

Cc: Andy Lutomirski <luto@xxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Borislav Petkov <bp@xxxxxxxxx>
Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
Cc: Michael Matz <matz@xxxxxxx>
Cc: "H.J. Lu" <hjl.tools@xxxxxxxxx>
Cc: Willy Tarreau <w@xxxxxx>
Cc: x86-ml <x86@xxxxxxxxxx>
Cc: lkml <linux-kernel@xxxxxxxxxxxxxxx>
Cc: GNU/Weeb Mailing List <gwml@xxxxxxxxxxx>
Signed-off-by: Ammar Faizi <ammarfaizi2@xxxxxxxxxxx>
---
[...]
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

Attachment: OpenPGP_signature
Description: OpenPGP digital signature