[PATCH v2] x32: Implement prctl in assembly
H.J. Lu
hjl.tools@gmail.com
Mon Dec 8 09:01:14 GMT 2025
On Mon, Dec 8, 2025 at 4:11 PM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
> > Here is the v2 patch to implement prctl in assembly for x32.
> >
> > Since the variadic prctl function takes at most 5 integer arguments which
> > are passed in the same integer registers on x32 as the function with 5
> > integer arguments, we can use assembly for prctl. Since upper 32-bits in
> > the last 4 arguments of prctl must be cleared to match the x32 prctl
> > syscall interface where the last 4 arguments are unsigned 64 bit longs,
> > implement prctl in assembly to clear upper 32-bits in the last 4 arguments
> > and add a test to verify it.
>
> What's the advantage of the assembler implementation over the C
> implementation? I'm missing the context for this change.
>
It is inspired by
commit 6a04404521ac4119ae36827eeb288ea84eee7cf6
Author: Florian Weimer <fweimer@redhat.com>
Date: Sat Feb 17 09:17:04 2024 +0100
Linux: Switch back to assembly syscall wrapper for prctl (bug 29770)
The difference is
00000000 <__GI___prctl>:
0: f3 0f 1e fa endbr64
4: 8d 44 24 08 lea 0x8(%rsp),%eax
8: 48 89 74 24 d0 mov %rsi,-0x30(%rsp)
d: 48 63 ff movslq %edi,%rdi
10: 8b 74 24 d0 mov -0x30(%rsp),%esi
14: 89 44 24 c0 mov %eax,-0x40(%rsp)
18: 8d 44 24 c8 lea -0x38(%rsp),%eax
1c: 48 89 54 24 d8 mov %rdx,-0x28(%rsp)
21: 8b 54 24 d8 mov -0x28(%rsp),%edx
25: 48 89 4c 24 e0 mov %rcx,-0x20(%rsp)
2a: 44 8b 54 24 e0 mov -0x20(%rsp),%r10d
2f: 4c 89 44 24 e8 mov %r8,-0x18(%rsp)
34: 44 8b 44 24 e8 mov -0x18(%rsp),%r8d
39: 89 44 24 c4 mov %eax,-0x3c(%rsp)
3d: b8 9d 00 00 40 mov $0x4000009d,%eax
42: c7 44 24 b8 08 00 00 00 movl $0x8,-0x48(%rsp)
4a: 0f 05 syscall
4c: 3d 00 f0 ff ff cmp $0xfffff000,%eax
51: 77 05 ja 58 <__GI___prctl+0x58>
53: c3 ret
54: 0f 1f 40 00 nopl 0x0(%rax)
58: f7 d8 neg %eax
5a: 64 8b 14 25 00 00 00 00 mov %fs:0x0,%edx
62: 40 03 15 00 00 00 00 rex add 0x0(%rip),%edx # 69
<__GI___prctl+0x69>
69: 67 89 02 mov %eax,(%edx)
6c: b8 ff ff ff ff mov $0xffffffff,%eax
71: c3 ret
vs
00000000 <__GI___prctl>:
0: 89 f6 mov %esi,%esi
2: 89 d2 mov %edx,%edx
4: 41 89 ca mov %ecx,%r10d
7: 45 89 c0 mov %r8d,%r8d
a: b8 9d 00 00 40 mov $0x4000009d,%eax
f: 0f 05 syscall
11: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
17: 73 01 jae 1a <__GI___prctl+0x1a>
19: c3 ret
1a: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 21 <__GI___prctl+0x21>
21: f7 d8 neg %eax
23: 64 89 01 mov %eax,%fs:(%rcx)
26: 83 c8 ff or $0xffffffff,%eax
29: c3 ret
--
H.J.
More information about the Libc-alpha
mailing list