[Bug 8611] New: syscalls with 6 arguments broken on x86 32bit
bugzilla at busybox.net
bugzilla at busybox.net
Fri Jan 15 14:30:20 UTC 2016
https://bugs.busybox.net/show_bug.cgi?id=8611
Bug ID: 8611
Summary: syscalls with 6 arguments broken on x86 32bit
Product: uClibc
Version: 0.9.33.2
Hardware: PC
OS: Linux
Status: NEW
Severity: major
Priority: P5
Component: Other
Assignee: unassigned at uclibc.org
Reporter: ronald.wahl at raritan.com
CC: uclibc-cvs at uclibc.org
Created attachment 6281
--> https://bugs.busybox.net/attachment.cgi?id=6281&action=edit
fix/workaround for broken syscall6 on x86 32bit
Syscalls with 6 arguments are currently broken or at least fragile on x86
32bit.
This becomes a larger issue especially when using linux 4.3+ where the socket
calls like sendto() are directly accessible.
In case of sendto the address len parameter is not correctly pushed to the
kernel (can be checked with a recent version of strace that supports the new
direct syscalls). This may sometimes not lead to malfunctioning code
immediately.
Copying the comment I added in the code here:
Syscalls with 6 arguments on x86/32bit arch need the 6th argument in the ebp
register. This register must been saved on the stack before assigning the
argument value. This actually happens inside inline assembler code. The actual
argument to be placed in ebp may itself being referenced via esp register.
Since pushing ebp will change esp behind gcc's back the value stored in ebp may
be wrong. It looks like gcc uses ebp when refering to stack arguments in case
of an existing frame pointer. So we enforce frame pointers in that case. We
also need to specify the noinline attribute.
The attached patch is just a workaround that is working for me with gcc 4.8.3
but is no guarantee that it works on all cases and all affected syscalls.
As far as I know glibc used a special hack for 6arg-syscalls by using a helper
macro that gets the first args in registers and all additional args via a
structure or array and the helper does the register setup for the actual
syscall.
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the uClibc-cvs
mailing list