Commit Graph

236 Commits

Author SHA1 Message Date
Rich Felker
b94067eeae eliminate assumption that mips syscall restart preserves r25
all past and current kernel versions have done so, but there seems to
be no reason it's necessary and the sentiment from everyone I've asked
has been that we should not rely on it. instead, use r7 (an argument
register) which will necessarily be preserved upon syscall restart.
however this only works for 0-3 argument syscalls, and we have to
resort to the function call for 4-argument syscalls.
2012-09-10 22:43:22 -04:00
Rich Felker
5e3c243d8d inline syscall support for arm
most pure-syscall-wrapper functions compile to the smallest/simplest
code possible (save r7 ; load syscall # ; svc 0 ; restore r7 ; tail
call to __syscall_ret).
2012-09-09 01:29:19 -04:00
Rich Felker
328810d325 inline syscall support for mips
this drastically reduces the size of some functions which are purely
syscall wrappers.

disabled for clang due to known bugs satisfying register constraints.
2012-09-09 01:01:19 -04:00
Rich Felker
208eb584ef syscall organization overhaul
now public syscall.h only exposes __NR_* and SYS_* constants and the
variadic syscall function. no macros or inline functions, no
__syscall_ret or other internal details, no 16-/32-bit legacy syscall
renaming, etc. this logic has all been moved to src/internal/syscall.h
with the arch-specific parts in arch/$(ARCH)/syscall_arch.h, and the
amount of arch-specific stuff has been reduced to a minimum.

changes still need to be reviewed/double-checked. minimal testing on
i386 and mips has already been performed.
2012-09-08 22:43:14 -04:00
Rich Felker
6cf8bfdb64 add acct, accept4, setns, and dup3 syscalls (linux extensions)
based on patch by Justin Cormack
2012-09-08 20:22:08 -04:00
Rich Felker
9f65796c35 add clang-compatible thread-pointer code for mips
clang does not presently support the "v" constraint we want to use to
get the result from $3, and trying to use register...__asm__("$3") to
do the same invokes serious compiler bugs. so for now, i'm working
around the issue with an extra temp register and putting $3 in the
clobber list instead of using it as output. when the bugs in clang are
fixed, this issue should be revisited to generate smaller/faster code
like what gcc gets.
2012-09-07 12:18:14 -04:00
Rich Felker
fb247fafa0 avoid "inline" in public headers for strict c89 compatibility
while musl itself requires a c99 compiler, some applications insist on
being compiled with c89 compilers, and use of "inline" in the headers
was breaking them. much of this had been avoided already by just
skipping the inline keyword in pre-c99 compilers or modes, but this
new unified solution is cleaner and may/should result in better code
generation in the default gcc configuration.
2012-09-02 12:46:06 -04:00
Rich Felker
036eaa24cf avoid need for -march=mips2 to compile mips atomic.h asm
linux guarantees ll/sc are always available. on mips1, they will be
emulated by the kernel. thus they are part of the linux mips1 abi and
safe to use.
2012-08-11 19:51:21 -04:00
Rich Felker
e3ebe7db5d use int instead of long for ptrdiff_t on all 32-bit archs
this is needed to match the underlying "ABI" standards. it's not
really an ABI issue since the binary representations are the same, but
having the wrong type can lead to errors when the type arising from a
difference-of-pointers expression does not match the defined type of
ptrdiff_t. most of the problems affect C++, not C.
2012-08-10 15:13:26 -04:00
Rich Felker
c5875ad34b fix incorrect ptrdiff_t type on mips 2012-08-10 14:59:20 -04:00
Rich Felker
83b42d94bd add defines for number of sigset_t bytes syscalls expect
yet another gratuitous mips incompatibility...
2012-08-09 21:35:19 -04:00
Rich Felker
ae0b9da48c further fixes for mips ioctl.h header
untested; hopefully it's right now
2012-08-07 19:59:28 -04:00
Rich Felker
ff02f94e2d fix another mips gratuitous-incompatibility bug: ioctl numbers 2012-08-07 19:19:21 -04:00
Rich Felker
7fee5f9606 fix socket.h on mips
why does mips have to be gratuitously incompatible in every possible
imaginable way?
2012-08-05 14:23:40 -04:00
Rich Felker
fa91df41e8 more stuff lost committing mips dynamic linker 2012-08-05 13:48:42 -04:00
Rich Felker
babf820180 mips dynamic linker support
not heavily tested, but the basics are working. the basic concept is
that the dynamic linker entry point code invokes a pure-PIC (no global
accesses) C function in reloc.h to perform the early GOT relocations
needed to make the dynamic linker itself functional, then invokes
__dynlink like on other archs. since mips uses some ugly arch-specific
hacks to optimize relocating the GOT (rather than just using the
normal DT_REL[A] tables like on other archs), the dynamic linker has
been modified slightly to support calling arch-specific relocation
code in reloc.h.

most of the actual mips-specific behavior was developed by reading the
output of readelf on libc.so and simple executable files. i could not
find good reference information on which relocation types need to be
supported or their semantics, so it's possible that some legitimate
usage cases will not work yet.
2012-08-05 12:50:26 -04:00
Rich Felker
dc046f55bb add floating point register saving/restoring to mips setjmp/longjmp
also fix the alignment of jmp_buf to meet the abi. linux always
emulates fpu on mips if it's not present, so enabling this code
unconditionally is "safe" but may be slow. in the long term it may be
preferable to find a way to disable it on soft float builds.
2012-07-22 18:55:01 -04:00
Rich Felker
48d20136b0 fix broken mips a_fetch_add
sc was overwriting the result
2012-07-12 23:18:03 -04:00
Rich Felker
e1e4d6b269 mipsel (little endian) support
the fields in the mcontext_t are long long (for no good reason) even
on 32-bit mips, so the offset of the instruction pointer (as a word)
varies depending on endianness.
2012-07-12 21:49:30 -04:00
Rich Felker
96107564e2 workaround another sendmsg kernel bug on 64-bit machines
the kernel wrongly expects the cmsg length field to be size_t instead
of socklen_t. in order to work around the issue, we have to impose a
length limit and copy to a local buffer. the length limit should be
more than sufficient for any real-world use; these headers are only
used for passing file descriptors and permissions between processes
over unix sockets.
2012-07-12 21:37:54 -04:00
Rich Felker
90e123f4a8 fix redef of sigprocmask constants on mips
this fix is easier than trying to reorder the header stuff
2012-07-12 16:54:43 -04:00
Rich Felker
ba8a96b068 more mips bits-header fixes
signal handling was very broken because of this
2012-07-12 14:21:41 -04:00
Rich Felker
db11e96493 fix mips syscalls with long long args
like arm, mips requires 64-bit arguments to be "aligned" on an even
register boundary.
2012-07-12 13:48:56 -04:00
Rich Felker
5fac93db37 fix mips mcontext_t structure size
otherwise offs in ucontext_t will be wrong, and break code that
inspects or modifies the signal makes (including cancellation code).
2012-07-12 00:14:40 -04:00
Rich Felker
2b3cc04a8d fix MAP_ANONYMOUS value for mips, remove cruft copied from i386 2012-07-11 22:29:57 -04:00
Rich Felker
6315004f61 initial version of mips (o32) port, based on work by Richard Pennington (rdp)
basically, this version of the code was obtained by starting with
rdp's work from his ellcc source tree, adapting it to musl's build
system and coding style, auditing the bits headers for discrepencies
with kernel definitions or glibc/LSB ABI or large file issues, fixing
up incompatibility with the old binutils from aboriginal linux, and
adding some new special cases to deal with the oddities of sigaction
and pipe syscall interfaces on mips.

at present, minimal test programs work, but some interfaces are broken
or missing. threaded programs probably will not link.
2012-07-11 04:22:13 -04:00
Rich Felker
bd1cf09c37 support -mfpmath=387 on x86_64
apparently somebody wants this for something... and it doesn't hurt.
2012-07-10 01:18:40 -04:00
Rich Felker
59c4ead16a fix wrong value of FLT_EVAL_METHOD for x86_64 2012-07-10 00:59:58 -04:00
Rich Felker
8bbc3be4b4 make arm syscalls (still non-inline) more efficient
no need to pass zero for unused arguments; just omit them.
2012-07-08 21:32:45 -04:00
Rich Felker
a3bdcd9376 remove little-endian assumption from arm atomic.h
this hidden endian dependency had left big endian arm badly broken.
2012-07-08 00:05:08 -04:00
Rich Felker
d6c0efe106 jmp_buf overhaul fixing several issues
on arm, the location of the saved-signal-mask flag and mask were off
by one between sigsetjmp and siglongjmp, causing incorrect behavior
restoring the signal mask. this is because the siglongjmp code assumed
an extra slot was in the non-sig jmp_buf for the flag, but arm did not
have this. now, the extra slot is removed for all archs since it was
useless.

also, arm eabi requires jmp_buf to have 8-byte alignment. we achieve
that using long long as the type rather than with non-portable gcc
attribute tags.
2012-07-03 20:07:33 -04:00
Rich Felker
213db3e3fa update syscall defs to latest kernel ones
patch submitted by Kristian L. <email@thexception.net>
2012-06-23 21:16:44 -04:00
Rich Felker
4e8b0938d9 proper error handling for fcntl F_GETOWN on modern kernels
on old kernels, there's no way to detect errors; we must assume
negative syscall return values are pgrp ids. but if the F_GETOWN_EX
fcntl works, we can get a reliable answer.
2012-06-20 22:16:47 -04:00
Rich Felker
54c567649e fix arm syscall.h to reflect which syscalls actually exist (on EABI) 2012-05-24 12:27:51 -04:00
Rich Felker
030b452b8d fix missing _BSD_SOURCE support in bits/*.h
this is actually rather ugly, and would get even uglier if we ever
want to support further feature test macros. at some point i may
factor the bits headers into separate files for C base, POSIX base,
and nonstandard extensions (the only distinctions that seem to matter
now) and then the logic for which to include can go in the main header
rather than being duplicated for each arch. the downside of this is
that it would result in more files having to be opened during
compilation, so as long as the ugliness does not grow, i'm inclined to
leave it alone for now.
2012-05-22 22:12:10 -04:00
Rich Felker
aa85940388 fix float_t and double_t defs on x86 when -mfpmath=sse -msse2 is used 2012-04-29 19:54:29 -04:00
Rich Felker
a1b442335d support FLT_EVAL_METHOD changing on x86 with gcc -msse2 -mfpmath=sse
if the compiler provides a value, use it; otherwise fallback to the
platform default (2).
2012-04-27 01:39:03 -04:00
Rich Felker
848d30a1e5 use signed char rather than plain char for int8_t
otherwise this BADLY breaks if -funsigned-char is passed to gcc
2012-04-24 18:06:56 -04:00
Rich Felker
67b25fe0a8 move F_DUPFD_CLOEXEC out of bits
fcntl values 1024 and up are universal, arch-independent. later I'll
add some of the other linux-specific ones for notify, leases, pipe
size, etc. here too.
2012-04-15 17:05:10 -04:00
Rich Felker
a68af22926 add F_SETSIG and F_GETSIG (linux specific) to fcntl.h
F_* is in the reserved namespace so no feature test is needed
2012-04-15 17:01:58 -04:00
Rich Felker
5bd0ab8af6 work around nasty gcc bug in the i386 syscall asm
when the "r" (register) constraint is used to let gcc choose a
register, gcc will sometimes assign the same register that was used
for one of the other fixed-register operands, if it knows the values
are the same. one common case is multiple zero arguments to a syscall.
this horribly breaks the intended usage, which is swapping the GOT
pointer from ebx into the temp register and back to perform the
syscall.

presumably there is a way to fix this with advanced usage of register
constaints on the inline asm, but having bad memories about hellish
compatibility issues with different gcc versions, for the time being
i'm just going to hard-code specific registers to be used. this may
hurt the compiler's ability to optimize, but it will fix serious
miscompilation issues.

so far the only function i know what compiled incorrectly is
getrlimit.c, and naturally the bug only applies to shared (PIC)
builds, but it may be more extensive and may have gone undetected..
2012-04-04 00:37:33 -04:00
Rich Felker
47db8903f6 fix DECIMAL_DIG definitions
DECIMAL_DIG is not the same as LDBL_DIG

type_DIG is the maximimum number of decimal digits that can survive a
round trip from decimal to type and back to decimal.

DECIMAL_DIG is the minimum number of decimal digits required in order
for any floating point type to survive the round trip to decimal and
back, and it is generally larger than LDBL_DIG. since the exact
formula is non-trivial, and defining it larger than necessary may be
legal but wasteful, just define the right value in bits/float.h.
2012-03-21 12:42:48 -04:00
Rich Felker
834255a3ff use __attribute__((const)) on arm __pthread_self function 2012-02-25 02:52:18 -05:00
Rich Felker
414a4cdebc add float_t and double_t to math.h 2012-02-15 21:47:55 -05:00
Rich Felker
afc35d5efd replace bad cancellation cleanup abi with a sane one
the old abi was intended to duplicate glibc's abi at the expense of
being ugly and slow, but it turns out glib was not even using that abi
except on non-gcc-compatible compilers (which it doesn't even support)
and was instead using an exceptions-in-c/unwind-based approach whose
abi we could not duplicate anyway without nasty dwarf2/unwind
integration.

the new abi is copied from a very old glibc abi, which seems to still
be supported/present in current glibc. it avoids all unwinding,
whether by sjlj or exceptions, and merely maintains a linked list of
cleanup functions to be called from the context of pthread_exit. i've
made some care to ensure that longjmp out of a cleanup function should
work, even though it is not required to.

this change breaks abi compatibility with programs which were using
pthread cancellation, which is unfortunate, but that's why i'm making
the change now rather than later. considering that most pthread
features have not been usable until recently anyway, i don't see it as
a major issue at this point.
2012-02-09 02:33:08 -05:00
Rich Felker
26f38328d6 add prlimit syscall wrapper 2012-01-20 22:10:47 -05:00
Rich Felker
03860303c2 fix some details in ugly stuff that doesn't belong in libc
patches by sh4rm4, presumably needed to make gdb or some similar junk
happy...
2011-10-17 12:23:04 -04:00
Rich Felker
1d3c276807 don't define wchar_t on c++
it's a keyword in c++ (wtf). i'm not sure this is the cleanest
solution; it might be better to avoid ever defining __NEED_wchar_t on
c++. but in any case, this works for now.
2011-10-15 00:28:49 -04:00
Rich Felker
e6d765a8b1 fix fcntl O_* flags for arm
no idea why these 4 are permuted and the rest are standard/generic
2011-10-05 00:26:49 -04:00
Rich Felker
74cc7c69f9 typo (copy 2) in arm reloc.h 2011-10-01 00:55:16 -04:00
Rich Felker
cd319d73c7 typo in arm reloc.h 2011-10-01 00:54:43 -04:00
Rich Felker
12ace5bf76 first attempt at arm dynamic linking 2011-10-01 00:52:33 -04:00
Rich Felker
d5bde7babb "optimize" arm __pthread_self
actually this is just to avoid gcc being stupid and refusing to inline
the function version, even when the size cost is essentially identical
whether it's inlined or not.
2011-09-22 22:56:06 -04:00
Rich Felker
2eff02e4a0 fix x86_64 user.h (previously was just a copy of i386) 2011-09-22 15:36:25 -04:00
Rich Felker
c651c473e5 cleanup/debloat i386 user.h 2011-09-22 15:35:57 -04:00
Rich Felker
ee6fc9a093 wrong __WORDSIZE in x86_64 header 2011-09-22 15:25:07 -04:00
Rich Felker
0b6eb2dfb2 update syscalls with off_t arguments to handle argument alignment, if needed
the arm syscall abi requires 64-bit arguments to be aligned on an even
register boundary. these new macros facilitate meeting the abi
requirement without imposing significant ugliness on the code.
2011-09-21 20:11:10 -04:00
Rich Felker
114c80f141 fix the definition of struct statvfs to match lsb abi
at the same time, make struct statfs match the traditional definition
and make it more useful, especially the fsid_t stuff.
2011-09-19 23:35:48 -04:00
Rich Felker
f780ac5baf cleanup redundancy in bits/signal.h versions 2011-09-19 20:02:12 -04:00
Rich Felker
224c7a376a fix the type of wchar_t on arm; support wchar_t varying with arch
really wchar_t should never vary, but the ARM EABI defines it as an
unsigned 32-bit int instead of a signed one, and gcc follows this
nonsense. thus, to give a conformant environment, we have to follow
(otherwise L""[0] and L'\0' would be 0U rather than 0, but the
application would be unaware due to a mismatched definition for
WCHAR_MIN and WCHAR_MAX, and Bad Things could happen with respect to
signed/unsigned comparisons, promotions, etc.).

fortunately no rules are imposed by the C standard on the relationship
between wchar_t and wint_t, and WEOF has type wint_t, so we can still
make wint_t always-signed and use -1 for WEOF.
2011-09-19 17:39:51 -04:00
Rich Felker
089aeb08a0 fix incorrect long double parameters on arm (and other future ports)
this was the cause of crashes in printf when attempting to print
floating point values.
2011-09-19 16:59:10 -04:00
Rich Felker
d960d4f2cb initial commit of the arm port
this port assumes eabi calling conventions, eabi linux syscall
convention, and presence of the kernel helpers at 0xffff0f?0 needed
for threads support. otherwise it makes very few assumptions, and the
code should work even on armv4 without thumb support, as well as on
systems with thumb interworking. the bits headers declare this a
little endian system, but as far as i can tell the code should work
equally well on big endian.

some small details are probably broken; so far, testing has been
limited to qemu/aboriginal linux.
2011-09-18 16:44:54 -04:00
Rich Felker
b0c088ee55 cleanup more bits cruft (sysmacros and socket) 2011-09-18 16:34:13 -04:00
Rich Felker
ca8373dfcf more bits junk (tcp.h) 2011-09-18 15:39:52 -04:00
Rich Felker
c8175666f2 move invariant netinet/in.h stuff out of bits/in.h 2011-09-18 15:31:44 -04:00
Rich Felker
df0b5a4940 security hardening: ensure suid programs have valid stdin/out/err
this behavior (opening fds 0-2 for a suid program) is explicitly
allowed (but not required) by POSIX to protect badly-written suid
programs from clobbering files they later open.

this commit does add some cost in startup code, but the availability
of auxv and the security flag will be useful elsewhere in the future.
in particular auxv is needed for static-linked vdso support, which is
still waiting to be committed (sorry nik!)
2011-08-23 09:37:39 -04:00
Rich Felker
6cb277d75e typo in macro definitions for x86_64 2011-08-14 15:19:17 -04:00
Rich Felker
8426a99048 ensure the compiler does not move around thread-register-based reads
if gcc decided to move this across a conditional that checks validity
of the thread register, an invalid thread-register-based read could be
performed and raise sigsegv.
2011-08-06 20:45:30 -04:00
Rich Felker
63d447e2a3 socket headers macro adjustment - workaround for buggy programs
some program was undefining AF_NETLINK and thereby breaking AF_ROUTE...
2011-07-21 22:44:05 -04:00
Rich Felker
32de61e81a fix some symbol resolution issues in dynamic linker
1. search was wrongly beginning with lib itself rather than dso head
2. inconsistent resolution of function pointers for functions in plt
2011-06-25 22:36:21 -04:00
Rich Felker
e8b8f3c90e move all limits that don't vary out of bits/limits.h, into main limits.h 2011-06-25 15:38:00 -04:00
Rich Felker
568b8075a4 proper path searching for dynamic linker
first, use $LD_LIBRARY_PATH unless suid. if that fails, read path from
/etc/ld-musl-$ARCH.path and fallback to a builtin default.
2011-06-25 01:56:34 -04:00
Rich Felker
51e2d83102 experimental dynamic linker!
some notes:
- library search path is hard coded
- x86_64 code is untested and may not work
- dlopen/dlsym is not yet implemented
- relocations in read-only memory won't work
2011-06-18 19:48:42 -04:00
Rich Felker
836ba93d93 __syscall5 inline is having trouble with PIC; just use the function for now 2011-06-14 23:14:22 -04:00
Rich Felker
0b6b43ed3f use __WCHAR_TYPE__ on i386 if it is defined
unfortunately traditional i386 practice was to use "long" rather than
"int" for wchar_t, despite the latter being much more natural and
logical. we followed this practice, but it seems some compilers (clang
and maybe certain gcc builds or others too..?) have switched to using
int, resulting in spurious pointer type mismatches when L"..." wide
strings are used. the best solution I could find is to use the
compiler's definition of wchar_t if it exists, and otherwise fallback
to the traditional definition.

there's no point in duplicating this approach on 64-bit archs, as
their only 32-bit type is int.
2011-06-07 11:26:42 -04:00
Rich Felker
def0af1898 use compiler builtins for variadic macros when available
this slightly cuts down on the degree musl "fights with" gcc, but more
importantly, it fixes a critical bug when gcc inlines a variadic
function and optimizes out the variadic arguments due to noticing that
they were "not used" (by __builtin_va_arg).

we leave the old code in place if __GNUC__ >= 3 is false; it seems
like it might be necessary at least for tinycc support and perhaps if
anyone ever gets around to fixing gcc 2.95.3 enough to make it work..
2011-04-27 23:41:48 -04:00
Rich Felker
4bb9b4f3b4 add word-sized ctz function to atomic.h
strictly speaking this and a few other ops should be factored into
asm.h or the file should just be renamed to asm.h, but whatever. clean
it up someday.
2011-04-27 12:19:49 -04:00
Rich Felker
4b5f054098 move wait.h macros out of bits. they do not vary. 2011-04-21 14:27:28 -04:00
Rich Felker
b052f13cd1 namespace fixes for sys/mman.h 2011-04-20 15:55:58 -04:00
Rich Felker
1c76683cb4 add syscall wrappers for posix_fadvise, posix_fallocate 2011-04-20 15:20:22 -04:00
Rich Felker
feee98903c overhaul pthread cancellation
this patch improves the correctness, simplicity, and size of
cancellation-related code. modulo any small errors, it should now be
completely conformant, safe, and resource-leak free.

the notion of entering and exiting cancellation-point context has been
completely eliminated and replaced with alternative syscall assembly
code for cancellable syscalls. the assembly is responsible for setting
up execution context information (stack pointer and address of the
syscall instruction) which the cancellation signal handler can use to
determine whether the interrupted code was in a cancellable state.

these changes eliminate race conditions in the previous generation of
cancellation handling code (whereby a cancellation request received
just prior to the syscall would not be processed, leaving the syscall
to block, potentially indefinitely), and remedy an issue where
non-cancellable syscalls made from signal handlers became cancellable
if the signal handler interrupted a cancellation point.

x86_64 asm is untested and may need a second try to get it right.
2011-04-17 11:43:03 -04:00
Rich Felker
a3aa89d826 fix O_SYNC definition, cleanup fcntl.h 2011-04-14 22:06:30 -04:00
Rich Felker
0a84e72c42 fix FAPPEND typo on x86_64 (previously only fixed on i386) 2011-04-14 21:50:07 -04:00
Rich Felker
c2b18f3531 fcntl.h: move macros that do not vary between archs out of bits 2011-04-14 21:49:22 -04:00
Rich Felker
ace973637f fix broken fcntl locks on x86_64 2011-04-14 21:45:26 -04:00
Rich Felker
9b96220e5a fix typo in legacy FAPPEND definition 2011-04-14 19:14:42 -04:00
Rich Felker
07e865cc5a numerous fixes to sysv ipc
some of these definitions were just plain wrong, others based on
outdated ancient "non-64" versions of the kernel interface.

as much as possible has now been moved out of bits/*

these changes break abi (the old abi for these functions was wrong),
but since they were not working anyway it can hardly matter.
2011-04-13 16:45:43 -04:00
Rich Felker
cac7d837cc fix and cleanup suseconds_t/timeval stuff (broken on 64-bit)
trash in the upper 32 bits was making the kernel sleep forever in
select on 64-bit systems.
2011-04-13 13:16:49 -04:00
Rich Felker
43b2e9bf26 more types cleanup
the basic idea is that the only things in alltypes.h should be types
that either vary from system to system (in practice, not just in
theoretical la-la land - this is the implementation so we choose what
constraints we want to impose on ports) or which are needed by
multiple system headers.
2011-04-11 10:48:52 -04:00
Rich Felker
28bde3b787 cleanup types stuff in headers, fix missing u_int*_t in sys/types.h 2011-04-11 10:38:00 -04:00
Rich Felker
196d6437dc add missing float.h macros
actually FLT_ROUNDS needs to expand to a static inline function that
obtains the current rounding mode and returns it, but that will be
added later with fenv.h stuff.
2011-04-10 18:27:47 -04:00
Rich Felker
7168790763 workaround broken msghdr struct on 64bit linux
POSIX clearly specifies the type of msg_iovlen and msg_controllen, and
Linux ignores it and makes them both size_t instead. to work around
this we add padding (instead of just using the wrong types like glibc
does), but we also need to patch-up the struct before passing it to
the kernel in case the caller did not zero-fill it.

if i could trust the kernel to just ignore the upper 32 bits, this
would not be necessary, but i don't think it will ignore them...
2011-04-08 09:24:19 -04:00
Rich Felker
918a40f257 add ip6 pktinfo stuff for x86_64
these defs should probably all be moved out of bits and unified...
2011-04-05 17:27:28 -04:00
Rich Felker
e86cc888df add some missing ipv6 stuff 2011-04-05 14:05:11 -04:00
Rich Felker
f93de08ca4 uncomment IP_PKTINFO
this was a hack leftover from testing before the initial
check-in to git.
2011-04-05 12:07:42 -04:00
Rich Felker
7e795ca7ed fix statvfs syscalls (missing size argument) 2011-04-03 15:42:31 -04:00
Rich Felker
5243e5f160 remove obsolete and useless useconds_t type 2011-04-01 21:10:01 -04:00
Rich Felker
3bb00f4579 somehow timespec tv_nsec had the wrong type on x86_64... fixed 2011-04-01 20:58:40 -04:00
Rich Felker
3990c5c6a4 avoid all malloc/free in timer creation/destruction
instead of allocating a userspace structure for signal-based timers,
simply use the kernel timer id. we use the fact that thread pointers
will always be zero in the low bit (actually more) to encode integer
timerid values as pointers.

also, this change ensures that the timer_destroy syscall has completed
before the library timer_destroy function returns, in case it matters.
2011-03-30 13:04:55 -04:00
Rich Felker
70c31c7bd7 some preliminaries for adding POSIX timers 2011-03-29 10:05:57 -04:00
Rich Felker
4cc78719dd fix bug from syscall overhaul: extra __syscall_ret call for 0-arg syscalls
this mainly just caused bloat, but could corrupt errno if a 0-arg
syscall ever failed.
2011-03-28 22:34:27 -04:00
Rich Felker
ea343364a7 match glibc/lsb cancellation abi on i386
glibc made the ridiculous choice to use pass-by-register calling
convention for these functions, which is impossible to duplicate
directly on non-gcc compilers. instead, we use ugly asm to wrap and
convert the calling convention. presumably this works with every
compiler anyone could potentially want to use.
2011-03-25 22:13:57 -04:00
Rich Felker
b470030f83 overhaul cancellation to fix resource leaks and dangerous behavior with signals
this commit addresses two issues:

1. a race condition, whereby a cancellation request occurring after a
syscall returned from kernelspace but before the subsequent
CANCELPT_END would cause cancellable resource-allocating syscalls
(like open) to leak resources.

2. signal handlers invoked while the thread was blocked at a
cancellation point behaved as if asynchronous cancellation mode wer in
effect, resulting in potentially dangerous state corruption if a
cancellation request occurs.

the glibc/nptl implementation of threads shares both of these issues.

with this commit, both are fixed. however, cancellation points
encountered in a signal handler will not be acted upon if the signal
was received while the thread was already at a cancellation point.
they will of course be acted upon after the signal handler returns, so
in real-world usage where signal handlers quickly return, it should
not be a problem. it's possible to solve this problem too by having
sigaction() wrap all signal handlers with a function that uses a
pthread_cleanup handler to catch cancellation, patch up the saved
context, and return into the cancellable function that will catch and
act upon the cancellation. however that would be a lot of complexity
for minimal if any benefit...
2011-03-24 14:18:00 -04:00
Rich Felker
bae862ab18 honor namespace for i386 syscall.h, even though it's not a standard header 2011-03-19 22:18:53 -04:00
Rich Felker
7877db6b2f fix typo in x86_64 part of syscall overhaul 2011-03-19 21:50:20 -04:00
Rich Felker
685e40bb09 syscall overhaul part two - unify public and internal syscall interface
with this patch, the syscallN() functions are no longer needed; a
variadic syscall() macro allows syscalls with anywhere from 0 to 6
arguments to be made with a single macro name. also, manually casting
each non-integer argument with (long) is no longer necessary; the
casts are hidden in the macros.

some source files which depended on being able to define the old macro
SYSCALL_RETURNS_ERRNO have been modified to directly use __syscall()
instead of syscall(). references to SYSCALL_SIGSET_SIZE and SYSCALL_LL
have also been changed.

x86_64 has not been tested, and may need a follow-up commit to fix any
minor bugs/oversights.
2011-03-19 21:36:10 -04:00
Rich Felker
d00ff2950e overhaul syscall interface
this commit shuffles around the location of syscall definitions so
that we can make a syscall() library function with both SYS_* and
__NR_* style syscall names available to user applications, provides
the syscall() library function, and optimizes the code that performs
the actual inline syscalls in the library itself.

previously on i386 when built as PIC (shared library), syscalls were
incurring bus lock (lock prefix) overhead at entry and exit, due to
the way the ebx register was being loaded (xchg instruction with a
memory operand). now the xchg takes place between two registers.

further cleanup to arch/$(ARCH)/syscall.h is planned.
2011-03-19 18:51:42 -04:00
Rich Felker
f5ba2bc9ca various legacy and linux-specific stuff
this commit is part of an effort to make more of busybox work
out-of-the-box.
2011-03-18 21:52:26 -04:00
Rich Felker
e914f8b7ec optimize contended normal mutex case; add int compare-and-swap atomic 2011-03-17 12:14:40 -04:00
Rich Felker
8bb0e48889 match dimensions so we can use all slots without invoking OOB-array-access 2011-03-11 10:02:17 -05:00
Rich Felker
cabf2ff349 fix missing ENOTSUP error code 2011-03-11 09:50:54 -05:00
Rich Felker
6871fd773d make sigaltstack work (missing macros in signal.h, error conditions) 2011-03-10 10:17:29 -05:00
Rich Felker
d6a1e0c79e resolve some header namespace non-issues
after re-reading 2.2.2 of POSIX 2008, all of these are in the correct
reserved namespaces and do not need protection.
2011-02-20 02:44:52 -05:00
Rich Felker
8668f033bc fill in some missing siginfo stuff in signal.h 2011-02-20 01:26:25 -05:00
Rich Felker
f3ef7a6124 add missing WIFCONTINUED macro and improve WIFSIGNALED 2011-02-19 02:23:29 -05:00
Rich Felker
ad2fe25041 support the ugly and deprecated ucontext and sigcontext header stuff...
only the structures, not the functions from ucontext.h, are supported
at this point. the main goal of this commit is to make modern gcc with
dwarf2 unwinding build without errors.

honestly, it probably doesn't matter how we define these as long as
they have members with the right names to prevent errors while
compiling libgcc. the only time they will be used is for propagating
exceptions across signal-handler boundaries, which invokes undefined
behavior anyway. but as-is, they're probably correct and may be useful
to various low-level applications dealing with virtualization, jit
code generation, and so on...
2011-02-18 22:03:03 -05:00
Rich Felker
e882756311 reorganize pthread data structures and move the definitions to alltypes.h
this allows sys/types.h to provide the pthread types, as required by
POSIX. this design also facilitates forcing ABI-compatible sizes in
the arch-specific alltypes.h, while eliminating the need for
developers changing the internals of the pthread types to poke around
with arch-specific headers they may not be able to test.
2011-02-17 17:16:20 -05:00
Rich Felker
571312de5f move stdio stuff that's not arch-specific out of bits 2011-02-15 19:47:22 -05:00
Rich Felker
8894947ba2 protect some limit constants with feature test macros on x86_64 2011-02-15 19:16:37 -05:00
Rich Felker
f451462098 fix the types of some integer constant limits in headers 2011-02-15 19:15:45 -05:00
Rich Felker
cda892ddbe fix directory reading on x86_64 2011-02-15 16:08:48 -05:00
Rich Felker
c0248191bd fix x86_64 wrongly reporting itself as ILP32 instead of LP64 2011-02-15 15:56:58 -05:00
Rich Felker
9b235e8374 remove standalone syscall cruft
this was originally written for an early draft of the library where
non-standard functions would reside in a static library separate from
the shared libc.so, which would implement a pure standard. the idea
was not to depend on an implementation-dependent __syscall_ret
function in the main libc. but it turned out to be better to put
everything in a single library for both static and dynamic linking
uses, and thus the (incomplete) remnants of this feature were just
enlarging the source and binary.
2011-02-15 14:39:02 -05:00
Rich Felker
44460c6d1e fix some type leakage (timer_t) from x86_64 commit 2011-02-15 14:32:46 -05:00
Nicholas J. Kain
062354f2e1 Optimize x86_64 atomics to take advantage of 64-bitness. 2011-02-15 08:26:46 -05:00
Nicholas J. Kain
ebc4a17957 Remove __syscall_lseek from x86_64 syscall.h. 2011-02-15 08:21:47 -05:00
Nicholas J. Kain
bb89bdd00e Update x86_64 bits to mirror (modulo platform differences) the latest changes
to i386.
2011-02-15 08:02:33 -05:00
Nicholas J. Kain
1e12632591 Port musl to x86-64. One giant commit! 2011-02-15 07:32:09 -05:00
Rich Felker
c2afb747b0 yet another ugly legacy syscall rename... 2011-02-15 05:52:27 -05:00
Rich Felker
f7eb91e795 fix getrlimit handling on 32-bit systems, and ease porting to 64-bit 2011-02-15 05:42:27 -05:00
Rich Felker
13a026bd79 split off arch-specific stdarg.h stuff 2011-02-15 05:06:15 -05:00
Rich Felker
03a2f3e48c cleanup socketcall syscall interface to ease porting to sane(r) archs 2011-02-15 04:40:40 -05:00
Rich Felker
cfe373146d finish moving 32-bit-specific junk out of source files. 2011-02-15 04:12:19 -05:00
Rich Felker
a5bf06c035 move arch-specific internal headers into place 2011-02-15 04:00:40 -05:00
Rich Felker
7b2dd2235d finish unifying thread register handling in preparation for porting 2011-02-15 03:56:52 -05:00
Rich Felker
1355fdca7c preparing build system to handle ports - step 1 2011-02-15 00:33:23 -05:00