chiark / gitweb /
[PATCH] update klibc to version 0.181
authorgreg@kroah.com <greg@kroah.com>
Wed, 6 Oct 2004 01:32:12 +0000 (18:32 -0700)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:37:01 +0000 (21:37 -0700)
288 files changed:
klibc/MCONFIG
klibc/Makefile
klibc/README
klibc/klibc.spec [new file with mode: 0644]
klibc/klibc.spec.in
klibc/klibc/MCONFIG
klibc/klibc/Makefile
klibc/klibc/README
klibc/klibc/SOCKETCALLS [deleted file]
klibc/klibc/SOCKETCALLS.def [new file with mode: 0644]
klibc/klibc/SYSCALLS [deleted file]
klibc/klibc/SYSCALLS.def [new file with mode: 0644]
klibc/klibc/__shared_init.c
klibc/klibc/__static_init.c
klibc/klibc/alarm.c
klibc/klibc/arch/alpha/Makefile.inc
klibc/klibc/arch/alpha/crt0.S
klibc/klibc/arch/alpha/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/alpha/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/alpha/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/alpha/include/machine/asm.h [deleted file]
klibc/klibc/arch/alpha/setjmp.S
klibc/klibc/arch/alpha/syscall.S [new file with mode: 0644]
klibc/klibc/arch/alpha/sysdual.S [new file with mode: 0644]
klibc/klibc/arch/alpha/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/arm/Makefile.inc
klibc/klibc/arch/arm/crt0.S
klibc/klibc/arch/arm/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/arm/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/arm/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/arm/setjmp-arm.S
klibc/klibc/arch/arm/syscall.S [new file with mode: 0644]
klibc/klibc/arch/arm/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/cris/MCONFIG
klibc/klibc/arch/cris/Makefile.inc
klibc/klibc/arch/cris/__negdi2.S [new file with mode: 0644]
klibc/klibc/arch/cris/crt0.S [new file with mode: 0644]
klibc/klibc/arch/cris/divide.c [new file with mode: 0644]
klibc/klibc/arch/cris/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/cris/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/cris/setjmp.S [new file with mode: 0644]
klibc/klibc/arch/cris/syscall.S [new file with mode: 0644]
klibc/klibc/arch/cris/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/i386/MCONFIG
klibc/klibc/arch/i386/Makefile.inc
klibc/klibc/arch/i386/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/i386/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/i386/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/i386/include/klibc/diverr.h [deleted file]
klibc/klibc/arch/i386/include/sys/io.h [deleted file]
klibc/klibc/arch/i386/include/sys/vm86.h [deleted file]
klibc/klibc/arch/i386/open.S [new file with mode: 0644]
klibc/klibc/arch/i386/socketcall.S
klibc/klibc/arch/i386/syscall.S [new file with mode: 0644]
klibc/klibc/arch/i386/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/ia64/Makefile.inc
klibc/klibc/arch/ia64/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/ia64/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/ia64/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/ia64/pipe.c
klibc/klibc/arch/ia64/syscall.S [new file with mode: 0644]
klibc/klibc/arch/ia64/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/ia64/vfork.S
klibc/klibc/arch/m68k/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/m68k/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/mips/MCONFIG
klibc/klibc/arch/mips/Makefile.inc
klibc/klibc/arch/mips/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/mips/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/mips/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/mips/include/machine/asm.h [deleted file]
klibc/klibc/arch/mips/include/sgidefs.h [deleted file]
klibc/klibc/arch/mips/klibc.ld [new file with mode: 0644]
klibc/klibc/arch/mips/syscall.S [new file with mode: 0644]
klibc/klibc/arch/mips/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/mips/vfork.S
klibc/klibc/arch/mips64/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/mips64/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/parisc/Makefile.inc
klibc/klibc/arch/parisc/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/parisc/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/parisc/syscall.c [new file with mode: 0644]
klibc/klibc/arch/parisc/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/ppc/MCONFIG
klibc/klibc/arch/ppc/Makefile.inc
klibc/klibc/arch/ppc/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/ppc/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/ppc/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/ppc/syscall.S [new file with mode: 0644]
klibc/klibc/arch/ppc/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/ppc64/MCONFIG
klibc/klibc/arch/ppc64/Makefile.inc
klibc/klibc/arch/ppc64/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/ppc64/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/ppc64/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/ppc64/setjmp.S
klibc/klibc/arch/ppc64/syscall.c [new file with mode: 0644]
klibc/klibc/arch/ppc64/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/s390/Makefile.inc
klibc/klibc/arch/s390/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/s390/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/s390/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/s390/mmap.c [new file with mode: 0644]
klibc/klibc/arch/s390/syscall.c [new file with mode: 0644]
klibc/klibc/arch/s390/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/s390x/Makefile.inc
klibc/klibc/arch/s390x/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/s390x/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/s390x/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/s390x/mmap.c [new file with mode: 0644]
klibc/klibc/arch/s390x/syscall.c [new file with mode: 0644]
klibc/klibc/arch/s390x/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/sh/Makefile.inc
klibc/klibc/arch/sh/crt0.S
klibc/klibc/arch/sh/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/sh/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/sh/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/sh/syscall.S [new file with mode: 0644]
klibc/klibc/arch/sh/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/sparc/Makefile.inc
klibc/klibc/arch/sparc/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/sparc/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/sparc/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/sparc/include/machine/asm.h [deleted file]
klibc/klibc/arch/sparc/include/machine/frame.h [deleted file]
klibc/klibc/arch/sparc/include/machine/trap.h [deleted file]
klibc/klibc/arch/sparc/syscall.S [new file with mode: 0644]
klibc/klibc/arch/sparc/sysfork.S [new file with mode: 0644]
klibc/klibc/arch/sparc/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/sparc64/Makefile.inc
klibc/klibc/arch/sparc64/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/sparc64/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/sparc64/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/sparc64/syscall.S [new file with mode: 0644]
klibc/klibc/arch/sparc64/sysfork.S [new file with mode: 0644]
klibc/klibc/arch/sparc64/sysstub.ph [new file with mode: 0644]
klibc/klibc/arch/x86_64/MCONFIG
klibc/klibc/arch/x86_64/Makefile.inc
klibc/klibc/arch/x86_64/include/klibc/archsetjmp.h [deleted file]
klibc/klibc/arch/x86_64/include/klibc/archsignal.h [deleted file]
klibc/klibc/arch/x86_64/include/klibc/archsys.h [deleted file]
klibc/klibc/arch/x86_64/include/sys/io.h [deleted file]
klibc/klibc/arch/x86_64/syscall.S [new file with mode: 0644]
klibc/klibc/arch/x86_64/sysstub.ph [new file with mode: 0644]
klibc/klibc/asprintf.c [new file with mode: 0644]
klibc/klibc/ctypes.c
klibc/klibc/daemon.c [new file with mode: 0644]
klibc/klibc/fdatasync.c [deleted file]
klibc/klibc/fork.c
klibc/klibc/fstatfs.c [new file with mode: 0644]
klibc/klibc/getcwd.c
klibc/klibc/getpagesize.c [deleted file]
klibc/klibc/getpriority.c
klibc/klibc/include/alloca.h [deleted file]
klibc/klibc/include/arpa/inet.h [deleted file]
klibc/klibc/include/assert.h [deleted file]
klibc/klibc/include/bits32/bitsize/limits.h [deleted file]
klibc/klibc/include/bits32/bitsize/stddef.h [deleted file]
klibc/klibc/include/bits32/bitsize/stdint.h [deleted file]
klibc/klibc/include/bits32/bitsize/stdintconst.h [deleted file]
klibc/klibc/include/bits32/bitsize/stdintlimits.h [deleted file]
klibc/klibc/include/bits64/bitsize/limits.h [deleted file]
klibc/klibc/include/bits64/bitsize/stddef.h [deleted file]
klibc/klibc/include/bits64/bitsize/stdint.h [deleted file]
klibc/klibc/include/bits64/bitsize/stdintconst.h [deleted file]
klibc/klibc/include/bits64/bitsize/stdintlimits.h [deleted file]
klibc/klibc/include/ctype.h [deleted file]
klibc/klibc/include/dirent.h [deleted file]
klibc/klibc/include/elf.h [deleted file]
klibc/klibc/include/endian.h [deleted file]
klibc/klibc/include/errno.h [deleted file]
klibc/klibc/include/fcntl.h [deleted file]
klibc/klibc/include/grp.h [deleted file]
klibc/klibc/include/inttypes.h [deleted file]
klibc/klibc/include/klibc/compiler.h [deleted file]
klibc/klibc/include/klibc/diverr.h [deleted file]
klibc/klibc/include/klibc/extern.h [deleted file]
klibc/klibc/include/limits.h [deleted file]
klibc/klibc/include/net/if.h [deleted file]
klibc/klibc/include/net/if_arp.h [deleted file]
klibc/klibc/include/net/if_ether.h [deleted file]
klibc/klibc/include/net/if_packet.h [deleted file]
klibc/klibc/include/netinet/in.h [deleted file]
klibc/klibc/include/netinet/in6.h [deleted file]
klibc/klibc/include/netinet/ip.h [deleted file]
klibc/klibc/include/netinet/tcp.h [deleted file]
klibc/klibc/include/netinet/udp.h [deleted file]
klibc/klibc/include/poll.h [deleted file]
klibc/klibc/include/sched.h [deleted file]
klibc/klibc/include/setjmp.h [deleted file]
klibc/klibc/include/signal.h [deleted file]
klibc/klibc/include/stdarg.h [deleted file]
klibc/klibc/include/stddef.h [deleted file]
klibc/klibc/include/stdint.h [deleted file]
klibc/klibc/include/stdio.h [deleted file]
klibc/klibc/include/stdlib.h [deleted file]
klibc/klibc/include/string.h [deleted file]
klibc/klibc/include/sys/dirent.h [deleted file]
klibc/klibc/include/sys/elf32.h [deleted file]
klibc/klibc/include/sys/elf64.h [deleted file]
klibc/klibc/include/sys/elfcommon.h [deleted file]
klibc/klibc/include/sys/fsuid.h [deleted file]
klibc/klibc/include/sys/ioctl.h [deleted file]
klibc/klibc/include/sys/klog.h [deleted file]
klibc/klibc/include/sys/mman.h [deleted file]
klibc/klibc/include/sys/mount.h [deleted file]
klibc/klibc/include/sys/param.h [deleted file]
klibc/klibc/include/sys/reboot.h [deleted file]
klibc/klibc/include/sys/resource.h [deleted file]
klibc/klibc/include/sys/select.h [deleted file]
klibc/klibc/include/sys/socket.h [deleted file]
klibc/klibc/include/sys/socketcalls.h [deleted file]
klibc/klibc/include/sys/stat.h [deleted file]
klibc/klibc/include/sys/syscall.h [deleted file]
klibc/klibc/include/sys/sysinfo.h [deleted file]
klibc/klibc/include/sys/sysmacros.h [deleted file]
klibc/klibc/include/sys/time.h [deleted file]
klibc/klibc/include/sys/types.h [deleted file]
klibc/klibc/include/sys/uio.h [deleted file]
klibc/klibc/include/sys/un.h [deleted file]
klibc/klibc/include/sys/utime.h [deleted file]
klibc/klibc/include/sys/utsname.h [deleted file]
klibc/klibc/include/sys/vfs.h [deleted file]
klibc/klibc/include/sys/wait.h [deleted file]
klibc/klibc/include/syslog.h [deleted file]
klibc/klibc/include/termios.h [deleted file]
klibc/klibc/include/time.h [deleted file]
klibc/klibc/include/unistd.h [deleted file]
klibc/klibc/include/utime.h [deleted file]
klibc/klibc/inet/bindresvport.c
klibc/klibc/interp.S
klibc/klibc/jrand48.c [new file with mode: 0644]
klibc/klibc/libc_init.c [new file with mode: 0644]
klibc/klibc/llseek.c
klibc/klibc/lrand48.c
klibc/klibc/makeerrlist.pl
klibc/klibc/malloc.c
klibc/klibc/malloc.h
klibc/klibc/mmap.c
klibc/klibc/mrand48.c [new file with mode: 0644]
klibc/klibc/nice.c
klibc/klibc/nrand48.c [new file with mode: 0644]
klibc/klibc/open.c
klibc/klibc/pause.c
klibc/klibc/perror.c
klibc/klibc/putchar.c [new file with mode: 0644]
klibc/klibc/qsort.c
klibc/klibc/readdir.c
klibc/klibc/sbrk.c
klibc/klibc/seed48.c
klibc/klibc/select.c [deleted file]
klibc/klibc/setresgid.c [deleted file]
klibc/klibc/setresuid.c [deleted file]
klibc/klibc/sha1hash.c
klibc/klibc/sigaction.c
klibc/klibc/sigpending.c
klibc/klibc/sigprocmask.c
klibc/klibc/sigsuspend.c
klibc/klibc/socketcalls.pl
klibc/klibc/socketcommon.h
klibc/klibc/srand48.c
klibc/klibc/statfs.c [new file with mode: 0644]
klibc/klibc/strerror.c
klibc/klibc/strlcat.c [new file with mode: 0644]
klibc/klibc/strlcpy.c [new file with mode: 0644]
klibc/klibc/strncat.c
klibc/klibc/strncpy.c
klibc/klibc/strnlen.c [new file with mode: 0644]
klibc/klibc/strtotimespec.c [new file with mode: 0644]
klibc/klibc/strtotimeval.c [new file with mode: 0644]
klibc/klibc/strtotimex.c [new file with mode: 0644]
klibc/klibc/syscalls.pl
klibc/klibc/syslog.c
klibc/klibc/tests/fcntl.c [new file with mode: 0644]
klibc/klibc/tests/getpagesize.c [new file with mode: 0644]
klibc/klibc/tests/malloctest2.c [new file with mode: 0644]
klibc/klibc/tests/microhello.c
klibc/klibc/tests/minips.c [deleted file]
klibc/klibc/tests/mmaptest.c [new file with mode: 0644]
klibc/klibc/tests/opentest.c [new file with mode: 0644]
klibc/klibc/tests/stat.c [new file with mode: 0644]
klibc/klibc/tests/statfs.c [new file with mode: 0644]
klibc/klibc/tests/strtoimax.c [new file with mode: 0644]
klibc/klibc/tests/strtotime.c [new file with mode: 0644]
klibc/klibc/time.c
klibc/klibc/utime.c
klibc/klibc/vasprintf.c [new file with mode: 0644]
klibc/version

index ec8b65c0e4c8a335060e5fa8441f2af5b130f0bc..d2aa23626c17ff535d991c6db9638345ea022b90 100644 (file)
@@ -3,22 +3,29 @@
 # Makefile configuration, without explicit rules
 #
 
+# Eventually support separate compilation, but we don't have it yet...
+OBJROOT = $(SRCROOT)
+
 ARCH    = $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 CROSS   = 
 CC     = $(CROSS)gcc
 LD      = $(CROSS)ld
 KLIBSRC = $(SRCROOT)/klibc
-REQFLAGS = $(ARCHREQFLAGS) -nostdinc -iwithprefix include -I$(KLIBSRC) \
-         -I$(KLIBSRC)/arch/$(ARCH)/include \
-         -I$(KLIBSRC)/include/bits$(BITSIZE) \
-         -D__KLIBC__ -DBITSIZE=$(BITSIZE) -I$(KLIBSRC)/include \
-         -I$(KERNEL_DIR)/include
+KLIBOBJ = $(OBJROOT)/klibc
+REQFLAGS = $(ARCHREQFLAGS) -nostdinc -iwithprefix include \
+         -D__KLIBC__ -DBITSIZE=$(BITSIZE) \
+         -I$(SRCROOT)/include/arch/$(ARCH) \
+         -I$(SRCROOT)/include/bits$(BITSIZE) \
+         -I$(SRCROOT)/include \
+         -I$(SRCROOT)/linux/include -I$(SRCROOT)/linux/include2
 LDFLAGS =
 AR      = $(CROSS)ar
 RANLIB  = $(CROSS)ranlib
 NM     = $(CROSS)nm
 PERL    = perl
 STRIP   = $(CROSS)strip --strip-all -R .comment -R .note
+OBJCOPY = $(CROSS)objcopy
 
 HOST_CC      = gcc
 HOST_CFLAGS  = -g -O
@@ -26,13 +33,13 @@ HOST_LDFLAGS =
 HOST_LIBS    =
 
 # Static library paths
-CRT0      = $(KLIBSRC)/crt0.o
-KLIBC     = $(KLIBSRC)/libc.a
+CRT0      = $(KLIBOBJ)/crt0.o
+KLIBC     = $(KLIBOBJ)/libc.a
 LIBGCC    = $(shell $(CC) --print-libgcc)
 
 # Shared library paths
-CRTSHARED = $(KLIBSRC)/interp.o
-LIBSHARED = $(KLIBSRC)/libc.so
+CRTSHARED = $(KLIBOBJ)/interp.o
+LIBSHARED = $(KLIBOBJ)/libc.so
 
 #
 # This indicates the location of the final version of the shared library.
@@ -41,7 +48,15 @@ LIBSHARED = $(KLIBSRC)/libc.so
 #
 SHLIBDIR = /lib
 
+# Enable this to make perror/strerror return real error messages
+# This makes klibc.so and any static binary which uses these functions
+# about 4K bigger.
+ERRLIST = 1
+
 #
 # Include arch-specific rule fragments
 #
 include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
+
+# How to tell the linker main() is the entrypoint
+EMAIN ?= -e main
index ef5fbabff8fc06291be7a5331c3fdf097364ecbc..8823a33bfd94e51b0f6e2edb3ae62e79a283a29e 100644 (file)
@@ -10,7 +10,7 @@ klibc.spec: klibc.spec.in version
 
 .PHONY: rpm
 rpm: klibc.spec
-       +$(rpmbuild) -bb klibc.spec
+       +$(rpmbuild) -bb klibc.spec --target=$(ARCH)
 
 %:
        @set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done
index 43813648745bb7c686ecfe9d7fc8aa8601bac52c..eb72e1c239d64ee59148eb1f7405e9353c2284bb 100644 (file)
@@ -1,4 +1,5 @@
-Please see klibc/README for build instructions.
+Please see klibc/README for build instructions and for the status of
+various platforms.
 
 
 
diff --git a/klibc/klibc.spec b/klibc/klibc.spec
new file mode 100644 (file)
index 0000000..6166a35
--- /dev/null
@@ -0,0 +1,157 @@
+Summary: A minimal libc subset for use with initramfs.
+Name: klibc
+Version: 0.181
+Release: 1
+License: BSD/GPL
+Group: Development/Libraries
+URL: http://www.zytor.com/mailman/listinfo/klibc
+Source: http://www.kernel.org/pub/linux/libs/klibc-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+BuildRequires: kernel-source >= 2.6.0
+Packager: H. Peter Anvin <hpa@zytor.com>
+Prefix: /usr
+Vendor: Starving Linux Artists
+
+%description
+%{name} is intended to be a minimalistic libc subset for use with
+initramfs.  It is deliberately written for small size, minimal
+entanglement, and portability, not speed.  It is definitely a work in
+progress, and a lot of things are still missing.
+
+%package kernheaders
+Summary: Kernel headers used during the build of klibc.
+Group: Development/Libraries
+
+%description kernheaders
+This package contains the set of kernel headers that were required to
+build %{name} and the utilities that ship with it.  This may or may
+not be a complete enough set to build other programs that link against
+%{name}.  If in doubt, use real kernel headers instead.
+
+%package utils
+Summary: Small statically-linked utilities built with klibc.
+Group: Utilities/System
+
+%description utils
+
+This package contains a collection of programs that are statically
+linked against klibc.  These duplicate some of the functionality of a
+regular Linux toolset, but are typically much smaller than their
+full-function counterparts.  They are intended for inclusion in
+initramfs images and embedded systems.
+
+%prep
+%setup -q
+cp -as /usr/src/linux-`rpm -q kernel-source | tail -1 | cut -d- -f3-` ./linux
+make -C linux defconfig ARCH=%{_target_cpu}
+make -C linux prepare ARCH=%{_target_cpu}
+# Deal with braindamage in RedHat's kernel-source RPM
+rm -f linux/include/linux/config.h
+cat <<EOF > linux/include/linux/config.h
+#ifndef _LINUX_CONFIG_H
+#define _LINUX_CONFIG_H
+
+#include <linux/autoconf.h>
+
+#endif
+EOF
+mkdir -p %{buildroot}
+
+%build
+make ARCH=%{_target_cpu}
+
+%install
+rm -rf %{buildroot}
+
+dest=%{buildroot}/%{prefix}
+lib=$dest/%{_lib}/klibc
+inc=$dest/include/klibc
+exe=$dest/libexec/klibc
+doc=$dest/share/doc/%{name}-%{version}
+udoc=$dest/share/doc/%{name}-utils-%{version}
+
+# First, the library.
+
+install -dD -m 755 $lib $inc/kernel $exe $doc $udoc
+install -m 755 klibc/klibc.so $lib
+install -m 644 klibc/libc.a $lib
+install -m 644 klibc/crt0.o $lib
+install -m 644 klibc/libc.so.hash $lib
+ln $lib/klibc.so $lib/libc.so
+ln $lib/klibc.so $lib/klibc-$(cat $lib/libc.so.hash).so
+
+# Next, the generated binaries.
+# These are currently static binaries, should we go for shared?
+
+install -m 755 ash/sh $exe
+install -m 755 gzip/gzip $exe
+ln $exe/gzip $exe/gunzip
+ln $exe/gzip $exe/zcat
+install -m 755 ipconfig/ipconfig $exe
+install -m 755 kinit/kinit $exe
+install -m 755 nfsmount/nfsmount $exe
+install -m 755 utils/static/* $exe
+
+# The docs.
+
+install -m 444 README $doc
+install -m 444 klibc/README $doc/README.klibc
+install -m 444 klibc/arch/README $doc/README.klibc.arch
+
+install -m 444 gzip/COPYING $udoc/COPYING.gzip
+install -m 444 gzip/README $udoc/README.gzip
+install -m 444 ipconfig/README $udoc/README.ipconfig
+install -m 444 kinit/README $udoc/README.kinit
+
+# Finally, the include files.
+
+bitsize=$(make --no-print-directory -C klibc bitsize ARCH=%{_target_cpu})
+cp --parents $(find klibc/include \( -name CVS -o -name SCCS \) -prune \
+    -o -name '*.h' -print) $inc
+mv $inc/klibc $inc/klibc.$$
+mv $inc/klibc.$$/include/* $inc
+mv $inc/bits$bitsize/bitsize $inc
+rm -rf $inc/klibc.$$ $inc/bits[0-9]*
+pushd klibc/arch/%{_arch}/include
+cp --parents -f $(find . \( -name CVS -o -name SCCS \) -prune \
+    -o -name '*.h' -print) $inc
+popd
+
+# Yeugh.  Find the transitive closure over all kernel headers included
+# by klibc, and copy them into place.
+
+find . -name '.*.d' | xargs -r sed -e 's,[ \t][ \t]*,\n,g' | sed -n -e 's,^\.\./linux/include/,,p' | sort | uniq | (cd linux/include && xargs -ri cp --parents '{}' $inc/kernel)
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,-)
+%docdir %{prefix}/share/doc/%{name}-%{version}
+%{prefix}/%{_lib}/klibc
+%dir %{prefix}/include/klibc
+%{prefix}/include/klibc/*.h
+%{prefix}/include/klibc/arpa
+%{prefix}/include/klibc/bitsize
+%{prefix}/include/klibc/klibc
+%{prefix}/include/klibc/net
+%{prefix}/include/klibc/netinet
+%{prefix}/include/klibc/sys
+%{prefix}/share/doc/%{name}-%{version}
+
+%files kernheaders
+%defattr(-,root,root,-)
+%{prefix}/include/klibc/kernel
+
+%files utils
+%defattr(-,root,root,-)
+%{prefix}/libexec/klibc
+%docdir %{prefix}/share/doc/%{name}-utils-%{version}
+%{prefix}/share/doc/%{name}-utils-%{version}
+
+%changelog
+* Tue Jul 6 2004 H. Peter Anvin <hpa@zytor.com>
+- Update to use kernel-source RPM for the kernel symlink.
+
+* Sat Nov 29 2003 Bryan O'Sullivan <bos@serpentine.com> - 
+- Initial build.
index f8bccc390e5ffb646e1af821ccbfe4c2de3b95f7..8f5b2618d03d57f1191072aadd564f82893f069f 100644 (file)
@@ -1,16 +1,14 @@
-%define _rpmdir rpms
-%define _builddir .
-
 Summary: A minimal libc subset for use with initramfs.
 Name: klibc
-Version: 0.89
+Version: @@VERSION@@
 Release: 1
 License: BSD/GPL
 Group: Development/Libraries
-URL: http://www.zytor.com/klibc
-Source: /dev/null
+URL: http://www.zytor.com/mailman/listinfo/klibc
+Source: http://www.kernel.org/pub/linux/libs/klibc-%{version}.tar.gz
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
-Packager: Bryan O'Sullivan <bos@serpentine.com>
+BuildRequires: kernel-source >= 2.6.0
+Packager: H. Peter Anvin <hpa@zytor.com>
 Prefix: /usr
 Vendor: Starving Linux Artists
 
@@ -43,18 +41,24 @@ full-function counterparts.  They are intended for inclusion in
 initramfs images and embedded systems.
 
 %prep
-if [ ! -L linux ]; then
-    echo "*** You must have a symlink named linux to build klibc" 1>&2
-    exit 1
-fi
-if [ ! -f linux/include/asm/page.h ]; then
-    echo "*** You need to 'make prepare' in the linux tree before building klibc" 1>&2
-    exit 1
-fi
-mkdir -p %{buildroot} %{_rpmdir}
+%setup -q
+cp -as /usr/src/linux-`rpm -q kernel-source | tail -1 | cut -d- -f3-` ./linux
+make -C linux defconfig ARCH=%{_target_cpu}
+make -C linux prepare ARCH=%{_target_cpu}
+# Deal with braindamage in RedHat's kernel-source RPM
+rm -f linux/include/linux/config.h
+cat <<EOF > linux/include/linux/config.h
+#ifndef _LINUX_CONFIG_H
+#define _LINUX_CONFIG_H
+
+#include <linux/autoconf.h>
+
+#endif
+EOF
+mkdir -p %{buildroot}
 
 %build
-make
+make ARCH=%{_target_cpu}
 
 %install
 rm -rf %{buildroot}
@@ -77,6 +81,7 @@ ln $lib/klibc.so $lib/libc.so
 ln $lib/klibc.so $lib/klibc-$(cat $lib/libc.so.hash).so
 
 # Next, the generated binaries.
+# These are currently static binaries, should we go for shared?
 
 install -m 755 ash/sh $exe
 install -m 755 gzip/gzip $exe
@@ -85,9 +90,7 @@ ln $exe/gzip $exe/zcat
 install -m 755 ipconfig/ipconfig $exe
 install -m 755 kinit/kinit $exe
 install -m 755 nfsmount/nfsmount $exe
-for i in chroot dd fstype mkdir mkfifo mount umount; do
-    install -m 755 utils/$i $exe
-done
+install -m 755 utils/static/* $exe
 
 # The docs.
 
@@ -102,7 +105,7 @@ install -m 444 kinit/README $udoc/README.kinit
 
 # Finally, the include files.
 
-bitsize=$(make --no-print-directory -C klibc bitsize)
+bitsize=$(make --no-print-directory -C klibc bitsize ARCH=%{_target_cpu})
 cp --parents $(find klibc/include \( -name CVS -o -name SCCS \) -prune \
     -o -name '*.h' -print) $inc
 mv $inc/klibc $inc/klibc.$$
@@ -147,5 +150,8 @@ rm -rf $RPM_BUILD_ROOT
 %{prefix}/share/doc/%{name}-utils-%{version}
 
 %changelog
+* Tue Jul 6 2004 H. Peter Anvin <hpa@zytor.com>
+- Update to use kernel-source RPM for the kernel symlink.
+
 * Sat Nov 29 2003 Bryan O'Sullivan <bos@serpentine.com> - 
 - Initial build.
index 253a9461b7289edbe74e43f430308014ad3afec3..5b6eecd037ed51370f47268f5d78c9a05fae7f1c 100644 (file)
@@ -8,6 +8,11 @@ include ../MCONFIG
 include ../MRULES
 
 WARNFLAGS = -W -Wall -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Winline
+
+ifeq ($(ERRLIST),1)
+REQFLAGS += -DWITH_ERRLIST
+endif
+
 CFLAGS  = -Wp,-MD,$(dir $*).$(notdir $*).d $(OPTFLAGS) $(REQFLAGS) $(WARNFLAGS)
 
 SOFLAGS = -fPIC
index 7ed03a8e87d2f4b7b7fa8aa0e558ec8f1c3f243f..d7e75f181498c6269a951760ac3bbd5e2a9c228e 100644 (file)
@@ -10,6 +10,7 @@ include MCONFIG
 TESTS   = $(patsubst %.c,%,$(wildcard tests/*.c)) \
          $(patsubst %.c,%.shared,$(wildcard tests/*.c))
 LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \
+         asprintf.o vasprintf.o \
          vsscanf.o sscanf.o ctypes.o \
          strntoumax.o strntoimax.o \
          atoi.o atol.o atoll.o \
@@ -18,41 +19,51 @@ LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \
          globals.o exitc.o atexit.o onexit.o \
          execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \
          fork.o wait.o wait3.o waitpid.o system.o setpgrp.o getpgrp.o \
-         open.o \
+         daemon.o \
          printf.o vprintf.o fprintf.o vfprintf.o perror.o \
-         fopen.o fread.o fread2.o fgetc.o fgets.o \
-         fwrite.o fwrite2.o fputc.o fputs.o puts.o \
-         sleep.o usleep.o raise.o abort.o assert.o alarm.o pause.o \
+         statfs.o fstatfs.o umount.o \
+         open.o fopen.o fread.o fread2.o fgetc.o fgets.o \
+         fwrite.o fwrite2.o fputc.o fputs.o puts.o putchar.o \
+         sleep.o usleep.o strtotimespec.o strtotimeval.o \
+         raise.o abort.o assert.o alarm.o pause.o \
          __signal.o sysv_signal.o bsd_signal.o siglist.o siglongjmp.o \
          sigaction.o sigpending.o sigprocmask.o sigsuspend.o \
-         brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o getpagesize.o \
+         brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o \
          memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \
-         memmove.o \
+         memmove.o memchr.o \
          strcasecmp.o strncasecmp.o strndup.o strerror.o \
-         strcat.o strchr.o strcmp.o strcpy.o strdup.o strlen.o \
-         strncat.o strstr.o strncmp.o strncpy.o strrchr.o strspn.o \
+         strcat.o strchr.o strcmp.o strcpy.o strdup.o strlen.o strnlen.o \
+         strncat.o strlcpy.o strlcat.o \
+         strstr.o strncmp.o strncpy.o strrchr.o strspn.o \
          strsep.o strtok.o \
          gethostname.o getdomainname.o getcwd.o \
-         seteuid.o setegid.o setresuid.o setresgid.o \
+         seteuid.o setegid.o \
          getenv.o setenv.o putenv.o __put_env.o unsetenv.o \
          getopt.o readdir.o \
          syslog.o closelog.o pty.o getpt.o isatty.o reboot.o \
-         time.o utime.o fdatasync.o llseek.o select.o nice.o getpriority.o \
-         qsort.o lrand48.o srand48.o seed48.o \
+         time.o utime.o llseek.o nice.o getpriority.o \
+         qsort.o \
+         lrand48.o jrand48.o mrand48.o nrand48.o srand48.o seed48.o \
          inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o \
          inet/inet_ntop.o inet/inet_pton.o inet/bindresvport.o \
          send.o recv.o
+ifeq ($(ERRLIST),1)
+LIBOBJS += errlist.o
+endif
+
 SOLIB   = libc.so
 SOHASH  = klibc.so
 
 CRT0    = crt0.o
 LIB     = libc.a
 
-#all: tests $(CRT0) $(LIB) $(SOLIB) klibc.so
-all:  $(CRT0) $(LIB) $(SOLIB) klibc.so
+INTERP_O = interp.o
+
+all: tests $(CRT0) $(LIB) $(SOLIB) klibc.so
 
 # Add any architecture-specific rules
 include arch/$(ARCH)/Makefile.inc
+EMAIN ?= -e main
 
 tests: $(TESTS)
 
@@ -71,19 +82,20 @@ tests/% : tests/%.o $(LIB) $(CRT0)
        $(STRIP) $@.stripped
 
 tests/%.shared : tests/%.o interp.o $(SOLIB)
-       $(LD) $(LDFLAGS) -o $@ -e main interp.o tests/$*.o -R $(SOLIB) $(LIBGCC)
+       $(LD) $(LDFLAGS) -o $@ $(EMAIN) interp.o tests/$*.o -R $(SOLIB) $(LIBGCC)
        cp $@ $@.stripped
        $(STRIP) $@.stripped
 
 $(LIB): __static_init.o $(LIBOBJS) $(ARCHOBJS) syscalls/static.obj socketcalls/static.obj
        rm -f $(LIB)
-       $(AR) cq $(LIB) __static_init.o $(LIBOBJS) $(ARCHOBJS) syscalls/*.o socketcalls/*.o
+       $(AR) cq $(LIB) __static_init.o $(LIBOBJS) $(ARCHOBJS) \
+               $(wildcard syscalls/*.o) $(wildcard socketcalls/*.o)
        $(RANLIB) $(LIB)
 
 $(SOLIB): $(CRT0) __shared_init.o $(LIBOBJS) $(ARCHOBJS) syscalls/static.obj socketcalls/static.obj
        $(LD) $(LDFLAGS) $(SHAREDFLAGS) -o $@ \
                $(CRT0) __shared_init.o $(LIBOBJS) $(ARCHOBJS) \
-               syscalls/*.o socketcalls/*.o \
+               $(wildcard syscalls/*.o) $(wildcard socketcalls/*.o) \
                $(LIBGCC)
 
 sha1hash: sha1hash.c
@@ -99,7 +111,7 @@ $(SOHASH): $(SOLIB) $(SOLIB).hash
        rm -f klibc-??????????????????????.so
        ln -f $@ klibc-`cat $(SOLIB).hash`.so
 
-interp.o: interp.S $(SOLIB).hash
+$(INTERP_O): interp.S $(SOLIB).hash
        $(CC) $(CFLAGS) -D__ASSEMBLY__ -DLIBDIR=\"$(SHLIBDIR)\" \
                -DSOHASH=\"`cat $(SOLIB).hash`\" \
                -c -o $@ $<
@@ -107,16 +119,29 @@ interp.o: interp.S $(SOLIB).hash
 crt0.o: arch/$(ARCH)/crt0.o
        cp arch/$(ARCH)/crt0.o .
 
-syscalls.dir: SYSCALLS syscalls.pl syscommon.h
+errlist.c:
+       $(PERL) makeerrlist.pl -errlist > $@ || rm -f $@
+
+# We pass -ansi to keep cpp from define e.g. "i386" as well as "__i386__"
+SYSCALLS.i: SYSCALLS.def
+       $(CC) $(CFLAGS) -D__ASSEMBLY__ -ansi -x assembler-with-cpp -E -o $@ $<
+
+syscalls.nrs: ../include/sys/syscall.h ../include/arch/$(ARCH)/klibc/archsys.h ../linux/include/asm/unistd.h
+       $(CC) $(CFLAGS) -Wp,-dM -x c -E -o $@ ../include/sys/syscall.h
+
+syscalls.dir: SYSCALLS.i syscalls.pl arch/$(ARCH)/sysstub.ph syscommon.h syscalls.nrs
        rm -rf syscalls
        mkdir syscalls
-       $(PERL) syscalls.pl $(ARCH) SYSCALLS
+       $(PERL) syscalls.pl SYSCALLS.i $(ARCH) $(BITSIZE) syscalls.nrs ../include/klibc/havesyscall.h
        touch $@
 
-socketcalls.dir: SOCKETCALLS socketcalls.pl socketcommon.h
+../include/klibc/havesyscall.h: syscalls.dir
+       : Generated by side effect
+
+socketcalls.dir: SOCKETCALLS.def socketcalls.pl socketcommon.h
        rm -rf socketcalls
        mkdir socketcalls
-       $(PERL) socketcalls.pl $(ARCH) SOCKETCALLS
+       $(PERL) socketcalls.pl SOCKETCALLS.def $(ARCH)
        touch $@
 
 %/static.obj: %.dir
@@ -133,9 +158,10 @@ clean: archclean
        rm -f $(TESTS) tests/*.stripped
        rm -rf syscalls syscalls.dir
        rm -rf socketcalls socketcalls.dir
-       rm -f sha1hash
+       rm -f sha1hash errlist.c
 
 spotless: clean
+       rm -f ../include/klibc/havesyscall.h syscalls.nrs
        find . \( -name \*~ -o -name '.*.d' \) -not -type d -print0 | \
                xargs -0rt rm -f
 
index d69fa8de41b924e51614f7c4f935941a786b5cfc..edc8524f221e82402df0653d886e3c57a2883f91 100644 (file)
@@ -1,6 +1,6 @@
 This is klibc, what is intended to be a minimalistic libc subset for
 use with initramfs.  It is deliberately written for small size,
-minimal entaglement and portability, not speed.  It is definitely a
+minimal entaglement, and portability, not speed.  It is definitely a
 work in progress, and a lot of things are still missing.
 
 
@@ -34,20 +34,38 @@ b) If you're cross-compiling, change ARCH in the main MCONFIG file to
 
    The following is the last known status of various architectures:
 
-   Known to work:             alpha arm ia64 i386 ppc s390 s390x sparc
-                              sparc64 x86_64*
-   Works static, not shared:   mips* arm-thumb sh* parisc
-   Might work:                ppc64
-   Need porting work:         cris m68k mips64 v850
-
-   x86_64:   requires a kernel header patch (to be created)
-   mips, sh: linker problem; might work with fixed linker
-
-   Shared library support requires binutils 2.13.90.0.4 or later on
-   many architectures.
-
-   Note that even the "known to work" ones likely have bugs.  Please
-   report them if you run into them.
+   alpha:       Working static, shared untested
+   arm-thumb:   Untested
+   arm26:       Not yet ported
+   arm:                 Working
+   cris:        Untested
+   h8300:       Not yet ported
+   i386:        Working
+   ia64:        Working
+   m68k:        Not yet ported
+   mips64:      Not yet ported
+   mips:        Working
+   parisc:      Untested
+   ppc64:       Working
+   ppc:                 Working
+   s390:        Working static, shared untested
+   s390x:       Working
+   sh:          Untested
+   sparc64:     sigaction() fails in ash for unknown reason
+   sparc:       Working
+   v850:        Not yet ported
+   x86-64:      Working
+   
+   Shared library support requires recent binutils on many
+   architectures.
+
+   "Need sysstub.ph" means the architectural changes first implemented
+   in klibc-0.117 has not yet been implemented; klibc-0.116 did,
+   however, work.  "Not yet ported" means no porting work has been
+   done on this architecture.
+
+   Note that even the "working" ones likely have bugs.  Please report
+   them if you run into them.
 
 c) Type "make" and pray...
 
diff --git a/klibc/klibc/SOCKETCALLS b/klibc/klibc/SOCKETCALLS
deleted file mode 100644 (file)
index 1ab4e36..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- fundamental -*-
-#
-# These are calls that are invoked via the socketcall mechanism
-#
-int socket(int, int, int)
-int bind(int, struct sockaddr *, int)
-int connect(int, struct sockaddr *, socklen_t)
-int listen(int, int)
-int accept(int, struct sockaddr *, socklen_t *)
-int getsockname(int, struct sockaddr *, socklen_t *)
-int getpeername(int, struct sockaddr *, socklen_t *)
-int socketpair(int, int, int, int *)
-# int send(int, const void *, size_t, unsigned int)
-int sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t)
-# int recv(int, void *, size_t, unsigned int)
-int recvfrom(int, void *, size_t, unsigned int, struct sockaddr *, socklen_t *)
-int shutdown(int, int)
-int setsockopt(int, int, int, const void *, socklen_t)
-int getsockopt(int, int, int, void *, socklen_t *)
-int sendmsg(int, const struct msghdr *, unsigned int)
-int recvmsg(int, struct msghdr *, unsigned int)
diff --git a/klibc/klibc/SOCKETCALLS.def b/klibc/klibc/SOCKETCALLS.def
new file mode 100644 (file)
index 0000000..e70b3fc
--- /dev/null
@@ -0,0 +1,21 @@
+; -*- fundamental -*-
+;
+; These are calls that are invoked via the socketcall mechanism
+; Note that on most architectures this is simply #included into
+; SYSCALLS.def.
+;
+<?> int socket(int, int, int)
+<?> int bind(int, struct sockaddr *, int)
+<?> int connect(int, struct sockaddr *, socklen_t)
+<?> int listen(int, int)
+<?> int accept(int, struct sockaddr *, socklen_t *)
+<?> int getsockname(int, struct sockaddr *, socklen_t *)
+<?> int getpeername(int, struct sockaddr *, socklen_t *)
+<?> int socketpair(int, int, int, int *)
+<?> int sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t)
+<?> int recvfrom(int, void *, size_t, unsigned int, struct sockaddr *, socklen_t *)
+<?> int shutdown(int, int)
+<?> int setsockopt(int, int, int, const void *, socklen_t)
+<?> int getsockopt(int, int, int, void *, socklen_t *)
+<?> int sendmsg(int, const struct msghdr *, unsigned int)
+<?> int recvmsg(int, struct msghdr *, unsigned int)
diff --git a/klibc/klibc/SYSCALLS b/klibc/klibc/SYSCALLS
deleted file mode 100644 (file)
index 8208120..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# -*- fundamental -*-
-#
-# This is a list of system calls we invoke "directly".  These
-# are generated into syscall stubs in their own C files, so the
-# linker can do its job properly.
-#
-# The full description of a line is:
-# [<[!]arch,...>] type sysname[@systype][::funcname](args)
-#
-
-#
-# Process-related syscalls
-#
-<!mips,mips64,sparc,ia64> pid_t vfork()
-<sparc> pid_t vfork@forkish()
-<!alpha> pid_t getpid()
-<alpha> pid_t getxpid@dual0::getpid()
-int setpgid(pid_t, pid_t)
-pid_t getpgid(pid_t)
-<!alpha> pid_t getppid()
-<alpha> pid_t getxpid@dual1::getppid()
-pid_t setsid()
-pid_t getsid(pid_t)
-pid_t wait4(pid_t, int *, int, struct rusage *)
-int execve(const char *, char * const *, char * const *)
-int setpriority(int, int, int)
-int sched_setscheduler(pid_t, int, const struct sched_param *)
-int sched_yield()
-
-#
-# User and group IDs
-#
-int setuid(uid_t)
-int setgid(gid_t)
-<!alpha> uid_t getuid()
-<alpha> uid_t getxuid@dual0::getuid()
-<!alpha> gid_t getgid()
-<alpha> gid_t getxgid@dual0::getgid()
-<!alpha> uid_t geteuid()
-<alpha> uid_t getxuid@dual1::geteuid()
-<!alpha> gid_t getegid()
-<alpha> uid_t getxgid@dual1::getegid()
-int getgroups(int, gid_t *)
-int setgroups(size_t, const gid_t *)
-int setreuid(uid_t, uid_t)
-int setregid(gid_t, gid_t)
-int setfsuid(uid_t)
-int setfsgid(gid_t)
-
-#
-# Filesystem-related system calls
-#
-int mount(const char *, const char *, const char *, unsigned long, const void *)
-<!alpha,ia64> int umount2(const char *, int)
-<alpha,ia64> int umount::umount2(const char *, int)
-<!m68k> int pivot_root(const char *, const char *)
-int sync()
-int statfs(const char *, struct statfs *)
-int fstatfs(int, struct statfs *)
-int swapon(const char *, int)
-int swapoff(const char *)
-
-#
-# Inode-related system calls
-#
-int access(const char *, int)
-int link(const char *, const char *)
-int unlink(const char *)
-int chdir(const char *)
-int rename(const char *, const char *)
-int mknod(const char *, mode_t, dev_t)
-int chmod(const char *, mode_t)
-int fchmod(int, mode_t)
-int mkdir(const char *, mode_t)
-int rmdir(const char *)
-<!alpha,ia64,mips,mips64> int pipe(int *)
-mode_t umask(mode_t)
-int chroot(const char *)
-int symlink(const char *, const char *)
-int readlink(const char *, char *, size_t)
-int stat(const char *, struct stat *)
-int lstat(const char *, struct stat *)
-int fstat(int, struct stat *)
-int getdents(unsigned int, struct dirent *, unsigned int)
-int chown(const char *, uid_t, gid_t)
-int fchown(int, uid_t, gid_t)
-int lchown(const char *, uid_t, gid_t)
-
-#
-# I/O operations
-#
-ssize_t read(int, void *, size_t)
-ssize_t write(int, const void *, size_t)
-int close(int)
-off_t lseek(int, off_t, int)
-int dup(int)
-int dup2(int, int)
-int fcntl(int, int, long)
-int ioctl(int, int, void *)
-int flock(int, int)
-int poll(struct pollfd *, nfds_t, long)
-int fsync(int)
-int readv(int, const struct iovec *, int)
-int writev(int, const struct iovec *, int)
-int ftruncate(int, off_t)
-
-#
-# Signal operations
-#
-int kill(pid_t, int)
-int rt_sigaction(int, const struct sigaction *, struct sigaction *, size_t)
-int rt_sigsuspend(const sigset_t *, size_t)
-int rt_sigpending(sigset_t *, size_t)
-int rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t)
-int getitimer(int, struct itimerval *)
-int setitimer(int, const struct itimerval *, struct itimerval *)
-
-#
-# Time-related system calls
-#
-clock_t times(struct tms *)
-int gettimeofday(struct timeval *, struct timezone *)
-int settimeofday(const struct timeval *, const struct timezone *)
-int nanosleep(const struct timespec *, struct timespec *)
-
-#
-# Memory
-#
-void * brk::__brk(void *)
-int munmap(void *, size_t)
-void * mremap(void *, size_t, size_t, unsigned long)
-int msync(const void *, size_t, int)
-int mprotect(const void *, size_t, int)
-
-#
-# System stuff
-#
-int uname(struct utsname *)
-int setdomainname(const char *, size_t)
-int sethostname(const char *, size_t)
-long init_module(void *, unsigned long, const char *)
-long delete_module(const char *, unsigned int)
-<!ia64> int query_module(const char *, int, void *, size_t, size_t)
-int reboot::__reboot(int, int, int, void *)
-int syslog::klogctl(int, char *, int)
-int sysinfo(struct sysinfo *)
-
-#
-# Low-level I/O (generally architecture-specific)
-#
-<i386,x86_64> int iopl(int)
-<i386,x86_64> int ioperm(unsigned long, unsigned long, int)
-<i386> int vm86(struct vm86_struct *)
diff --git a/klibc/klibc/SYSCALLS.def b/klibc/klibc/SYSCALLS.def
new file mode 100644 (file)
index 0000000..dbd7dc8
--- /dev/null
@@ -0,0 +1,207 @@
+; -*- fundamental -*-
+;
+; This is a list of system calls we invoke "directly".  These
+; are generated into syscall stubs in their own files, so the
+; linker can do its job properly.
+;
+; The full description of a line is:
+; [<[?][!]arch,...>] type [sysname,...][@systype][::funcname](args)
+;
+; ? means only instantiate this system call if present in asm/unistd.h
+;
+
+#include <asm/unistd.h>
+
+;
+; Process-related syscalls
+;
+<?!ia64> pid_t clone::__clone(unsigned long, void *)
+<?ia64> pid_t clone::__clone2(unsigned long, void *, void *)
+<?!sparc> pid_t fork()
+<sparc> pid_t fork@forkish()
+<!mips,mips64,sparc,ia64> pid_t vfork()
+<sparc> pid_t vfork@forkish()
+<!alpha> pid_t getpid()
+<alpha> pid_t getxpid@dual0::getpid()
+int setpgid(pid_t, pid_t)
+pid_t getpgid(pid_t)
+<!alpha> pid_t getppid()
+<alpha> pid_t getxpid@dual1::getppid()
+pid_t setsid()
+pid_t getsid(pid_t)
+pid_t wait4(pid_t, int *, int, struct rusage *)
+int execve(const char *, char * const *, char * const *)
+<?> int nice(int)
+<alpha,ia64> int getpriority(int, int)
+<!alpha,ia64> int getpriority::__getpriority(int, int)
+int setpriority(int, int, int)
+int sched_setscheduler(pid_t, int, const struct sched_param *)
+int sched_yield()
+
+;
+; User and group IDs
+;
+int setuid32,setuid::setuid(uid_t)
+int setgid32,setgid::setgid(gid_t)
+<!alpha> uid_t getuid32,getuid::getuid()
+<alpha>  uid_t getxuid@dual0::getuid()
+<!alpha> gid_t getgid32,getgid::getgid()
+<alpha> gid_t getxgid@dual0::getgid()
+<!alpha> uid_t geteuid32,geteuid::geteuid()
+<alpha> uid_t getxuid@dual1::geteuid()
+<!alpha> gid_t getegid32,getegid::getegid()
+<alpha> gid_t getxgid@dual1::getegid()
+int getgroups32,getgroups::getgroups(int, gid_t *)
+int setgroups32,setgroups::setgroups(size_t, const gid_t *)
+int setreuid32,setreuid::setreuid(uid_t, uid_t)
+int setregid32,setregid::setregid(gid_t, gid_t)
+int setfsuid32,setfsuid::setfsuid(uid_t)
+int setfsgid32,setfsgid::setfsgid(gid_t)
+int setresuid32,setresuid::setresuid(int, uid_t, uid, uid_t)
+
+;
+; Filesystem-related system calls
+;
+int mount(const char *, const char *, const char *, unsigned long, const void *)
+<!alpha,ia64> int umount2(const char *, int)
+<alpha,ia64> int umount::umount2(const char *, int)
+<!m68k> int pivot_root(const char *, const char *)
+int sync()
+#ifdef __NR_statfs64
+int statfs64::__statfs64(const char *, size_t, struct statfs *)
+#else
+int statfs(const char *, struct statfs *)
+#endif
+#ifdef __NR_fstatfs64
+int fstatfs64::__fstatfs64(int, size_t, struct statfs *)
+#else
+int fstatfs(int, struct statfs *)
+#endif
+int swapon(const char *, int)
+int swapoff(const char *)
+
+;
+; Inode-related system calls
+;
+int access(const char *, int)
+int link(const char *, const char *)
+int unlink(const char *)
+int chdir(const char *)
+int fchdir(int)
+int rename(const char *, const char *)
+int mknod(const char *, mode_t, dev_t)
+int chmod(const char *, mode_t)
+int fchmod(int, mode_t)
+int mkdir(const char *, mode_t)
+int rmdir(const char *)
+<!alpha,ia64,mips,mips64> int pipe(int *)
+mode_t umask(mode_t)
+int chroot(const char *)
+int symlink(const char *, const char *)
+int readlink(const char *, char *, size_t)
+int stat64,stat::stat(const char *, struct stat *)
+int lstat64,lstat::lstat(const char *, struct stat *)
+int fstat64,fstat::fstat(int, struct stat *)
+int getdents64,getdents::getdents(unsigned int, struct dirent *, unsigned int)
+int chown32,chown::chown(const char *, uid_t, gid_t)
+int fchown32,fchown::fchown(int, uid_t, gid_t)
+int lchown32,lchown::lchown(const char *, uid_t, gid_t)
+int getcwd::__getcwd(char *, size_t)
+<?> int utime(const char *, const struct utimbuf *)
+<?> int utimes(const char *, const struct timeval *)
+
+;
+; I/O operations
+;
+<!i386,64> int open::__open(const char *, int, mode_t)
+<64> int open(const char *, int, mode_t)
+ssize_t read(int, void *, size_t)
+ssize_t write(int, const void *, size_t)
+int close(int)
+<64> off_t lseek(int, off_t, int)
+<32> int _llseek::__llseek(int, unsigned long, unsigned long, off_t *, int)
+int dup(int)
+int dup2(int, int)
+<i386> int fcntl64@varadic::fcntl(int, int, unsigned long)
+<!i386> int fcntl64,fcntl::fcntl(int, int, unsigned long)
+int ioctl(int, int, void *)
+int flock(int, int)
+int _newselect,select::select(int, fd_set *, fd_set *, fd_set *, struct timeval *)
+int poll(struct pollfd *, nfds_t, long)
+int fsync(int)
+int fdatasync,fsync::fdatasync(int)
+int readv(int, const struct iovec *, int)
+int writev(int, const struct iovec *, int)
+int ftruncate64,ftruncate::ftruncate(int, off_t)
+ssize_t pread64,pread::pread(int, void *, size_t, off_t)
+ssize_t pwrite64,pwrite::pwrite(int, void *, size_t, off_t)
+
+;
+; Signal operations
+;
+int kill(pid_t, int)
+<?> int sigaction(int, const struct sigaction *, struct sigaction *)
+int rt_sigaction(int, const struct sigaction *, struct sigaction *, size_t)
+<?> int sigsuspend(const sigset_t *)
+int rt_sigsuspend(const sigset_t *, size_t)
+<?> int sigpending(sigset_t)
+int rt_sigpending(sigset_t *, size_t)
+<?> int sigprocmask(int, const sigset_t *, sigset_t *)
+int rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t)
+<?> unsigned int alarm(unsigned int)
+int getitimer(int, struct itimerval *)
+int setitimer(int, const struct itimerval *, struct itimerval *)
+
+;
+; Time-related system calls
+;
+<?> time_t time(time_t *)
+clock_t times(struct tms *)
+int gettimeofday(struct timeval *, struct timezone *)
+int settimeofday(const struct timeval *, const struct timezone *)
+int nanosleep(const struct timespec *, struct timespec *)
+<?> int pause()
+
+;
+; Memory
+;
+void * brk::__brk(void *)
+int munmap(void *, size_t)
+void * mremap(void *, size_t, size_t, unsigned long)
+int msync(const void *, size_t, int)
+int mprotect(const void *, size_t, int)
+#if (BITSIZE == 32 && defined(__NR_mmap2)) || (BITSIZE == 64 && !defined(__NR_mmap))
+<!s390> void * mmap2::__mmap2(void *, size_t, int, int, int, long)
+#else
+<!s390x> void * mmap(void *, size_t, int, int, int, long)
+#endif
+int mlockall(int)
+int munlockall()
+int mlock(const void *, size_t)
+int munlock(const void *, size_t)
+
+;
+; System stuff
+;
+int uname(struct utsname *)
+int setdomainname(const char *, size_t)
+int sethostname(const char *, size_t)
+long init_module(void *, unsigned long, const char *)
+long delete_module(const char *, unsigned int)
+int reboot::__reboot(int, int, int, void *)
+int syslog::klogctl(int, char *, int)
+int sysinfo(struct sysinfo *)
+
+;
+; Low-level I/O (generally architecture-specific)
+;
+<i386,x86_64> int iopl(int)
+<i386,x86_64> int ioperm(unsigned long, unsigned long, int)
+<i386> int vm86(struct vm86_struct *)
+
+;
+; Most architectures have the socket interfaces using regular
+; system calls.
+;
+<?!i386> long socketcall::__socketcall(int, const unsigned long *)
+#include "SOCKETCALLS.def"
index 63e3f4644ed78233dd9819eae88c4735fd093fea..592a3db6f507e3bfc4b9204ae91b9b91f100aded 100644 (file)
@@ -1,56 +1,2 @@
-/*
- * __shared_init.c
- *
- * This function takes the raw data block set up by the ELF loader
- * in the kernel and parses it.  It is invoked by crt0.S which makes
- * any necessary adjustments and passes calls this function using
- * the standard C calling convention.
- *
- * The arguments are:
- *  uintptr_t *elfdata  -- The ELF loader data block; usually from the stack.
- *                          Basically a pointer to argc.
- *  void (*onexit)(void) -- Function to install into onexit
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <klibc/compiler.h>
-#include <elf.h>
-
-char **environ;
-
-__noreturn __libc_init(uintptr_t *elfdata, void (*onexit)(void))
-{
-  int argc;
-  char **argv, **envp, **envend;
-  struct auxentry {
-    uintptr_t type;
-    uintptr_t v;
-  } *auxentry;
-  typedef int (*main_t)(int, char **, char **);
-  main_t main_ptr = NULL;
-
-  (void)onexit;                        /* For now, we ignore this... */
-
-  argc = (int)*elfdata++;
-  argv = (char **)elfdata;
-  envp = argv+(argc+1);
-
-  /* The auxillary entry vector is after all the environment vars */
-  for ( envend = envp ; *envend ; envend++ );
-  auxentry = (struct auxentry *)(envend+1);
-
-  while ( auxentry->type ) {
-    if ( auxentry->type == AT_ENTRY ) {
-      main_ptr = (main_t)(auxentry->v);
-      break;
-    }
-    auxentry++;
-  }
-
-  environ = envp;
-  exit(main_ptr(argc, argv, envp));
-}
-
-  
+#define SHARED 1
+#include "libc_init.c"
index 5a90b5cd88a95303b772a51ea31ac34ab3faa7d5..0b59eedaa73260b11616f3df5aca9fc391f5ae56 100644 (file)
@@ -1,38 +1,2 @@
-/*
- * __static_init.c
- *
- * This function takes the raw data block set up by the ELF loader
- * in the kernel and parses it.  It is invoked by crt0.S which makes
- * any necessary adjustments and passes calls this function using
- * the standard C calling convention.
- *
- * The arguments are:
- *  uintptr_t *elfdata  -- The ELF loader data block; usually from the stack.
- *                          Basically a pointer to argc.
- *  void (*onexit)(void) -- Function to install into onexit
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <klibc/compiler.h>
-#include <elf.h>
-
-char **environ;
-
-extern int main(int, char **, char **);
-
-__noreturn __libc_init(uintptr_t *elfdata, void (*onexit)(void))
-{
-  int argc;
-  char **argv, **envp;
-
-  (void)onexit;                        /* For now, we ignore this... */
-
-  argc = (int)*elfdata++;
-  argv = (char **)elfdata;
-  envp = argv+(argc+1);
-
-  environ = envp;
-  exit(main(argc, argv, envp));
-}
+#define SHARED 0
+#include "libc_init.c"
index ca7bb37f921ad0e27b5fc8c405be9f187d36a22d..40c0969432d0cc6d79b3b4d0be33e3957230d30a 100644 (file)
@@ -5,11 +5,7 @@
 #include <sys/time.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_alarm
-
-_syscall1(unsigned int,alarm,unsigned int,seconds);
-
-#else
+#ifndef __NR_alarm
 
 /* Emulate alarm() via setitimer() */
 
index 2a1100f962f72af18f23e3a4a1669cc5d92d1bef..62fce9dc2809896fb4a9e960a6b24c2235b25c15 100644 (file)
@@ -11,7 +11,7 @@
 DIVCFLAGS = $(REQFLAGS) \
        -O3 -fomit-frame-pointer -fcall-saved-1 -fcall-saved-2 \
        -fcall-saved-3 -fcall-saved-4 -fcall-saved-5 -fcall-saved-6 \
-       -fcall-saved-7 -fcall-saved-8 -fcall-saved-15 -fcall-saved-16 \
+       -fcall-saved-7 -fcall-saved-8 -ffixed-15 -fcall-saved-16 \
        -fcall-saved-17 -fcall-saved-18 -fcall-saved-19 -fcall-saved-20 \
        -fcall-saved-21 -fcall-saved-22 -ffixed-23 -fcall-saved-24 \
        -ffixed-25 -ffixed-27
@@ -26,7 +26,9 @@ ARCHOBJS = \
        arch/$(ARCH)/__divl.o \
        arch/$(ARCH)/__reml.o \
        arch/$(ARCH)/pipe.o \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
+       arch/$(ARCH)/sysdual.o
 
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
index 6c2958117d5c23c6177a49486d0af1033901f817..904b539741b818f15db65171ae1389bfea8cfa85 100644 (file)
@@ -3,10 +3,10 @@
 #
 
        .text
-       .type   __start,@function
-       .ent    __start, 0
-       .globl  __start
-__start:
+       .type   _start,@function
+       .ent    _start, 0
+       .globl  _start
+_start:
        .frame  $30, 0, $26, 0
        mov     $31, $15
        br      $29, 1f
@@ -18,4 +18,5 @@ __start:
        
        jsr     $26, __libc_init
        
-       .size __start,.-__start
+       .size   _start,.-_start
+       .end    _start
diff --git a/klibc/klibc/arch/alpha/include/klibc/archsetjmp.h b/klibc/klibc/arch/alpha/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 9dc570a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * arch/alpha/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __s0;
-  unsigned long __s1;
-  unsigned long __s2;
-  unsigned long __s3;
-  unsigned long __s4;
-  unsigned long __s5;
-  unsigned long __fp;
-  unsigned long __ra;
-  unsigned long __gp;
-  unsigned long __sp;
-  
-  unsigned long __f2;
-  unsigned long __f3;
-  unsigned long __f4;
-  unsigned long __f5;
-  unsigned long __f6;
-  unsigned long __f7;
-  unsigned long __f8;
-  unsigned long __f9;
-};
-
-/* Must be an array so it will decay to a pointer when a function is called */
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _KLIBC_ARCHSETJMP_H */
diff --git a/klibc/klibc/arch/alpha/include/klibc/archsignal.h b/klibc/klibc/arch/alpha/include/klibc/archsignal.h
deleted file mode 100644 (file)
index b870a05..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/alpha/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/alpha/include/klibc/archsys.h b/klibc/klibc/arch/alpha/include/klibc/archsys.h
deleted file mode 100644 (file)
index 16ed658..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * arch/alpha/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* Alpha has some bizarre Tru64-derived system calls which return two
-   different values in $0 and $20(!), respectively.  The standard
-   macros can't deal with these; even the ones that give the right
-   return value have the wrong clobbers. */
-
-#define _syscall0_dual0(type, name)                                     \
-type name(void)                                                         \
-{                                                                       \
-        long _sc_ret, _sc_err;                                          \
-        {                                                               \
-                register long _sc_0 __asm__("$0");                      \
-                register long _sc_19 __asm__("$19");                    \
-                register long _sc_20 __asm__("$20");                    \
-                                                                        \
-                _sc_0 = __NR_##name;                                    \
-                __asm__("callsys"                                       \
-                        : "=r"(_sc_0), "=r"(_sc_19), "=r" (_sc_20)      \
-                        : "0"(_sc_0)                                    \
-                        : _syscall_clobbers);                           \
-                _sc_ret = _sc_0, _sc_err = _sc_19; (void)(_sc_20);      \
-        }                                                               \
-        _syscall_return(type);                                          \
-}
-
-#define _syscall0_dual1(type, name)                                     \
-type name(void)                                                         \
-{                                                                       \
-        long _sc_ret, _sc_err;                                          \
-        {                                                               \
-                register long _sc_0 __asm__("$0");                      \
-                register long _sc_19 __asm__("$19");                    \
-                register long _sc_20 __asm__("$20");                    \
-                                                                        \
-                _sc_0 = __NR_##name;                                    \
-                __asm__("callsys"                                       \
-                        : "=r"(_sc_0), "=r"(_sc_19), "=r" (_sc_20)      \
-                        : "0"(_sc_0)                                    \
-                        : _syscall_clobbers);                           \
-                _sc_ret = _sc_20, _sc_err = _sc_19; (void)(_sc_0);      \
-        }                                                               \
-        _syscall_return(type);                                          \
-}
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/alpha/include/machine/asm.h b/klibc/klibc/arch/alpha/include/machine/asm.h
deleted file mode 100644 (file)
index e22db90..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * machine/asm.h
- */
-
-#ifndef _MACHINE_ASM_H
-#define _MACHINE_ASM_H
-
-/* Standard aliases for Alpha register names */
-
-#define v0     $0
-#define t0     $1
-#define t1     $2
-#define t2     $3
-#define t3     $4
-#define t4     $5
-#define t5     $6
-#define t6     $7
-#define t7     $8
-#define s0     $9
-#define s1     $10
-#define s2     $11
-#define s3     $12
-#define s4     $13
-#define s5     $14
-#define fp     $15
-#define a0     $16
-#define a1     $17
-#define a2     $18
-#define a3     $19
-#define a4     $20
-#define a5     $21
-#define t8     $22
-#define t9     $23
-#define t10    $24
-#define t11    $25
-#define ra     $26
-#define t12    $27             /* t12 and pv are both used for $27 */
-#define pv     $27             /* t12 and pv are both used for $27 */
-#define at     $28
-#define gp     $29
-#define sp     $30
-#define zero   $31
-
-#endif /* _MACHINE_ASM_H */
index e1ad642539b5e0461639f3f2e4f3923cefdffccf..5d915f2dbea8ad1f0051f5fa2c563f5fd21e1aab 100644 (file)
@@ -31,14 +31,14 @@ setjmp:
        stq     ra,  56(a0)
        stq     gp,  64(a0)
        stq     sp,  72(a0)
-       stt     f2,  80(a0)
-       stt     f3,  88(a0)
-       stt     f4,  96(a0)
-       stt     f5, 104(a0)
-       stt     f6, 112(a0)
-       stt     f7, 120(a0)
-       stt     f8, 128(a0)
-       stt     f9, 136(a0)
+       stt     $f2,  80(a0)
+       stt     $f3,  88(a0)
+       stt     $f4,  96(a0)
+       stt     $f5, 104(a0)
+       stt     $f6, 112(a0)
+       stt     $f7, 120(a0)
+       stt     $f8, 128(a0)
+       stt     $f9, 136(a0)
        ret     zero,(ra),1
 
        .size setjmp,.-setjmp
@@ -59,14 +59,14 @@ longjmp:
        ldq     ra,  56(a0)
        ldq     gp,  64(a0)
        ldq     sp,  72(a0)
-       ldt     f2,  80(a0)
-       ldt     f3,  88(a0)
-       ldt     f4,  96(a0)
-       ldt     f5, 104(a0)
-       ldt     f6, 112(a0)
-       ldt     f7, 120(a0)
-       ldt     f8, 128(a0)
-       ldt     f9, 136(a0)
+       ldt     $f2,  80(a0)
+       ldt     $f3,  88(a0)
+       ldt     $f4,  96(a0)
+       ldt     $f5, 104(a0)
+       ldt     $f6, 112(a0)
+       ldt     $f7, 120(a0)
+       ldt     $f8, 128(a0)
+       ldt     $f9, 136(a0)
        /* We're bound to get a mispredict here, but at least give us
           a chance to get the return stack back in sync... */
        ret     zero,(ra),1
diff --git a/klibc/klibc/arch/alpha/syscall.S b/klibc/klibc/arch/alpha/syscall.S
new file mode 100644 (file)
index 0000000..0c87414
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# arch/alpha/syscall.S
+#
+
+#include <machine/asm.h>
+       
+       .text
+       .align  3
+       .type   __syscall_common,@function
+       .ent    __syscall_common, 0
+       .globl  __syscall_common
+__syscall_common:
+       .frame  sp,0,ra,0
+       callsys
+       beq     a3, 1f
+       br      pv, 2f                  # pv <- pc  
+2:
+       ldgp    gp, 0(pv)
+       lda     a1, errno
+       lda     v0, -1(zero)
+       stl     a3, 0(a1)
+1:
+       ret     zero,(ra),1
+
+       .size   __syscall_common,.-__syscall_common
+       .end    __syscall_common
diff --git a/klibc/klibc/arch/alpha/sysdual.S b/klibc/klibc/arch/alpha/sysdual.S
new file mode 100644 (file)
index 0000000..c00db88
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# arch/alpha/sysdual.S
+#
+
+#
+# Some system calls have an alternate return value in r20 (a4).
+# This system call stub is for system calls where that is
+# the "real" return value.
+#
+
+#include <machine/asm.h>
+       
+       .text
+       .align  3
+       .type   __syscall_dual1,@function
+       .ent    __syscall_dual1, 0
+       .globl  __syscall_dual1
+__syscall_dual1:
+       .frame  sp,0,ra,0
+       callsys
+       mov     v0, a4
+       beq     a3, 1f
+       br      pv, 2f                  # pv <- pc  
+2:
+       ldgp    gp, 0(pv)
+       lda     a1, errno
+       lda     v0, -1(zero)
+       stl     a3, 0(a1)
+1:
+       ret     zero,(ra),1
+
+       .size   __syscall_dual1,.-__syscall_dual1
+       .end    __syscall_dual1
diff --git a/klibc/klibc/arch/alpha/sysstub.ph b/klibc/klibc/arch/alpha/sysstub.ph
new file mode 100644 (file)
index 0000000..a24b6c0
--- /dev/null
@@ -0,0 +1,37 @@
+# -*- perl -*-
+#
+# arch/alpha/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+# On Alpha, most system calls follow the standard convention, with the
+# system call number in r0 (v0), return an error value in r19 (a3) as
+# well as the return value in r0 (v0).
+#
+# A few system calls are dual-return with the second return value in
+# r20 (a4).
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    $stype = $stype || 'common';
+    $stype = 'common' if ( $stype eq 'dual0' );
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "#include <machine/asm.h>\n";
+    print OUT "\n";
+    print OUT "\t.text\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.ent\t${fname}, 0\n"; # What is this?
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tlda\tv0, __NR_${sname}(zero)\n";
+    print OUT "\tbr __syscall_${stype}\n";
+    print OUT "\t.size\t${fname},.-${fname}\n";
+    print OUT "\t.end\t${fname}\n";
+    close(OUT);
+}
+
+1;
index 3ec8c051b2fe6a0e138b76c592a671b088fc4599..0603d850bdeff7070b56f22708c8011e286fd122 100644 (file)
@@ -17,7 +17,8 @@ ARCHOBJS = \
        libgcc/__moddi3.o \
        libgcc/__udivdi3.o \
        libgcc/__umoddi3.o \
-       libgcc/__udivmoddi4.o
+       libgcc/__udivmoddi4.o \
+       arch/arm/syscall.o
 
 ifeq ($(THUMB),y)
 ARCHOBJS += arch/arm/setjmp-thumb.o
@@ -26,6 +27,17 @@ else
 ARCHOBJS += arch/arm/setjmp-arm.o
 endif
 
+arch/arm/sysstubs.a: arch/arm/sysstubs.pl
+       mkdir -p arch/arm/sysstubs
+       $(PERL) $< arch/arm/sysstubs
+       $(MAKE) $(patsubst %.S,%.o,$(wildcard arch/arm/sysstubs/*.S))
+       -rm -f $@
+       $(AR) cq $@ arch/arm/sysstubs/*.o
+       $(RANLIB) $@
+
+
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
 archclean:
+       -rm -rf arch/arm/sysstubs
+       -rm -f arch/arm/sysstubs.a
index 8cd3640c30de7313b033671964aa4e8d3f9f391e..fc1104ef0ea389aed47332357d1ce33dc1779ece 100644 (file)
@@ -3,10 +3,8 @@
 #
 # void _start(void)
 # {
-#    /* Divine up argc, argv, and envp */
-#    environ = envp;
-#    exit(main(argc, argv, envp));
-# } 
+#    __libc_init(elf_structure, atexit_ptr);
+# }
 #
 
        .text
diff --git a/klibc/klibc/arch/arm/include/klibc/archsetjmp.h b/klibc/klibc/arch/arm/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index c956b50..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * arch/i386/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned int regs[10];
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/arm/include/klibc/archsignal.h b/klibc/klibc/arch/arm/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 77685e6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/arm/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/arm/include/klibc/archsys.h b/klibc/klibc/arch/arm/include/klibc/archsys.h
deleted file mode 100644 (file)
index 1a77e53..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/arm/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
index bcb30b42210ae3967edbab010bbf68d73a5706da..1a29ee7f71ef584f0375e2a8d6401b10e3840c78 100644 (file)
@@ -34,7 +34,6 @@ setjmp:
        .type longjmp, #function
 longjmp:
        ldmia   r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr}
-       movs    r0, r1
-       moveq   r0, #1
+       mov     r0, r1
        mov     pc, lr
        .size longjmp,.-longjmp
diff --git a/klibc/klibc/arch/arm/syscall.S b/klibc/klibc/arch/arm/syscall.S
new file mode 100644 (file)
index 0000000..0e73f68
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * arch/arm/syscall.S
+ *
+ * System call common handling
+ */
+
+       .type   __syscall_common,#function
+       .globl  __syscall_common
+#ifndef __thumb__
+       /* ARM version - this is executed after the swi */
+
+       .align  4
+__syscall_common:
+        cmn     r0, #4096
+        rsbcs  r2, r0, #0
+        ldrcs  r3, 1f
+        mvncs  r0, #0
+        strcs  r2, [r3]
+       ldmfd   sp!,{r4,r5,pc}
+       
+       .align 4        
+1:
+       .word   errno
+
+#else
+       /* Thumb version - must still load r4 and r5 and run swi */
+
+       .thumb_func
+       .align  2
+__syscall_common:
+       ldr     r4, [sp #12]
+       ldr     r5, [sp #16]
+       swi     0
+       ldr     r1, 2f
+       cmp     r0, r1
+       bcc     1f
+       ldr     r1, 3f
+       neg     r2, r0
+       mvn     r0, #0  
+       str     r2, [r1]
+1:
+       pop     {r4,r5,r7,pc}
+
+       .align  4
+2:
+       .word   #-4095
+3:
+       .word   errno
+
+#endif
diff --git a/klibc/klibc/arch/arm/sysstub.ph b/klibc/klibc/arch/arm/sysstub.ph
new file mode 100644 (file)
index 0000000..bf953cc
--- /dev/null
@@ -0,0 +1,44 @@
+# -*- perl -*-
+#
+# arch/arm/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print  OUT "#include <asm/unistd.h>\n";
+       
+    print  OUT "\t.text\n";
+    print  OUT "\t.type\t${fname}, #function\n";
+    print  OUT "\t.globl ${fname}\n";
+    print  OUT "\t.align\t4\n";
+
+    print  OUT "#ifndef __thumb__\n";
+
+    # ARM version first
+    print  OUT "${fname}:\n";
+    print  OUT "\tstmfd\tsp!,{r4,r5,lr}\n";
+    print  OUT "\tldr\tr4,[sp,#12]\n";
+    print  OUT "\tldr\tr5,[sp,#16]\n";
+    print  OUT "\tswi\t# __NR_${sname}\n";
+    print  OUT "\tb\t__syscall_common\n";
+
+    print  OUT "#else\n";
+
+    # Thumb version
+    print  OUT "\t.thumb_func\n";
+    print  OUT "${fname}:\n";
+    print  OUT "\tpush\t{r4,r5,r7,pc}\n";
+    print  OUT "\tmov\tr7, # __NR_${sname}\n";
+    print  OUT "\tb\t__syscall_common\n";
+    
+    print  OUT "#endif\n";
+
+    print  OUT "\t.size\t__syscall${i},.-__syscall${i}\n";
+}
+
+1;
index 27809ebbe726d6d6e9377ebd364a3f29608a93dc..2762494a30c553cd842c06779a551d5c1e6f6fe6 100644 (file)
@@ -9,3 +9,18 @@
 
 OPTFLAGS = -Os -fomit-frame-pointer
 BITSIZE  = 32
+
+# Extra linkflags when building the shared version of the library
+# This address needs to be reachable using normal inter-module
+# calls, and work on the memory models for this architecture
+# 224 MB - normal binaries start at 0
+# (lib?)gcc on cris seems to insist on producing .init and .fini sections
+SHAREDFLAGS     = --section-start .init=0x0e000100
+
+# The CRIS compiler needs an -iprefix to find libgcc includes when
+# nostdinc is used. It also needs -mlinux to compile linux applications.
+INCLUDE_PREFIX  = $(shell $(CC) -print-libgcc-file-name | sed -e s/libgcc.a//)
+ARCHREQFLAGS = -iprefix $(INCLUDE_PREFIX) -mlinux
+
+# Special flags needed for linking
+LDFLAGS        += -mcrislinux
index 41183fd64bac2702dd4b731a2575c2b6b3004758..75fa17ba99c92d89ff70ed2b218a69021f3aee48 100644 (file)
@@ -7,4 +7,27 @@
 # accordingly.
 #
 
+ARCHOBJS = \
+       arch/$(ARCH)/__Umod.o \
+       arch/$(ARCH)/__Udiv.o \
+       arch/$(ARCH)/__Mod.o \
+       arch/$(ARCH)/__Div.o \
+       arch/$(ARCH)/__negdi2.o \
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
+       libgcc/__divdi3.o \
+       libgcc/__moddi3.o \
+       libgcc/__udivdi3.o \
+       libgcc/__umoddi3.o \
+       libgcc/__udivmoddi4.o
+
+arch/$(ARCH)/__Umod.o: arch/$(ARCH)/divide.c
+       $(CC) $(CFLAGS) -DSIGNED=0 -DREM=1 -DBITS=32 -DNAME=__Umod -c -o $@ $<
+arch/$(ARCH)/__Udiv.o: arch/$(ARCH)/divide.c
+       $(CC) $(CFLAGS) -DSIGNED=0 -DREM=0 -DBITS=32 -DNAME=__Udiv -c -o $@ $<
+arch/$(ARCH)/__Mod.o: arch/$(ARCH)/divide.c
+       $(CC) $(CFLAGS) -DSIGNED=1 -DREM=1 -DBITS=32 -DNAME=__Mod -c -o $@ $<
+arch/$(ARCH)/__Div.o: arch/$(ARCH)/divide.c
+       $(CC) $(CFLAGS) -DSIGNED=1 -DREM=0 -DBITS=32 -DNAME=__Div -c -o $@ $<
+
 archclean:
diff --git a/klibc/klibc/arch/cris/__negdi2.S b/klibc/klibc/arch/cris/__negdi2.S
new file mode 100644 (file)
index 0000000..3cca9ed
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * arch/cris/__negdi2.c
+ */
+
+/*
+ * In 2's complement arithmetric, -x == (~x + 1), so
+ * -{h,l} = (~{h,l} + {0,1)
+ * -{h,l} = {~h,~l} + {0,1}
+ * -{h,l} = {~h + cy, ~l + 1}
+ * ... where cy = (l == 0)
+ * -{h,l} = {~h + cy, -l}
+ */
+
+       .text
+       .balign 4
+       .type   __negdi2,@function
+       .globl  __negdi2
+__negdi2:
+       neg.d   $r10,$r10
+       seq     $r12
+       not     $r11
+       ret
+         add.d $r12,$r11
+
+       .size __negdi2, .-__negdi2
diff --git a/klibc/klibc/arch/cris/crt0.S b/klibc/klibc/arch/cris/crt0.S
new file mode 100644 (file)
index 0000000..989c82b
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# arch/cris/crt0.S
+#
+# Does arch-specific initialization and invokes __libc_init
+# with the appropriate arguments.
+#
+# See __static_init.c or __shared_init.c for the expected
+# arguments.
+#
+
+       .text
+       .balign 4
+       .type   _start,@function
+       .globl  _start
+_start:
+       /* Save the address of the ELF argument array */
+       move.d  $sp,$r10        /* Address of ELF arguments */
+
+       /* atexit() function (assume null) */
+       moveq   0,$r11
+       
+       /* Set up a dummy stack frame to keep gcc from getting confused */
+       push    $r11
+       push    $r11
+       jump    __libc_init
+
+       .size _start, .-_start
+
diff --git a/klibc/klibc/arch/cris/divide.c b/klibc/klibc/arch/cris/divide.c
new file mode 100644 (file)
index 0000000..29081dc
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stdint.h>
+#include <signal.h>
+
+#if BITS == 64
+typedef uint64_t unum;
+typedef int64_t  snum;
+#else
+typedef uint32_t unum;
+typedef int32_t  snum;
+#endif
+
+#ifdef SIGNED
+typedef snum xnum;
+#else
+typedef unum xnum;
+#endif
+
+#ifdef __cris__
+static inline unum __attribute__((const)) dstep(unum rs, unum rd) {
+  asm("dstep %1,%0" : "+r" (rd) : "r" (rs));
+  return rd;
+}
+
+static inline unum __attribute__((const)) lz(unum rs) {
+  unum rd;
+  asm("lz %1,%0" : "=r" (rd) : "r" (rs));
+  return rd;
+}
+
+#else
+/* For testing */
+static inline unum __attribute__ ((const)) dstep(unum rs, unum rd) {
+  rd <<= 1;
+  if ( rd >= rs )
+    rd -= rs;
+
+  return rd;
+}
+
+static inline unum __attribute__((const)) lz(unum rs) {
+  unum rd = 0;
+  while ( rs >= 0x7fffffff ) {
+    rd++;
+    rs <<= 1;
+  }
+  return rd;
+}
+
+#endif
+
+xnum NAME (unum num, unum den)
+{
+  unum quot = 0, qbit = 1;
+  int minus = 0;
+  xnum v;
+  
+  if ( den == 0 ) {
+    raise(SIGFPE);
+    return 0;                  /* If signal ignored... */
+  }
+
+  if (den == 1) return (xnum)(REM ? 0 : num);
+
+#if SIGNED
+  if ( (snum)(num^den) < 0 )
+    minus = 1;
+  if ( (snum)num < 0 ) num = -num;
+  if ( (snum)den < 0 ) den = -den;
+#endif
+
+  den--;
+
+
+  /* Left-justify denominator and count shift */
+  while ( (snum)den >= 0 ) {
+    den <<= 1;
+    qbit <<= 1;
+  }
+
+  while ( qbit ) {
+    if ( den <= num ) {
+      num -= den;
+      quot += qbit;
+    }
+    den >>= 1;
+    qbit >>= 1;
+  }
+
+  v = (xnum)(REM ? num : quot);
+  if ( minus ) v = -v;
+  return v;
+}
diff --git a/klibc/klibc/arch/cris/include/klibc/archsignal.h b/klibc/klibc/arch/cris/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 73b2e19..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/cris/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/cris/include/klibc/archsys.h b/klibc/klibc/arch/cris/include/klibc/archsys.h
deleted file mode 100644 (file)
index dfdc70a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/cris/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/cris/setjmp.S b/klibc/klibc/arch/cris/setjmp.S
new file mode 100644 (file)
index 0000000..4316241
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# arch/cris/setjmp.S
+#
+# setjmp/longjmp for the cris architecture
+#
+
+#
+# The jmp_buf is assumed to contain the following, in order:
+#      $r8..$r0        (in that order)
+#      $sp     ($r14)
+#      return address
+#
+
+       .text
+       .balign 4
+       .globl  setjmp
+       .type   setjmp, @function
+setjmp:
+       movem   $r8,[$r10+]             /* Save $r8..$r0 at $r10... */
+       move.d  $sp,[$r10+]
+       move    $srp,[$r10]
+       ret
+         moveq 0,$r10
+
+       .size setjmp,.-setjmp
+
+       .text
+       .balign 4
+       .globl  longjmp
+       .type   longjmp, @function
+longjmp:
+       movem   [$r10+],$r8             /* Load $r8..$r0 from $r10... */
+       move.d  [$r10+],$sp
+       jump    [$r10]
+       move.d $r11,$r10
+       
+       .size longjmp,.-longjmp
diff --git a/klibc/klibc/arch/cris/syscall.S b/klibc/klibc/arch/cris/syscall.S
new file mode 100644 (file)
index 0000000..d71495a
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * arch/cris/syscall.S
+ *
+ * On cris, r9 contains the syscall number (set by generated stub);
+ * r10..r13 contain arguments 0-3 per the standard calling convention,
+ * and arguments 4-5 are passed in $mof and $srp; however, we have
+ * to save $srp around the system call.
+ */
+
+       .section ".text","ax"
+       .balign 4
+       .globl  __syscall_common
+       .type   __syscall_common,@function
+__syscall_common:
+       push    $srp
+       move    [$sp+4],$mof
+       move    [$sp+8],$srp
+       break   13
+
+       cmps.w  -4096,$r10
+       blo     1f
+       neg.d   $r10,$r11
+       move.d  $r11,[errno]
+       moveq   -1,$r10
+1:
+       pop     $srp
+       ret
+       nop
+
+       .size   __syscall_common,.-__syscall_common
diff --git a/klibc/klibc/arch/cris/sysstub.ph b/klibc/klibc/arch/cris/sysstub.ph
new file mode 100644 (file)
index 0000000..6c894f6
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- perl -*-
+#
+# arch/cris/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.text\n";
+    print OUT "\t.type\t${fname},\@function\n";
+    print OUT "\t.globl\t${fname}\n";
+    print OUT "\t.balign\t4\n";
+    print OUT "${fname}:\n";
+    print OUT "#if __NR_${sname} <= 31\n";
+    print OUT "\t  moveq\t__NR_${sname}, \$r9\n";
+    print OUT "#else\n";
+    print OUT "\t  move.d\t__NR_${sname}, \$r9\n";
+    print OUT "#endif\n";
+    print OUT "\tjump\t__syscall_common\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index 516b1b67381489b8956ebdd023e331db899747e2..2421452eea408c6a4b5e7e8a15c23c8fcd296c8e 100644 (file)
@@ -9,11 +9,11 @@
 
 # Enable this to compile with register parameters; only safe for
 # gcc > 3
-REGPARM_OPT := -mregparm=3 -DREGPARM
+REGPARM_OPT := -mregparm=3 -DREGPARM=3
 
-gcc_major := $(shell $(CC) -v 2>&1 | awk '/gcc version/{print int($$3)}')
+gcc_major := $(shell echo __GNUC__ | $(CC) -E -xc - | tail -n 1)
 
-OPTFLAGS = $(REGPARM) -march=i386 -Os
+OPTFLAGS = $(REGPARM) -march=i386 -Os -g
 
 ifeq ($(gcc_major),3)
 REGPARM  := $(REGPARM_OPT)
index 171248a796e543b0c94cd80c33152c023600445f..5c320cb45322ababc07563a1383407836d12f45a 100644 (file)
@@ -11,6 +11,8 @@ ARCHOBJS = \
        arch/$(ARCH)/exits.o \
        arch/$(ARCH)/socketcall.o \
        arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
+       arch/$(ARCH)/open.o \
        arch/$(ARCH)/libgcc/__ashldi3.o \
        arch/$(ARCH)/libgcc/__ashrdi3.o \
        arch/$(ARCH)/libgcc/__lshrdi3.o \
@@ -22,6 +24,4 @@ ARCHOBJS = \
        libgcc/__umoddi3.o \
        libgcc/__udivmoddi4.o
 
-ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
-
 archclean:
diff --git a/klibc/klibc/arch/i386/include/klibc/archsetjmp.h b/klibc/klibc/arch/i386/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index db04314..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * arch/i386/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned int __ebx;
-  unsigned int __esp;
-  unsigned int __ebp;
-  unsigned int __esi;
-  unsigned int __edi;
-  unsigned int __eip;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/i386/include/klibc/archsignal.h b/klibc/klibc/arch/i386/include/klibc/archsignal.h
deleted file mode 100644 (file)
index b092ba6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/i386/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/i386/include/klibc/archsys.h b/klibc/klibc/arch/i386/include/klibc/archsys.h
deleted file mode 100644 (file)
index e21487b..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * arch/i386/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/*
- * If we're compiling i386 in PIC mode, we need to treat %ebx
- * specially.  Most of these are copied from the equivalent file in
- * newlib and were written by Werner Almesberger.
- */
-#if defined(__PIC__)
-
-/* _syscall0() is the same as non-PIC */
-
-#undef _syscall1
-#define _syscall1(type,name,type1,arg1) \
-type name(type1 arg1) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; movl %2,%%ebx; int $0x80; pop %%ebx" \
-       : "=a" (__res) \
-       : "0" (__NR_##name),"r" ((long)(arg1))); \
-__syscall_return(type,__res); \
-}
-
-#undef _syscall2
-#define _syscall2(type,name,type1,arg1,type2,arg2) \
-type name(type1 arg1,type2 arg2) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; movl %2,%%ebx; int $0x80; pop %%ebx" \
-       : "=a" (__res) \
-       : "0" (__NR_##name),"r" ((long)(arg1)),"c" ((long)(arg2))); \
-__syscall_return(type,__res); \
-}
-
-#undef _syscall3
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
-type name(type1 arg1,type2 arg2,type3 arg3) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; movl %2,%%ebx; int $0x80; pop %%ebx" \
-       : "=a" (__res) \
-       : "0" (__NR_##name),"r" ((long)(arg1)),"c" ((long)(arg2)), \
-               "d" ((long)(arg3))); \
-__syscall_return(type,__res); \
-}
-
-#undef _syscall4
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; movl %2,%%ebx; int $0x80; pop %%ebx" \
-       : "=a" (__res) \
-       : "0" (__NR_##name),"r" ((long)(arg1)),"c" ((long)(arg2)), \
-         "d" ((long)(arg3)),"S" ((long)(arg4))); \
-__syscall_return(type,__res); \
-}
-
-#undef _syscall5
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; movl %2,%%ebx; int $0x80; pop %%ebx" \
-       : "=a" (__res) \
-       : "0" (__NR_##name),"m" ((long)(arg1)),"c" ((long)(arg2)), \
-         "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \
-__syscall_return(type,__res); \
-}
-
-#undef _syscall6
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-long __res; \
-__asm__ __volatile__ ("push %%ebx; pushl %%ebp; movl %2,%%ebx; " \
-                      "movl %%eax,%%ebp; movl %1,%%eax; int $0x80; " \
-                      "pop %%ebp ; pop %%ebx" \
-       : "=a" (__res) \
-       : "i" (__NR_##name),"m" ((long)(arg1)),"c" ((long)(arg2)), \
-         "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \
-         "a" ((long)(arg6))); \
-__syscall_return(type,__res); \
-}
-
-#endif /* __PIC__ */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/i386/include/klibc/diverr.h b/klibc/klibc/arch/i386/include/klibc/diverr.h
deleted file mode 100644 (file)
index 410aba0..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * arch/i386/include/klibc/diverr.h
- */
-
-#ifndef _KLIBC_DIVERR_H
-#define _KLIBC_DIVERR_H
-
-#include <signal.h>
-
-static __inline__ void
-__divide_error(void)
-{
-  asm volatile("divl %0" :: "rm" (0) : "eax", "edx");
-}
-
-#endif /* _KLIBC_DIVERR_H */
diff --git a/klibc/klibc/arch/i386/include/sys/io.h b/klibc/klibc/arch/i386/include/sys/io.h
deleted file mode 100644 (file)
index b051464..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#ident "$Id: io.h,v 1.2 2004/01/25 07:49:39 hpa Exp $"
-/* ----------------------------------------------------------------------- *
- *   
- *   Copyright 2004 H. Peter Anvin - All Rights Reserved
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *   
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *   
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * sys/io.h for the i386 architecture
- *
- * Basic I/O macros
- */
-
-#ifndef _SYS_IO_H
-#define _SYS_IO_H 1
-
-/* I/O-related system calls */
-
-int iopl(int);
-int ioperm(unsigned long, unsigned long, int);
-
-/* Basic I/O macros */
-
-static __inline__ void
-outb(unsigned char __v, unsigned short __p)
-{
-  asm volatile("outb %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ void
-outw(unsigned short __v, unsigned short __p)
-{
-  asm volatile("outw %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ void
-outl(unsigned int __v, unsigned short __p)
-{
-  asm volatile("outl %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ unsigned char
-inb(unsigned short __p)
-{
-  unsigned char __v;
-  asm volatile("inb %1,%0" : "=a" (__v) : "dN" (__p));
-  return __v;
-}
-
-static __inline__ unsigned short
-inw(unsigned short __p)
-{
-  unsigned short __v;
-  asm volatile("inw %1,%0" : "=a" (__v) : "dN" (__p));
-  return __v;
-}
-
-static __inline__ unsigned int
-inl(unsigned short __p)
-{
-  unsigned int __v;
-  asm volatile("inl %1,%0" : "=a" (__v) : "dN" (__p));
-  return __v;
-}
-
-/* String I/O macros */
-
-static __inline__ void
-outsb (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsb" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-outsw (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsw" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-outsl (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsl" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-
-static __inline__ void
-insb (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insb" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-insw (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insw" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-insl (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insl" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-#endif /* _SYS_IO_H */
diff --git a/klibc/klibc/arch/i386/include/sys/vm86.h b/klibc/klibc/arch/i386/include/sys/vm86.h
deleted file mode 100644 (file)
index d327239..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#ident "$Id: vm86.h,v 1.1 2004/01/25 01:34:28 hpa Exp $"
-/* ----------------------------------------------------------------------- *
- *   
- *   Copyright 2004 H. Peter Anvin - All Rights Reserved
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *   
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *   
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * sys/vm86.h for i386
- */
-
-#ifndef _SYS_VM86_H
-#define _SYS_VM86_H 1
-
-#include <asm/vm86.h>
-
-/* Actual system call */
-int vm86(struct vm86_struct *);
-
-#endif
diff --git a/klibc/klibc/arch/i386/open.S b/klibc/klibc/arch/i386/open.S
new file mode 100644 (file)
index 0000000..4f492a1
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * arch/i386/open.S
+ *
+ * Handle the open() system call - oddball due to the varadic
+ * prototype, which forces the use of the cdecl calling convention,
+ * and the need for O_LARGEFILE.
+ */
+
+#include <asm/unistd.h>
+
+/* <asm/fcntl.h>, despite the name, isn't assembly-safe */
+#define O_LARGEFILE     0100000
+       
+       .globl  open
+       .type   open,@function
+
+open:
+#ifdef REGPARM
+       movl    4(%esp),%eax
+       movl    8(%esp),%edx
+       movl    12(%esp),%ecx
+       orl     $O_LARGEFILE,%edx
+#else
+       orl     $O_LARGEFILE,8(%esp)
+#endif
+       pushl   $__NR_open
+       jmp     __syscall_common
+
+       .size   open,.-open
index 6bac1e6913ef9db874dddd11cecdc29607dae2bb..b13d204c32468d4d0d32915504e38d6dda67e64c 100644 (file)
        .type __socketcall_common, @function
 
 __socketcall_common:
-       pushl %ebx
-       movzbl %al,%ebx         # The socketcall number is passed in in %al
-       leal 8(%esp),%ecx       # Argument pointer
-       movl $__NR_socketcall, %eax
-       int $0x80
-       cmpl $-125,%eax         # Error return?
-       popl %ebx
-       jb 1f
-       neg %eax
-       movl %eax,errno
-       xorl %eax,%eax
-       decl %eax               # Return = -1
+       pushl   %ebx
+
+       movzbl  %al,%ebx        # The socketcall number is passed in in %al
+       leal    8(%esp),%ecx    # Argument pointer
+       movl    $__NR_socketcall,%eax
+       int     $0x80
+       
+       cmpl    $-4096,%eax     # Error return?
+       
+       popl    %ebx
+       
+       jb      1f
+       
+       negl    %eax
+       movl    %eax,errno
+       orl     $-1,%eax        # Return -1
 1:
        ret
 
diff --git a/klibc/klibc/arch/i386/syscall.S b/klibc/klibc/arch/i386/syscall.S
new file mode 100644 (file)
index 0000000..f8fa7b4
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * arch/i386/syscall.S
+ *
+ * Common tail-handling code for system calls.  Because of __syscalldecl
+ * we are using the stack even on if we are compiling with regparm.
+ *
+ * The arguments are on the stack; the system call number in %eax.
+ */
+
+#define ARG(n) (4*n+20)(%esp)
+       
+       .text
+       .align  4
+       .globl  __syscall_common
+       .type   __syscall_common,@function
+__syscall_common:
+#ifdef REGPARM
+       xchgl   %ebx,(%esp)
+#else
+       popl    %eax
+       pushl   %ebx
+#endif
+       pushl   %esi
+       pushl   %edi
+       pushl   %ebp
+
+#ifdef REGPARM
+       xchgl   %eax,%ebx
+       xchgl   %ecx,%edx
+       movl    ARG(0),%esi
+       movl    ARG(1),%edi
+       movl    ARG(2),%ebp
+#else
+       movl    ARG(0),%ebx             # Syscall arguments
+       movl    ARG(1),%ecx
+       movl    ARG(2),%edx
+       movl    ARG(3),%esi
+       movl    ARG(4),%edi
+       movl    ARG(5),%ebp
+#endif
+       int     $0x80
+
+       cmpl    $-4096,%eax
+
+       popl    %ebp
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+
+       jb      1f
+
+       # Error return, must set errno
+       negl    %eax
+       movl    %eax,errno
+       orl     $-1,%eax                # Return -1
+
+1:
+       ret
+
+       .size   __syscall_common,.-__syscall_common
diff --git a/klibc/klibc/arch/i386/sysstub.ph b/klibc/klibc/arch/i386/sysstub.ph
new file mode 100644 (file)
index 0000000..eaa8180
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- perl -*-
+#
+# arch/i386/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+
+    if ( $stype eq 'varadic' ) {
+       print OUT "#ifdef REGPARM\n";
+       print OUT "\tmovl  4(%esp),%eax\n";
+       print OUT "\tmovl  8(%esp),%edx\n";
+       print OUT "\tmovl 12(%esp),%ecx\n";
+       print OUT "#endif\n";
+    }
+
+    print OUT "\tpushl \$__NR_${sname}\n";
+    print OUT "\tjmp __syscall_common\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index 781448770e621c9df864bb1ebd4dd93796a39297..6363c1f9484fd14371a98a5c3a1300d6bd375350 100644 (file)
@@ -11,6 +11,7 @@ ARCHOBJS = \
        arch/$(ARCH)/vfork.o \
        arch/$(ARCH)/setjmp.o \
        arch/$(ARCH)/pipe.o \
+       arch/$(ARCH)/syscall.o \
        libgcc/__divdi3.o \
        libgcc/__divsi3.o \
        libgcc/__udivdi3.o \
diff --git a/klibc/klibc/arch/ia64/include/klibc/archsetjmp.h b/klibc/klibc/arch/ia64/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index bd639c0..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * arch/ia64/include/klibc/archsetjmp.h
- *
- * Code borrowed from the FreeBSD kernel.
- *
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-/* User code must not depend on the internal representation of jmp_buf. */
-#define _JBLEN 0x200
-
-/* guaranteed 128-bit alignment! */
-typedef char jmp_buf[_JBLEN] __attribute__ ((aligned (16)));
-
-#endif
diff --git a/klibc/klibc/arch/ia64/include/klibc/archsignal.h b/klibc/klibc/arch/ia64/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 5b01f19..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * arch/ia64/include/klibc/archsignal.h
- * 
- * Architecture-specific signal definitions.
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-#define _NSIG        64
-#define _NSIG_BPW    64
-#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
-
-typedef struct {
-       unsigned long sig[_NSIG_WORDS];
-} sigset_t;
-
-struct sigaction {
-        union {
-               __sighandler_t        _sa_handler;
-               void (*_sa_sigaction)(int, struct siginfo *, void *);
-        } _u;
-        sigset_t        sa_mask;
-        int             sa_flags;
-};
-
-#define sa_handler      _u._sa_handler
-#define sa_sigaction    _u._sa_sigaction
-
-#endif
diff --git a/klibc/klibc/arch/ia64/include/klibc/archsys.h b/klibc/klibc/arch/ia64/include/klibc/archsys.h
deleted file mode 100644 (file)
index fe331ac..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * arch/ia64/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-#define __IA64_BREAK "break 0x100000;;\n\t"
-
-#define _syscall0(type,name)                                            \
-type                                                                    \
-name (void)                                                             \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15)         \
-                         : "2" (_r15) ASM_ARGS_0                        \
-                         : "memory" ASM_CLOBBERS_0);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall1(type,name,type1,arg1)                                 \
-type                                                                    \
-name (type1 arg1)                                                       \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_1(arg1);                                               \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_1                                \
-                         : "2" (_r15) ASM_ARGS_1                        \
-                         : "memory" ASM_CLOBBERS_1);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall2(type,name,type1,arg1,type2,arg2)                      \
-type                                                                    \
-name (type1 arg1, type2 arg2)                                           \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_2(arg1, arg2);                                         \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_2                                \
-                         : "2" (_r15) ASM_ARGS_2                        \
-                         : "memory" ASM_CLOBBERS_2);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)           \
-type                                                                    \
-name (type1 arg1, type2 arg2, type3 arg3)                               \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_3(arg1, arg2, arg3);                                   \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_3                                \
-                         : "2" (_r15) ASM_ARGS_3                        \
-                         : "memory" ASM_CLOBBERS_3);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type                                                                    \
-name (type1 arg1, type2 arg2, type3 arg3, type4 arg4)                   \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_4(arg1, arg2, arg3, arg4);                             \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_4                                \
-                         : "2" (_r15) ASM_ARGS_4                        \
-                         : "memory" ASM_CLOBBERS_4);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
-type                                                                    \
-name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)       \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_5(arg1, arg2, arg3, arg4, arg5);                       \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_5                                \
-                         : "2" (_r15) ASM_ARGS_5                        \
-                         : "memory" ASM_CLOBBERS_5);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
-type                                                                    \
-name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6)       \
-{                                                                       \
-       register long _r8 asm ("r8");                                   \
-       register long _r10 asm ("r10");                                  \
-       register long _r15 asm ("r15") = __NR_##name;                    \
-       long _retval;                                                    \
-       LOAD_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6);                 \
-       __asm __volatile (__IA64_BREAK                                   \
-                         : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
-                           ASM_OUTARGS_6                                \
-                         : "2" (_r15) ASM_ARGS_6                        \
-                         : "memory" ASM_CLOBBERS_6);                    \
-       _retval = _r8;                                                   \
-       if (_r10 == -1) {                                                \
-               errno = (_retval);                                       \
-               _retval = -1;                                            \
-       }                                                                \
-       return _retval;                                                  \
-}
-  
-
-#define LOAD_ARGS_0()   do { } while (0)
-#define LOAD_ARGS_1(out0)                              \
-  register long _out0 asm ("out0") = (long) (out0);    \
-  LOAD_ARGS_0 ()
-#define LOAD_ARGS_2(out0, out1)                                \
-  register long _out1 asm ("out1") = (long) (out1);    \
-  LOAD_ARGS_1 (out0)
-#define LOAD_ARGS_3(out0, out1, out2)                  \
-  register long _out2 asm ("out2") = (long) (out2);    \
-  LOAD_ARGS_2 (out0, out1)
-#define LOAD_ARGS_4(out0, out1, out2, out3)            \
-  register long _out3 asm ("out3") = (long) (out3);    \
-  LOAD_ARGS_3 (out0, out1, out2)
-#define LOAD_ARGS_5(out0, out1, out2, out3, out4)      \
-  register long _out4 asm ("out4") = (long) (out4);    \
-  LOAD_ARGS_4 (out0, out1, out2, out3)
-#define LOAD_ARGS_6(out0, out1, out2, out3, out4, out5)        \
-  register long _out5 asm ("out5") = (long) (out5);    \
-  LOAD_ARGS_5 (out0, out1, out2, out3, out4)
-
-#define ASM_OUTARGS_1  "=r" (_out0)
-#define ASM_OUTARGS_2  ASM_OUTARGS_1, "=r" (_out1)
-#define ASM_OUTARGS_3  ASM_OUTARGS_2, "=r" (_out2)
-#define ASM_OUTARGS_4  ASM_OUTARGS_3, "=r" (_out3)
-#define ASM_OUTARGS_5  ASM_OUTARGS_4, "=r" (_out4)
-#define ASM_OUTARGS_6  ASM_OUTARGS_5, "=r" (_out5)
-
-#define ASM_ARGS_0
-#define ASM_ARGS_1     ASM_ARGS_0, "3" (_out0)
-#define ASM_ARGS_2     ASM_ARGS_1, "4" (_out1)
-#define ASM_ARGS_3     ASM_ARGS_2, "5" (_out2)
-#define ASM_ARGS_4     ASM_ARGS_3, "6" (_out3)
-#define ASM_ARGS_5     ASM_ARGS_4, "7" (_out4)
-#define ASM_ARGS_6     ASM_ARGS_5, "8" (_out5)
-
-#define ASM_CLOBBERS_0 ASM_CLOBBERS_1, "out0"
-#define ASM_CLOBBERS_1 ASM_CLOBBERS_2, "out1"
-#define ASM_CLOBBERS_2 ASM_CLOBBERS_3, "out2"
-#define ASM_CLOBBERS_3 ASM_CLOBBERS_4, "out3"
-#define ASM_CLOBBERS_4 ASM_CLOBBERS_5, "out4"
-#define ASM_CLOBBERS_5 ASM_CLOBBERS_6, "out5"
-#define ASM_CLOBBERS_6 , "out6", "out7",                               \
-  /* Non-stacked integer registers, minus r8, r10, r15.  */            \
-  "r2", "r3", "r9", "r11", "r12", "r13", "r14", "r16", "r17", "r18",   \
-  "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27",       \
-  "r28", "r29", "r30", "r31",                                          \
-  /* Predicate registers.  */                                          \
-  "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",    \
-  /* Non-rotating fp registers.  */                                    \
-  "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",    \
-  /* Branch registers.  */                                             \
-  "b6", "b7"
-
-#endif /* _KLIBC_ARCHSYS_H */
index 5f5dd05727eddb0a109b761c8e18778b71eff9d0..0b641e87029f8331cf6566c990df606487318a65 100644 (file)
@@ -27,7 +27,7 @@ int pipe(int *filedes)
        long _retval;
        __asm __volatile (__IA64_BREAK
                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),
-                           "=r" (_out0)
+                         "=r" (_out0), "=r" (_r9)
                          : "2" (_r15), "3" (_out0)
                          : "memory" ASM_CLOBBERS);
        if (_r10 == -1) {
diff --git a/klibc/klibc/arch/ia64/syscall.S b/klibc/klibc/arch/ia64/syscall.S
new file mode 100644 (file)
index 0000000..e3f264c
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# arch/ia64/syscall.S
+#
+
+#include <asm/unistd.h>
+       
+       .text
+       .align  32
+       .proc   __syscall_error
+       .globl  __syscall_error
+__syscall_error:
+       addl    r2 = @ltoffx(errno),gp
+       ;;
+       ld8.mov r3 = [r2],errno
+       ;;
+       st4     [r3] = r8
+       mov     r8 = -1
+       br.ret.sptk.many b0
+       .size   __syscall_error, .-__syscall_error
+       .endp   __syscall_error
diff --git a/klibc/klibc/arch/ia64/sysstub.ph b/klibc/klibc/arch/ia64/sysstub.ph
new file mode 100644 (file)
index 0000000..34031a2
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- perl -*-
+#
+# arch/ia64/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.text\n";
+    print OUT "\t.align 32\n";
+    print OUT "\t.proc ${fname}\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tmov\tr15 = __NR_${sname}\n";
+    print OUT "\tbreak __BREAK_SYSCALL\n";
+    print OUT "\tcmp.eq p6,p0 = -1,r10\n";
+    print OUT "(p6)\tbr.few __syscall_error\n";
+    print OUT "\tbr.ret.sptk.many b0\n";
+    print OUT "\t.size\t${fname},.-${fname}\n";
+    print OUT "\t.endp\t${fname}\n";
+    close(OUT);
+}
+
+1;
index 0354fa9ef75d1eb34bfb36fa0e014e068cb7bc73..efcd03f7f1b0f5ef3a39849dbbcf46899de3c03f 100644 (file)
@@ -27,8 +27,8 @@ vfork:
        mov     out0=CLONE_VM|CLONE_VFORK|SIGCHLD
        mov     out1=0
        ;;
-       __IA64_BREAK      // Do the syscall
-       
+       break 0x100000      // Do the syscall
+       ;; 
        addl    r15=0,r1
        cmp.eq  p7,p6 = -1,r10
        ;;
diff --git a/klibc/klibc/arch/m68k/include/klibc/archsignal.h b/klibc/klibc/arch/m68k/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 714527f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/m68k/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/m68k/include/klibc/archsys.h b/klibc/klibc/arch/m68k/include/klibc/archsys.h
deleted file mode 100644 (file)
index 8f6bed8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/m68k/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
index 52b518461fa85ee6fac7dcc5edf3d96771bfccb7..a248973815a59502565e63f2b5ea078f217a2262 100644 (file)
@@ -7,12 +7,9 @@
 # accordingly.
 #
 
-ARCHREQFLAGS = -fno-pic -mno-abicalls
+ARCHREQFLAGS = -fno-pic -mno-abicalls -G 0
 OPTFLAGS     = -Os -fomit-frame-pointer
 BITSIZE      = 32
 
 # Extra linkflags when building the shared version of the library
-# This address needs to be reachable using normal inter-module
-# calls, and work on the memory models for this architecture
-# 2 MB -- the normal starting point for text is 4 MB.
-SHAREDFLAGS    = -Ttext 0x00200200
+SHAREDFLAGS    = -T arch/$(ARCH)/klibc.ld
index 09a2d2f73622b72cb6bdf8f5a658867336bb22ef..e257023f34658c4cf4b9c50fbcb4f66a22d253ac 100644 (file)
@@ -11,6 +11,7 @@ ARCHOBJS = \
        arch/$(ARCH)/pipe.o \
        arch/$(ARCH)/vfork.o \
        arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
        libgcc/__divdi3.o \
         libgcc/__moddi3.o \
         libgcc/__udivdi3.o \
diff --git a/klibc/klibc/arch/mips/include/klibc/archsetjmp.h b/klibc/klibc/arch/mips/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 40e5be2..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * arch/mips/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __s0;
-  unsigned long __s1;
-  unsigned long __s2;
-  unsigned long __s3;
-  unsigned long __s4;
-  unsigned long __s5;
-  unsigned long __s6;
-  unsigned long __s7;
-  unsigned long __gp;
-  unsigned long __sp;
-  unsigned long __s8;
-  unsigned long __ra;
-  unsigned long __f20;
-  unsigned long __f21;
-  unsigned long __f22;
-  unsigned long __f23;
-  unsigned long __f24;
-  unsigned long __f25;
-  unsigned long __f26;
-  unsigned long __f27;
-  unsigned long __f28;
-  unsigned long __f29;
-  unsigned long __f30;
-  unsigned long __f31;
-  unsigned long __fcr31;
-  unsigned long __unused;
-} __attribute__((aligned(8)));
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _KLIBC_ARCHSETJMP_H */
diff --git a/klibc/klibc/arch/mips/include/klibc/archsignal.h b/klibc/klibc/arch/mips/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 3b72908..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/mips/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/mips/include/klibc/archsys.h b/klibc/klibc/arch/mips/include/klibc/archsys.h
deleted file mode 100644 (file)
index f696cdf..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/mips/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/mips/include/machine/asm.h b/klibc/klibc/arch/mips/include/machine/asm.h
deleted file mode 100644 (file)
index e5239a6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * arch/mips/include/machine/asm.h
- */
-
-#ifndef _MACHINE_ASM_H
-#define _MACHINE_ASM_H
-
-#include <asm/regdef.h>
-#include <asm/asm.h>
-
-#endif /* _MACHINE_ASM_H */
diff --git a/klibc/klibc/arch/mips/include/sgidefs.h b/klibc/klibc/arch/mips/include/sgidefs.h
deleted file mode 100644 (file)
index eb103ac..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * arch/mips/include/sgidefs.h
- */
-
-/* Some ABI constants */
-
-#ifndef _SGIDEFS_H
-#define _SGIDEFS_H
-
-#define _MIPS_ISA_MIPS1 1
-#define _MIPS_ISA_MIPS2 2
-#define _MIPS_ISA_MIPS3 3
-#define _MIPS_ISA_MIPS4 4
-#define _MIPS_ISA_MIPS5 5
-
-#define _MIPS_SIM_ABI32         1
-#define _MIPS_SIM_NABI32        2
-#define _MIPS_SIM_ABI64         3
-
-#endif /* _SGIDEFS_H */
diff --git a/klibc/klibc/arch/mips/klibc.ld b/klibc/klibc/arch/mips/klibc.ld
new file mode 100644 (file)
index 0000000..d75c9de
--- /dev/null
@@ -0,0 +1,217 @@
+/* Linker script for klibc.so, needed because of the the damned
+   GNU ld script headers problem */
+
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips",
+             "elf32-tradlittlemips")
+OUTPUT_ARCH(mips)
+ENTRY(__start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  /* This address needs to be reachable using normal inter-module
+      calls, and work on the memory models for this architecture */
+  /* 2 MB -- the normal starting point for text is 4 MB */
+  . = 0x00200400;
+  .interp         : { *(.interp) }
+  .reginfo        : { *(.reginfo) }
+  .dynamic        : { *(.dynamic) }
+  .hash           : { *(.hash) }
+  .dynsym         : { *(.dynsym) }
+  .dynstr         : { *(.dynstr) }
+  .gnu.version    : { *(.gnu.version) }
+  .gnu.version_d  : { *(.gnu.version_d) }
+  .gnu.version_r  : { *(.gnu.version_r) }
+  .rel.dyn        :
+    {
+      *(.rel.init)
+      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
+      *(.rel.fini)
+      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
+      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
+      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
+      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
+      *(.rel.ctors)
+      *(.rel.dtors)
+      *(.rel.got)
+      *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
+      *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
+      *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
+      *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
+      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
+    }
+  .rela.dyn       :
+    {
+      *(.rela.init)
+      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+      *(.rela.fini)
+      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+      *(.rela.ctors)
+      *(.rela.dtors)
+      *(.rela.got)
+      *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
+      *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
+      *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
+      *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
+      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+    }
+  .rel.plt        : { *(.rel.plt) }
+  .rela.plt       : { *(.rela.plt) }
+  .init           :
+  {
+    KEEP (*(.init))
+  } =0
+  .plt            : { *(.plt) }
+  .text           :
+  {
+    _ftext = . ;
+    *(.text .stub .text.* .gnu.linkonce.t.*)
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    *(.mips16.fn.*) *(.mips16.call.*)
+  } =0
+  .fini           :
+  {
+    KEEP (*(.fini))
+  } =0
+  PROVIDE (__etext = .);
+  PROVIDE (_etext = .);
+  PROVIDE (etext = .);
+  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+  .rodata1        : { *(.rodata1) }
+  .sdata2         : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) }
+  .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
+  .eh_frame_hdr : { *(.eh_frame_hdr) }
+  /* Adjust the address for the data segment.  We want to adjust up to
+     the same address within the page on the next page up.  */
+  . = ALIGN(8192);
+  /* Ensure the __preinit_array_start label is properly aligned.  We
+     could instead move the label definition inside the section, but
+     the linker would then create the section even if it turns out to
+     be empty, which isn't pretty.  */
+  . = ALIGN(32 / 8);
+  PROVIDE (__preinit_array_start = .);
+  .preinit_array     : { *(.preinit_array) }
+  PROVIDE (__preinit_array_end = .);
+  PROVIDE (__init_array_start = .);
+  .init_array     : { *(.init_array) }
+  PROVIDE (__init_array_end = .);
+  PROVIDE (__fini_array_start = .);
+  .fini_array     : { *(.fini_array) }
+  PROVIDE (__fini_array_end = .);
+  .data           :
+  {
+    _fdata = . ;
+    *(.data .data.* .gnu.linkonce.d.*)
+    SORT(CONSTRUCTORS)
+  }
+  .data1          : { *(.data1) }
+  .tdata         : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
+  .tbss                  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+  .eh_frame       : { KEEP (*(.eh_frame)) }
+  .gcc_except_table   : { *(.gcc_except_table) }
+  .ctors          :
+  {
+    /* gcc uses crtbegin.o to find the start of
+       the constructors, so we make sure it is
+       first.  Because this is a wildcard, it
+       doesn't matter if the user does not
+       actually link against crtbegin.o; the
+       linker won't look for a file to match a
+       wildcard.  The wildcard also means that it
+       doesn't matter which directory crtbegin.o
+       is in.  */
+    KEEP (*crtbegin*.o(.ctors))
+    /* We don't want to include the .ctor section from
+       from the crtend.o file until after the sorted ctors.
+       The .ctor section from the crtend file contains the
+       end of ctors marker and it must be last */
+    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+  }
+  .dtors          :
+  {
+    KEEP (*crtbegin*.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+  }
+  .jcr            : { KEEP (*(.jcr)) }
+  _gp = ALIGN(16) + 0x7ff0;
+  .got            : { *(.got.plt) *(.got) }
+  /* We want the small data sections together, so single-instruction offsets
+     can access them all, and initialized data all before uninitialized, so
+     we can shorten the on-disk segment size.  */
+  .sdata          :
+  {
+    *(.sdata .sdata.* .gnu.linkonce.s.*)
+  }
+  .lit8           : { *(.lit8) }
+  .lit4           : { *(.lit4) }
+  _edata = .;
+  PROVIDE (edata = .);
+  __bss_start = .;
+  _fbss = .;
+  .sbss           :
+  {
+    PROVIDE (__sbss_start = .);
+    PROVIDE (___sbss_start = .);
+    *(.dynsbss)
+    *(.sbss .sbss.* .gnu.linkonce.sb.*)
+    *(.scommon)
+    PROVIDE (__sbss_end = .);
+    PROVIDE (___sbss_end = .);
+  }
+  .bss            :
+  {
+   *(.dynbss)
+   *(.bss .bss.* .gnu.linkonce.b.*)
+   *(COMMON)
+   /* Align here to ensure that the .bss section occupies space up to
+      _end.  Align after .bss to ensure correct alignment even if the
+      .bss section disappears because there are no input sections.  */
+   . = ALIGN(32 / 8);
+  }
+  . = ALIGN(32 / 8);
+  _end = .;
+  PROVIDE (end = .);
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
+  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
+  /DISCARD/ : { *(.note.GNU-stack) }
+}
diff --git a/klibc/klibc/arch/mips/syscall.S b/klibc/klibc/arch/mips/syscall.S
new file mode 100644 (file)
index 0000000..d5c1fe1
--- /dev/null
@@ -0,0 +1,15 @@
+#include <asm/asm.h>
+#include <asm/regdef.h>
+#include <asm/unistd.h>
+
+       .set noreorder
+       
+LEAF(__syscall_common)
+       syscall
+        beqz    a3, 1f
+       # sw is actually two instructions; the first one goes
+       # in the branch delay slot
+        sw      v0, errno
+        li      v0, -1
+1:      jr      ra
+       END(__syscall_common)
diff --git a/klibc/klibc/arch/mips/sysstub.ph b/klibc/klibc/arch/mips/sysstub.ph
new file mode 100644 (file)
index 0000000..abe599c
--- /dev/null
@@ -0,0 +1,30 @@
+# -*- perl -*-
+#
+# arch/mips/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+# On MIPS, most system calls follow the standard convention, with the
+# system call number in r0 (v0), return an error value in r19 (a3) as
+# well as the return value in r0 (v0).
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    $stype = $stype || 'common';
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/asm.h>\n";
+    print OUT "#include <asm/regdef.h>\n";
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.set noreorder\n";
+    print OUT "\n";
+    print OUT "LEAF(${fname})\n";
+    print OUT "\tj\t__syscall_${stype}\n";
+    print OUT "\t  li\tv0, __NR_${sname}\n";
+    print OUT "\tEND(${fname})\n";
+    close(OUT);
+}
+
+1;
index aca8083aa4d4973243c38f6a60b43e3c2b74a3dd..9829867fab77136c0682faecb5a32896f2ebf16e 100644 (file)
@@ -6,14 +6,11 @@
 #define CLONE_VFORK    0x00004000
 #define SIGCHLD                18
 
+       .set noreorder
+       
 LEAF(vfork)
        li      a0, CLONE_VFORK | CLONE_VM | SIGCHLD
        li      a1, 0
-       li      v0, __NR_clone
-       syscall
-       bnez    a3, 1f
-       b       2f
-1:     sw      v0, errno
-       li      v0, -1
-2:     jr      ra
+       j       __syscall_common
+         li    v0, __NR_clone
        END(vfork)
diff --git a/klibc/klibc/arch/mips64/include/klibc/archsignal.h b/klibc/klibc/arch/mips64/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 56b0fd3..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/mips64/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/mips64/include/klibc/archsys.h b/klibc/klibc/arch/mips64/include/klibc/archsys.h
deleted file mode 100644 (file)
index 81e5106..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/mips64/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
index abe9155bf4d7dadc67c45f64e969fdb0411582e9..980a543ed23aaf508919a8ef004ebb1e685e61c2 100644 (file)
@@ -8,8 +8,12 @@
 #
 
 ARCHOBJS = \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o
 
 ARCHOOBJS = $(patsubst %o,%.lo,%(ARCHOBJS))
 
 archclean:
+
+arch/$(ARCH)/syscall.o: arch/$(ARCH)/syscall.c
+       $(CC) $(CFLAGS) -ffixed-r20 -c -o $@ $<
diff --git a/klibc/klibc/arch/parisc/include/klibc/archsignal.h b/klibc/klibc/arch/parisc/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 3190e85..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * arch/parisc/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-#define _NSIG    64
-#define _NSIG_SZ (_NSIG / LONG_BIT)
-
-typedef struct {
-        unsigned long sig[_NSIG_SZ];
-} sigset_t;
-
-struct sigaction {
-        __sighandler_t sa_handler;
-        unsigned long sa_flags;
-        sigset_t sa_mask;
-};
-
-#endif
diff --git a/klibc/klibc/arch/parisc/include/klibc/archsys.h b/klibc/klibc/arch/parisc/include/klibc/archsys.h
deleted file mode 100644 (file)
index 5013ba8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/parisc/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/parisc/syscall.c b/klibc/klibc/arch/parisc/syscall.c
new file mode 100644 (file)
index 0000000..99ef5fe
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * arch/parisc/syscall.c
+ *
+ * This function is called from a stub with %r20 already set up.
+ * Compile this function with -ffixed-r20 so that it doesn't clobber
+ * this register by mistake.
+ */
+
+#include <klibc/compiler.h>
+#include <errno.h>
+
+long __syscall_common(long a0, long a1, long a2, long a3, long a4, long a5)
+{
+  register unsigned long rv asm ("r28");
+
+  asm volatile("\tble 0x100(%%sr2, %%r0)\n"
+              : "=r" (rv)
+              : "r" (a0), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5)
+              : "%r1", "%r2", "%r29", "%r31");
+
+  if ( __unlikely(rv >= -4095UL) ) {
+    errno = -rv;
+    return -1L;
+  } else {
+    return (long)rv;
+  }
+}
+
+  
diff --git a/klibc/klibc/arch/parisc/sysstub.ph b/klibc/klibc/arch/parisc/sysstub.ph
new file mode 100644 (file)
index 0000000..eb6b5dd
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- perl -*-
+#
+# arch/parisc/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.text\n";
+    print OUT "\t.align 4\n";
+    print OUT "\t.import __syscall_common, code\n";
+    print OUT "\t.global ${fname}\n";
+    print OUT "\t.export ${fname}, code\n";
+    print OUT "\t.type   ${fname}, @function\n";
+    print OUT "\t.proc\n";
+    print OUT "\.callinfo\n";
+    print OUT "${fname}:\n";
+    print OUT "\tb\t__syscall_common\n";
+    print OUT "\t  ldo\t__NR_${sname}(%r0),%r20\n";
+    print OUT "\t.procend\n";
+    close(OUT);
+}
+
+1;
index fcb09921506747ff5a4e3704da2f6c744942fee6..ff7c44db9a30085cf3fb25363073b58987c86c06 100644 (file)
@@ -9,3 +9,10 @@
 
 OPTFLAGS = -Os -fomit-frame-pointer
 BITSIZE  = 32
+
+# Extra linkflags when building the shared version of the library
+# This address needs to be reachable using normal inter-module
+# calls, and work on the memory models for this architecture
+# 256-16 MB - normal binaries start at 256 MB, and jumps are limited
+# to +/- 16 MB
+SHAREDFLAGS     = -Ttext 0x0f000200
index 3bd2c0643c89ac9f7e01a13135d836007c2bdeb5..c6bb975f0f7606c8fec8103eb5ce83ca8877cf53 100644 (file)
@@ -9,6 +9,7 @@
 
 ARCHOBJS = \
        arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
        libgcc/__divdi3.o \
        libgcc/__moddi3.o \
        libgcc/__udivdi3.o \
diff --git a/klibc/klibc/arch/ppc/include/klibc/archsetjmp.h b/klibc/klibc/arch/ppc/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 53e2fcc..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * arch/ppc/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __r2;
-  unsigned long __sp;
-  unsigned long __lr;
-  unsigned long __cr;
-  unsigned long __r13;
-  unsigned long __r14;
-  unsigned long __r15;
-  unsigned long __r16;
-  unsigned long __r17;
-  unsigned long __r18;
-  unsigned long __r19;
-  unsigned long __r20;
-  unsigned long __r21;
-  unsigned long __r22;
-  unsigned long __r23;
-  unsigned long __r24;
-  unsigned long __r25;
-  unsigned long __r26;
-  unsigned long __r27;
-  unsigned long __r28;
-  unsigned long __r29;
-  unsigned long __r30;
-  unsigned long __r31;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/ppc/include/klibc/archsignal.h b/klibc/klibc/arch/ppc/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 567a547..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/ppc/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/ppc/include/klibc/archsys.h b/klibc/klibc/arch/ppc/include/klibc/archsys.h
deleted file mode 100644 (file)
index 17a2885..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * arch/ppc/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* PowerPC seems to lack _syscall6() in its headers */
-/* This seems to work on both 32- and 64-bit ppc */
-
-#ifndef _syscall6
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-        unsigned long __sc_ret, __sc_err;                               \
-        {                                                               \
-                register unsigned long __sc_0 __asm__ ("r0");           \
-                register unsigned long __sc_3 __asm__ ("r3");           \
-                register unsigned long __sc_4 __asm__ ("r4");           \
-                register unsigned long __sc_5 __asm__ ("r5");           \
-                register unsigned long __sc_6 __asm__ ("r6");           \
-                register unsigned long __sc_7 __asm__ ("r7");           \
-                register unsigned long __sc_8 __asm__ ("r8");           \
-                                                                        \
-                __sc_3 = (unsigned long) (arg1);                        \
-                __sc_4 = (unsigned long) (arg2);                        \
-                __sc_5 = (unsigned long) (arg3);                        \
-                __sc_6 = (unsigned long) (arg4);                        \
-                __sc_7 = (unsigned long) (arg5);                        \
-                __sc_8 = (unsigned long) (arg6);                        \
-                __sc_0 = __NR_##name;                                   \
-                __asm__ __volatile__                                    \
-                        ("sc           \n\t"                            \
-                         "mfcr %1      "                                \
-                        : "+r"   (__sc_3),                             \
-                         "+r"   (__sc_0),                              \
-                          "+r"   (__sc_4),                              \
-                          "+r"   (__sc_5),                              \
-                          "+r"   (__sc_6),                              \
-                          "+r"   (__sc_7),                              \
-                          "+r"   (__sc_8)                               \
-                        : : "cr0", "ctr", "memory",                     \
-                            "r9", "r10", "r11", "r12");                        \
-                __sc_ret = __sc_3;                                      \
-                __sc_err = __sc_0;                                      \
-        }                                                               \
-        if (__sc_err & 0x10000000)                                      \
-        {                                                               \
-                errno = (int)__sc_ret;                                  \
-                __sc_ret = -1;                                          \
-        }                                                               \
-        return (type)__sc_ret;                                          \
-}
-
-#endif /* _syscall6() missing */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/ppc/syscall.S b/klibc/klibc/arch/ppc/syscall.S
new file mode 100644 (file)
index 0000000..0a7c37c
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * arch/ppc/syscall.S
+ *
+ * Common error-handling path for system calls.
+ */
+
+       .text
+       .align  2
+       .globl  __syscall_error
+       .type   __syscall_error,@function
+__syscall_error:
+       lis     9,errno@ha
+       stw     3,errno@l(9)
+       li      3,-1
+       blr
+       .size   __syscall_error,.-__syscall_error
diff --git a/klibc/klibc/arch/ppc/sysstub.ph b/klibc/klibc/arch/ppc/sysstub.ph
new file mode 100644 (file)
index 0000000..542ab55
--- /dev/null
@@ -0,0 +1,25 @@
+# -*- perl -*-
+#
+# arch/ppc/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tli 0,__NR_${sname}\n";
+    print OUT "\tsc\n";
+    print OUT "\tbnslr\n";
+    print OUT "\tb __syscall_error\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index 6997693e99bb5958c3c3c5bfa810c234888c7d99..86526f895cfc93dc0a5ef4b5abb868bae0422d2c 100644 (file)
@@ -9,3 +9,10 @@
 
 OPTFLAGS = -Os -fomit-frame-pointer
 BITSIZE  = 64
+
+# Extra linkflags when building the shared version of the library
+# This address needs to be reachable using normal inter-module
+# calls, and work on the memory models for this architecture
+# 256-16 MB - normal binaries start at 256 MB, and jumps are limited
+# to +/- 16 MB
+SHAREDFLAGS     = -Ttext 0x0f000200
index 3ab3a8c8e64fb6dc916825540a07175e8eb25e51..928df1aeb70ad0cfd43aad2d168699ae40cd25cf 100644 (file)
@@ -8,8 +8,18 @@
 #
 
 ARCHOBJS = \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o
 
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
+INTERP_O = interp1.o
+
+interp.o: interp1.o klibc.got
+       $(LD) $(LDFLAGS) -r -o $@ interp1.o klibc.got
+
+klibc.got: $(SOHASH)
+       $(OBJCOPY) -j.got $< $@
+
 archclean:
+       rm -f klibc.got
diff --git a/klibc/klibc/arch/ppc64/include/klibc/archsetjmp.h b/klibc/klibc/arch/ppc64/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 006a2e2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * arch/ppc64/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __r2;
-  unsigned long __sp;
-  unsigned long __lr;
-  unsigned long __cr;
-  unsigned long __r13;
-  unsigned long __r14;
-  unsigned long __r15;
-  unsigned long __r16;
-  unsigned long __r17;
-  unsigned long __r18;
-  unsigned long __r19;
-  unsigned long __r20;
-  unsigned long __r21;
-  unsigned long __r22;
-  unsigned long __r23;
-  unsigned long __r24;
-  unsigned long __r25;
-  unsigned long __r26;
-  unsigned long __r27;
-  unsigned long __r28;
-  unsigned long __r29;
-  unsigned long __r30;
-  unsigned long __r31;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/ppc64/include/klibc/archsignal.h b/klibc/klibc/arch/ppc64/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 8452f6e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/ppc64/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/ppc64/include/klibc/archsys.h b/klibc/klibc/arch/ppc64/include/klibc/archsys.h
deleted file mode 100644 (file)
index 4f81fee..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * arch/ppc64/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-#ifndef _syscall6
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-        unsigned long __sc_ret, __sc_err;                               \
-        {                                                               \
-                register unsigned long __sc_0 __asm__ ("r0");           \
-                register unsigned long __sc_3 __asm__ ("r3");           \
-                register unsigned long __sc_4 __asm__ ("r4");           \
-                register unsigned long __sc_5 __asm__ ("r5");           \
-                register unsigned long __sc_6 __asm__ ("r6");           \
-                register unsigned long __sc_7 __asm__ ("r7");           \
-                register unsigned long __sc_8 __asm__ ("r8");           \
-                                                                        \
-                __sc_3 = (unsigned long) (arg1);                        \
-                __sc_4 = (unsigned long) (arg2);                        \
-                __sc_5 = (unsigned long) (arg3);                        \
-                __sc_6 = (unsigned long) (arg4);                        \
-                __sc_7 = (unsigned long) (arg5);                        \
-                __sc_8 = (unsigned long) (arg6);                        \
-                __sc_0 = __NR_##name;                                   \
-                __asm__ __volatile__                                    \
-                        ("sc           \n\t"                            \
-                         "mfcr %1      "                                \
-                        : "=&r" (__sc_3), "=&r" (__sc_0)                \
-                        : "0"   (__sc_3), "1"   (__sc_0),               \
-                          "r"   (__sc_4),                               \
-                          "r"   (__sc_5),                               \
-                          "r"   (__sc_6),                               \
-                          "r"   (__sc_7),                               \
-                          "r"   (__sc_8)                                \
-                        : __syscall_clobbers);                          \
-                __sc_ret = __sc_3;                                      \
-                __sc_err = __sc_0;                                      \
-        }                                                               \
-        __syscall_return (type);                                        \
-}
-
-#endif /* _syscall6() missing */
-
-#endif /* _KLIBC_ARCHSYS_H */
index 1dcc67035e11b611451d266d72cb8113c5ac0cb6..30db419140ed56bc23bce8251c19b283d4972625 100644 (file)
@@ -2,7 +2,6 @@
 # arch/ppc64/setjmp.S
 #
 # Basic setjmp/longjmp implementation
-# This file was derived from the equivalent file in NetBSD
 #
 
        .text
@@ -17,13 +16,33 @@ setjmp:
        .globl  setjmp
        .globl  .setjmp
 .setjmp:
-        mflr    %r11                    /* save return address */
-        mfcr    %r12                    /* save condition register */
-        mr      %r10,%r1                /* save stack pointer */
-        mr      %r9,%r2                 /* save GPR2 (not needed) */
-        stmw    %r9,0(%r3)              /* save r9..r31 */
-        li      %r3,0                   /* indicate success */
-        blr                             /* return */
+       mflr    %r11                    /* save return address */
+       mfcr    %r12                    /* save condition register */
+       std     %r2,0(%r3)              /* save TOC pointer (not needed) */
+       stdu    %r1,8(%r3)              /* save stack pointer */
+       stdu    %r11,8(%r3)
+       stdu    %r12,8(%r3)
+       stdu    %r13,8(%r3)             /* save caller saved regs */
+       stdu    %r14,8(%r3)
+       stdu    %r15,8(%r3)
+       stdu    %r16,8(%r3)
+       stdu    %r17,8(%r3)
+       stdu    %r18,8(%r3)
+       stdu    %r19,8(%r3)
+       stdu    %r20,8(%r3)
+       stdu    %r21,8(%r3)
+       stdu    %r22,8(%r3)
+       stdu    %r23,8(%r3)
+       stdu    %r24,8(%r3)
+       stdu    %r25,8(%r3)
+       stdu    %r26,8(%r3)
+       stdu    %r27,8(%r3)
+       stdu    %r28,8(%r3)
+       stdu    %r29,8(%r3)
+       stdu    %r30,8(%r3)
+       std     %r31,8(%r3)
+       li      %r3,0                   /* indicate success */
+       blr                             /* return */
 
        .size .setjmp,.-.setjmp
        .section ".opd","aw"
@@ -35,12 +54,32 @@ longjmp:
        .globl  longjmp
        .globl  .longjmp
 .longjmp:
-        lmw     %r9,0(%r3)              /* save r9..r31 */
-        mtlr    %r11                    /* restore LR */
-        mtcr    %r12                    /* restore CR */
-        mr      %r2,%r9                 /* restore GPR2 (not needed) */
-        mr      %r1,%r10                /* restore stack */
-        mr      %r3,%r4                 /* get return value */
-        blr                             /* return */
+       ld      %r2,0(%r3)              /* restore TOC pointer (not needed) */
+       ldu     %r1,8(%r3)              /* restore stack */
+       ldu     %r11,8(%r3)
+       ldu     %r12,8(%r3)
+       ldu     %r13,8(%r3)             /* restore caller saved regs */
+       ldu     %r14,8(%r3)
+       ldu     %r15,8(%r3)
+       ldu     %r16,8(%r3)
+       ldu     %r17,8(%r3)
+       ldu     %r18,8(%r3)
+       ldu     %r19,8(%r3)
+       ldu     %r20,8(%r3)
+       ldu     %r21,8(%r3)
+       ldu     %r22,8(%r3)
+       ldu     %r23,8(%r3)
+       ldu     %r24,8(%r3)
+       ldu     %r25,8(%r3)
+       ldu     %r26,8(%r3)
+       ldu     %r27,8(%r3)
+       ldu     %r28,8(%r3)
+       ldu     %r29,8(%r3)
+       ldu     %r30,8(%r3)
+       ld      %r31,8(%r3)
+       mtlr    %r11                    /* restore LR */
+       mtcr    %r12                    /* restore CR */
+       mr      %r3,%r4                 /* get return value */
+       blr                             /* return */
 
        .size .longjmp,.-.longjmp
diff --git a/klibc/klibc/arch/ppc64/syscall.c b/klibc/klibc/arch/ppc64/syscall.c
new file mode 100644 (file)
index 0000000..a5895fe
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * arch/ppc64/syscall.c
+ *
+ * Common error-handling path for system calls.
+ * The return value from __syscall_error becomes the
+ * return value from the system call.
+ */
+#include <errno.h>
+
+long int __syscall_error(long int err)
+{
+       errno = err;
+       return -1;
+}
diff --git a/klibc/klibc/arch/ppc64/sysstub.ph b/klibc/klibc/arch/ppc64/sysstub.ph
new file mode 100644 (file)
index 0000000..1469cc6
--- /dev/null
@@ -0,0 +1,34 @@
+# -*- perl -*-
+#
+# arch/ppc64/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "\t.section \".opd\",\"aw\"\n";
+    print OUT "\t.align 3\n";
+    print OUT "${fname}:\n";
+    print OUT "\t.quad .${fname},.TOC.\@tocbase,0\n";
+    print OUT "\t.size ${fname},24\n";
+    print OUT "\t.text\n";
+    print OUT "\t.type .${fname},\@function\n";
+    print OUT "\t.globl .${fname}\n";
+    print OUT ".${fname}:\n";
+    print OUT "\tli 0,__NR_${sname}\n";
+    print OUT "\tsc\n";
+    print OUT "\tmfcr 0\n";
+    print OUT "\trldicl. 9,0,36,63\n";
+    print OUT "\tbeqlr- 0\n";
+    print OUT "\tb .__syscall_error\n";
+    print OUT "\t.size .${fname},.-.${fname}\n";
+    close(OUT);
+}
+
+1;
index c50f4f2886c629cc1cf809f6897a898cb3f4de51..49b64ddbc6235b3d24f1bfa0dca4d5b596a14417 100644 (file)
@@ -9,6 +9,8 @@
 
 ARCHOBJS = \
        arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/mmap.o \
+       arch/$(ARCH)/syscall.o \
        libgcc/__divdi3.o \
        libgcc/__moddi3.o \
        libgcc/__udivdi3.o \
diff --git a/klibc/klibc/arch/s390/include/klibc/archsetjmp.h b/klibc/klibc/arch/s390/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 11a641e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * arch/s390/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  uint32_t __gregs[10]; /* general registers r6-r15 */
-  uint64_t __fpregs[2]; /* fp registers f4 and f6   */
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/s390/include/klibc/archsignal.h b/klibc/klibc/arch/s390/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 1f8de28..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/s390/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/s390/include/klibc/archsys.h b/klibc/klibc/arch/s390/include/klibc/archsys.h
deleted file mode 100644 (file)
index 1cd0948..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * arch/s390/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* S/390 only has five syscall parameters, and uses a structure for
-   6-argument syscalls. */
-
-#ifndef _syscall6
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,arg4,type5,arg5,type6,arg6)          \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
-          type5 arg5, type6 arg6) {                         \
-       unsigned long  __arg[6] = {                          \
-               (unsigned long) arg1,                        \
-               (unsigned long) arg2,                        \
-               (unsigned long) arg3,                        \
-               (unsigned long) arg4,                        \
-               (unsigned long) arg5,                        \
-               (unsigned long) arg6                         \
-       };                                                   \
-       register void *__argp asm("2") = &__arg;             \
-       long __res;                                          \
-       __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                "    lr  %0,2"                               \
-                : "=d" (__res)                               \
-                : "i" (__NR_##name),                         \
-                  "d" (__argp)                              \
-               : _svc_clobber);                             \
-       __syscall_return(type, __res);                       \
-}
-
-#endif /* _syscall6() missing */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/s390/mmap.c b/klibc/klibc/arch/s390/mmap.c
new file mode 100644 (file)
index 0000000..51ff07f
--- /dev/null
@@ -0,0 +1,41 @@
+#include <sys/types.h>
+#include <linux/unistd.h>
+
+struct mmap_arg_struct {
+       unsigned long addr;
+       unsigned long len;
+       unsigned long prot;
+       unsigned long flags;
+       unsigned long fd;
+       unsigned long offset;
+};
+
+void * __mmap2(void * addr, size_t len, int prot, int flags,
+                                                int fd, long offset)
+{
+       struct mmap_arg_struct args = {
+               (unsigned long) addr,
+               (unsigned long) len,
+               (unsigned long) prot,
+               (unsigned long) flags,
+               (unsigned long) fd,
+               (unsigned long) offset,
+       };
+
+       register struct mmap_arg_struct *__arg1 asm("2") = &args;
+       register long __svcres asm("2");
+       unsigned long __res;
+
+       __asm__ __volatile__ (
+               "    svc %b1\n"
+               : "=d" (__svcres)
+               : "i" (__NR_mmap2),
+                 "0" (__arg1)
+               : "1", "cc", "memory");
+       __res = __svcres;
+       if (__res >= (unsigned long)-125) {
+               errno = -__res;
+               __res = -1;
+       }
+       return (void *)__res;
+}
diff --git a/klibc/klibc/arch/s390/syscall.c b/klibc/klibc/arch/s390/syscall.c
new file mode 100644 (file)
index 0000000..c0f17c4
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * arch/s390/syscall.c
+ *
+ * Common error-handling path for system calls.
+ * The return value from __syscall_common becomes the
+ * return value from the system call.
+ */
+#include <errno.h>
+
+long int __syscall_common(long int err)
+{
+       if ((unsigned long)(err) < (unsigned long)(-125))
+               return err;
+       errno = err;
+       return -1;
+}
diff --git a/klibc/klibc/arch/s390/sysstub.ph b/klibc/klibc/arch/s390/sysstub.ph
new file mode 100644 (file)
index 0000000..3838a1f
--- /dev/null
@@ -0,0 +1,31 @@
+# -*- perl -*-
+#
+# arch/s390/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT ".if __NR_${sname} < 256\n";
+    print OUT "\tsvc __NR_${sname}\n";
+    print OUT ".else\n";
+    print OUT "\tlhi %r1,__NR_${sname}\n";
+    print OUT "\tsvc 0\n";
+    print OUT ".endif\n";
+    print OUT "\tbras %r3,1f\n";
+    print OUT "\t.long __syscall_common\n";
+    print OUT "1:\tl %r3,0(%r3)\n";
+    print OUT "\tbr %r3\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index eff8f951acc9ed5863cfdb9bde55d319d5cfcce6..9d614e07b24b71c51439a55583db55b0c83a4944 100644 (file)
@@ -8,7 +8,9 @@
 #
 
 ARCHOBJS = \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/mmap.o \
+       arch/$(ARCH)/syscall.o
 
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
diff --git a/klibc/klibc/arch/s390x/include/klibc/archsetjmp.h b/klibc/klibc/arch/s390x/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index dd3ed0d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * arch/s390x/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  uint64_t __gregs[10]; /* general registers r6-r15 */
-  uint64_t __fpregs[4]; /* fp registers f1, f3, f5, f7 */
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/s390x/include/klibc/archsignal.h b/klibc/klibc/arch/s390x/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 08c9a00..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/s390x/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/s390x/include/klibc/archsys.h b/klibc/klibc/arch/s390x/include/klibc/archsys.h
deleted file mode 100644 (file)
index 15f7113..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * arch/s390x/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* S/390X only has five syscall parameters, and uses a structure for
-   6-argument syscalls. */
-
-#ifndef _syscall6
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,arg4,type5,arg5,type6,arg6)          \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
-          type5 arg5, type6 arg6) {                         \
-       unsigned long  __arg[6] = {                          \
-               (unsigned long) arg1,                        \
-               (unsigned long) arg2,                        \
-               (unsigned long) arg3,                        \
-               (unsigned long) arg4,                        \
-               (unsigned long) arg5,                        \
-               (unsigned long) arg6                         \
-       };                                                   \
-       register void *__argp asm("2") = &__arg;             \
-       long __res;                                          \
-       __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                "    lgr  %0,2"                              \
-                : "=d" (__res)                               \
-                : "i" (__NR_##name),                         \
-                  "d" (__argp)                              \
-               : _svc_clobber);                             \
-       __syscall_return(type, __res);                       \
-}
-
-#endif /* _syscall6() missing */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/s390x/mmap.c b/klibc/klibc/arch/s390x/mmap.c
new file mode 100644 (file)
index 0000000..158f093
--- /dev/null
@@ -0,0 +1,41 @@
+#include <sys/types.h>
+#include <linux/unistd.h>
+
+struct mmap_arg_struct {
+       unsigned long addr;
+       unsigned long len;
+       unsigned long prot;
+       unsigned long flags;
+       unsigned long fd;
+       unsigned long offset;
+};
+
+void * mmap(void * addr, size_t len, int prot, int flags,
+                                                int fd, off_t offset)
+{
+       struct mmap_arg_struct args = {
+               (unsigned long) addr,
+               (unsigned long) len,
+               (unsigned long) prot,
+               (unsigned long) flags,
+               (unsigned long) fd,
+               (unsigned long) offset,
+       };
+
+       register struct mmap_arg_struct *__arg1 asm("2") = &args;
+       register long __svcres asm("2");
+       unsigned long __res;
+
+       __asm__ __volatile__ (
+               "    svc %b1\n"
+               : "=d" (__svcres)
+               : "i" (__NR_mmap),
+                 "0" (__arg1)
+               : "1", "cc", "memory");
+       __res = __svcres;
+       if (__res >= (unsigned long)-125) {
+               errno = -__res;
+               __res = -1;
+       }
+       return (void *)__res;
+}
diff --git a/klibc/klibc/arch/s390x/syscall.c b/klibc/klibc/arch/s390x/syscall.c
new file mode 100644 (file)
index 0000000..c0f17c4
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * arch/s390/syscall.c
+ *
+ * Common error-handling path for system calls.
+ * The return value from __syscall_common becomes the
+ * return value from the system call.
+ */
+#include <errno.h>
+
+long int __syscall_common(long int err)
+{
+       if ((unsigned long)(err) < (unsigned long)(-125))
+               return err;
+       errno = err;
+       return -1;
+}
diff --git a/klibc/klibc/arch/s390x/sysstub.ph b/klibc/klibc/arch/s390x/sysstub.ph
new file mode 100644 (file)
index 0000000..10a47f7
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- perl -*-
+#
+# arch/s390x/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT ".if __NR_${sname} < 256\n";
+    print OUT "\tsvc __NR_${sname}\n";
+    print OUT ".else\n";
+    print OUT "\tlghi %r1,__NR_${sname}\n";
+    print OUT "\tsvc 0\n";
+    print OUT ".endif\n";
+    print OUT "\tbrasl %r3,__syscall_common\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index 16d7ea1e1892efd913861c84ed00f9cd5d48609e..ccabfa496ba392c09566eff78ef6c06c9efcfc51 100644 (file)
@@ -7,7 +7,8 @@
 # accordingly.
 #
 
-ARCHOBJS = arch/sh/setjmp.o
+ARCHOBJS = arch/sh/setjmp.o \
+          arch/sh/syscall.o
 
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
index c9938a5612eae9003df0fa11af49ffa02ada7000..21a37655f2a4de27db93d638ecbd74097afc4658 100644 (file)
@@ -1,12 +1,11 @@
 #
 # arch/sh/crt0.S
 #
-# void _start(void)
-# {
-#    /* Divine up argc, argv, and envp */
-#    environ = envp;
-#    exit(main(argc, argv, envp));
-# } 
+# Does arch-specific initialization and invokes __libc_init
+# with the appropriate arguments.
+#
+# See __static_init.c or __shared_init.c for the expected
+# arguments.
 #
 
        .text
diff --git a/klibc/klibc/arch/sh/include/klibc/archsetjmp.h b/klibc/klibc/arch/sh/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 28dd932..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * arch/sh/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long r8;
-  unsigned long r9;
-  unsigned long r10;
-  unsigned long r11;
-  unsigned long r12;
-  unsigned long r13;
-  unsigned long r14;
-  unsigned long r15;
-  unsigned long pr;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _KLIBC_ARCHSETJMP_H */
diff --git a/klibc/klibc/arch/sh/include/klibc/archsignal.h b/klibc/klibc/arch/sh/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 6c4e597..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/sh/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/sh/include/klibc/archsys.h b/klibc/klibc/arch/sh/include/klibc/archsys.h
deleted file mode 100644 (file)
index 5f8050a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * arch/sh/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* No special syscall definitions for this architecture */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/sh/syscall.S b/klibc/klibc/arch/sh/syscall.S
new file mode 100644 (file)
index 0000000..41a0486
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * arch/sh/syscall.S
+ *
+ * On sh, r3 contains the syscall number (set by generated stub);
+ * r4..r7 contain arguments 0-3 per the standard calling convention,
+ * and arguments 4-5 are passed in r0 and r1.
+ *
+ * The return value is in r3 rather than standard r0.
+ */
+
+       .section ".text.syscall","ax"
+       .align  2
+       .globl  ___syscall_common
+       .type   ___syscall_common,@function
+___syscall_common:
+       mov.l   @(sp),r0
+       mov.l   @(4,sp),r1
+       trapa   #0x15
+       mov.l   1f,r0
+       cmp/hs  r0,r3
+       bt/s    3f
+         neg   r3,r4
+       mov.l   2f,r5
+       mov.l   r4,@r5
+       rts
+         mov   #-1,r0
+3:
+       rts
+         mov   r3,r0
+
+       .align 2
+1:     .long   -4096           /* Errno limit */
+2:     .long   errno
+
+       .size   ___syscall_common,.-___syscall_common
diff --git a/klibc/klibc/arch/sh/sysstub.ph b/klibc/klibc/arch/sh/sysstub.ph
new file mode 100644 (file)
index 0000000..add5d35
--- /dev/null
@@ -0,0 +1,34 @@
+# -*- perl -*-
+#
+# arch/sh/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.section\t\".text.syscall\",\"ax\"\n";
+    print OUT "\t.type\t${fname},\#function\n";
+    print OUT "\t.globl\t${fname}\n";
+    print OUT "\t.align\t2\n";
+    print OUT "${fname}:\n";
+    print OUT "\tbra\t__syscall_common\n";
+    print OUT "#if __NR_${sname} >= 128\n";
+    print OUT "\t  mov.l\t1f, r3\n";
+    print OUT "#else\n";
+    print OUT "\t  mov\t# __NR_${sname}, r3\n";
+    print OUT "#endif\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    print OUT "\n";
+    print OUT "#if __NR_${sname} >= 128\n";
+    print OUT "\t.align\t2\n";
+    print OUT "1:\t.long\t__NR_${sname}\n";
+    print OUT "#endif\n";
+    close(OUT);
+}
+
+1;
index 0186810aca7ada4180f6f556a5a758f1fc9ae115..6ea66114fa7eb68d7922b5795b12b9688430a499 100644 (file)
@@ -14,7 +14,9 @@ ARCHOBJS = \
        arch/$(ARCH)/urem.o \
        arch/$(ARCH)/smul.o \
        arch/$(ARCH)/umul.o \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
+       arch/$(ARCH)/sysfork.o
 
 arch/$(ARCH)/sdiv.S: arch/$(ARCH)/divrem.m4
        @echo 'building $@ from $^'
diff --git a/klibc/klibc/arch/sparc/include/klibc/archsetjmp.h b/klibc/klibc/arch/sparc/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 92c1c74..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * arch/sparc/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __sp;
-  unsigned long __fp;
-  unsigned long __pc;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/sparc/include/klibc/archsignal.h b/klibc/klibc/arch/sparc/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 6af3709..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/sparc/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/sparc/include/klibc/archsys.h b/klibc/klibc/arch/sparc/include/klibc/archsys.h
deleted file mode 100644 (file)
index fe6e68d..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * arch/sparc/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* fork and vfork return the "other process" pid in %o0 and an
-   "is child" flag in %o1... */
-
-#define _syscall0_forkish(type,name) \
-type name(void) \
-{ \
-register long __g1 __asm__ ("g1") = __NR_##name; \
-register unsigned long __o0 __asm__ ("o0"); \
-register unsigned long __o1 __asm__ ("o1"); \
-__asm__ __volatile__ ("t 0x10\n\t" \
-                     "bcc 1f\n\t" \
-                     "mov %%o0, %0\n\t" \
-                     "sub %%g0, %%o0, %0\n\t" \
-                     "1:\n\t" \
-                     : "=r" (__o0), "=r" (__o1)\
-                     : "r" (__g1) \
-                     : "cc"); \
-if ((unsigned long)__o0 < (unsigned long)-255) \
-    return (type)(__o0 & (__o1-1)); \
-errno = (int)-__o0; \
-return -1; \
-}
-
-/* SPARC seems to lack _syscall6() in its headers */
-
-#ifndef _syscall6
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-  type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-long __res; \
-register long __g1 __asm__ ("g1") = __NR_##name; \
-register long __o0 __asm__ ("o0") = (long)(arg1); \
-register long __o1 __asm__ ("o1") = (long)(arg2); \
-register long __o2 __asm__ ("o2") = (long)(arg3); \
-register long __o3 __asm__ ("o3") = (long)(arg4); \
-register long __o4 __asm__ ("o4") = (long)(arg5); \
-register long __o5 __asm__ ("o5") = (long)(arg6); \
-__asm__ __volatile__ ("t 0x10\n\t" \
-      "bcc 1f\n\t" \
-      "mov %%o0, %0\n\t" \
-      "sub %%g0, %%o0, %0\n\t" \
-      "1:\n\t" \
-      : "=r" (__res), "=&r" (__o0) \
-      : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__o5), "r" (__g1) \
-      : "cc"); \
-if (__res < -255 || __res>=0) \
-return (type) __res; \
-errno = -__res; \
-return (type)-1; \
-}
-
-#endif /* _syscall6 missing */
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/sparc/include/machine/asm.h b/klibc/klibc/arch/sparc/include/machine/asm.h
deleted file mode 100644 (file)
index b622bd8..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-/*     $NetBSD: asm.h,v 1.14 2002/07/20 08:37:30 mrg Exp $ */
-
-/*
- * Copyright (c) 1994 Allen Briggs
- * All rights reserved.
- *
- * Gleaned from locore.s and sun3 asm.h which had the following copyrights:
- * locore.s:
- * Copyright (c) 1988 University of Utah.
- * Copyright (c) 1982, 1990 The Regents of the University of California.
- * sun3/include/asm.h:
- * Copyright (c) 1993 Adam Glass
- * Copyright (c) 1990 The Regents of the University of California.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ASM_H_
-#define _ASM_H_
-
-/* Pull in CCFSZ, CC64FSZ, and BIAS from frame.h */
-#ifndef _LOCORE
-#define _LOCORE
-#endif
-#include <machine/frame.h>
-
-#ifdef __ELF__
-#define        _C_LABEL(name)          name
-#else
-#ifdef __STDC__
-#define _C_LABEL(name)         _ ## name
-#else
-#define _C_LABEL(name)         _/**/name
-#endif
-#endif
-#define        _ASM_LABEL(name)        name
-
-#ifdef PIC
-/*
- * PIC_PROLOGUE() is akin to the compiler generated function prologue for
- * PIC code. It leaves the address of the Global Offset Table in DEST,
- * clobbering register TMP in the process.
- *
- * We can use two code sequences.  We can read the %pc or use the call
- * instruction that saves the pc in %o7.  Call requires the branch unit and
- * IEU1, and clobbers %o7 which needs to be restored.  This instruction
- * sequence takes about 4 cycles due to instruction interdependence.  Reading
- * the pc takes 4 cycles to dispatch and is always dispatched alone.  That
- * sequence takes 7 cycles.
- */
-#ifdef __arch64__
-#define PIC_PROLOGUE(dest,tmp) \
-       mov %o7, tmp; \
-       sethi %hi(_GLOBAL_OFFSET_TABLE_-4),dest; \
-       call 0f; \
-        or dest,%lo(_GLOBAL_OFFSET_TABLE_+4),dest; \
-0: \
-       add dest,%o7,dest; \
-       mov tmp, %o7
-#else
-#define PIC_PROLOGUE(dest,tmp) \
-       mov %o7,tmp; 3: call 4f; nop; 4: \
-       sethi %hi(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
-       or dest,%lo(_C_LABEL(_GLOBAL_OFFSET_TABLE_)-(3b-.)),dest; \
-       add dest,%o7,dest; mov tmp,%o7
-#endif
-
-/*
- * PICCY_SET() does the equivalent of a `set var, %dest' instruction in
- * a PIC-like way, but without involving the Global Offset Table. This
- * only works for VARs defined in the same file *and* in the text segment.
- */
-#ifdef __arch64__
-#define PICCY_SET(var,dest,tmp) \
-       3: rd %pc, tmp; add tmp,(var-3b),dest
-#else
-#define PICCY_SET(var,dest,tmp) \
-       mov %o7,tmp; 3: call 4f; nop; 4: \
-       add %o7,(var-3b),dest; mov tmp,%o7
-#endif
-#else
-#define PIC_PROLOGUE(dest,tmp)
-#define PICCY_OFFSET(var,dest,tmp)
-#endif
-
-#define FTYPE(x)               .type x,@function
-#define OTYPE(x)               .type x,@object
-
-#define        _ENTRY(name) \
-       .align 4; .globl name; .proc 1; FTYPE(name); name:
-
-#ifdef GPROF
-/* see _MCOUNT_ENTRY in profile.h */
-#ifdef __ELF__
-#ifdef __arch64__
-#define _PROF_PROLOGUE \
-       .data; .align 8; 1: .uaword 0; .uaword 0; \
-       .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call _mcount; \
-       or %o0,%lo(1b),%o0; restore
-#else
-#define _PROF_PROLOGUE \
-       .data; .align 4; 1: .long 0; \
-       .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call _mcount; \
-       or %o0,%lo(1b),%o0; restore
-#endif
-#else
-#ifdef __arch64__
-#define _PROF_PROLOGUE \
-       .data; .align 8; 1: .uaword 0; .uaword 0; \
-       .text; save %sp,-CC64FSZ,%sp; sethi %hi(1b),%o0; call mcount; \
-       or %o0,%lo(1b),%o0; restore
-#else
-#define        _PROF_PROLOGUE \
-       .data; .align 4; 1: .long 0; \
-       .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call mcount; \
-       or %o0,%lo(1b),%o0; restore
-#endif
-#endif
-#else
-#define _PROF_PROLOGUE
-#endif
-
-#define ENTRY(name)            _ENTRY(_C_LABEL(name)); _PROF_PROLOGUE
-#define ENTRY_NOPROFILE(name)  _ENTRY(_C_LABEL(name))
-#define        ASENTRY(name)           _ENTRY(_ASM_LABEL(name)); _PROF_PROLOGUE
-#define        FUNC(name)              ASENTRY(name)
-#define RODATA(name)           .align 4; .text; .globl _C_LABEL(name); \
-                               OTYPE(_C_LABEL(name)); _C_LABEL(name):
-
-
-#define ASMSTR                 .asciz
-
-#define RCSID(name)            .asciz name
-
-#ifdef __ELF__
-#define        WEAK_ALIAS(alias,sym)                                           \
-       .weak alias;                                                    \
-       alias = sym
-#endif
-
-/*
- * WARN_REFERENCES: create a warning if the specified symbol is referenced.
- */
-#ifdef __ELF__
-#ifdef __STDC__
-#define        WARN_REFERENCES(_sym,_msg)                              \
-       .section .gnu.warning. ## _sym ; .ascii _msg ; .text
-#else
-#define        WARN_REFERENCES(_sym,_msg)                              \
-       .section .gnu.warning./**/_sym ; .ascii _msg ; .text
-#endif /* __STDC__ */
-#else
-#ifdef __STDC__
-#define        __STRING(x)                     #x
-#define        WARN_REFERENCES(sym,msg)                                        \
-       .stabs msg ## ,30,0,0,0 ;                                       \
-       .stabs __STRING(_ ## sym) ## ,1,0,0,0
-#else
-#define        __STRING(x)                     "x"
-#define        WARN_REFERENCES(sym,msg)                                        \
-       .stabs msg,30,0,0,0 ;                                           \
-       .stabs __STRING(_/**/sym),1,0,0,0
-#endif /* __STDC__ */
-#endif /* __ELF__ */
-
-#endif /* _ASM_H_ */
diff --git a/klibc/klibc/arch/sparc/include/machine/frame.h b/klibc/klibc/arch/sparc/include/machine/frame.h
deleted file mode 100644 (file)
index b09175c..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*     $NetBSD: frame.h,v 1.4 2001/12/04 00:05:05 darrenr Exp $ */
-
-/*
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This software was developed by the Computer Systems Engineering group
- * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
- * contributed to Berkeley.
- *
- * All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Lawrence Berkeley Laboratory.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *     @(#)frame.h     8.1 (Berkeley) 6/11/93
- */
-
-#if defined(_KERNEL_OPT)
-#include "opt_sparc_arch.h"
-#endif
-
-/*
- * Sparc stack frame format.
- *
- * Note that the contents of each stack frame may be held only in
- * machine register windows.  In order to get an accurate picture
- * of the frame, you must first force the kernel to write any such
- * windows to the stack.
- */
-#ifndef _LOCORE
-#ifndef SUN4U
-struct frame {
-       int32_t fr_local[8];    /* space to save locals (%l0..%l7) */
-       int32_t fr_arg[6];      /* space to save arguments (%i0..%i5) */
-       struct  frame *fr_fp;   /* space to save frame pointer (%i6) */
-       int32_t fr_pc;          /* space to save return pc (%i7) */
-       /*
-        * SunOS reserves another 8 words here; this is pointless
-        * but we do it for compatibility.
-        */
-       int32_t fr_xxx;         /* `structure return pointer' (unused) */
-       int32_t fr_argd[6];     /* `arg dump area' (lunacy) */
-       int32_t fr_argx[1];     /* arg extension (args 7..n; variable size) */
-};
-#else
-struct frame32 {
-       int32_t fr_local[8];    /* space to save locals (%l0..%l7) */
-       int32_t fr_arg[6];      /* space to save arguments (%i0..%i5) */
-       u_int32_t       fr_fp;  /* space to save frame pointer (%i6) */
-       u_int32_t       fr_pc;  /* space to save return pc (%i7) */
-       /*
-        * SunOS reserves another 8 words here; this is pointless
-        * but we do it for compatibility.
-        */
-       int32_t fr_xxx;         /* `structure return pointer' (unused) */
-       int32_t fr_argd[6];     /* `arg dump area' (lunacy) */
-       int32_t fr_argx[1];     /* arg extension (args 7..n; variable size) */
-};
-#endif
-#endif
-
-/*
- * CCFSZ (C Compiler Frame SiZe) is the size of a stack frame required if
- * a function is to call C code.  It should be just 64, but Sun defined
- * their frame with space to hold arguments 0 through 5 (plus some junk),
- * and varargs routines (such as kprintf) demand this, and gcc uses this
- * area at times anyway.
- */
-#define CCFSZ          96
-
-/*
- * Sparc v9 stack frame format.
- *
- * Note that the contents of each stack frame may be held only in
- * machine register windows.  In order to get an accurate picture
- * of the frame, you must first force the kernel to write any such
- * windows to the stack.
- *
- * V9 frames have an odd bias, so you can tall a v9 frame from
- * a v8 frame by testing the stack pointer's lsb.
- */
-#if !defined(_LOCORE) && !defined(_LIBC)
-struct frame64 {
-       int64_t fr_local[8];    /* space to save locals (%l0..%l7) */
-       int64_t fr_arg[6];      /* space to save arguments (%i0..%i5) */
-       u_int64_t       fr_fp;          /* space to save frame pointer (%i6) */
-       u_int64_t       fr_pc;          /* space to save return pc (%i7) */
-       /*
-        * SVR4 reserves a bunch of extra stuff.
-        */
-       int64_t fr_argd[6];     /* `register save area' (lunacy) */
-       int64_t fr_argx[0];     /* arg extension (args 7..n; variable size) */
-};
-
-#define v9next_frame(f)                ((struct frame64*)(f->fr_fp+BIAS))
-#endif
-
-/*
- * CC64FSZ (C Compiler 64-bit Frame SiZe) is the size of a stack frame used
- * by the compiler in 64-bit mode.  It is (16)*8; space for 8 ins, 8 outs.
- */
-#define CC64FSZ                176
-
-/*
- * v9 stacks all have a bias of 2047 added to the %sp and %fp, so you can easily
- * detect it by testing the register for an odd value.  Why 2K-1 I don't know.
- */
-#define BIAS   (2048-1)
-
diff --git a/klibc/klibc/arch/sparc/include/machine/trap.h b/klibc/klibc/arch/sparc/include/machine/trap.h
deleted file mode 100644 (file)
index 42c3ef6..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*     $NetBSD: trap.h,v 1.11 1999/01/20 00:15:08 pk Exp $ */
-
-/*
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This software was developed by the Computer Systems Engineering group
- * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
- * contributed to Berkeley.
- *
- * All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Lawrence Berkeley Laboratory.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *     @(#)trap.h      8.1 (Berkeley) 6/11/93
- */
-/*
- * Sun4m support by Aaron Brown, Harvard University.
- * Changes Copyright (c) 1995 The President and Fellows of Harvard College.
- * All rights reserved.
- */
-
-#ifndef        _MACHINE_TRAP_H
-#define        _MACHINE_TRAP_H
-
-/*     trap            vec       (pri) description     */
-#define        T_RESET         0x00    /* (1) not actually vectored; jumps to 0 */
-#define        T_TEXTFAULT     0x01    /* (2) address fault during instr fetch */
-#define        T_ILLINST       0x02    /* (3) illegal instruction */
-#define        T_PRIVINST      0x03    /* (4) privileged instruction */
-#define        T_FPDISABLED    0x04    /* (5) fp instr while fp disabled */
-#define        T_WINOF         0x05    /* (6) register window overflow */
-#define        T_WINUF         0x06    /* (7) register window underflow */
-#define        T_ALIGN         0x07    /* (8) address not properly aligned */
-#define        T_FPE           0x08    /* (9) floating point exception */
-#define        T_DATAFAULT     0x09    /* (10) address fault during data fetch */
-#define        T_TAGOF         0x0a    /* (11) tag overflow */
-/*                     0x0b       unused */
-/*                     0x0c       unused */
-/*                     0x0d       unused */
-/*                     0x0e       unused */
-/*                     0x0f       unused */
-/*                     0x10       unused */
-#define        T_L1INT         0x11    /* (27) level 1 interrupt */
-#define        T_L2INT         0x12    /* (26) level 2 interrupt */
-#define        T_L3INT         0x13    /* (25) level 3 interrupt */
-#define        T_L4INT         0x14    /* (24) level 4 interrupt */
-#define        T_L5INT         0x15    /* (23) level 5 interrupt */
-#define        T_L6INT         0x16    /* (22) level 6 interrupt */
-#define        T_L7INT         0x17    /* (21) level 7 interrupt */
-#define        T_L8INT         0x18    /* (20) level 8 interrupt */
-#define        T_L9INT         0x19    /* (19) level 9 interrupt */
-#define        T_L10INT        0x1a    /* (18) level 10 interrupt */
-#define        T_L11INT        0x1b    /* (17) level 11 interrupt */
-#define        T_L12INT        0x1c    /* (16) level 12 interrupt */
-#define        T_L13INT        0x1d    /* (15) level 13 interrupt */
-#define        T_L14INT        0x1e    /* (14) level 14 interrupt */
-#define        T_L15INT        0x1f    /* (13) level 15 interrupt */
-/*                     0x20       unused */
-/*     through         0x23       unused */
-#define        T_CPDISABLED    0x24    /* (5) coprocessor instr while disabled */
-#define        T_UNIMPLFLUSH   0x25    /* Unimplemented FLUSH */
-/*     through         0x27       unused */
-#define        T_CPEXCEPTION   0x28    /* (9) coprocessor exception */
-/*                     0x29       unused */
-#define T_IDIV0                0x2a    /* divide by zero (from hw [su]div instr) */
-#define T_STOREBUFFAULT        0x2b    /* SuperSPARC: Store buffer copy-back fault */
-/*                     0x2c       unused */
-/*     through         0x7f       unused */
-
-/* beginning of `user' vectors (from trap instructions) - all priority 12 */
-#define        T_SUN_SYSCALL   0x80    /* system call */
-#define        T_BREAKPOINT    0x81    /* breakpoint `instruction' */
-#define        T_DIV0          0x82    /* division routine was handed 0 */
-#define        T_FLUSHWIN      0x83    /* flush windows */
-#define        T_CLEANWIN      0x84    /* provide clean windows */
-#define        T_RANGECHECK    0x85    /* ? */
-#define        T_FIXALIGN      0x86    /* fix up unaligned accesses */
-#define        T_INTOF         0x87    /* integer overflow ? */
-#define        T_SVR4_SYSCALL  0x88    /* SVR4 system call */
-#define        T_BSD_SYSCALL   0x89    /* BSD system call */
-#define        T_KGDB_EXEC     0x8a    /* for kernel gdb */
-
-/* 0x8b..0xff are currently unallocated, except the following */
-#define T_SVR4_GETCC           0xa0
-#define T_SVR4_SETCC           0xa1
-#define T_SVR4_GETPSR          0xa2
-#define T_SVR4_SETPSR          0xa3
-#define T_SVR4_GETHRTIME       0xa4
-#define T_SVR4_GETHRVTIME      0xa5
-#define T_SVR4_GETHRESTIME     0xa7
-
-
-#ifdef _KERNEL                 /* pseudo traps for locore.s */
-#define        T_RWRET         -1      /* need first user window for trap return */
-#define        T_AST           -2      /* no-op, just needed reschedule or profile */
-#endif
-
-/* flags to system call (flags in %g1 along with syscall number) */
-#define        SYSCALL_G2RFLAG 0x400   /* on success, return to %g2 rather than npc */
-#define        SYSCALL_G7RFLAG 0x800   /* use %g7 as above (deprecated) */
-
-/*
- * `software trap' macros to keep people happy (sparc v8 manual says not
- * to set the upper bits).
- */
-#define        ST_BREAKPOINT   (T_BREAKPOINT & 0x7f)
-#define        ST_DIV0         (T_DIV0 & 0x7f)
-#define        ST_FLUSHWIN     (T_FLUSHWIN & 0x7f)
-#define        ST_SYSCALL      (T_SUN_SYSCALL & 0x7f)
-
-#endif /* _MACHINE_TRAP_H_ */
diff --git a/klibc/klibc/arch/sparc/syscall.S b/klibc/klibc/arch/sparc/syscall.S
new file mode 100644 (file)
index 0000000..c0273f7
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/sparc/syscall.S
+ *
+ * Common system-call stub; %g1 already set to syscall number
+ */
+
+       .globl  __syscall_common
+       .type   __syscall_common,#function
+               .align  4
+__syscall_common:
+       t       0x10
+       bcc     1f
+         sethi %hi(errno), %g4
+       or      %g4, %lo(errno), %g4
+       st      %o0,[%g4]
+       mov     -1, %o0
+1:
+               retl
+         nop
diff --git a/klibc/klibc/arch/sparc/sysfork.S b/klibc/klibc/arch/sparc/sysfork.S
new file mode 100644 (file)
index 0000000..a66c76e
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * arch/sparc/sysfork.S
+ *
+ * The fork and vfork system calls are special on sparc[64]:
+ * they return the "other process" pid in %o0 and the
+ * "is child" flag in %o1
+ *
+ * Common system-call stub; %g1 already set to syscall number
+ */
+
+       .globl  __syscall_forkish
+       .type   __syscall_forkish,#function
+               .align  4
+__syscall_forkish:
+       t       0x10
+       sub     %o1, 1, %o1
+       bcc,a   1f
+         and   %o0, %o1, %o0
+       sethi   %hi(errno), %g4
+       or      %g4, %lo(errno), %g4
+       st      %o0,[%g4]
+       mov     -1, %o0
+1:
+               retl
+         nop
diff --git a/klibc/klibc/arch/sparc/sysstub.ph b/klibc/klibc/arch/sparc/sysstub.ph
new file mode 100644 (file)
index 0000000..baad9e3
--- /dev/null
@@ -0,0 +1,25 @@
+# -*- perl -*-
+#
+# arch/sparc32/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    $stype = $stype || 'common';
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tb __syscall_${stype}\n";
+    print OUT "\t  mov\t__NR_${sname}, %g1\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index d59f9878e9a0262dde5250a381847c70ba453c7a..06b79537a31fc8efc27f6c6f3c9e47b970c8ec44 100644 (file)
@@ -8,6 +8,8 @@
 #
 
 ARCHOBJS = \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o \
+       arch/$(ARCH)/sysfork.o
 
 archclean:
diff --git a/klibc/klibc/arch/sparc64/include/klibc/archsetjmp.h b/klibc/klibc/arch/sparc64/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 022a31e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * arch/sparc64/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __sp;
-  unsigned long __fp;
-  unsigned long __pc;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/sparc64/include/klibc/archsignal.h b/klibc/klibc/arch/sparc64/include/klibc/archsignal.h
deleted file mode 100644 (file)
index f81bd66..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/sparc64/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/sparc64/include/klibc/archsys.h b/klibc/klibc/arch/sparc64/include/klibc/archsys.h
deleted file mode 100644 (file)
index 651e4f7..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * arch/sparc64/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* The Linux 2.5.31 SPARC64 syscall macros are just plain broken */
-
-#undef _syscall0
-#undef _syscall1
-#undef _syscall2
-#undef _syscall3
-#undef _syscall4
-#undef _syscall5
-#undef _syscall6
-
-#define _syscall0(type,name) \
-type name (void) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall1(type,name,type1,arg1) \
-type name (type1 arg1) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall2(type,name,type1,arg1,type2,arg2) \
-type name (type1 arg1,type2 arg2) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  register type2 __o1 __asm__ ("o1") = (arg2); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__o1), "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
-type name (type1 arg1,type2 arg2,type3 arg3) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  register type2 __o1 __asm__ ("o1") = (arg2); \
-  register type3 __o2 __asm__ ("o2") = (arg3); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  register type2 __o1 __asm__ ("o1") = (arg2); \
-  register type3 __o2 __asm__ ("o2") = (arg3); \
-  register type4 __o3 __asm__ ("o3") = (arg4); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,\
-  type5,arg5) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  register type2 __o1 __asm__ ("o1") = (arg2); \
-  register type3 __o2 __asm__ ("o2") = (arg3); \
-  register type4 __o3 __asm__ ("o3") = (arg4); \
-  register type5 __o4 __asm__ ("o4") = (arg5); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), \
-        "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-  type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-  register unsigned long __g1 __asm__ ("g1") = __NR_##name; \
-  register unsigned long __ret __asm__("o0"); \
-  type1 __o0 = (arg1); \
-  register type2 __o1 __asm__ ("o1") = (arg2); \
-  register type3 __o2 __asm__ ("o2") = (arg3); \
-  register type4 __o3 __asm__ ("o3") = (arg4); \
-  register type5 __o4 __asm__ ("o4") = (arg5); \
-  register type6 __o5 __asm__ ("o5") = (arg6); \
-  __asm__ __volatile__ ("t 0x6d\n\t" \
-      "bcs,a %%xcc, 1f\n\t" \
-      " st %0,%1\n\t" \
-      "1:" \
-      "movcs %%xcc,-1,%0\n" \
-      : "=&r" (__ret), "+m" (errno) \
-      : "0" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), \
-        "r" (__o5), "r" (__g1) \
-      : "cc"); \
-  return (type) __ret; \
-}
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/sparc64/syscall.S b/klibc/klibc/arch/sparc64/syscall.S
new file mode 100644 (file)
index 0000000..7ab9d95
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * arch/sparc64/syscall.S
+ *
+ * Common system-call stub; %g1 already set to syscall number
+ */
+
+       .globl  __syscall_common
+       .type   __syscall_common,#function
+               .align  4
+__syscall_common:
+       t       0x6d
+       bcc     %xcc, 1f
+         sethi %hi(errno), %g4
+       or      %g4, %lo(errno), %g4
+       st      %o0,[%g4]
+1:
+               retl
+         movcs %xcc, -1, %o0
diff --git a/klibc/klibc/arch/sparc64/sysfork.S b/klibc/klibc/arch/sparc64/sysfork.S
new file mode 100644 (file)
index 0000000..739c35e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * arch/sparc64/sysfork.S
+ *
+ * The fork and vfork system calls are special on sparc[64]:
+ * they return the "other process" pid in %o0 and the
+ * "is child" flag in %o1
+ *
+ * Common system-call stub; %g1 already set to syscall number
+ *
+ * IS THIS CORRECT FOR SPARC64?
+ */
+
+       .globl  __syscall_forkish
+       .type   __syscall_forkish,#function
+               .align  4
+__syscall_forkish:
+       t       0x6d
+       sub     %o1, 1, %o1
+       bcc,a   %xcc, 1f
+         and   %o0, %o1, %o0
+       sethi   %hi(errno), %g4
+       or      %g4, %lo(errno), %g4
+       st      %o0,[%g4]
+1:
+               retl
+         movcs %xcc, -1, %o0
diff --git a/klibc/klibc/arch/sparc64/sysstub.ph b/klibc/klibc/arch/sparc64/sysstub.ph
new file mode 100644 (file)
index 0000000..2ef2c6b
--- /dev/null
@@ -0,0 +1,25 @@
+# -*- perl -*-
+#
+# arch/sparc64/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    $stype = $stype || 'common';
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tb __syscall_${stype}\n";
+    print OUT "\t  mov\t__NR_${sname}, %g1\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
index ecb14ccb70f0cb137aa21d477a8e3591dcedfc05..f3c87410a6c8c10355e0d6b5c4a3a5f7765990b3 100644 (file)
@@ -9,8 +9,14 @@
 # Blatantly copied and modified from i386 version by Mats Petersson, AMD.
 #
 
+#
+# NOTE: -fno-asynchronous-unwind-tables produce significantly smaller
+# binaries (20% smaller), but makes the code completely useless for
+# debugging using gdb.
+#
 ARCHREQFLAGS = -m64
-OPTFLAGS     = -Os -fomit-frame-pointer -falign-functions=0 -falign-jumps=0 -falign-loops=0
+OPTFLAGS     = -Os -fno-asynchronous-unwind-tables -fomit-frame-pointer \
+               -falign-functions=0 -falign-jumps=0 -falign-loops=0
 BITSIZE      = 64
 LDFLAGS      = -m elf_x86_64
 
index c84443f4e18f3b6c923b96b758f9dd0ccb3eb289..d6cc1204e488ff8cac8acda9989c07bdea011a9d 100644 (file)
@@ -9,7 +9,8 @@
 
 ARCHOBJS = \
        arch/$(ARCH)/exits.o \
-       arch/$(ARCH)/setjmp.o
+       arch/$(ARCH)/setjmp.o \
+       arch/$(ARCH)/syscall.o
 
 ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
 
diff --git a/klibc/klibc/arch/x86_64/include/klibc/archsetjmp.h b/klibc/klibc/arch/x86_64/include/klibc/archsetjmp.h
deleted file mode 100644 (file)
index 90d0a0d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * arch/x86_64/include/klibc/archsetjmp.h
- */
-
-#ifndef _KLIBC_ARCHSETJMP_H
-#define _KLIBC_ARCHSETJMP_H
-
-struct __jmp_buf {
-  unsigned long __rbx;
-  unsigned long __rsp;
-  unsigned long __rbp;
-  unsigned long __r12;
-  unsigned long __r13;
-  unsigned long __r14;
-  unsigned long __r15;
-  unsigned long __rip;
-};
-
-typedef struct __jmp_buf jmp_buf[1];
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/arch/x86_64/include/klibc/archsignal.h b/klibc/klibc/arch/x86_64/include/klibc/archsignal.h
deleted file mode 100644 (file)
index 74e82e1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * arch/x86_64/include/klibc/archsignal.h
- *
- * Architecture-specific signal definitions
- *
- */
-
-#ifndef _KLIBC_ARCHSIGNAL_H
-#define _KLIBC_ARCHSIGNAL_H
-
-/* No special stuff for this architecture */
-
-#endif
diff --git a/klibc/klibc/arch/x86_64/include/klibc/archsys.h b/klibc/klibc/arch/x86_64/include/klibc/archsys.h
deleted file mode 100644 (file)
index 2ec72cd..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * arch/x86_64/include/klibc/archsys.h
- *
- * Architecture-specific syscall definitions
- */
-
-#ifndef _KLIBC_ARCHSYS_H
-#define _KLIBC_ARCHSYS_H
-
-/* The x86-64 syscall headers are needlessly inefficient */
-
-#undef _syscall0
-#undef _syscall1
-#undef _syscall2
-#undef _syscall3
-#undef _syscall4
-#undef _syscall5
-#undef _syscall6
-
-#define _syscall0(type,name) \
-type name (void) \
-{ \
-long __res; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall1(type,name,type1,arg1) \
-type name (type1 arg1) \
-{ \
-long __res; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall2(type,name,type1,arg1,type2,arg2) \
-type name (type1 arg1,type2 arg2) \
-{ \
-long __res; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1),"S" (arg2) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
-type name (type1 arg1,type2 arg2,type3 arg3) \
-{ \
-long __res; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1),"S" (arg2), \
-          "d" (arg3) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
-{ \
-long __res; \
-register type4 __r10 asm("%r10") = arg4; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1),"S" (arg2), \
-          "d" (arg3),"r" (__r10) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
-{ \
-long __res; \
-register type4 __r10 asm("%r10") = arg4; \
-register type5 __r8  asm("%r8")  = arg5; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1),"S" (arg2), \
-          "d" (arg3),"r" (__r10),"r" (__r8) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
-          type5,arg5,type6,arg6) \
-type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
-{ \
-long __res; \
-register type4 __r10 asm("%r10") = arg4; \
-register type5 __r8  asm("%r8")  = arg5; \
-register type6 __r9  asm("%r9")  = arg6; \
-__asm__ volatile (__syscall \
-        : "=a" (__res) \
-        : "0" (__NR_##name),"D" (arg1),"S" (arg2), \
-          "d" (arg3),"r" (__r10),"r" (__r8), "r" (__r9) \
-        : __syscall_clobber); \
-__syscall_return(type,__res); \
-}
-
-#endif /* _KLIBC_ARCHSYS_H */
diff --git a/klibc/klibc/arch/x86_64/include/sys/io.h b/klibc/klibc/arch/x86_64/include/sys/io.h
deleted file mode 100644 (file)
index 4a0ae44..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#ident "$Id: io.h,v 1.1 2004/01/25 01:34:29 hpa Exp $"
-/* ----------------------------------------------------------------------- *
- *   
- *   Copyright 2004 H. Peter Anvin - All Rights Reserved
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *   
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *   
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * sys/io.h for the i386 architecture
- *
- * Basic I/O macros
- */
-
-#ifndef _SYS_IO_H
-#define _SYS_IO_H 1
-
-/* I/O-related system calls */
-
-int iopl(int);
-int ioperm(unsigned long, unsigned long, int);
-
-/* Basic I/O macros */
-
-static __inline__ void
-outb(unsigned char __v, unsigned short __p)
-{
-  asm volatile("outb %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ void
-outw(unsigned short __v, unsigned short __p)
-{
-  asm volatile("outw %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ void
-outl(unsigned int __v, unsigned short __p)
-{
-  asm volatile("outl %0,%1" : : "a" (__v), "dN" (__p));
-}
-
-static __inline__ unsigned char
-inb(unsigned short __p)
-{
-  unsigned char __v;
-  asm volatile("inb %1,%0" : "=a" (__v) : "dN" (__p));
-  return v;
-}
-
-static __inline__ unsigned short
-inw(unsigned short __p)
-{
-  unsigned short __v;
-  asm volatile("inw %1,%0" : "=a" (__v) : "dN" (__p));
-  return v;
-}
-
-static __inline__ unsigned int
-inl(unsigned short __p)
-{
-  unsigned int __v;
-  asm volatile("inl %1,%0" : "=a" (__v) : "dN" (__p));
-  return v;
-}
-
-/* String I/O macros */
-
-static __inline__ void
-outsb (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsb" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-outsw (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsw" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-outsl (unsigned short __p, const void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; outsl" : "+S" (__d), "+c" (__n) : "d" (__p));
-}
-
-
-static __inline__ void
-insb (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insb" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-insw (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insw" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-static __inline__ void
-insl (unsigned short __p, void *__d, unsigned long __n)
-{
-  asm volatile("cld; rep; insl" : "+D" (__d), "+c" (__n) : "d" (__p));
-}
-
-#endif /* _SYS_IO_H */
diff --git a/klibc/klibc/arch/x86_64/syscall.S b/klibc/klibc/arch/x86_64/syscall.S
new file mode 100644 (file)
index 0000000..f2c74ae
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * arch/x86-64/syscall.S
+ *
+ * Common tail-handling code for system calls.
+ *
+ * The arguments are in the standard argument registers; the system
+ * call number in %eax.
+ */
+       .text
+       .align  4
+       .globl  __syscall_common
+       .type   __syscall_common,@function
+__syscall_common:
+       movq    %rcx,%r10               # The kernel uses %r10 istf %rcx
+       syscall
+
+       cmpq    $-4095,%rax
+       jb      1f
+
+       # Error return, must set errno
+       negl    %eax
+       movl    %eax,errno(%rip)        # errno is type int, so 32 bits
+       orq     $-1,%rax                # orq $-1 smaller than movq $-1
+
+1:
+       ret
+
+       .size   __syscall_common,.-__syscall_common
diff --git a/klibc/klibc/arch/x86_64/sysstub.ph b/klibc/klibc/arch/x86_64/sysstub.ph
new file mode 100644 (file)
index 0000000..07af122
--- /dev/null
@@ -0,0 +1,23 @@
+# -*- perl -*-
+#
+# arch/x86_64/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+    my($fname, $type, $sname, $stype, @args) = @_;
+
+    open(OUT, '>', "syscalls/${fname}.S");
+    print OUT "#include <asm/unistd.h>\n";
+    print OUT "\n";
+    print OUT "\t.type ${fname},\@function\n";
+    print OUT "\t.globl ${fname}\n";
+    print OUT "${fname}:\n";
+    print OUT "\tmovl \$__NR_${sname},%eax\n"; # Zero-extends to 64 bits
+    print OUT "\tjmp __syscall_common\n";
+    print OUT "\t.size ${fname},.-${fname}\n";
+    close(OUT);
+}
+
+1;
diff --git a/klibc/klibc/asprintf.c b/klibc/klibc/asprintf.c
new file mode 100644 (file)
index 0000000..457d34b
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * asprintf.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int asprintf(char **bufp, const char *format, ...)
+{
+  va_list ap, ap1;
+  int rv;
+  int bytes;
+  char *p;
+
+  va_start(ap, format);
+  va_copy(ap1, ap);
+
+  bytes = vsnprintf(NULL, 0, format, ap1);
+  va_end(ap1);
+
+  *bufp = p = malloc(bytes+1);
+  if ( !p )
+    return -1;
+  
+  rv = vsnprintf(p, bytes, format, ap);
+  va_end(ap);
+
+  return rv;
+}
index c7adc9882cab85a8d9f2823b7f5941832df857cb..acfa05ab65275b36bc7c4a4ac48784f702999d75 100644 (file)
 const unsigned char __ctypes[257] = {
   0,                           /* EOF */
 
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  __ctype_space,               /* BS */
-  __ctype_space,               /* TAB */
-  __ctype_space,               /* LF */
-  __ctype_space,               /* VT */
-  __ctype_space,               /* FF */
-  __ctype_space,               /* CR */
-  0,                           /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl|__ctype_space, /* BS */
+  __ctype_cntrl|__ctype_space, /* TAB */
+  __ctype_cntrl|__ctype_space, /* LF */
+  __ctype_cntrl|__ctype_space, /* VT */
+  __ctype_cntrl|__ctype_space, /* FF */
+  __ctype_cntrl|__ctype_space, /* CR */
+  __ctype_cntrl,               /* control character */
 
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
+  __ctype_cntrl,               /* control character */
   
-  __ctype_space|__ctype_print, /* space */
+  __ctype_print|__ctype_space, /* space */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
@@ -61,16 +61,16 @@ const unsigned char __ctypes[257] = {
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
 
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
-  __ctype_digit|__ctype_xdigit|__ctype_print, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
+  __ctype_print|__ctype_digit|__ctype_xdigit, /* digit */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
@@ -79,33 +79,33 @@ const unsigned char __ctypes[257] = {
   __ctype_print|__ctype_punct, /* punctuation */
 
   __ctype_print|__ctype_punct, /* punctuation */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print|__ctype_xdigit, /* A-F */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper|__ctype_xdigit, /* A-F */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
 
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
-  __ctype_upper|__ctype_print, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
+  __ctype_print|__ctype_upper, /* G-Z */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
@@ -113,74 +113,74 @@ const unsigned char __ctypes[257] = {
   __ctype_print|__ctype_punct, /* punctuation */
 
   __ctype_print|__ctype_punct, /* punctuation */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print|__ctype_xdigit, /* a-f */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower|__ctype_xdigit, /* a-f */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
 
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
-  __ctype_lower|__ctype_print, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
+  __ctype_print|__ctype_lower, /* g-z */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
-  0,                           /* control character */
+  __ctype_cntrl,                               /* control character */
 
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
 
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
-  0,                           /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
+  __ctype_cntrl,                               /* control character */
 
-  __ctype_space|__ctype_print, /* NBSP */
+  __ctype_print|__ctype_space, /* NBSP */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
@@ -214,71 +214,71 @@ const unsigned char __ctypes[257] = {
   __ctype_print|__ctype_punct, /* punctuation */
   __ctype_print|__ctype_punct, /* punctuation */
 
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
 
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_print|__ctype_punct, /* punctuation */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_upper|__ctype_print, /* upper accented */
-  __ctype_lower|__ctype_print, /* lower accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_punct, /* punctuation */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_upper, /* upper accented */
+  __ctype_print|__ctype_lower, /* lower accented */
 
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
 
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_print|__ctype_punct, /* punctuation */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
-  __ctype_lower|__ctype_print, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_punct, /* punctuation */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
+  __ctype_print|__ctype_lower, /* lower accented */
 };
diff --git a/klibc/klibc/daemon.c b/klibc/klibc/daemon.c
new file mode 100644 (file)
index 0000000..75d7146
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * daemon.c - "daemonize" a process
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+int daemon(int nochdir, int noclose)
+{
+  int nullfd;
+  pid_t f;
+
+  if ( !nochdir ) {
+    if ( chdir("/") )
+      return -1;
+  }
+
+  if ( !noclose ) {
+    if ( (nullfd = open("/dev/null", O_RDWR)) < 0 ||
+        dup2(nullfd, 0) < 0 ||
+        dup2(nullfd, 1) < 0 ||
+        dup2(nullfd, 2) < 0 )
+      return -1;
+    close(nullfd);
+  }
+  
+  f = fork();
+  if ( f < 0 )
+    return -1;
+  else if ( f > 0 )
+    _exit(0);
+
+
+  return setsid();
+}
+
+  
diff --git a/klibc/klibc/fdatasync.c b/klibc/klibc/fdatasync.c
deleted file mode 100644 (file)
index 53079b0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * fdatasync.c
- *
- * Some systems don't have this (alpha?) ... this is really a bug,
- * but mimic using fsync()
- */
-
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#ifndef __NR_fdatasync
-#define __NR_fdatasync __NR_fsync
-#endif
-
-_syscall1(int,fdatasync,int,fd);
index d7e4db89a17874f45c800b8c55c4822fbeb044ff..daf313eaf27edc784f77b0d2a7e47d7737daaa6d 100644 (file)
@@ -9,21 +9,13 @@
 #include <signal.h>
 #include <unistd.h>
 
-#ifdef __NR_fork
+#ifndef __NR_fork
 
-#ifdef _syscall0_forkish
-_syscall0_forkish(pid_t,fork);
-#else
-_syscall0(pid_t,fork);
-#endif
-
-#else /* __NR_fork */
-
-static inline _syscall2(pid_t,clone,unsigned long,flags,void *,newsp);
+extern pid_t __clone(unsigned long flags, void * newsp);
 
 pid_t fork(void)
 {
-  return clone(SIGCHLD, 0);
+  return __clone(SIGCHLD, 0);
 }
 
 #endif /* __NR_fork */
diff --git a/klibc/klibc/fstatfs.c b/klibc/klibc/fstatfs.c
new file mode 100644 (file)
index 0000000..09e4674
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * fstatfs.c
+ *
+ * On architectures which do fstatfs64, wrap the system call
+ */
+
+#include <sys/syscall.h>
+#include <sys/vfs.h>
+
+#ifdef __NR_fstatfs64
+
+extern int __fstatfs64(int, size_t, struct statfs *);
+
+int fstatfs(int fd, struct statfs *buf)
+{
+  return __fstatfs64(fd, sizeof *buf, buf);
+}
+
+#endif
index 350ec69a6356edbcd7c7f2ac53766dbb43597962..613ca0529c503f0a8e26144350f872477a5c7fa1 100644 (file)
@@ -1,12 +1,13 @@
 /*
  * getcwd.c
+ *
+ * The system call behaves differently than the library function.
  */
 
 #include <unistd.h>
 #include <sys/syscall.h>
 
-#define __NR___getcwd __NR_getcwd
-static inline _syscall2(int,__getcwd,char *,buf,size_t,size);
+extern int __getcwd(char * buf, size_t size);
 
 char *getcwd(char *buf, size_t size)
 {
diff --git a/klibc/klibc/getpagesize.c b/klibc/klibc/getpagesize.c
deleted file mode 100644 (file)
index 2d975b1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * getpagesize.c
- */
-
-#include <sys/syscall.h>
-#include <asm/page.h>
-
-/* Presumably there is a better way to do this... */
-#ifdef __ia64__
-# define __NR_getpagesize 1171
-#endif
-
-#ifdef __NR_getpagesize
-
-_syscall0(int,getpagesize);
-
-#else
-
-int getpagesize(void)
-{
-  return PAGE_SIZE;
-}
-
-#endif
-
-
index d6db2cc6b9542ebfe1d55d53c53136d45c564912..4ea630487d3b5fdc0388566bc951249a45edc2ef 100644 (file)
 #include <sys/resource.h>
 #include <sys/syscall.h>
 
-#define __NR__getpriority __NR_getpriority
+#if !defined(__alpha__) && !defined(__ia64__)
 
-static inline _syscall2(int,_getpriority,int,which,int,who);
+extern int __getpriority(int, int);
 
 int getpriority(int which, int who)
 {
-#if defined(__alpha__) || defined(__ia64__)
-  return _getpriority(which, who);
-#else
-  int rv = _getpriority(which, who);
+  int rv = __getpriority(which, who);
   return ( rv < 0 ) ? rv : 20-rv;
-#endif
 }
+
+#endif
diff --git a/klibc/klibc/include/alloca.h b/klibc/klibc/include/alloca.h
deleted file mode 100644 (file)
index 41a4d94..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * alloca.h
- *
- * Just call the builtin alloca() function
- */
-
-#ifndef _ALLOCA_H
-#define _ALLOCA_H
-
-#define alloca(size) __builtin_alloca(size)
-
-#endif /* _ALLOCA_H */
-
diff --git a/klibc/klibc/include/arpa/inet.h b/klibc/klibc/include/arpa/inet.h
deleted file mode 100644 (file)
index 043b148..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * arpa/inet.h
- */
-
-#ifndef _ARPA_INET_H
-#define _ARPA_INET_H
-
-#include <klibc/extern.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <netinet/in6.h>
-
-__extern uint32_t inet_addr(const char *);
-__extern int inet_aton(const char *, struct in_addr *);
-__extern char *inet_ntoa(struct in_addr);
-__extern int inet_pton(int, const char *, void *);
-__extern const char *inet_ntop(int, const void *, char *, size_t);
-__extern unsigned int inet_nsap_addr(const char *, unsigned char *, int);
-__extern char *inet_nsap_ntoa(int, const unsigned char *, char *);
-
-#endif /* _ARPA_INET_H */
-
-
diff --git a/klibc/klibc/include/assert.h b/klibc/klibc/include/assert.h
deleted file mode 100644 (file)
index 58cc37c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * assert.h
- */
-
-#ifndef _ASSERT_H
-#define _ASSERT_H
-
-#ifdef NDEBUG
-
-#define assert(x) ((void)(x))
-
-#else
-
-extern void __assert_fail(const char *, const char *,
-                         unsigned int);
-
-#define assert(x) ((x) ? (void)0 : __assert_fail(#x, __FILE__, __LINE__))
-
-#endif
-
-#endif /* _ASSERT_H */
-
diff --git a/klibc/klibc/include/bits32/bitsize/limits.h b/klibc/klibc/include/bits32/bitsize/limits.h
deleted file mode 100644 (file)
index f90e524..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * bits32/limits.h
- */
-
-#ifndef _BITSIZE_LIMITS_H
-#define _BITSIZE_LIMITS_H
-
-#define LONG_BIT       32
-
-#define LONG_MIN       (-2147483647L-1)
-#define LONG_MAX       2147483647L
-#define ULONG_MAX      4294967295UL
-
-#endif /* _BITSIZE_LIMITS_H */
diff --git a/klibc/klibc/include/bits32/bitsize/stddef.h b/klibc/klibc/include/bits32/bitsize/stddef.h
deleted file mode 100644 (file)
index bf6e695..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * bits32/stddef.h
- */
-
-#ifndef _BITSIZE_STDDEF_H
-#define _BITSIZE_STDDEF_H
-
-#define _SIZE_T
-#if (defined(__s390__) || defined(__hppa__) || defined(__cris__))
-typedef unsigned long size_t;
-#else
-typedef unsigned int size_t;
-#endif
-
-#define _PTRDIFF_T
-typedef signed int   ptrdiff_t;
-
-#endif /* _BITSIZE_STDDEF_H */
diff --git a/klibc/klibc/include/bits32/bitsize/stdint.h b/klibc/klibc/include/bits32/bitsize/stdint.h
deleted file mode 100644 (file)
index 40b4649..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * bits32/stdint.h
- */
-
-#ifndef _BITSIZE_STDINT_H
-#define _BITSIZE_STDINT_H
-
-typedef signed char            int8_t;
-typedef short int              int16_t;
-typedef int                    int32_t;
-typedef long long int          int64_t;
-
-typedef unsigned char          uint8_t;
-typedef unsigned short int     uint16_t;
-typedef unsigned int           uint32_t;
-typedef unsigned long long int uint64_t;
-
-typedef int                    int_fast16_t;
-typedef int                    int_fast32_t;
-
-typedef unsigned int           uint_fast16_t;
-typedef unsigned int           uint_fast32_t;
-
-typedef int                    intptr_t;
-typedef unsigned int           uintptr_t;
-
-#define __INT64_C(c)   c ## LL
-#define __UINT64_C(c)  c ## ULL
-
-#define __PRI64_RANK   "ll"
-#define __PRIFAST_RANK ""
-#define __PRIPTR_RANK  ""
-
-#endif /* _BITSIZE_STDINT_H */
diff --git a/klibc/klibc/include/bits32/bitsize/stdintconst.h b/klibc/klibc/include/bits32/bitsize/stdintconst.h
deleted file mode 100644 (file)
index 8157dd0..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * bits32/stdintconst.h
- */
-
-#ifndef _BITSIZE_STDINTCONST_H
-#define _BITSIZE_STDINTCONST_H
-
-#define INT_FAST16_C(c)         INT32_C(c)
-#define INT_FAST32_C(c)  INT32_C(c)
-
-#define UINT_FAST16_C(c) UINT32_C(c)
-#define UINT_FAST32_C(c) UINT32_C(c)
-
-#define INTPTR_C(c)     INT32_C(c)
-#define UINTPTR_C(c)    UINT32_C(c)
-#define PTRDIFF_C(c)     INT32_C(c)
-
-#endif /* _BITSIZE_STDINTCONST_H */
diff --git a/klibc/klibc/include/bits32/bitsize/stdintlimits.h b/klibc/klibc/include/bits32/bitsize/stdintlimits.h
deleted file mode 100644 (file)
index b44fe01..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * bits32/stdintlimits.h
- */
-
-#ifndef _BITSIZE_STDINTLIMITS_H
-#define _BITSIZE_STDINTLIMITS_H
-
-#define INT_FAST16_MIN INT32_MIN
-#define INT_FAST32_MIN INT32_MIN
-#define INT_FAST16_MAX INT32_MAX
-#define INT_FAST32_MAX INT32_MAX
-#define UINT_FAST16_MAX UINT32_MAX
-#define UINT_FAST32_MAX UINT32_MAX
-
-#define INTPTR_MIN     INT32_MIN
-#define INTPTR_MAX     INT32_MAX
-#define UINTPTR_MAX    UINT32_MAX
-
-#define PTRDIFF_MIN    INT32_MIN
-#define PTRDIFF_MAX    INT32_MAX
-
-#endif /* _BITSIZE_STDINTLIMITS_H */
diff --git a/klibc/klibc/include/bits64/bitsize/limits.h b/klibc/klibc/include/bits64/bitsize/limits.h
deleted file mode 100644 (file)
index 7b20da0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * bits64/limits.h
- */
-
-#ifndef _BITSIZE_LIMITS_H
-#define _BITSIZE_LIMITS_H
-
-#define LONG_BIT       64
-
-#define LONG_MIN       (-9223372036854775807L-1)
-#define LONG_MAX       9223372036854775807L
-#define ULONG_MAX      18446744073709551615UL
-
-#endif /* _BITSIZE_LIMITS_H */
diff --git a/klibc/klibc/include/bits64/bitsize/stddef.h b/klibc/klibc/include/bits64/bitsize/stddef.h
deleted file mode 100644 (file)
index 3e72621..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * bits64/stddef.h
- */
-
-#ifndef _BITSIZE_STDDEF_H
-#define _BITSIZE_STDDEF_H
-
-#define _SIZE_T
-typedef unsigned long size_t;
-#define _PTRDIFF_T
-typedef signed long   ptrdiff_t;
-
-#endif /* _BITSIZE_STDDEF_H */
diff --git a/klibc/klibc/include/bits64/bitsize/stdint.h b/klibc/klibc/include/bits64/bitsize/stdint.h
deleted file mode 100644 (file)
index f569f52..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * bits64/stdint.h
- */
-
-#ifndef _BITSIZE_STDINT_H
-#define _BITSIZE_STDINT_H
-
-typedef signed char            int8_t;
-typedef short int              int16_t;
-typedef int                    int32_t;
-typedef long long int          int64_t;
-
-typedef unsigned char          uint8_t;
-typedef unsigned short int     uint16_t;
-typedef unsigned int           uint32_t;
-typedef unsigned long int      uint64_t;
-
-typedef long int               int_fast16_t;
-typedef long int               int_fast32_t;
-
-typedef unsigned long int      uint_fast16_t;
-typedef unsigned long int      uint_fast32_t;
-
-typedef long int               intptr_t;
-typedef unsigned long int      uintptr_t;
-
-#define __INT64_C(c)  c ## L
-#define __UINT64_C(c) c ## UL
-
-#define __PRI64_RANK   "l"
-#define __PRIFAST_RANK  "l"
-#define __PRIPTR_RANK  "l"
-
-#endif /* _BITSIZE_STDINT_H */
-
-
diff --git a/klibc/klibc/include/bits64/bitsize/stdintconst.h b/klibc/klibc/include/bits64/bitsize/stdintconst.h
deleted file mode 100644 (file)
index 65f2db0..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * bits64/stdintconst.h
- */
-
-#ifndef _BITSIZE_STDINTCONST_H
-#define _BITSIZE_STDINTCONST_H
-
-#define INT_FAST16_C(c)         INT64_C(c)
-#define INT_FAST32_C(c)  INT64_C(c)
-
-#define UINT_FAST16_C(c) UINT64_C(c)
-#define UINT_FAST32_C(c) UINT64_C(c)
-
-#define INTPTR_C(c)     INT64_C(c)
-#define UINTPTR_C(c)    UINT64_C(c)
-#define PTRDIFF_C(c)     INT64_C(c)
-
-#endif /* _BITSIZE_STDINTCONST_H */
diff --git a/klibc/klibc/include/bits64/bitsize/stdintlimits.h b/klibc/klibc/include/bits64/bitsize/stdintlimits.h
deleted file mode 100644 (file)
index d110d17..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * bits64/stdintlimits.h
- */
-
-#ifndef _BITSIZE_STDINTLIMITS_H
-#define _BITSIZE_STDINTLIMITS_H
-
-#define INT_FAST16_MIN INT64_MIN
-#define INT_FAST32_MIN INT64_MIN
-#define INT_FAST16_MAX INT64_MAX
-#define INT_FAST32_MAX INT64_MAX
-#define UINT_FAST16_MAX UINT64_MAX
-#define UINT_FAST32_MAX UINT64_MAX
-
-#define INTPTR_MIN     INT64_MIN
-#define INTPTR_MAX     INT64_MAX
-#define UINTPTR_MAX    UINT64_MAX
-
-#define PTRDIFF_MIN    INT64_MIN
-#define PTRDIFF_MAX    INT64_MAX
-
-#endif /* _BITSIZE_STDINTLIMITS_H */
diff --git a/klibc/klibc/include/ctype.h b/klibc/klibc/include/ctype.h
deleted file mode 100644 (file)
index 3f5cfad..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * ctype.h
- *
- * This assumes ISO 8859-1, being a reasonable superset of ASCII.
- */
-
-#ifndef _CTYPE_H
-#define _CTYPE_H
-
-#ifndef __CTYPE_NO_INLINE
-# define __ctype_inline extern __inline__
-#else
-# define __ctype_inline
-#endif
-
-/*
- * This relies on the following definitions:
- *
- * cntrl = !print
- * alpha = upper|lower
- * graph = punct|alpha|digit
- * blank = '\t' || ' ' (per POSIX requirement)
- */
-enum {
-  __ctype_upper  = (1 << 0),
-  __ctype_lower  = (1 << 1),
-  __ctype_digit  = (1 << 2),
-  __ctype_xdigit = (1 << 3),
-  __ctype_space  = (1 << 4),
-  __ctype_print  = (1 << 5),
-  __ctype_punct  = (1 << 6)
-};
-
-extern const unsigned char __ctypes[];
-
-__ctype_inline int isalnum(int __c)
-{
-  return __ctypes[__c+1] &
-    (__ctype_upper|__ctype_lower|__ctype_digit);
-}
-
-__ctype_inline int isalpha(int __c)
-{
-  return __ctypes[__c+1] &
-    (__ctype_upper|__ctype_lower);
-}
-
-__ctype_inline int isascii(int __c)
-{
-  return !(__c & ~0x7f);
-}
-
-__ctype_inline int isblank(int __c)
-{
-  return (__c == '\t') || (__c == ' ');
-}
-
-__ctype_inline int iscntrl(int __c)
-{
-  return (__c >= 0) && !(__ctypes[__c+1] & __ctype_print);
-}
-
-__ctype_inline int isdigit(int __c)
-{
-  return __ctypes[__c+1] & __ctype_digit;
-}
-
-__ctype_inline int isgraph(int __c)
-{
-  return __ctypes[__c+1] &
-    (__ctype_upper|__ctype_lower|__ctype_digit|__ctype_punct);
-}
-
-__ctype_inline int islower(int __c)
-{
-  return __ctypes[__c+1] & __ctype_lower;
-}
-
-__ctype_inline int isprint(int __c)
-{
-  return __ctypes[__c+1] & __ctype_print;
-}
-
-__ctype_inline int ispunct(int __c)
-{
-  return __ctypes[__c+1] & __ctype_punct;
-}
-
-__ctype_inline int isspace(int __c)
-{
-  return __ctypes[__c+1] & __ctype_space;
-}
-
-__ctype_inline int isupper(int __c)
-{
-  return __ctypes[__c+1] & __ctype_upper;
-}
-
-__ctype_inline int isxdigit(int __c)
-{
-  return __ctypes[__c+1] & __ctype_xdigit;
-}
-
-/* Note: this is decimal, not hex, to avoid accidental promotion to unsigned */
-#define _toupper(__c) ((__c) & ~32)
-#define _tolower(__c) ((__c) | 32)
-
-__ctype_inline int toupper(int __c)
-{
-  return islower(__c) ? _toupper(__c) : __c;
-}
-
-__ctype_inline int tolower(int __c)
-{
-  return isupper(__c) ? _tolower(__c) : __c;
-}
-
-#endif /* _CTYPE_H */
diff --git a/klibc/klibc/include/dirent.h b/klibc/klibc/include/dirent.h
deleted file mode 100644 (file)
index 10dd138..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * dirent.h
- */
-
-#ifndef _DIRENT_H
-#define _DIRENT_H
-
-#include <klibc/extern.h>
-#include <sys/dirent.h>
-
-#ifndef __IO_DIR_DEFINED
-struct _IO_dir;
-#endif
-typedef struct _IO_dir DIR;
-
-__extern DIR *opendir(const char *);
-__extern struct dirent *readdir(DIR *);
-__extern int closedir(DIR *);
-
-#endif /* _DIRENT_H */
diff --git a/klibc/klibc/include/elf.h b/klibc/klibc/include/elf.h
deleted file mode 100644 (file)
index 52f47d0..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * elf.h
- */
-
-#ifndef _ELF_H
-#define _ELF_H
-
-#include <sys/elf32.h>
-#include <sys/elf64.h>
-
-#endif /* _ELF_H */
-
diff --git a/klibc/klibc/include/endian.h b/klibc/klibc/include/endian.h
deleted file mode 100644 (file)
index 44f89cc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * endian.h
- */
-
-#ifndef _ENDIAN_H
-#define _ENDIAN_H
-
-#include <klibc/compiler.h>
-#include <asm/byteorder.h>
-
-/* Linux' asm/byteorder.h defines either __LITTLE_ENDIAN or
-   __BIG_ENDIAN, but the glibc/BSD-ish macros expect both to be
-   defined with __BYTE_ORDER defining which is actually used... */
-
-#if defined(__LITTLE_ENDIAN)
-# undef  __LITTLE_ENDIAN
-# define __LITTLE_ENDIAN 1234
-# define __BIG_ENDIAN    4321
-# define __PDP_ENDIAN    3412
-# define __BYTE_ORDER    __LITTLE_ENDIAN
-#elif defined(__BIG_ENDIAN)
-# undef  __BIG_ENDIAN
-# define __LITTLE_ENDIAN 1234
-# define __BIG_ENDIAN    4321
-# define __PDP_ENDIAN    3412
-# define __BYTE_ORDER    __BIG_ENDIAN
-#elif defined(__PDP_ENDIAN)
-# undef  __PDP_ENDIAN
-# define __LITTLE_ENDIAN 1234
-# define __BIG_ENDIAN    4321
-# define __PDP_ENDIAN    3412
-# define __BYTE_ORDER    __PDP_ENDIAN
-#else
-# error "Unknown byte order!"
-#endif
-
-#define LITTLE_ENDIAN  __LITTLE_ENDIAN
-#define BIG_ENDIAN     __BIG_ENDIAN
-#define PDP_ENDIAN     __PDP_ENDIAN
-#define BYTE_ORDER     __BYTE_ORDER
-
-#endif /* _ENDIAN_H */
diff --git a/klibc/klibc/include/errno.h b/klibc/klibc/include/errno.h
deleted file mode 100644 (file)
index b2e6665..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- * errno.h
- */
-
-#include <klibc/extern.h>
-#include <asm/errno.h>
-
-__extern int errno;
diff --git a/klibc/klibc/include/fcntl.h b/klibc/klibc/include/fcntl.h
deleted file mode 100644 (file)
index e90959c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * fcntl.h
- */
-
-#ifndef _FCNTL_H
-#define _FCNTL_H
-
-#include <sys/types.h>
-#include <linux/fcntl.h>
-
-#endif /* _FCNTL_H */
diff --git a/klibc/klibc/include/grp.h b/klibc/klibc/include/grp.h
deleted file mode 100644 (file)
index 03ceb31..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * grp.h
- */
-
-#ifndef _GRP_H
-#define _GRP_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-
-__extern int setgroups(size_t, const gid_t *);
-
-#endif /* _GRP_H */
diff --git a/klibc/klibc/include/inttypes.h b/klibc/klibc/include/inttypes.h
deleted file mode 100644 (file)
index e00fa63..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * inttypes.h
- */
-
-#ifndef _INTTYPES_H
-#define _INTTYPES_H
-
-#include <klibc/extern.h>
-#include <stdint.h>
-#include <stddef.h>
-
-static __inline__ intmax_t imaxabs(intmax_t __n)
-{
-  return (__n < (intmax_t)0) ? -__n : __n;
-}
-
-__extern intmax_t strtoimax(const char *, char **, int);
-__extern uintmax_t strtoumax(const char *, char **, int);
-
-/* extensions */
-__extern intmax_t strntoimax(const char *, char **, int, size_t);
-__extern uintmax_t strntoumax(const char *, char **, int, size_t);
-
-#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
-
-#define PRId8  "d"
-#define PRId16 "d"
-#define PRId32 "d"
-#define PRId64 __PRI64_RANK "d"
-
-#define PRIdLEAST8     "d"
-#define PRIdLEAST16    "d"
-#define PRIdLEAST32    "d"
-#define PRIdLEAST64    __PRI64_RANK "d"
-
-#define PRIdFAST8      "d"
-#define PRIdFAST16     __PRIFAST_RANK "d"
-#define PRIdFAST32     __PRIFAST_RANK "d"
-#define PRIdFAST64     __PRI64_RANK "d"
-
-#define PRIdMAX         __PRI64_RANK "d"
-#define PRIdPTR  __PRIPTR_RANK "d"
-
-#define PRIi8  "i"
-#define PRIi16 "i"
-#define PRIi32 "i"
-#define PRIi64 __PRI64_RANK "i"
-
-#define PRIiLEAST8     "i"
-#define PRIiLEAST16    "i"
-#define PRIiLEAST32    "i"
-#define PRIiLEAST64    __PRI64_RANK "i"
-
-#define PRIiFAST8      "i"
-#define PRIiFAST16     __PRIFAST_RANK "i"
-#define PRIiFAST32     __PRIFAST_RANK "i"
-#define PRIiFAST64     __PRI64_RANK "i"
-
-#define PRIiMAX         __PRI64_RANK "i"
-#define PRIiPTR  __PRIPTR_RANK "i"
-
-#define PRIo8  "o"
-#define PRIo16 "o"
-#define PRIo32 "o"
-#define PRIo64 __PRI64_RANK "o"
-
-#define PRIoLEAST8     "o"
-#define PRIoLEAST16    "o"
-#define PRIoLEAST32    "o"
-#define PRIoLEAST64    __PRI64_RANK "o"
-
-#define PRIoFAST8      "o"
-#define PRIoFAST16     __PRIFAST_RANK "o"
-#define PRIoFAST32     __PRIFAST_RANK "o"
-#define PRIoFAST64     __PRI64_RANK "o"
-
-#define PRIoMAX         __PRI64_RANK "o"
-#define PRIoPTR  __PRIPTR_RANK "o"
-
-#define PRIu8  "u"
-#define PRIu16 "u"
-#define PRIu32 "u"
-#define PRIu64 __PRI64_RANK "u"
-
-#define PRIuLEAST8     "u"
-#define PRIuLEAST16    "u"
-#define PRIuLEAST32    "u"
-#define PRIuLEAST64    __PRI64_RANK "u"
-
-#define PRIuFAST8      "u"
-#define PRIuFAST16     __PRIFAST_RANK "u"
-#define PRIuFAST32     __PRIFAST_RANK "u"
-#define PRIuFAST64     __PRI64_RANK "u"
-
-#define PRIuMAX         __PRI64_RANK "u"
-#define PRIuPTR  __PRIPTR_RANK "u"
-
-#define PRIx8  "x"
-#define PRIx16 "x"
-#define PRIx32 "x"
-#define PRIx64 __PRI64_RANK "x"
-
-#define PRIxLEAST8     "x"
-#define PRIxLEAST16    "x"
-#define PRIxLEAST32    "x"
-#define PRIxLEAST64    __PRI64_RANK "x"
-
-#define PRIxFAST8      "x"
-#define PRIxFAST16     __PRIFAST_RANK "x"
-#define PRIxFAST32     __PRIFAST_RANK "x"
-#define PRIxFAST64     __PRI64_RANK "x"
-
-#define PRIxMAX         __PRI64_RANK "x"
-#define PRIxPTR  __PRIPTR_RANK "x"
-
-#define PRIX8  "X"
-#define PRIX16 "X"
-#define PRIX32 "X"
-#define PRIX64 __PRI64_RANK "X"
-
-#define PRIXLEAST8     "X"
-#define PRIXLEAST16    "X"
-#define PRIXLEAST32    "X"
-#define PRIXLEAST64    __PRI64_RANK "X"
-
-#define PRIXFAST8      "X"
-#define PRIXFAST16     __PRIFAST_RANK "X"
-#define PRIXFAST32     __PRIFAST_RANK "X"
-#define PRIXFAST64     __PRI64_RANK "X"
-
-#define PRIXMAX         __PRI64_RANK "X"
-#define PRIXPTR  __PRIPTR_RANK "X"
-
-#define SCNd8  "hhd"
-#define SCNd16 "hd"
-#define SCNd32 "d"
-#define SCNd64 __PRI64_RANK "d"
-
-#define SCNdLEAST8     "hhd"
-#define SCNdLEAST16    "hd"
-#define SCNdLEAST32    "d"
-#define SCNdLEAST64    __PRI64_RANK "d"
-
-#define SCNdFAST8      "hhd"
-#define SCNdFAST16     __PRIFAST_RANK "d"
-#define SCNdFAST32     __PRIFAST_RANK "d"
-#define SCNdFAST64     __PRI64_RANK "d"
-
-#define SCNdMAX         __PRI64_RANK "d"
-#define SCNdPTR  __PRIPTR_RANK "d"
-
-#define SCNi8  "hhi"
-#define SCNi16 "hi"
-#define SCNi32 "i"
-#define SCNi64 __PRI64_RANK "i"
-
-#define SCNiLEAST8     "hhi"
-#define SCNiLEAST16    "hi"
-#define SCNiLEAST32    "i"
-#define SCNiLEAST64    __PRI64_RANK "i"
-
-#define SCNiFAST8      "hhi"
-#define SCNiFAST16     __PRIFAST_RANK "i"
-#define SCNiFAST32     __PRIFAST_RANK "i"
-#define SCNiFAST64     __PRI64_RANK "i"
-
-#define SCNiMAX         __PRI64_RANK "i"
-#define SCNiPTR  __PRIPTR_RANK "i"
-
-#define SCNo8  "hho"
-#define SCNo16 "ho"
-#define SCNo32 "o"
-#define SCNo64 __PRI64_RANK "o"
-
-#define SCNoLEAST8     "hho"
-#define SCNoLEAST16    "ho"
-#define SCNoLEAST32    "o"
-#define SCNoLEAST64    __PRI64_RANK "o"
-
-#define SCNoFAST8      "hho"
-#define SCNoFAST16     __PRIFAST_RANK "o"
-#define SCNoFAST32     __PRIFAST_RANK "o"
-#define SCNoFAST64     __PRI64_RANK "o"
-
-#define SCNoMAX         __PRI64_RANK "o"
-#define SCNoPTR  __PRIPTR_RANK "o"
-
-#define SCNu8  "hhu"
-#define SCNu16 "hu"
-#define SCNu32 "u"
-#define SCNu64 __PRI64_RANK "u"
-
-#define SCNuLEAST8     "hhu"
-#define SCNuLEAST16    "hu"
-#define SCNuLEAST32    "u"
-#define SCNuLEAST64    __PRI64_RANK "u"
-
-#define SCNuFAST8      "hhu"
-#define SCNuFAST16     __PRIFAST_RANK "u"
-#define SCNuFAST32     __PRIFAST_RANK "u"
-#define SCNuFAST64     __PRI64_RANK "u"
-
-#define SCNuMAX         __PRI64_RANK "u"
-#define SCNuPTR  __PRIPTR_RANK "u"
-
-#define SCNx8  "hhx"
-#define SCNx16 "hx"
-#define SCNx32 "x"
-#define SCNx64 __PRI64_RANK "x"
-
-#define SCNxLEAST8     "hhx"
-#define SCNxLEAST16    "hx"
-#define SCNxLEAST32    "x"
-#define SCNxLEAST64    __PRI64_RANK "x"
-
-#define SCNxFAST8      "hhx"
-#define SCNxFAST16     __PRIFAST_RANK "x"
-#define SCNxFAST32     __PRIFAST_RANK "x"
-#define SCNxFAST64     __PRI64_RANK "x"
-
-#define SCNxMAX         __PRI64_RANK "x"
-#define SCNxPTR  __PRIPTR_RANK "x"
-
-#endif
-
-#endif /* _INTTYPES_H */
diff --git a/klibc/klibc/include/klibc/compiler.h b/klibc/klibc/include/klibc/compiler.h
deleted file mode 100644 (file)
index 6c01474..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * klibc/compiler.h
- *
- * Various compiler features
- */
-
-#ifndef _KLIBC_COMPILER_H
-#define _KLIBC_COMPILER_H
-
-/* Specific calling conventions */
-/* __cdecl is used when we want varadic and non-varadic functions to have
-   the same binary calling convention. */
-#ifdef __i386__
-# ifdef __GNUC__
-#  define __cdecl __attribute__((cdecl,regparm(0)))
-# else
-  /* Most other C compilers have __cdecl as a keyword */
-# endif
-#else
-# define __cdecl               /* Meaningless on non-i386 */
-#endif
-
-/* How to declare a function that *must* be inlined */
-#ifdef __GNUC__
-# if __GNUC_MAJOR__ >= 3
-#  define __must_inline static __inline__ __attribute__((always_inline))
-# else
-#  define __must_inline extern __inline__
-# endif
-#else
-# define __must_inline inline  /* Just hope this works... */
-#endif
-
-/* How to declare a function that does not return */
-#ifdef __GNUC__
-# define __noreturn void __attribute__((noreturn))
-#else
-# define __noreturn void
-#endif
-
-/* How to declare a "constant" function (a function in the
-   mathematical sense) */
-#ifdef __GNUC__
-# define __constfunc __attribute__((const))
-#else
-# define __constfunc
-#endif
-
-/* Format attribute */
-#ifdef __GNUC__
-# define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
-#else
-# define __formatfunc(t,f,a)
-#endif
-
-/* likely/unlikely */
-#if defined(__GNUC__) && (__GNUC_MAJOR__ > 2 || (__GNUC_MAJOR__ == 2 && __GNUC_MINOR__ >= 95))
-# define __likely(x)   __builtin_expect((x), 1)
-# define __unlikely(x) __builtin_expect((x), 0)
-#else
-# define __likely(x)   (x)
-# define __unlikely(x) (x)
-#endif
-
-/* Possibly unused function */
-#ifdef __GNUC__
-# define __unusedfunc  __attribute__((unused))
-#else
-# define __unusedfunc
-#endif
-
-/* "pure" function:
-
-     Many functions have no effects except the return value and their
-     return value depends only on the parameters and/or global
-     variables.  Such a function can be subject to common subexpression
-     elimination and loop optimization just as an arithmetic operator
-     would be.  These functions should be declared with the attribute
-     `pure'.
-*/
-#ifdef __GNUC__
-# define __attribute_pure__    __attribute__((pure))
-#else
-# define __attribute_pure__
-#endif
-
-/* "const" function:
-
-     Many functions do not examine any values except their arguments,
-     and have no effects except the return value.  Basically this is
-     just slightly more strict class than the `pure' attribute above,
-     since function is not allowed to read global memory.
-
-     Note that a function that has pointer arguments and examines the
-     data pointed to must _not_ be declared `const'.  Likewise, a
-     function that calls a non-`const' function usually must not be
-     `const'.  It does not make sense for a `const' function to return
-     `void'.
-*/
-#ifdef __GNUC__
-# define __attribute_const__   __attribute__((const))
-#else
-# define __attribute_const__
-#endif
-
-#endif
diff --git a/klibc/klibc/include/klibc/diverr.h b/klibc/klibc/include/klibc/diverr.h
deleted file mode 100644 (file)
index 4d8c8d3..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * klibc/diverr.h
- */
-
-#ifndef _KLIBC_DIVERR_H
-#define _KLIBC_DIVERR_H
-
-#include <signal.h>
-
-static __inline__ void
-__divide_error(void)
-{
-  raise(SIGFPE);
-}
-
-#endif /* _KLIBC_DIVERR_H */
diff --git a/klibc/klibc/include/klibc/extern.h b/klibc/klibc/include/klibc/extern.h
deleted file mode 100644 (file)
index f9c3467..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * klibc/extern.h
- */
-
-#ifndef _KLIBC_EXTERN_H
-#define _KLIBC_EXTERN_H
-
-#ifdef __cplusplus
-#define __extern extern "C"
-#else
-#define __extern extern
-#endif
-
-#endif /* _KLIBC_EXTERN_H */
diff --git a/klibc/klibc/include/limits.h b/klibc/klibc/include/limits.h
deleted file mode 100644 (file)
index f1532e5..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * limits.h
- */
-
-#ifndef _LIMITS_H
-#define _LIMITS_H
-
-#define CHAR_BIT       8
-#define SHRT_BIT       16
-#define INT_BIT                32
-#define LONGLONG_BIT   64
-
-#define SCHAR_MIN      (-128)
-#define SCHAR_MAX      127
-#define UCHAR_MAX      255
-
-#ifdef __CHAR_UNSIGNED__
-# define CHAR_MIN 0
-# define CHAR_MAX UCHAR_MAX
-#else
-# define CHAR_MIN SCHAR_MIN
-# define CHAR_MAX SCHAR_MAX
-#endif
-
-#define SHRT_MIN       (-32768)
-#define SHRT_MAX       32767
-#define USHRT_MAX      65535
-
-#define INT_MIN                (-2147483647-1)
-#define INT_MAX                2147483647
-#define UINT_MAX       4294967295U
-
-#define LONGLONG_MIN   (-9223372036854775807LL-1)
-#define LONGLONG_MAX   9223372036854775807LL
-#define ULONGLONG_MAX  18446744073709551615ULL
-
-#include <bitsize/limits.h>
-#include <linux/limits.h>
-
-#endif /* _LIMITS_H */
diff --git a/klibc/klibc/include/net/if.h b/klibc/klibc/include/net/if.h
deleted file mode 100644 (file)
index 1aa8e7b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/if.h>
diff --git a/klibc/klibc/include/net/if_arp.h b/klibc/klibc/include/net/if_arp.h
deleted file mode 100644 (file)
index a25f1b4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/if_arp.h>
diff --git a/klibc/klibc/include/net/if_ether.h b/klibc/klibc/include/net/if_ether.h
deleted file mode 100644 (file)
index 060ef22..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/if_ether.h>
diff --git a/klibc/klibc/include/net/if_packet.h b/klibc/klibc/include/net/if_packet.h
deleted file mode 100644 (file)
index b5e8e0e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <linux/if_packet.h>
diff --git a/klibc/klibc/include/netinet/in.h b/klibc/klibc/include/netinet/in.h
deleted file mode 100644 (file)
index 92dc843..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * netinet/in.h
- */
-
-#ifndef _NETINET_IN_H
-#define _NETINET_IN_H
-
-/* added this include by Mats Petersson */
-#include <linux/socket.h>
-
-#include <klibc/extern.h>
-#include <stdint.h>
-#include <endian.h>            /* Must be included *before* <linux/in.h> */
-#include <linux/in.h>
-
-#ifndef htons
-# define htons(x)      __cpu_to_be16(x)
-#endif
-#ifndef ntohs
-# define ntohs(x)      __be16_to_cpu(x)
-#endif
-#ifndef htonl
-# define htonl(x)      __cpu_to_be32(x)
-#endif
-#ifndef ntohl
-# define ntohl(x)      __be32_to_cpu(x)
-#endif
-
-#define IPPORT_RESERVED        1024
-
-__extern int bindresvport (int sd, struct sockaddr_in *sin);
-
-#endif /* _NETINET_IN_H */
diff --git a/klibc/klibc/include/netinet/in6.h b/klibc/klibc/include/netinet/in6.h
deleted file mode 100644 (file)
index 46584ca..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * netinet/in6.h
- */
-
-#ifndef _NETINET_IN6_H
-#define _NETINET_IN6_H
-
-#include <linux/in6.h>
-
-#endif /* _NETINET_IN6_H */
diff --git a/klibc/klibc/include/netinet/ip.h b/klibc/klibc/include/netinet/ip.h
deleted file mode 100644 (file)
index 8aecbe6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * netinet/ip.h
- */
-
-#ifndef _NETINET_IP_H
-#define _NETINET_IP_H
-
-#include <endian.h>
-#include <linux/ip.h>
-
-#define IP_DF          0x4000          /* Flag: "Don't Fragment" */
-
-#endif /* _NETINET_IP_H */
diff --git a/klibc/klibc/include/netinet/tcp.h b/klibc/klibc/include/netinet/tcp.h
deleted file mode 100644 (file)
index bb5d307..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * netinet/tcp.h
- */
-
-#ifndef _NETINET_TCP_H
-#define _NETINET_TCP_H
-
-#include <endian.h>            /* Include *before* linux/tcp.h */
-#include <linux/tcp.h>
-
-#endif /* _NETINET_TCP_H */
diff --git a/klibc/klibc/include/netinet/udp.h b/klibc/klibc/include/netinet/udp.h
deleted file mode 100644 (file)
index b809b4e..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * netinet/udp.h
- */
-
-#ifndef _NETINET_UDP_H
-#define _NETINET_UDP_H
-
-/*
- * We would include linux/udp.h, but it brings in too much other stuff
- */
-
-struct udphdr {
-       __u16   source;
-       __u16   dest;
-       __u16   len;
-       __u16   check;
-};
-
-#endif /* _NETINET_UDP_H */
diff --git a/klibc/klibc/include/poll.h b/klibc/klibc/include/poll.h
deleted file mode 100644 (file)
index 8710d92..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * poll.h
- */
-
-#ifndef _POLL_H
-#define _POLL_H
-
-#include <klibc/extern.h>
-#include <linux/poll.h>
-
-/* POSIX specifies "int" for the timeout, Linux seems to use long... */
-
-typedef unsigned int nfds_t;
-__extern int poll(struct pollfd *, nfds_t, long);
-
-#endif /* _POLL_H */
diff --git a/klibc/klibc/include/sched.h b/klibc/klibc/include/sched.h
deleted file mode 100644 (file)
index 5e61039..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * sched.h
- */
-
-#ifndef _SCHED_H
-#define _SCHED_H
-
-#include <klibc/extern.h>
-
-/* linux/sched.h is unusable; put the declarations we need here... */
-
-#define SCHED_NORMAL            0
-#define SCHED_FIFO              1
-#define SCHED_RR                2
-
-struct sched_param {
-  int sched_priority;
-};
-
-__extern int sched_setschedule(pid_t, int, const struct sched_param *);
-__extern int sched_yield(void);
-
-#endif /* _SCHED_H */
diff --git a/klibc/klibc/include/setjmp.h b/klibc/klibc/include/setjmp.h
deleted file mode 100644 (file)
index b504eb6..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * setjmp.h
- */
-
-#ifndef _SETJMP_H
-#define _SETJMP_H
-
-#include <klibc/extern.h>
-#include <klibc/compiler.h>
-#include <stddef.h>
-#include <signal.h>
-
-#include <klibc/archsetjmp.h>
-
-__extern int setjmp(jmp_buf);
-__extern __noreturn longjmp(jmp_buf, int);
-
-/*
-  Whose bright idea was it to add unrelated functionality to just about
-  the only function in the standard C library (setjmp) which cannot be
-  wrapped by an ordinary function wrapper?  Anyway, the damage is done,
-  and therefore, this wrapper *must* be inline.  However, gcc will
-  complain if this is an inline function for unknown reason, and
-  therefore sigsetjmp() needs to be a macro.
-*/
-
-struct __sigjmp_buf {
-  jmp_buf __jmpbuf;
-  sigset_t __sigs;
-};
-
-typedef struct __sigjmp_buf sigjmp_buf[1];
-
-#define sigsetjmp(__env, __save) \
-({ \
-  struct __sigjmp_buf *__e = (__env); \
-  sigprocmask(0, NULL, &__e->__sigs); \
-  setjmp(__e->__jmpbuf); \
-})
-
-__extern __noreturn siglongjmp(sigjmp_buf, int);
-
-#endif /* _SETJMP_H */
diff --git a/klibc/klibc/include/signal.h b/klibc/klibc/include/signal.h
deleted file mode 100644 (file)
index 513b4e5..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * signal.h
- */
-
-#ifndef _SIGNAL_H
-#define _SIGNAL_H
-
-#include <klibc/extern.h>
-#include <string.h>            /* For memset() */
-#include <limits.h>            /* For LONG_BIT */
-#include <sys/types.h>
-#include <asm/signal.h>
-
-#include <klibc/archsignal.h>
-
-/* glibc seems to use sig_atomic_t as "int" pretty much on all architectures.
-   Do the same, but allow the architecture to override. */
-#ifdef _KLIBC_HAS_ARCH_SIG_ATOMIC_T
-typedef int sig_atomic_t;
-#endif
-
-/* Some architectures don't define these */
-#ifndef SA_RESETHAND
-# define SA_RESETHAND SA_ONESHOT
-#endif
-#ifndef SA_NODEFER
-# define SA_NODEFER SA_NOMASK
-#endif
-#ifndef NSIG
-# define NSIG _NSIG
-#endif
-
-__extern const char * const sys_siglist[];
-
-/* This assumes sigset_t is either an unsigned long or an array of such,
-   and that _NSIG_BPW in the kernel is always LONG_BIT */
-
-static __inline__ int sigemptyset(sigset_t *__set)
-{
-  memset(__set, 0, sizeof *__set);
-  return 0;
-}
-static __inline__ int sigfillset(sigset_t *__set)
-{
-  memset(__set, ~0, sizeof *__set);
-  return 0;
-}
-static __inline__ int sigaddset(sigset_t *__set, int __signum)
-{
-  unsigned long *__lset = (unsigned long *)__set;
-  __lset[__signum/LONG_BIT] |= 1UL << (__signum%LONG_BIT);
-  return 0;
-}
-static __inline__ int sigdelset(sigset_t *__set, int __signum)
-{
-  unsigned long *__lset = (unsigned long *)__set;
-  __lset[__signum/LONG_BIT] &= ~(1UL << (__signum%LONG_BIT));
-  return 0;
-}
-static __inline__ int sigismember(sigset_t *__set, int __signum)
-{
-  unsigned long *__lset = (unsigned long *)__set;
-  return (int)((__lset[__signum/LONG_BIT] >> (__signum%LONG_BIT)) & 1);
-}
-
-__extern __sighandler_t __signal(int, __sighandler_t, int);
-__extern __sighandler_t sysv_signal(int, __sighandler_t);
-__extern __sighandler_t bsd_signal(int, __sighandler_t);
-__extern int sigaction(int, const struct sigaction *, struct sigaction *);
-__extern int sigprocmask(int, const sigset_t *, sigset_t *);
-__extern int sigpending(sigset_t *);
-__extern int sigsuspend(const sigset_t *);
-__extern int rt_sigaction(int, const struct sigaction *, struct sigaction *, size_t);
-__extern int rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t);
-__extern int rt_sigpending(sigset_t *, size_t);
-__extern int rt_sigsuspend(const sigset_t *, size_t);
-__extern int raise(int);
-__extern int kill(pid_t, int);
-
-#endif /* _SIGNAL_H */
diff --git a/klibc/klibc/include/stdarg.h b/klibc/klibc/include/stdarg.h
deleted file mode 100644 (file)
index cc324b8..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * stdarg.h
- *
- * This is just a wrapper for the gcc one, but defines va_copy()
- * even if gcc doesn't.
- */
-
-/* Note: the _STDARG_H macro belongs to the gcc header... */
-#include_next <stdarg.h>
-
-/* Older gcc considers this an extension, so it's double underbar only */
-#ifndef va_copy
-#define va_copy(d,s) __va_copy(d,s)
-#endif
diff --git a/klibc/klibc/include/stddef.h b/klibc/klibc/include/stddef.h
deleted file mode 100644 (file)
index 125d235..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * stddef.h
- */
-
-#ifndef _STDDEF_H
-#define _STDDEF_H
-
-#ifndef __KLIBC__
-# define __KLIBC__ 1
-#endif
-
-#include <bitsize/stddef.h>
-
-#undef NULL
-#ifdef __cplusplus
-# define NULL 0
-#else
-# define NULL ((void *)0)
-#endif
-
-#undef offsetof
-#define offsetof(t,m) ((size_t)&((t *)0)->m)
-
-#endif /* _STDDEF_H */
diff --git a/klibc/klibc/include/stdint.h b/klibc/klibc/include/stdint.h
deleted file mode 100644 (file)
index 47fec18..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * stdint.h
- */
-
-#ifndef _STDINT_H
-#define _STDINT_H
-
-#include <bitsize/stdint.h>
-
-typedef int8_t   int_least8_t;
-typedef int16_t  int_least16_t;
-typedef int32_t  int_least32_t;
-typedef int64_t  int_least64_t;
-
-typedef uint8_t  uint_least8_t;
-typedef uint16_t uint_least16_t;
-typedef uint32_t uint_least32_t;
-typedef uint64_t uint_least64_t;
-
-typedef int8_t   int_fast8_t;
-typedef int64_t  int_fast64_t;
-
-typedef uint8_t  uint_fast8_t;
-typedef uint64_t uint_fast64_t;
-
-typedef int64_t  intmax_t;
-typedef uint64_t uintmax_t;
-
-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)
-
-#define INT8_MIN       (-128)
-#define INT16_MIN      (-32768)
-#define INT32_MIN      (-2147483647-1)
-#define INT64_MIN      (__INT64_C(-9223372036854775807)-1)
-
-#define INT8_MAX       (127)
-#define INT16_MAX      (32767)
-#define INT32_MAX      (2147483647)
-#define INT64_MAX      (__INT64_C(9223372036854775807))
-
-#define UINT8_MAX      (255U)
-#define UINT16_MAX     (65535U)
-#define UINT32_MAX     (4294967295U)
-#define UINT64_MAX     (__UINT64_C(18446744073709551615))
-
-#define INT_LEAST8_MIN INT8_MIN
-#define INT_LEAST16_MIN        INT16_MIN
-#define INT_LEAST32_MIN        INT32_MIN
-#define INT_LEAST64_MIN        INT64_MIN
-
-#define INT_LEAST8_MAX INT8_MAX
-#define INT_LEAST16_MAX        INT16_MAX
-#define INT_LEAST32_MAX        INT32_MAX
-#define INT_LEAST64_MAX        INT64_MAX
-
-#define UINT_LEAST8_MAX         UINT8_MAX
-#define UINT_LEAST16_MAX UINT16_MAX
-#define UINT_LEAST32_MAX UINT32_MAX
-#define UINT_LEAST64_MAX UINT64_MAX
-
-#define INT_FAST8_MIN  INT8_MIN
-#define INT_FAST64_MIN INT64_MIN
-
-#define INT_FAST8_MAX  INT8_MAX
-#define INT_FAST64_MAX INT64_MAX
-
-#define UINT_FAST8_MAX UINT8_MAX
-#define UINT_FAST64_MAX UINT64_MAX
-
-#define INTMAX_MIN     INT64_MIN
-#define INTMAX_MAX     INT64_MAX
-#define UINTMAX_MAX    UINT64_MAX
-
-#include <bitsize/stdintlimits.h>
-
-#endif
-
-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
-
-#define INT8_C(c)      c
-#define INT16_C(c)     c
-#define INT32_C(c)     c
-#define INT64_C(c)     __INT64_C(c)
-
-#define UINT8_C(c)     c ## U
-#define UINT16_C(c)    c ## U
-#define UINT32_C(c)    c ## U
-#define UINT64_C(c)    __UINT64_C(c)
-
-#define INT_LEAST8_C(c)         INT8_C(c)
-#define INT_LEAST16_C(c) INT16_C(c)
-#define INT_LEAST32_C(c) INT32_C(c)
-#define INT_LEAST64_C(c) INT64_C(c)
-
-#define UINT_LEAST8_C(c)  UINT8_C(c)
-#define UINT_LEAST16_C(c) UINT16_C(c)
-#define UINT_LEAST32_C(c) UINT32_C(c)
-#define UINT_LEAST64_C(c) UINT64_C(c)
-
-#define INT_FAST8_C(c) INT8_C(c)
-#define INT_FAST64_C(c) INT64_C(c)
-
-#define UINT_FAST8_C(c)  UINT8_C(c)
-#define UINT_FAST64_C(c) UINT64_C(c)
-
-#define INTMAX_C(c)    INT64_C(c)
-#define UINTMAX_C(c)   UINT64_C(c)
-
-#include <bitsize/stdintconst.h>
-
-#endif
-
-/* Keep the kernel from trying to define these types... */
-#define __BIT_TYPES_DEFINED__
-
-#endif /* _STDINT_H */
diff --git a/klibc/klibc/include/stdio.h b/klibc/klibc/include/stdio.h
deleted file mode 100644 (file)
index fba1e30..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * stdio.h
- */
-
-#ifndef _STDIO_H
-#define _STDIO_H
-
-#include <klibc/extern.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <unistd.h>
-
-/* This structure doesn't really exist, but it gives us something
-   to define FILE * with */
-struct _IO_file;
-typedef struct _IO_file FILE;
-
-#ifndef EOF
-# define EOF (-1)
-#endif
-
-#ifndef BUFSIZ
-# define BUFSIZ 4096
-#endif
-
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-
-/*
- * Convert between a FILE * and a file descriptor.  We don't actually
- * have any in-memory data, so we just abuse the pointer itself to
- * hold the data.  Note, however, that for file descriptors, -1 is
- * error and 0 is a valid value; for FILE *, NULL (0) is error and
- * non-NULL are valid.
- */
-static __inline__ int fileno(FILE *__f)
-{
-  /* This should really be intptr_t, but size_t should be the same size */
-  return (int)(size_t)__f - 1;
-}
-
-/* This is a macro so it can be used as initializer */
-#define __create_file(__fd) ((FILE *)(size_t)((__fd) + 1))
-
-#define stdin  __create_file(0)
-#define stdout __create_file(1)
-#define stderr __create_file(2)
-
-__extern FILE *fopen(const char *, const char *);
-
-static __inline__ FILE *fdopen(int __fd, const char *__m)
-{
-  (void)__m; return __create_file(__fd);
-}
-static __inline__ int fclose(FILE *__f)
-{
-  extern int close(int);
-  return close(fileno(__f));
-}
-static __inline__ int fseek(FILE *__f, off_t __o, int __w)
-{
-  extern off_t lseek(int, off_t, int);
-  return (lseek(fileno(__f), __o, __w) == (off_t)-1) ? -1 : 0;
-}
-static __inline__ off_t ftell(FILE *__f)
-{
-  extern off_t lseek(int, off_t, int);
-  return lseek(fileno(__f), 0, SEEK_CUR);
-}
-
-__extern int fputs(const char *, FILE *);
-__extern int puts(const char *);
-__extern int fputc(int, FILE *);
-#define putc(c,f)  fputc((c),(f))
-#define putchar(c) fputc((c),stdout)
-
-__extern int    fgetc(FILE *);
-__extern char * fgets(char *, int, FILE *);
-#define getc(f) fgetc(f)
-
-__extern size_t _fread(void *, size_t, FILE *);
-__extern size_t _fwrite(const void *, size_t, FILE *);
-
-#ifndef __NO_FREAD_FWRITE_INLINES
-extern __inline__ size_t
-fread(void *__p, size_t __s, size_t __n, FILE *__f)
-{
-  return _fread(__p, __s*__n, __f)/__s;
-}
-
-extern __inline__ size_t
-fwrite(void *__p, size_t __s, size_t __n, FILE *__f)
-{
-  return _fwrite(__p, __s*__n, __f)/__s;
-}
-#endif
-
-__extern int printf(const char *, ...);
-__extern int vprintf(const char *, va_list);
-__extern int fprintf(FILE *, const char *, ...);
-__extern int vfprintf(FILE *, const char *, va_list);
-__extern int sprintf(char *, const char *, ...);
-__extern int vsprintf(char *, const char *, va_list);
-__extern int snprintf(char *, size_t n, const char *, ...);
-__extern int vsnprintf(char *, size_t n, const char *, va_list);
-
-__extern int sscanf(const char *, const char *, ...);
-__extern int vsscanf(const char *, const char *, va_list);
-
-__extern void perror(const char *);
-
-__extern int rename(const char *, const char *);
-
-#endif /* _STDIO_H */
diff --git a/klibc/klibc/include/stdlib.h b/klibc/klibc/include/stdlib.h
deleted file mode 100644 (file)
index af97eea..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * stdlib.h
- */
-
-#ifndef _STDLIB_H
-#define _STDLIB_H
-
-#include <klibc/extern.h>
-#include <klibc/compiler.h>
-#include <stddef.h>
-
-#define EXIT_FAILURE 1
-#define EXIT_SUCCESS 0
-
-static __inline__ __noreturn _Exit(int __n) {
-  __extern __noreturn _exit(int);
-  _exit(__n);
-  for(;;);                     /* Some gcc versions are stupid */
-}
-__extern __noreturn abort(void);
-static __inline__ int abs(int __n) {
-  return (__n < 0) ? -__n : __n;
-}
-__extern int atexit(void (*)(void));
-__extern int on_exit(void (*)(int, void *), void *);
-__extern int atoi(const char *);
-__extern long atol(const char *);
-__extern long long atoll(const char *);
-__extern __noreturn exit(int);
-__extern void free(void *);
-static __inline__ long labs(long __n) {
-  return (__n < 0L) ? -__n : __n;
-}
-
-static __inline__ long long llabs(long long __n) {
-  return (__n < 0LL) ? -__n : __n;
-}
-
-#if defined(__GNUC__) && __GNUC_MAJOR__ >= 3
-# define __attribute_malloc __attribute__((malloc))
-#else
-# define __attribute_malloc
-#endif
-
-__extern __attribute_malloc void *malloc(size_t);
-__extern __attribute_malloc void *calloc(size_t, size_t);
-__extern void *realloc(void *, size_t);
-__extern long strtol(const char *, char **, int);
-__extern long long strtoll(const char *, char **, int);
-__extern unsigned long strtoul(const char *, char **, int);
-__extern unsigned long long strtoull(const char *, char **, int);
-
-__extern char *getenv(const char *);
-__extern int putenv(const char *);
-__extern int setenv(const char *, const char *, int);
-__extern int unsetenv(const char *);
-
-__extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
-
-
-__extern long jrand48(unsigned short *);
-__extern long mrand48(void);
-__extern long nrand48(unsigned short *);
-__extern long lrand48(void);
-__extern unsigned short *seed48(const unsigned short *);
-__extern void srand48(long);
-
-#define RAND_MAX 0x7fffffff
-static __inline__ int rand(void) {
-  return (int)lrand48();
-}
-static __inline__ void srand(unsigned int __s) {
-  srand48(__s);
-}
-static __inline__ long random(void)
-{
-  return lrand48();
-}
-static __inline__ void srandom(unsigned int __s)
-{
-  srand48(__s);
-}
-
-/* Basic PTY functions.  These only work if devpts is mounted! */
-
-__extern int unlockpt(int);
-__extern char *ptsname(int);
-__extern int getpt(void);
-
-static __inline__ int grantpt(int __fd)
-{
-  (void)__fd;
-  return 0;                    /* devpts does this all for us! */
-}
-
-#endif /* _STDLIB_H */
diff --git a/klibc/klibc/include/string.h b/klibc/klibc/include/string.h
deleted file mode 100644 (file)
index 1debb55..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * string.h
- */
-
-#ifndef _STRING_H
-#define _STRING_H
-
-#include <klibc/extern.h>
-#include <stddef.h>
-
-__extern void *memccpy(void *, const void *, int, size_t);
-__extern void *memchr(const void *, int, size_t);
-__extern int memcmp(const void *, const void *, size_t);
-__extern void *memcpy(void *, const void *, size_t);
-__extern void *memmove(void *, const void *, size_t);
-__extern void *memset(void *, int, size_t);
-__extern void *memmem(const void *, size_t, const void *, size_t);
-__extern void memswap(void *, void *, size_t);
-__extern int strcasecmp(const char *, const char *);
-__extern int strncasecmp(const char *, const char *, size_t);
-__extern char *strcat(char *, const char *);
-__extern char *strchr(const char *, int);
-__extern int strcmp(const char *, const char *);
-__extern char *strcpy(char *, const char *);
-__extern size_t strcspn(const char *, const char *);
-__extern char *strdup(const char *);
-__extern char *strndup(const char *, size_t);
-__extern char *strerror(int);
-__extern size_t strlen(const char *);
-__extern char *strncat(char *, const char *, size_t);
-__extern int strncmp(const char *, const char *, size_t);
-__extern char *strncpy(char *, const char *, size_t);
-__extern char *strpbrk(const char *, const char *);
-__extern char *strrchr(const char *, int);
-__extern char *strsep(char **, const char *);
-__extern size_t strspn(const char *, const char *);
-__extern char *strstr(const char *, const char *);
-__extern char *strtok(char *, const char *);
-
-#endif /* _STRING_H */
diff --git a/klibc/klibc/include/sys/dirent.h b/klibc/klibc/include/sys/dirent.h
deleted file mode 100644 (file)
index 0700f4b..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * sys/dirent.h
- */
-
-#ifndef _SYS_DIRENT_H
-#define _SYS_DIRENT_H
-
-#include <sys/types.h>
-#include <linux/dirent.h>
-
-__extern int getdents(unsigned int, struct dirent *, unsigned int);
-
-#endif /* _SYS_DIRENT_H */
diff --git a/klibc/klibc/include/sys/elf32.h b/klibc/klibc/include/sys/elf32.h
deleted file mode 100644 (file)
index 652de5b..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * sys/elf32.h
- */
-
-#ifndef _SYS_ELF32_H
-#define _SYS_ELF32_H
-
-#include <sys/elfcommon.h>
-
-/* ELF standard typedefs (yet more proof that <stdint.h> was way overdue) */
-typedef uint16_t  Elf32_Half;
-typedef int16_t   Elf32_SHalf;
-typedef uint32_t  Elf32_Word;
-typedef int32_t   Elf32_Sword;
-typedef uint64_t  Elf32_Xword;
-typedef int64_t   Elf32_Sxword;
-
-typedef uint32_t  Elf32_Off;
-typedef uint32_t  Elf32_Addr;
-typedef uint16_t  Elf32_Section;
-
-/* Dynamic header */
-
-typedef struct elf32_dyn {
-  Elf32_Sword d_tag;
-  union{
-    Elf32_Sword d_val;
-    Elf32_Addr  d_ptr;
-  } d_un;
-} Elf32_Dyn;
-
-/* Relocations */
-
-#define ELF32_R_SYM(x) ((x) >> 8)
-#define ELF32_R_TYPE(x)        ((x) & 0xff)
-
-typedef struct elf32_rel {
-  Elf32_Addr    r_offset;
-  Elf32_Word    r_info;
-} Elf32_Rel;
-
-typedef struct elf32_rela {
-  Elf32_Addr    r_offset;
-  Elf32_Word    r_info;
-  Elf32_Sword   r_addend;
-} Elf32_Rela;
-
-/* Symbol */
-
-typedef struct elf32_sym {
-  Elf32_Word    st_name;
-  Elf32_Addr    st_value;
-  Elf32_Word    st_size;
-  unsigned char st_info;
-  unsigned char st_other;
-  Elf32_Half    st_shndx;
-} Elf32_Sym;
-
-/* Main file header */
-
-typedef struct elf32_hdr {
-  unsigned char e_ident[EI_NIDENT];
-  Elf32_Half    e_type;
-  Elf32_Half    e_machine;
-  Elf32_Word    e_version;
-  Elf32_Addr    e_entry;
-  Elf32_Off     e_phoff;
-  Elf32_Off     e_shoff;
-  Elf32_Word    e_flags;
-  Elf32_Half    e_ehsize;
-  Elf32_Half    e_phentsize;
-  Elf32_Half    e_phnum;
-  Elf32_Half    e_shentsize;
-  Elf32_Half    e_shnum;
-  Elf32_Half    e_shstrndx;
-} Elf32_Ehdr;
-
-/* Program header */
-
-typedef struct elf32_phdr {
-  Elf32_Word    p_type;
-  Elf32_Off     p_offset;
-  Elf32_Addr    p_vaddr;
-  Elf32_Addr    p_paddr;
-  Elf32_Word    p_filesz;
-  Elf32_Word    p_memsz;
-  Elf32_Word    p_flags;
-  Elf32_Word    p_align;
-} Elf32_Phdr;
-
-
-/* Section header */
-
-typedef struct elf32_shdr {
-  Elf32_Word    sh_name;
-  Elf32_Word    sh_type;
-  Elf32_Word    sh_flags;
-  Elf32_Addr    sh_addr;
-  Elf32_Off     sh_offset;
-  Elf32_Word    sh_size;
-  Elf32_Word    sh_link;
-  Elf32_Word    sh_info;
-  Elf32_Word    sh_addralign;
-  Elf32_Word    sh_entsize;
-} Elf32_Shdr;
-
-/* Note header */
-typedef struct elf32_note {
-  Elf32_Word    n_namesz;       /* Name size */
-  Elf32_Word    n_descsz;       /* Content size */
-  Elf32_Word    n_type;         /* Content type */
-} Elf32_Nhdr;
-
-#endif /* _SYS_ELF32_H */
-
diff --git a/klibc/klibc/include/sys/elf64.h b/klibc/klibc/include/sys/elf64.h
deleted file mode 100644 (file)
index 750ddac..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * sys/elf64.h
- */
-
-#ifndef _SYS_ELF64_H
-#define _SYS_ELF64_H
-
-#include <sys/elfcommon.h>
-
-/* ELF standard typedefs (yet more proof that <stdint.h> was way overdue) */
-typedef uint16_t  Elf64_Half;
-typedef int16_t   Elf64_SHalf;
-typedef uint32_t  Elf64_Word;
-typedef int32_t   Elf64_Sword;
-typedef uint64_t  Elf64_Xword;
-typedef int64_t   Elf64_Sxword;
-
-typedef uint64_t  Elf64_Off;
-typedef uint64_t  Elf64_Addr;
-typedef uint16_t  Elf64_Section;
-
-/* Dynamic header */
-
-typedef struct elf64_dyn {
-  Elf64_Sxword d_tag;
-  union{
-    Elf64_Xword d_val;
-    Elf64_Addr  d_ptr;
-  } d_un;
-} Elf64_Dyn;
-
-/* Relocations */
-
-#define ELF64_R_SYM(x) ((x) >> 32)
-#define ELF64_R_TYPE(x)        ((x) & 0xffffffff)
-
-typedef struct elf64_rel {
-  Elf64_Addr    r_offset;
-  Elf64_Xword   r_info;
-} Elf64_Rel;
-
-typedef struct elf64_rela {
-  Elf64_Addr    r_offset;
-  Elf64_Xword   r_info;
-  Elf64_Sxword  r_addend;
-} Elf64_Rela;
-
-/* Symbol */
-
-typedef struct elf64_sym {
-  Elf64_Word    st_name;
-  unsigned char st_info;
-  unsigned char st_other;
-  Elf64_Half    st_shndx;
-  Elf64_Addr    st_value;
-  Elf64_Xword   st_size;
-} Elf64_Sym;
-
-/* Main file header */
-
-typedef struct elf64_hdr {
-  unsigned char e_ident[EI_NIDENT];
-  Elf64_Half    e_type;
-  Elf64_Half    e_machine;
-  Elf64_Word    e_version;
-  Elf64_Addr    e_entry;
-  Elf64_Off     e_phoff;
-  Elf64_Off     e_shoff;
-  Elf64_Word    e_flags;
-  Elf64_Half    e_ehsize;
-  Elf64_Half    e_phentsize;
-  Elf64_Half    e_phnum;
-  Elf64_Half    e_shentsize;
-  Elf64_Half    e_shnum;
-  Elf64_Half    e_shstrndx;
-} Elf64_Ehdr;
-
-/* Program header */
-
-typedef struct elf64_phdr {
-  Elf64_Word    p_type;
-  Elf64_Word    p_flags;
-  Elf64_Off     p_offset;
-  Elf64_Addr    p_vaddr;
-  Elf64_Addr    p_paddr;
-  Elf64_Xword   p_filesz;
-  Elf64_Xword   p_memsz;
-  Elf64_Xword   p_align;
-} Elf64_Phdr;
-
-
-/* Section header */
-
-typedef struct elf64_shdr {
-  Elf64_Word    sh_name;
-  Elf64_Word    sh_type;
-  Elf64_Xword   sh_flags;
-  Elf64_Addr    sh_addr;
-  Elf64_Off     sh_offset;
-  Elf64_Xword   sh_size;
-  Elf64_Word    sh_link;
-  Elf64_Word    sh_info;
-  Elf64_Xword   sh_addralign;
-  Elf64_Xword   sh_entsize;
-} Elf64_Shdr;
-
-/* Note header */
-typedef struct elf64_note {
-  Elf64_Word    n_namesz;       /* Name size */
-  Elf64_Word    n_descsz;       /* Content size */
-  Elf64_Word    n_type;         /* Content type */
-} Elf64_Nhdr;
-
-#endif /* _SYS_ELF64_H */
-
diff --git a/klibc/klibc/include/sys/elfcommon.h b/klibc/klibc/include/sys/elfcommon.h
deleted file mode 100644 (file)
index f984f6a..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * sys/elfcommon.h
- */
-
-#ifndef _SYS_ELFCOMMON_H
-#define _SYS_ELFCOMMON_H
-
-/* Segment types */
-#define PT_NULL        0
-#define PT_LOAD        1
-#define PT_DYNAMIC     2
-#define PT_INTERP      3
-#define PT_NOTE        4
-#define PT_SHLIB       5
-#define PT_PHDR        6
-#define PT_LOOS        0x60000000
-#define PT_HIOS        0x6fffffff
-#define PT_LOPROC      0x70000000
-#define PT_HIPROC      0x7fffffff
-#define PT_GNU_EH_FRAME        0x6474e550 /* Extension, eh? */
-
-/* ELF file types */
-#define ET_NONE        0
-#define ET_REL         1
-#define ET_EXEC        2
-#define ET_DYN         3
-#define ET_CORE        4
-#define ET_LOPROC      0xff00
-#define ET_HIPROC      0xffff
-
-/* ELF machine types */
-#define EM_NONE        0
-#define EM_M32         1
-#define EM_SPARC       2
-#define EM_386         3
-#define EM_68K         4
-#define EM_88K         5
-#define EM_486         6       /* Not used in Linux at least */
-#define EM_860         7
-#define EM_MIPS         8       /* R3k, bigendian(?) */
-#define EM_MIPS_RS4_BE         10      /* R4k BE */
-#define EM_PARISC              15
-#define EM_SPARC32PLUS         18
-#define EM_PPC                 20
-#define EM_PPC64               21
-#define EM_S390         22
-#define EM_SH                  42
-#define EM_SPARCV9     43      /* v9 = SPARC64 */
-#define EM_H8_300H      47
-#define EM_H8S          48
-#define EM_IA_64        50     /* Itanic */
-#define EM_X86_64       62
-#define EM_CRIS         76
-#define EM_V850         87
-#define EM_ALPHA        0x9026 /* Interrim Alpha that stuck around */
-#define EM_CYGNUS_V850  0x9080 /* Old v850 ID used by Cygnus */
-#define EM_S390_OLD     0xA390 /* Obsolete interrim value for S/390 */
-
-/* Dynamic type values */
-#define DT_NULL                0
-#define DT_NEEDED      1
-#define DT_PLTRELSZ    2
-#define DT_PLTGOT      3
-#define DT_HASH                4
-#define DT_STRTAB      5
-#define DT_SYMTAB      6
-#define DT_RELA                7
-#define DT_RELASZ      8
-#define DT_RELAENT     9
-#define DT_STRSZ       10
-#define DT_SYMENT      11
-#define DT_INIT                12
-#define DT_FINI                13
-#define DT_SONAME      14
-#define DT_RPATH       15
-#define DT_SYMBOLIC    16
-#define DT_REL         17
-#define DT_RELSZ       18
-#define DT_RELENT      19
-#define DT_PLTREL      20
-#define DT_DEBUG       21
-#define DT_TEXTREL     22
-#define DT_JMPREL      23
-#define DT_LOPROC      0x70000000
-#define DT_HIPROC      0x7fffffff
-
-/* Auxilliary table entries */
-#define AT_NULL                0       /* end of vector */
-#define AT_IGNORE      1       /* entry should be ignored */
-#define AT_EXECFD      2       /* file descriptor of program */
-#define AT_PHDR                3       /* program headers for program */
-#define AT_PHENT       4       /* size of program header entry */
-#define AT_PHNUM       5       /* number of program headers */
-#define AT_PAGESZ      6       /* system page size */
-#define AT_BASE                7       /* base address of interpreter */
-#define AT_FLAGS       8       /* flags */
-#define AT_ENTRY       9       /* entry point of program */
-#define AT_NOTELF      10      /* program is not ELF */
-#define AT_UID         11      /* real uid */
-#define AT_EUID                12      /* effective uid */
-#define AT_GID         13      /* real gid */
-#define AT_EGID                14      /* effective gid */
-#define AT_PLATFORM    15      /* string identifying CPU for optimizations */
-#define AT_HWCAP       16      /* arch dependent hints at CPU capabilities */
-#define AT_CLKTCK      17      /* frequency at which times() increments */
-/* 18..22 = ? */
-#define AT_SECURE      23      /* secure mode boolean */
-
-/* Program header permission flags */
-#define PF_X            0x1
-#define PF_W            0x2
-#define PF_R            0x4
-
-/* Section header types */
-#define SHT_NULL        0
-#define SHT_PROGBITS    1
-#define SHT_SYMTAB      2
-#define SHT_STRTAB      3
-#define SHT_RELA        4
-#define SHT_HASH        5
-#define SHT_DYNAMIC     6
-#define SHT_NOTE        7
-#define SHT_NOBITS      8
-#define SHT_REL         9
-#define SHT_SHLIB       10
-#define SHT_DYNSYM      11
-#define SHT_NUM         12
-#define SHT_LOPROC      0x70000000
-#define SHT_HIPROC      0x7fffffff
-#define SHT_LOUSER      0x80000000
-#define SHT_HIUSER      0xffffffff
-
-/* Section header flags */
-#define SHF_WRITE       0x1
-#define SHF_ALLOC       0x2
-#define SHF_EXECINSTR   0x4
-#define SHF_MASKPROC    0xf0000000
-
-/* Special section numbers */
-#define SHN_UNDEF       0
-#define SHN_LORESERVE   0xff00
-#define SHN_LOPROC      0xff00
-#define SHN_HIPROC      0xff1f
-#define SHN_ABS         0xfff1
-#define SHN_COMMON      0xfff2
-#define SHN_HIRESERVE   0xffff
-
-/* Lenght of magic at the start of a file */
-#define EI_NIDENT      16
-
-/* Magic number constants... */
-#define EI_MAG0         0      /* e_ident[] indexes */
-#define EI_MAG1         1
-#define EI_MAG2         2
-#define EI_MAG3         3
-#define EI_CLASS        4
-#define EI_DATA         5
-#define EI_VERSION      6
-#define EI_OSABI        7
-#define EI_PAD          8
-
-#define ELFMAG0         0x7f   /* EI_MAG */
-#define ELFMAG1         'E'
-#define ELFMAG2         'L'
-#define ELFMAG3         'F'
-#define ELFMAG          "\177ELF"
-#define SELFMAG         4
-
-#define ELFCLASSNONE    0      /* EI_CLASS */
-#define ELFCLASS32      1
-#define ELFCLASS64      2
-#define ELFCLASSNUM     3
-
-#define ELFDATANONE     0      /* e_ident[EI_DATA] */
-#define ELFDATA2LSB     1
-#define ELFDATA2MSB     2
-
-#define EV_NONE         0      /* e_version, EI_VERSION */
-#define EV_CURRENT      1
-#define EV_NUM          2
-
-#define ELFOSABI_NONE   0
-#define ELFOSABI_LINUX  3
-
-#endif /* _SYS_ELFCOMMON_H */
-
diff --git a/klibc/klibc/include/sys/fsuid.h b/klibc/klibc/include/sys/fsuid.h
deleted file mode 100644 (file)
index 823486b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * sys/fsuid.h
- */
-
-#ifndef _SYS_FSUID_H
-#define _SYS_FSUID_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-
-__extern int setfsuid(uid_t);
-__extern int setfsgid(gid_t);
-
-#endif /* _SYS_FSUID_H */
diff --git a/klibc/klibc/include/sys/ioctl.h b/klibc/klibc/include/sys/ioctl.h
deleted file mode 100644 (file)
index b0cee4c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * sys/ioctl.h
- */
-
-#ifndef _SYS_IOCTL_H
-#define _SYS_IOCTL_H
-
-#include <klibc/extern.h>
-#include <linux/ioctl.h>
-#include <asm/ioctls.h>
-
-__extern int ioctl(int, int, void *);
-
-#endif /* _SYS_IOCTL_H */
diff --git a/klibc/klibc/include/sys/klog.h b/klibc/klibc/include/sys/klog.h
deleted file mode 100644 (file)
index 0fc5f5d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * sys/klog.h
- */
-
-#ifndef _SYS_KLOG_H
-#define _SYS_KLOG_H
-
-#include <klibc/extern.h>
-
-#define KLOG_CLOSE     0
-#define KLOG_OPEN      1
-#define KLOG_READ      2
-#define KLOG_READ_ALL  3
-#define KLOG_READ_CLEAR        4
-#define KLOG_CLEAR     5
-#define KLOG_DISABLE   6
-#define KLOG_ENABLE    7
-#define KLOG_SETLEVEL  8
-#define KLOG_UNREADSIZE        9
-#define KLOG_WRITE     10
-
-__extern int klogctl(int, char *, int);
-
-#endif /* _SYS_KLOG_H */
diff --git a/klibc/klibc/include/sys/mman.h b/klibc/klibc/include/sys/mman.h
deleted file mode 100644 (file)
index 3d8a2f6..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * sys/mman.h
- */
-
-#ifndef _SYS_MMAN_H
-#define _SYS_MMAN_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <asm/mman.h>
-#include <asm/page.h>          /* For PAGE_SIZE */
-
-#define MAP_FAILED ((void *)-1)
-
-__extern void *mmap(void *, size_t, int, int, int, off_t);
-__extern int munmap(void *, size_t);
-__extern void *mremap(void *, size_t, size_t, unsigned long);
-__extern int msync(const void *, size_t, int);
-__extern int mprotect(const void *, size_t, int);
-
-#endif /* _SYS_MMAN_H */
diff --git a/klibc/klibc/include/sys/mount.h b/klibc/klibc/include/sys/mount.h
deleted file mode 100644 (file)
index 313c90e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * sys/mount.h
- */
-
-#ifndef _SYS_MOUNT_H
-#define _SYS_MOUNT_H
-
-#include <klibc/extern.h>
-
-/*
- * These are the fs-independent mount-flags: up to 32 flags are supported
- */
-#define MS_RDONLY        1      /* Mount read-only */
-#define MS_NOSUID        2      /* Ignore suid and sgid bits */
-#define MS_NODEV         4      /* Disallow access to device special files */
-#define MS_NOEXEC        8      /* Disallow program execution */
-#define MS_SYNCHRONOUS  16      /* Writes are synced at once */
-#define MS_REMOUNT      32      /* Alter flags of a mounted FS */
-#define MS_MANDLOCK     64      /* Allow mandatory locks on an FS */
-#define MS_DIRSYNC     128     /* Directory modifications are synchronous */
-#define MS_NOATIME      1024    /* Do not update access times. */
-#define MS_NODIRATIME   2048    /* Do not update directory access times */
-#define MS_BIND         4096
-#define MS_MOVE                8192
-#define MS_REC          16384
-#define MS_VERBOSE      32768
-#define MS_NOUSER       (1<<31)
-
-/*
- * Superblock flags that can be altered by MS_REMOUNT
- */
-#define MS_RMT_MASK     (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_NOATIME|MS_NODIRATIME)
-
-/*
- * Old magic mount flag and mask
- */
-#define MS_MGC_VAL 0xC0ED0000
-#define MS_MGC_MSK 0xffff0000
-
-/*
- * umount2() flags
- */
-#define MNT_FORCE      1
-
-/*
- * Prototypes
- */
-__extern int mount(const char *, const char *,
-                  const char *, unsigned long,
-                  const void *);
-__extern int umount(const char *);
-__extern int umount2(const char *, int);
-__extern int pivot_root(const char *, const char *);
-
-#endif /* _SYS_MOUNT_H */
diff --git a/klibc/klibc/include/sys/param.h b/klibc/klibc/include/sys/param.h
deleted file mode 100644 (file)
index 63a0661..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * sys/param.h
- */
-
-#ifndef _SYS_PARAM_H
-#define _SYS_PARAM_H
-
-#include <limits.h>
-#include <linux/param.h>
-
-#endif /* _SYS_PARAM_H */
diff --git a/klibc/klibc/include/sys/reboot.h b/klibc/klibc/include/sys/reboot.h
deleted file mode 100644 (file)
index eaf5661..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * sys/reboot.h
- */
-
-#ifndef _SYS_REBOOT_H
-#define _SYS_REBOOT_H
-
-#include <klibc/extern.h>
-#include <linux/reboot.h>
-
-/* glibc names these constants differently; allow both versions */
-
-#define RB_AUTOBOOT    LINUX_REBOOT_CMD_RESTART
-#define RB_HALT_SYSTEM LINUX_REBOOT_CMD_HALT
-#define RB_ENABLE_CAD  LINUX_REBOOT_CMD_CAD_ON
-#define RB_DISABLE_CAD LINUX_REBOOT_CMD_CAD_OFF
-#define RB_POWER_OFF   LINUX_REBOOT_CMD_POWER_OFF
-
-/* glibc-ish one-argument version */
-__extern int reboot(int);
-
-/* Native four-argument system call */
-__extern int __reboot(int, int, int, void *);
-
-#endif /* _SYS_REBOOT_H */
diff --git a/klibc/klibc/include/sys/resource.h b/klibc/klibc/include/sys/resource.h
deleted file mode 100644 (file)
index ef14bde..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * sys/resource.h
- */
-
-#ifndef _SYS_RESOURCE_H
-#define _SYS_RESOURCE_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>         /* MUST be included before linux/resource.h */
-#include <linux/resource.h>
-
-__extern int getpriority(int, int);
-__extern int setpriority(int, int, int);
-
-#endif /* _SYS_RESOURCE_H */
diff --git a/klibc/klibc/include/sys/select.h b/klibc/klibc/include/sys/select.h
deleted file mode 100644 (file)
index 7caf8c9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * sys/select.h
- */
-
-#ifndef _SYS_SELECT_H
-#define _SYS_SELECT_H
-
-#include <sys/time.h>
-#include <sys/types.h>
-
-__extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
-
-#endif /* _SYS_SELECT_H */
diff --git a/klibc/klibc/include/sys/socket.h b/klibc/klibc/include/sys/socket.h
deleted file mode 100644 (file)
index cbc2b89..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * sys/socket.h
- */
-
-#ifndef _SYS_SOCKET_H
-#define _SYS_SOCKET_H
-
-#include <klibc/extern.h>
-#include <klibc/compiler.h>
-#include <linux/socket.h>
-
-/* For some reason these may be protected by __KERNEL__ in asm/socket.h */
-#ifndef SOCK_STREAM
-# define SOCK_STREAM    1
-# define SOCK_DGRAM     2
-# define SOCK_RAW       3
-# define SOCK_RDM       4
-# define SOCK_SEQPACKET 5
-# define SOCK_PACKET    10
-#endif
-
-#ifdef __i386__
-# define __socketcall __extern __cdecl
-#else
-# define __socketcall __extern
-#endif
-
-typedef int socklen_t;
-
-__socketcall int socket(int, int, int);
-__socketcall int bind(int, struct sockaddr *, int);
-__socketcall int connect(int, struct sockaddr *, socklen_t);
-__socketcall int listen(int, int);
-__socketcall int accept(int, struct sockaddr *, socklen_t *);
-__socketcall int getsockname(int, struct sockaddr *, socklen_t *);
-__socketcall int getpeername(int, struct sockaddr *, socklen_t *);
-__socketcall int socketpair(int, int, int, int *);
-__extern     int send(int, const void *, size_t, unsigned int);
-__socketcall int sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
-__extern     int recv(int, void *, size_t, unsigned int);
-__socketcall int recvfrom(int, void *, size_t, unsigned int, struct sockaddr *, socklen_t *);
-__socketcall int shutdown(int, int);
-__socketcall int setsockopt(int, int, int, const void *, socklen_t);
-__socketcall int getsockopt(int, int, int, void *, socklen_t *);
-__socketcall int sendmsg(int, const struct msghdr *, unsigned int);
-__socketcall int recvmsg(int, struct msghdr *, unsigned int);
-
-#undef __socketcall
-
-#endif /* _SYS_SOCKET_H */
diff --git a/klibc/klibc/include/sys/socketcalls.h b/klibc/klibc/include/sys/socketcalls.h
deleted file mode 100644 (file)
index dac9f9a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * sys/socketcalls.h
- */
-
-#ifndef _SYS_SOCKETCALLS_H
-#define _SYS_SOCKETCALLS_H
-
-/* socketcalls by number, since <linux/net.h> isn't usable for assembly */
-
-#define SYS_SOCKET      1               /* sys_socket(2)                */
-#define SYS_BIND        2               /* sys_bind(2)                  */
-#define SYS_CONNECT     3               /* sys_connect(2)               */
-#define SYS_LISTEN      4               /* sys_listen(2)                */
-#define SYS_ACCEPT      5               /* sys_accept(2)                */
-#define SYS_GETSOCKNAME 6               /* sys_getsockname(2)           */
-#define SYS_GETPEERNAME 7               /* sys_getpeername(2)           */
-#define SYS_SOCKETPAIR  8               /* sys_socketpair(2)            */
-#define SYS_SEND        9               /* sys_send(2)                  */
-#define SYS_RECV        10              /* sys_recv(2)                  */
-#define SYS_SENDTO      11              /* sys_sendto(2)                */
-#define SYS_RECVFROM    12              /* sys_recvfrom(2)              */
-#define SYS_SHUTDOWN    13              /* sys_shutdown(2)              */
-#define SYS_SETSOCKOPT  14              /* sys_setsockopt(2)            */
-#define SYS_GETSOCKOPT  15              /* sys_getsockopt(2)            */
-#define SYS_SENDMSG     16              /* sys_sendmsg(2)               */
-#define SYS_RECVMSG     17              /* sys_recvmsg(2)               */
-
-#endif /* _SYS_SOCKETCALLS_H */
diff --git a/klibc/klibc/include/sys/stat.h b/klibc/klibc/include/sys/stat.h
deleted file mode 100644 (file)
index f7bb5aa..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * sys/stat.h
- */
-
-#ifndef _SYS_STAT_H
-#define _SYS_STAT_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <asm/stat.h>
-#include <linux/stat.h>
-
-__extern int stat(const char *, struct stat *);
-__extern int fstat(int, struct stat *);
-__extern int lstat(const char *, struct stat *);
-__extern mode_t umask(mode_t);
-__extern int mknod(const char *, mode_t, dev_t);
-static __inline__ int mkfifo(const char *__p, mode_t __m)
-{
-  return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
-}
-
-#endif /* _SYS_STAT_H */
diff --git a/klibc/klibc/include/sys/syscall.h b/klibc/klibc/include/sys/syscall.h
deleted file mode 100644 (file)
index 907c7f9..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * sys/syscall.h
- *
- * Generic system call interface macros
- */
-#ifndef _SYS_SYSCALL_H
-#define _SYS_SYSCALL_H
-
-#include <errno.h>
-#include <asm/unistd.h>
-
-/* Many architectures have incomplete or defective syscall macros */
-#include <klibc/archsys.h>
-
-#endif /* _SYS_SYSCALL_H */
diff --git a/klibc/klibc/include/sys/sysinfo.h b/klibc/klibc/include/sys/sysinfo.h
deleted file mode 100644 (file)
index 4051c68..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * sys/sysinfo.h
- */
-
-#ifndef _SYS_SYSINFO_H
-#define _SYS_SYSINFO_H
-
-#include <linux/kernel.h>
-
-extern int sysinfo (struct sysinfo *info);
-
-#endif /* _SYS_SYSINFO_H */
diff --git a/klibc/klibc/include/sys/sysmacros.h b/klibc/klibc/include/sys/sysmacros.h
deleted file mode 100644 (file)
index 7f1e082..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * sys/sysmacros.h
- *
- * Constructs to create and pick apart dev_t.  This applies to the Linux 2.6
- * 32-bit dev_t format.
- */
-
-#ifndef _SYS_SYSMACROS_H
-#define _SYS_SYSMACROS_H
-
-#ifndef _SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-static __inline__ int major(dev_t __d)
-{
-  return (__d >> 8) & 0xfff;
-}
-
-static __inline__ int minor(dev_t __d)
-{
-  return (__d & 0xff) | ((__d >> 12) & 0xfff00);
-}
-
-static __inline__ dev_t makedev(int __ma, int __mi)
-{
-  return ((__ma & 0xfff) << 8) | (__mi & 0xff) | ((__mi & 0xfff00) << 12);
-}
-
-#endif /* _SYS_SYSMACROS_H */
-
diff --git a/klibc/klibc/include/sys/time.h b/klibc/klibc/include/sys/time.h
deleted file mode 100644 (file)
index b503d21..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * sys/time.h
- */
-
-#ifndef _SYS_TIME_H
-#define _SYS_TIME_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <linux/time.h>
-
-__extern int gettimeofday(struct timeval *, struct timezone *);
-__extern int settimeofday(const struct timeval *, const struct timezone *);
-__extern int getitimer(int, struct itimerval *);
-__extern int setitimer(int, const struct itimerval *, struct itimerval *);
-
-#endif /* _SYS_TIME_H */
diff --git a/klibc/klibc/include/sys/types.h b/klibc/klibc/include/sys/types.h
deleted file mode 100644 (file)
index 0aaeeb1..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * sys/types.h
- */
-
-#ifndef _SYS_TYPES_H
-#define _SYS_TYPES_H
-
-#include <stddef.h>
-#include <stdint.h>
-
-#define _SSIZE_T
-typedef ptrdiff_t ssize_t;
-
-#include <linux/posix_types.h>
-#include <asm/types.h>
-
-/* Keeps linux/types.h from getting included elsewhere */
-#define _LINUX_TYPES_H         
-
-typedef __kernel_fd_set                fd_set;
-typedef uint32_t               dev_t;
-typedef __kernel_ino_t         ino_t;
-typedef __kernel_mode_t                mode_t;
-typedef __kernel_nlink_t       nlink_t;
-typedef __kernel_off_t         off_t; /* Should become __kernel_loff_t... */
-typedef __kernel_pid_t         pid_t;
-typedef __kernel_daddr_t       daddr_t;
-typedef __kernel_key_t         key_t;
-typedef __kernel_suseconds_t   suseconds_t;
-typedef __kernel_timer_t       timer_t;
-
-typedef __kernel_uid32_t       uid_t;
-typedef __kernel_gid32_t       gid_t;
-
-typedef __kernel_loff_t                loff_t;
-
-/*
- * The following typedefs are also protected by individual ifdefs for
- * historical reasons:
- */
-#ifndef _SIZE_T
-#define _SIZE_T
-typedef __kernel_size_t                size_t;
-#endif
-
-#ifndef _SSIZE_T
-#define _SSIZE_T
-typedef __kernel_ssize_t       ssize_t;
-#endif
-
-#ifndef _PTRDIFF_T
-#define _PTRDIFF_T
-typedef __kernel_ptrdiff_t     ptrdiff_t;
-#endif
-
-#ifndef _TIME_T
-#define _TIME_T
-typedef __kernel_time_t                time_t;
-#endif
-
-#ifndef _CLOCK_T
-#define _CLOCK_T
-typedef __kernel_clock_t       clock_t;
-#endif
-
-#ifndef _CADDR_T
-#define _CADDR_T
-typedef __kernel_caddr_t       caddr_t;
-#endif
-
-/* bsd */
-typedef unsigned char          u_char;
-typedef unsigned short         u_short;
-typedef unsigned int           u_int;
-typedef unsigned long          u_long;
-
-/* sysv */
-typedef unsigned char          unchar;
-typedef unsigned short         ushort;
-typedef unsigned int           uint;
-typedef unsigned long          ulong;
-
-/* Linux-specific? */
-typedef uint8_t                        u_int8_t;
-typedef uint16_t               u_int16_t;
-typedef uint32_t               u_int32_t;
-typedef uint64_t               u_int64_t;
-
-/*
- * transition to 64-bit sector_t, possibly making it an option...
- */
-#undef BLK_64BIT_SECTOR
-
-#ifdef BLK_64BIT_SECTOR
-typedef u64 sector_t;
-#else
-typedef unsigned long sector_t;
-#endif
-
-/*
- * The type of an index into the pagecache.  Use a #define so asm/types.h
- * can override it.
- */
-#ifndef pgoff_t
-#define pgoff_t unsigned long
-#endif
-
-/*
- * Below are truly Linux-specific types that should never collide with
- * any application/library that wants linux/types.h.
- */
-
-struct ustat {
-       __kernel_daddr_t        f_tfree;
-       __kernel_ino_t          f_tinode;
-       char                    f_fname[6];
-       char                    f_fpack[6];
-};
-
-/*
- * Some apps want this in <sys/types.h>
- */
-#include <sys/sysmacros.h>
-
-#endif
diff --git a/klibc/klibc/include/sys/uio.h b/klibc/klibc/include/sys/uio.h
deleted file mode 100644 (file)
index fc2525d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * sys/uio.h
- */
-
-#ifndef _SYS_UIO_H
-#define _SYS_UIO_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <linux/uio.h>
-
-__extern int readv(int, const struct iovec *, int);
-__extern int writev(int, const struct iovec *, int);
-
-#endif /* _SYS_UIO_H */
diff --git a/klibc/klibc/include/sys/un.h b/klibc/klibc/include/sys/un.h
deleted file mode 100644 (file)
index df42d71..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * <sys/un.h>
- */
-
-#ifndef _SYS_UN_H
-#define _SYS_UN_H
-
-#include <linux/un.h>
-
-#endif /* _SYS_UN_H */
diff --git a/klibc/klibc/include/sys/utime.h b/klibc/klibc/include/sys/utime.h
deleted file mode 100644 (file)
index d1d635d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * sys/utime.h
- */
-
-#ifndef _SYS_UTIME_H
-#define _SYS_UTIME_H
-
-#include <linux/utime.h>
-
-#endif /* _SYS_UTIME_H */
diff --git a/klibc/klibc/include/sys/utsname.h b/klibc/klibc/include/sys/utsname.h
deleted file mode 100644 (file)
index f2990f5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * sys/utsname.h
- */
-
-#ifndef _SYS_UTSNAME_H
-#define _SYS_UTSNAME_H
-
-#include <klibc/extern.h>
-
-#define SYS_NMLN 65
-
-struct utsname {
-        char sysname[SYS_NMLN];
-        char nodename[SYS_NMLN];
-        char release[SYS_NMLN];
-        char version[SYS_NMLN];
-        char machine[SYS_NMLN];
-        char domainname[SYS_NMLN];
-};
-
-__extern int uname(struct utsname *);
-
-#endif /* _SYS_UTSNAME_H */
diff --git a/klibc/klibc/include/sys/vfs.h b/klibc/klibc/include/sys/vfs.h
deleted file mode 100644 (file)
index 8c1577c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * sys/vfs.h
- */
-
-#ifndef _SYS_VFS_H
-#define _SYS_VFS_H
-
-#include <klibc/extern.h>
-#include <linux/vfs.h>
-
-__extern int statfs(const char *, struct statfs *);
-__extern int fstatfs(int, struct statfs *);
-
-#endif /* _SYS_VFS_H */
diff --git a/klibc/klibc/include/sys/wait.h b/klibc/klibc/include/sys/wait.h
deleted file mode 100644 (file)
index 4cfafc9..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * sys/wait.h
- */
-
-#ifndef _SYS_WAIT_H
-#define _SYS_WAIT_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <sys/resource.h>
-
-#include <linux/wait.h>
-
-#define WEXITSTATUS(s) (((s) & 0xff00) >> 8)
-#define WTERMSIG(s)    ((s) & 0x7f)
-#define WIFEXITED(s)   (WTERMSIG(s) == 0)
-#define WIFSTOPPED(s)  (WTERMSIG(s) == 0x7f)
-/* Ugly hack to avoid multiple evaluation of "s" */
-#define WIFSIGNALED(s) (WTERMSIG((s)+1) >= 2)
-#define WCOREDUMP(s)   ((s) & 0x80)
-#define WSTOPSIG(s)    WEXITSTATUS(s)
-
-__extern pid_t wait(int *);
-__extern pid_t waitpid(pid_t, int *, int);
-__extern pid_t wait3(int *, int, struct rusage *);
-__extern pid_t wait4(pid_t, int *, int, struct rusage *);
-
-#endif /* _SYS_WAIT_H */
diff --git a/klibc/klibc/include/syslog.h b/klibc/klibc/include/syslog.h
deleted file mode 100644 (file)
index 551527a..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * syslog.h
- */
-
-#ifndef _SYSLOG_H
-#define _SYSLOG_H
-
-#include <stdio.h>
-#include <klibc/extern.h>
-
-/* Alert levels */
-#define LOG_EMERG      0
-#define LOG_ALERT      1
-#define LOG_CRIT       2
-#define LOG_ERR                3
-#define LOG_WARNING    4
-#define LOG_NOTICE     5
-#define LOG_INFO       6
-#define LOG_DEBUG      7
-
-#define LOG_PRIMASK    7
-#define LOG_PRI(x)     ((x) & LOG_PRIMASK)
-
-
-/* Facilities; not actually used */
-#define LOG_KERN       0000
-#define LOG_USER       0010
-#define LOG_MAIL       0020
-#define LOG_DAEMON     0030
-#define LOG_AUTH       0040
-#define LOG_SYSLOG     0050
-#define LOG_LPR                0060
-#define LOG_NEWS       0070
-#define LOG_UUCP       0100
-#define LOG_CRON       0110
-#define LOG_AUTHPRIV   0120
-#define LOG_FTP                0130
-#define LOG_LOCAL0     0200
-#define LOG_LOCAL1     0210
-#define LOG_LOCAL2     0220
-#define LOG_LOCAL3     0230
-#define LOG_LOCAL4     0240
-#define LOG_LOCAL5     0250
-#define LOG_LOCAL6     0260
-#define LOG_LOCAL7     0270
-
-#define LOG_FACMASK    01770
-#define LOG_FAC(x)     (((x) >> 3) & (LOG_FACMASK >> 3))
-
-__extern void openlog(const char *, int, int);
-__extern void syslog(int, const char *, ...);
-__extern void vsyslog(int, const char *, va_list);
-__extern void closelog(void);
-
-#endif /* _SYSLOG_H */
diff --git a/klibc/klibc/include/termios.h b/klibc/klibc/include/termios.h
deleted file mode 100644 (file)
index 08a5e56..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * termios.h
- */
-
-#ifndef _TERMIOS_H
-#define _TERMIOS_H
-
-#include <klibc/extern.h>
-#include <stdint.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <linux/termios.h>
-
-/* Redefine these so the magic constants == the ioctl number to use. */
-#undef TCSANOW
-#undef TCSADRAIN
-#undef TCSAFLUSH
-#define TCSANOW           TCSETS
-#define TCSADRAIN  TCSETSW
-#define TCSAFLUSH  TCSETSF
-
-static __inline__ int tcgetattr(int __fd, struct termios *__s)
-{
-  return ioctl(__fd, TCGETS, __s);
-}
-
-static __inline__ int tcsetattr(int __fd, int __opt, const struct termios *__s)
-{
-  return ioctl(__fd, __opt, (void *)__s);
-}
-
-static __inline__ int tcflow(int __fd, int __action)
-{
-  return ioctl(__fd, TCXONC, (void *)(intptr_t)__action);
-}
-
-static __inline__ int tcflush(int __fd, int __queue)
-{
-  return ioctl(__fd, TCFLSH, (void *)(intptr_t)__queue);
-}
-
-static __inline__ pid_t tcgetpgrp(int __fd)
-{
-  pid_t __p;
-  return ioctl(__fd, TIOCGPGRP, &__p) ? (pid_t)-1 : __p;
-}
-
-static __inline__ pid_t tcgetsid(int __fd)
-{
-  pid_t __p;
-  return ioctl(__fd, TIOCGSID, &__p) ? (pid_t)-1 : __p;
-}  
-
-static __inline__ int tcsendbreak(int __fd, int __duration)
-{
-  return ioctl(__fd, TCSBRKP, (void *)(uintptr_t)__duration);
-}
-
-static __inline__ int tcsetpgrp(int __fd, pid_t __p)
-{
-  return ioctl(__fd, TIOCSPGRP, &__p);
-}
-
-static __inline__ speed_t cfgetospeed(const struct termios *__s)
-{
-  return (speed_t)(__s->c_cflag & CBAUD);
-}
-
-static __inline__ speed_t cfgetispeed(const struct termios *__s)
-{
-  return (speed_t)(__s->c_cflag & CBAUD);
-}
-
-static __inline__ int cfsetospeed(struct termios *__s, speed_t __v)
-{
-  __s->c_cflag = (__s->c_cflag & ~CBAUD) | (__v & CBAUD);
-  return 0;
-}
-
-static __inline__ int cfsetispeed(struct termios *__s, speed_t __v)
-{
-  __s->c_cflag = (__s->c_cflag & ~CBAUD) | (__v & CBAUD);
-  return 0;
-}
-
-#endif /* _TERMIOS_H */
diff --git a/klibc/klibc/include/time.h b/klibc/klibc/include/time.h
deleted file mode 100644 (file)
index c69c231..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * time.h
- */
-
-#ifndef _TIME_H
-#define _TIME_H
-
-#include <klibc/extern.h>
-#include <sys/time.h>
-
-__extern time_t time(time_t *);
-__extern int nanosleep(const struct timespec *, struct timespec *);
-
-#endif /* _TIME_H */
diff --git a/klibc/klibc/include/unistd.h b/klibc/klibc/include/unistd.h
deleted file mode 100644 (file)
index 13ff03b..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * unistd.h
- */
-
-#ifndef _UNISTD_H
-#define _UNISTD_H
-
-#include <klibc/extern.h>
-#include <klibc/compiler.h>
-#include <stddef.h>
-#include <sys/types.h>
-#include <sys/select.h>
-
-__extern char **environ;
-__extern __noreturn _exit(int);
-
-__extern pid_t fork(void);
-__extern pid_t vfork(void);
-__extern pid_t getpid(void);
-__extern pid_t getpgid(pid_t);
-__extern int setpgid(pid_t, pid_t);
-__extern pid_t getppid(void);
-__extern pid_t getpgrp(void);
-__extern int setpgrp(void);
-__extern pid_t setsid(void);
-__extern pid_t getsid(pid_t);
-__extern int execv(const char *, char * const *);
-__extern int execvp(const char *, char * const *);
-__extern int execve(const char *, char * const *, char * const *);
-__extern int execvpe(const char *, char * const *, char * const *);
-__extern int execl(const char *, const char *, ...);
-__extern int execlp(const char *, const char *, ...);
-__extern int execle(const char *, const char *, ...);
-__extern int execlpe(const char *, const char *, ...);
-
-__extern int setuid(uid_t);
-__extern uid_t getuid(void);
-__extern int seteuid(uid_t);
-__extern uid_t geteuid(void);
-__extern int setgid(gid_t);
-__extern gid_t getgid(void); 
-__extern int setegid(gid_t);
-__extern gid_t getegid(void);
-__extern int getgroups(int, gid_t *);
-__extern int setgroups(size_t, const gid_t *);
-__extern int setreuid(uid_t, uid_t);
-__extern int setregid(gid_t, gid_t);
-__extern int setresuid(uid_t, uid_t, uid_t);
-__extern int setresgid(gid_t, gid_t, gid_t);
-__extern int getfsuid(uid_t);
-__extern int setfsuid(uid_t);
-
-/* Macros for access() */
-#define R_OK   4               /* Read */
-#define W_OK   2               /* Write */
-#define X_OK   1               /* Execute */
-#define F_OK   0               /* Existence */
-
-__extern int access(const char *, int);
-__extern int link(const char *, const char *);
-__extern int unlink(const char *);
-__extern int chdir(const char *);
-__extern int chmod(const char *, mode_t);
-__extern int fchmod(int, mode_t);
-__extern int mkdir(const char *, mode_t);
-__extern int rmdir(const char *);
-__extern int pipe(int *);
-__extern int chroot(const char *);
-__extern int symlink(const char *, const char *);
-__extern int readlink(const char *, char *, size_t);
-__extern int chown(const char *, uid_t, gid_t);
-__extern int fchown(int, uid_t, gid_t);
-__extern int lchown(const char *, uid_t, gid_t);
-__extern char *getcwd(char *, size_t);
-
-__extern int sync(void);
-
-__extern ssize_t read(int, void *, size_t);
-__extern ssize_t write(int, const void *, size_t);
-#ifndef __IN_OPEN_C
-__extern __cdecl int open(const char *, int, ...);
-#endif
-__extern int close(int);
-__extern off_t lseek(int, off_t, int);
-__extern loff_t llseek(int, loff_t, int);
-__extern int dup(int);
-__extern int dup2(int, int);
-__extern int fcntl(int, int, long);
-__extern int ioctl(int, int, void *);
-__extern int flock(int, int);
-__extern int fsync(int);
-__extern int fdatasync(int);
-__extern int ftruncate(int, off_t);
-
-__extern int pause(void);
-__extern unsigned int alarm(unsigned int);
-__extern unsigned int sleep(unsigned int);
-__extern void usleep(unsigned long);
-
-__extern int gethostname(char *, size_t);
-__extern int sethostname(const char *, size_t);
-__extern int getdomainname(char *, size_t);
-__extern int setdomainname(const char *, size_t);
-
-__extern void *__brk(void *);
-__extern int brk(void *);
-__extern void *sbrk(ptrdiff_t);
-
-__extern int getopt(int, char * const *, const char *);
-__extern char *optarg;
-__extern int optind, opterr, optopt;
-
-__extern int isatty(int);
-
-__extern int getpagesize(void);
-
-/* Standard file descriptor numbers. */
-#define STDIN_FILENO   0
-#define STDOUT_FILENO  1
-#define STDERR_FILENO  2
-
-#endif /* _UNISTD_H */
diff --git a/klibc/klibc/include/utime.h b/klibc/klibc/include/utime.h
deleted file mode 100644 (file)
index 3dfa03a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * utime.h
- */
-
-#ifndef _UTIME_H
-#define _UTIME_H
-
-#include <klibc/extern.h>
-#include <sys/types.h>
-#include <linux/utime.h>
-
-__extern int utime(const char *, const struct utimbuf *);
-
-#endif /* _UTIME_H */
-
index c30054edfd326566e95b0af94bcaa8ed79201f93..750bd709c495ac50245bc5b5f76a17cad2b218ee 100644 (file)
@@ -9,8 +9,8 @@
 #include <string.h>
 #include <unistd.h>
 
-#define START_PORT     600
-#define END_PORT       (IPPORT_RESERVED - 1)
+#define START_PORT     768
+#define END_PORT       IPPORT_RESERVED
 #define NUM_PORTS      (END_PORT - START_PORT)
 
 int bindresvport(int sd, struct sockaddr_in *sin)
@@ -21,14 +21,12 @@ int bindresvport(int sd, struct sockaddr_in *sin)
        int i;
 
        if (sin == NULL) {
+               memset(&me, 0, sizeof(me));
                sin = &me;
-               memset(sin, 0, sizeof(me));
-               sin->sin_port = AF_INET;
-       }
-       else if (sin->sin_family != AF_INET) {
+               sin->sin_family = AF_INET;
+       } else if (sin->sin_family != AF_INET) {
                errno = EPFNOSUPPORT;
-               ret = -1;
-               goto bail;
+               return -1;
        }
        
        if (port == 0) {
@@ -36,13 +34,12 @@ int bindresvport(int sd, struct sockaddr_in *sin)
        }
        
        for (i = 0; i < NUM_PORTS; i++, port++) {
-               sin->sin_port = htons(port);
-               if ((ret = bind(sd, (struct sockaddr *)&sin, sizeof(*sin))) != -1)
-                       break;
                if (port == END_PORT)
                        port = START_PORT;
+               sin->sin_port = htons(port);
+               if ((ret = bind(sd, (struct sockaddr *)sin, sizeof(*sin))) != -1)
+                       break;
        }
 
- bail:
        return ret;
 }
index 303943697ba60565da86872e7ad65ba49714e72e..b1a27019996e13ad1037d7fd9f6b92270aa3ff57 100644 (file)
@@ -2,7 +2,9 @@
 # This is a hack to generate the .intrp section, which then
 # ld turns into an PT_INTERP header.
 #
-
+# NOTE: The .interp section needs to be "a", or it doesnt work...
+#
+       
         .section ".interp","a"
         .ascii LIBDIR
        .ascii "/klibc-"
diff --git a/klibc/klibc/jrand48.c b/klibc/klibc/jrand48.c
new file mode 100644 (file)
index 0000000..a2ead11
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * jrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+long jrand48(unsigned short xsubi[3])
+{
+  uint64_t x;
+
+  /* The xsubi[] array is littleendian by spec */
+  x = (uint64_t)xsubi[0] +
+    ((uint64_t)xsubi[1] << 16) +
+    ((uint64_t)xsubi[2] << 32);
+
+  x = (0x5deece66dULL * x) + 0xb;
+  
+  xsubi[0] = (unsigned short)x;
+  xsubi[1] = (unsigned short)(x >> 16);
+  xsubi[2] = (unsigned short)(x >> 32);
+
+  return (long)(int32_t)(x >> 16);
+}
diff --git a/klibc/klibc/libc_init.c b/klibc/klibc/libc_init.c
new file mode 100644 (file)
index 0000000..e91edc4
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * libc_init.c
+ *
+ * This function takes the raw data block set up by the ELF loader
+ * in the kernel and parses it.  It is invoked by crt0.S which makes
+ * any necessary adjustments and passes calls this function using
+ * the standard C calling convention.
+ *
+ * The arguments are:
+ *  uintptr_t *elfdata  -- The ELF loader data block; usually from the stack.
+ *                          Basically a pointer to argc.
+ *  void (*onexit)(void) -- Function to install into onexit
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <klibc/compiler.h>
+#include <elf.h>
+
+/* This file is included from __static_init.c or __shared_init.c */
+#ifndef SHARED
+# error "SHARED should be defined to 0 or 1"
+#endif
+
+char **environ;
+unsigned int __page_size, __page_shift;
+
+struct auxentry {
+  uintptr_t type;
+  uintptr_t v;
+};
+
+__noreturn __libc_init(uintptr_t *elfdata, void (*onexit)(void))
+{
+  int argc;
+  char **argv, **envp, **envend;
+  struct auxentry *auxentry;
+#if SHARED
+  typedef int (*main_t)(int, char **, char **);
+  main_t MAIN = NULL;
+#else
+  extern int main(int, char **, char **);
+#define MAIN main
+#endif
+  unsigned int page_size = 0, page_shift = 0;
+
+  (void)onexit;                        /* For now, we ignore this... */
+
+  argc = (int)*elfdata++;
+  argv = (char **)elfdata;
+  envp = argv+(argc+1);
+
+  /* The auxillary entry vector is after all the environment vars */
+  for ( envend = envp ; *envend ; envend++ );
+  auxentry = (struct auxentry *)(envend+1);
+
+  while ( auxentry->type ) {
+    switch ( auxentry->type ) {
+#if SHARED
+    case AT_ENTRY:
+      MAIN = (main_t)(auxentry->v);
+      break;
+#endif
+    case AT_PAGESZ:
+      page_size = (int)(auxentry->v);
+      break;
+    }
+    auxentry++;
+  }
+
+  __page_size = page_size;
+
+#if defined(__i386__) || defined(__x86_64__)
+  asm("bsrl %1,%0" : "=r" (page_shift) : "rm" (page_size));
+#else
+  while ( page_size > 1 ) {
+    page_shift++;
+    page_size >>= 1;
+  }
+#endif
+  __page_shift = page_shift;
+
+  environ = envp;
+  exit(MAIN(argc, argv, envp));
+}
index fdffc16e2ce272bd8e280925a4260917fed70eba..2102a503e98fd9d23d2d14b71cfb7c4136ee04b2 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * llseek.c
  *
- * On 32-bit platforms, we need llseek() as well as lseek() to be
- * able to handle large disks
+ * On 32-bit platforms, we need to use the _llseek() system call
+ * rather than lseek(), to be able to handle large disks.  _llseek()
+ * isn't just a normal syscall which takes a 64-bit argument; it needs
+ * to return a 64-bit value and so takes an extra pointer.
  */
 
 #include <unistd.h>
 
 #if BITSIZE == 32
 
-static inline _syscall5(int, _llseek, int, fd, unsigned long, hi, unsigned long, lo, loff_t *,res, int, whence);
+extern int __llseek(int fd, unsigned long hi, unsigned long lo, off_t *res, int whence);
 
-loff_t llseek(int fd, loff_t offset, int whence)
+off_t lseek(int fd, off_t offset, int whence)
 {
-  loff_t result;
+  off_t result;
   int rv;
 
-  rv = _llseek(fd, (unsigned long)(offset >> 32),
-               (unsigned long)offset, &result, whence);
+  rv = __llseek(fd, (unsigned long)(offset >> 32), (unsigned long)offset,
+               &result, whence);
   
-  return rv ? (loff_t)-1 : result;
-}
-
-#else
-
-loff_t llseek(int fd, loff_t offset, int whence)
-{
-  return lseek(fd, offset, whence);
+  return rv ? (off_t)-1 : result;
 }
 
 #endif
index 4d05de2e895802d5d39f634a00e6c86b6af2558c..8c0a3de176709b1dc5b38f279e23d7a4ba604235 100644 (file)
@@ -5,38 +5,10 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-unsigned short __rand48_seed[3];
-
-long jrand48(unsigned short xsubi[3])
-{
-  uint64_t x;
-
-  /* The xsubi[] array is littleendian by spec */
-  x = (uint64_t)xsubi[0] +
-    ((uint64_t)xsubi[1] << 16) +
-    ((uint64_t)xsubi[2] << 32);
-
-  x = (0x5deece66dULL * x) + 0xb;
-  
-  xsubi[0] = (unsigned short)x;
-  xsubi[1] = (unsigned short)(x >> 16);
-  xsubi[2] = (unsigned short)(x >> 32);
-
-  return (long)(int32_t)(x >> 16);
-}
-
-long mrand48(void)
-{
-  return jrand48(__rand48_seed);
-}
-
-long nrand48(unsigned short xsubi[3])
-{
-  return (long)((uint32_t)jrand48(xsubi) >> 1);
-}
+unsigned short __rand48_seed[3]; /* Common with mrand48.c, srand48.c */
 
 long lrand48(void)
 {
-  return (long)((uint32_t)(mrand48() >> 1));
+  return (uint32_t)jrand48(__rand48_seed) >> 1;
 }
 
index 00acb8a3d5bbf00a586930a7c1eec52096096ee8..f42704f88a3b8b7987d5fc9662ae7454cee3989c 100644 (file)
@@ -20,7 +20,7 @@ sub parse_file($) {
 
     $file = $rootdir.$file;
 
-    print STDERR "opening $file\n";
+    print STDERR "opening $file\n" unless ( $quiet );
 
     if ( !($fh->open("< ".$file)) ) {
        die "$0: cannot open $file\n";
@@ -38,7 +38,7 @@ sub parse_file($) {
                $error = $1;
                $errno = $2+0;
                $msg   = $3;
-               print STDERR "$error ($errno) => \"$msg\"\n";
+               print STDERR "$error ($errno) => \"$msg\"\n" unless ( $quiet );
                $errors{$errno} = $error;
                $errmsg{$errno} = $msg;
                $maxerr = $errno if ( $errno > $maxerr );
@@ -50,12 +50,23 @@ sub parse_file($) {
        }
     }
     close($fh);
-    print STDERR "closing $file\n";
+    print STDERR "closing $file\n" unless ( $quiet );
 }
         
-parse_file('linux/errno.h');
+$v = $ENV{'KBUILD_VERBOSE'};
+$quiet = defined($v) ? !$v : 0;
 
-($type) = @ARGV;
+foreach $arg ( @ARGV ) {
+    if ( $arg eq '-q' ) {
+       $quiet = 1;
+    } elsif ( $arg =~ /^-(errlist|errnos|maxerr)$/ ) {
+       $type = $arg;
+    } else {
+       die "$0: Unknown option: $arg\n";
+    }
+}
+
+parse_file('linux/errno.h');
 
 if ( $type eq '-errlist' ) {
     print  "#include <errno.h>\n";
index 20a2350d71b70b77e7355fb9e5a5d5d07bf682ba..976353c2016b1c138b084a9b01075edf1b9895a6 100644 (file)
@@ -133,9 +133,14 @@ void *malloc(size_t size)
   }
 
   /* Nothing found... need to request a block from the kernel */
-  fsize = (size+MALLOC_CHUNK_MASK) & ~MALLOC_CHUNK_MASK; 
+  fsize = (size+MALLOC_CHUNK_MASK) & ~MALLOC_CHUNK_MASK;
+
+#ifdef MALLOC_USING_SBRK
+  fp = (struct free_arena_header *) sbrk(fsize);
+#else
   fp = (struct free_arena_header *)
     mmap(NULL, fsize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
+#endif
 
   if ( fp == (struct free_arena_header *)MAP_FAILED ) {
     return NULL;               /* Failed to get a block */
index e053f714010f2fe121a25beee6c1b5b07f048811..456295069a01384496a5b26285770f5afeb4fcb6 100644 (file)
@@ -6,13 +6,7 @@
 
 #include <stdint.h>
 #include <stddef.h>
-
-/*
- * This is the minimum chunk size we will ask the kernel for; this should
- * be a multiple of the page size on all architectures.
- */
-#define MALLOC_CHUNK_SIZE      65536
-#define MALLOC_CHUNK_MASK       (MALLOC_CHUNK_SIZE-1)
+#include <klibc/sysconfig.h>
 
 /*
  * This structure should be a power of two.  This becomes the
index 89cf3a6a8f1b28120c336548586e3c2a878dbe84..196f1c088f38d450dc9bc0af86c286ace71a8c53 100644 (file)
@@ -6,46 +6,44 @@
 #include <errno.h>
 #include <sys/syscall.h>
 #include <sys/mman.h>
+#include <unistd.h>
 #include <asm/page.h>          /* For PAGE_SHIFT */
 
 #if defined(__sparc__)
 # define MMAP2_SHIFT   12      /* Fixed by syscall definition */
+#elif defined(__mips__) || defined(__powerpc__)
+# define MMAP2_SHIFT   __getpageshift() /* Variable */
 #else
 # define MMAP2_SHIFT   PAGE_SHIFT
 #endif
-#define MMAP2_MASK     ((1UL << MMAP2_SHIFT)-1)
 
 /*
- * Prefer mmap2() over mmap(), except on the architectures listed
+ * Set in SYSCALLS whether or not we should use an unadorned mmap() system
+ * call (typical on 64-bit architectures).
  */
+#if (BITSIZE == 32 && defined(__NR_mmap2)) || (BITSIZE == 64 && !defined(__NR_mmap))
 
-#if defined(__NR_mmap2) && !defined(__sparc__) && !defined(__ia64__) && !defined(__powerpc__) && !defined(__powerpc64__)
+/* This architecture uses mmap2(). The Linux mmap2() system call takes
+   a page offset as the offset argument.  We need to make sure we have
+   the proper conversion in place. */
 
-/* This architecture uses mmap2() */
-
-static inline _syscall6(void *,mmap2,void *,start,size_t,length,int,prot,int,flags,int,fd,off_t,offset);
-
-/* The Linux mmap2() system call takes a page offset as the offset argument.
-   We need to make sure we have the proper conversion in place. */
+extern void *__mmap2(void *, size_t, int, int, int, size_t);
 
 void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
 {
-  if ( offset & MMAP2_MASK ) {
+  const int mmap2_shift = MMAP2_SHIFT;
+  const unsigned long mmap2_mask = (1UL << mmap2_shift) - 1;
+
+  if ( offset & mmap2_mask ) {
     errno = EINVAL;
     return MAP_FAILED;
   }
 
-  return mmap2(start, length, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
+  return __mmap2(start, length, prot, flags, fd, (size_t)offset >> mmap2_shift);
 }
 
-#else
-
-/* This architecture uses a plain mmap() system call */
-/* Only use this for architectures where mmap() is a real 6-argument system call! */
-
-_syscall6(void *,mmap,void *,start,size_t,length,int,prot,int,flags,int,fd,off_t,offset)
-
 #endif
 
+
     
   
diff --git a/klibc/klibc/mrand48.c b/klibc/klibc/mrand48.c
new file mode 100644 (file)
index 0000000..886ae9f
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * mrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+unsigned short __rand48_seed[3]; /* Common with lrand48.c, srand48.c */
+
+long mrand48(void)
+{
+  return jrand48(__rand48_seed);
+}
index f0d97a3cd025ecafdb27572670e85411d8b0b08c..5a18de9091235cd4cee0d117070cbc737d6e82bd 100644 (file)
@@ -7,11 +7,7 @@
 #include <sys/resource.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_nice
-
-_syscall1(int,nice,int,inc);
-
-#else
+#ifndef __NR_nice
 
 int nice(int inc)
 {
diff --git a/klibc/klibc/nrand48.c b/klibc/klibc/nrand48.c
new file mode 100644 (file)
index 0000000..fb7c577
--- /dev/null
@@ -0,0 +1,11 @@
+/*
+ * nrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+long nrand48(unsigned short xsubi[3])
+{
+  return (long)((uint32_t)jrand48(xsubi) >> 1);
+}
index 0d7db10c4a3d70daa0b19b4b835786c2311cacc5..d52b53a6992af4400622212947d50864d3a89e49 100644 (file)
@@ -1,17 +1,21 @@
 /*
  * open.c
  *
- * The open syscall is weird, because it's defined as a varadic
- * function, but implementing it as such generally sucks for
- * performance.  Thus we generate it as a 3-argument function,
- * but with explicit __cdecl assuming the __cdecl convention is
- * independent of being varadic.
+ * On 32-bit platforms we need to pass O_LARGEFILE to the open()
+ * system call, to indicate that we're 64-bit safe.
  */
 
-#define __IN_OPEN_C
+#define _KLIBC_IN_OPEN_C
 #include <unistd.h>
 #include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/syscall.h>
 
-__cdecl _syscall3(int,open,const char *,file,int,flags,mode_t,mode)
+#if BITSIZE == 32 && !defined(__i386__)
+
+extern int __open(const char *, int, mode_t);
+
+int open(const char *pathname, int flags, mode_t mode)
+{
+  return __open(pathname, flags|O_LARGEFILE, mode);
+}
+
+#endif
index 57487284722adbb0a0bb328d120f1ef67635f996..1f7b9342de88e96a10f9ef88e83f7cb65fdcc9ba 100644 (file)
@@ -7,11 +7,7 @@
 #include <sys/time.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_pause
-
-_syscall0(int,pause);
-
-#else
+#ifndef __NR_pause
 
 int pause(void)
 {
index 45585cd57739eed2f97cc8796526429d24ee18ef..26f8ce8f6d963be5f6740bb6e775d3be87ad9b29 100644 (file)
@@ -8,5 +8,6 @@
 
 void perror(const char *s)
 {
-  fprintf(stderr, "%s: error %d\n", s, errno);
+  int e = errno;
+  fprintf(stderr, "%s: %s\n", s, strerror(e));
 }
diff --git a/klibc/klibc/putchar.c b/klibc/klibc/putchar.c
new file mode 100644 (file)
index 0000000..0e35add
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * putchar.c
+ *
+ * - gcc wants this
+ */
+
+#include <stdio.h>
+
+#undef putchar                 /* Defined as a macro */
+int putchar(int);
+
+int putchar(int c)
+{
+  return fputc(c, stdout);
+}
index e2197ea2ae8e8c4fa0da3724f5def7587d31b6bd..185f4dac69ebb1230ac15636cd9228416cf02196 100644 (file)
@@ -23,14 +23,14 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co
 {
   size_t gap = nmemb;
   size_t i, j;
-  void *p1, *p2;
+  char *p1, *p2;
   int swapped;
 
   do {
     gap = newgap(gap);
     swapped = 0;
     
-    for ( i = 0, p1 = base ; i < nmemb-gap ; i++, (char *)p1 += size ) {
+    for ( i = 0, p1 = base ; i < nmemb-gap ; i++, p1 += size ) {
       j = i+gap;
       if ( compar(p1, p2 = (char *)base+j*size) > 0 ) {
        memswap(p1, p2, size);
index bb216a19516a83b390ecd85da1bf424c54ee4629..acfe588713fd904aeed160b686d3a1d3e1579b84 100644 (file)
@@ -1,21 +1,12 @@
 /*
- * opendir/readdir/closedir
+ * readdir.c: opendir/readdir/closedir
  */
 
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdlib.h>
-#include <sys/dirent.h>
-#include <stdio.h>
-
-#define __IO_DIR_DEFINED
-struct _IO_dir {
-  int fd;
-  size_t bytes_left;
-  struct dirent *next;
-  struct dirent buffer[15];    /* 15 times max dirent size =~ 4K */
-};
 
+#define __KLIBC_DIRENT_INTERNALS
 #include <dirent.h>
 
 DIR *opendir(const char *name)
@@ -25,9 +16,9 @@ DIR *opendir(const char *name)
   if ( !dp )
     return NULL;
 
-  dp->fd = open(name, O_DIRECTORY|O_RDONLY);
+  dp->__fd = open(name, O_DIRECTORY|O_RDONLY);
 
-  if ( dp->fd < 0 ) {
+  if ( dp->__fd < 0 ) {
     free(dp);
     return NULL;
   }
@@ -43,7 +34,7 @@ struct dirent *readdir(DIR *dir)
   int rv;
   
   if ( !dir->bytes_left ) {
-    rv = getdents(dir->fd, dir->buffer, sizeof(dir->buffer));
+    rv = getdents(dir->__fd, dir->buffer, sizeof(dir->buffer));
     if ( rv <= 0 )
       return NULL;
     dir->bytes_left = rv;
@@ -51,7 +42,7 @@ struct dirent *readdir(DIR *dir)
   }
 
   dent = dir->next;
-  ((char *)dir->next) += dent->d_reclen;
+  dir->next = (struct dirent *)((char *)dir->next + dent->d_reclen);
   dir->bytes_left -= dent->d_reclen;
   
   return dent;
@@ -60,7 +51,7 @@ struct dirent *readdir(DIR *dir)
 int closedir(DIR *dir)
 {
   int rv;
-  rv = close(dir->fd);
+  rv = close(dir->__fd);
   free(dir);
   return rv;
 }
index 03ab3c14bba0824f927d0651dd4e32ff054eb5b3..f7401dcfe25fed99cdb7733d3f57ffd059553445 100644 (file)
@@ -1,23 +1,41 @@
 /* sbrk.c - Change data segment size */
 
 /* Written 2000 by Werner Almesberger */
+/* Modified 2003-2004 for klibc by H. Peter Anvin */
 
 #include <stddef.h>
 #include <unistd.h>
-#include <sys/types.h>
+#include <inttypes.h>
+#include <errno.h>
+#include "malloc.h"
 
 char *__current_brk;           /* Common with brk.c */
 
+/* p is an address,  a is alignment; must be a power of 2 */
+static inline void *align_up(void *p, uintptr_t a)
+{
+  return (void *) (((uintptr_t)p + a-1) & ~(a-1));
+}
+
 void *sbrk(ptrdiff_t increment)
 {
-  char *old_brk, *new_brk;
+  char *start, *end, *new_brk;
   
   if (!__current_brk)
     __current_brk = __brk(NULL);
-  new_brk = __brk(__current_brk+increment);
-  if (new_brk != __current_brk+increment)
+
+  start = align_up(__current_brk, SBRK_ALIGNMENT);
+  end   = start + increment;
+
+  new_brk = __brk(end);
+
+  if (new_brk == (void *)-1)
+    return (void *)-1;
+  else if (new_brk < end) {
+    errno = ENOMEM;
     return (void *) -1;
-  old_brk = __current_brk;
+  }
+
   __current_brk = new_brk;
-  return old_brk;
+  return end;
 }
index f8353c8715234a21d5fd9d83b64cda894c28b09e..ac916d61650d9c86ffcdeb56c1e6cd7662df0372 100644 (file)
@@ -6,7 +6,7 @@
 #include <stdint.h>
 #include <string.h>
 
-extern unsigned short __rand48_seed[3];
+unsigned short __rand48_seed[3];
 
 unsigned short *seed48(const unsigned short xsubi[3])
 {
diff --git a/klibc/klibc/select.c b/klibc/klibc/select.c
deleted file mode 100644 (file)
index 2404bb1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#ifdef __NR__newselect
-#undef __NR_select
-#define __NR_select __NR__newselect
-#endif
-
-_syscall5(int,select,int,a0,fd_set *,a1,fd_set *,a2,fd_set *,a3,struct timeval *,a4);
diff --git a/klibc/klibc/setresgid.c b/klibc/klibc/setresgid.c
deleted file mode 100644 (file)
index f1a8c6b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * setresgid.c
- */
-
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_setresgid
-
-_syscall3(int,setresgid,gid_t,a0,gid_t,a1,gid_t,a2);
-
-#elif defined(__NR_setresgid32)
-
-static inline _syscall3(int,setresgid32,gid_t,a0,gid_t,a1,gid_t,a2);
-
-int setresgid(gid_t a0, gid_t a1, gid_t a2)
-{
-  if ( sizeof(gid_t) == sizeof(uint32_t) ) {
-    return setresgid32(a0,a1,a2);
-  } else {
-    uint32_t x0 = (a0 == (gid_t)-1) ? (uint32_t)-1 : a0;
-    uint32_t x1 = (a1 == (gid_t)-1) ? (uint32_t)-1 : a1;
-    uint32_t x2 = (a2 == (gid_t)-1) ? (uint32_t)-1 : a2;
-    
-    return setresgid32(x0,x1,x2);
-  }
-}
-
-#endif
diff --git a/klibc/klibc/setresuid.c b/klibc/klibc/setresuid.c
deleted file mode 100644 (file)
index a587acb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * setresuid.c
- */
-
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_setresuid
-
-_syscall3(int,setresuid,uid_t,a0,uid_t,a1,uid_t,a2);
-
-#elif defined(__NR_setresuid32)
-
-static inline _syscall3(int,setresuid32,uid_t,a0,uid_t,a1,uid_t,a2);
-
-int setresuid(uid_t a0, uid_t a1, uid_t a2)
-{
-  if ( sizeof(uid_t) == sizeof(uint32_t) ) {
-    return setresuid32(a0,a1,a2);
-  } else {
-    uint32_t x0 = (a0 == (uid_t)-1) ? (uint32_t)-1 : a0;
-    uint32_t x1 = (a1 == (uid_t)-1) ? (uint32_t)-1 : a1;
-    uint32_t x2 = (a2 == (uid_t)-1) ? (uint32_t)-1 : a2;
-    
-    return setresuid32(x0,x1,x2);
-  }
-}
-
-#endif
-
index 600d51248c1837569527ed2ca6d775c5714dabcd..f81e08b17c44353f0b4b4998a8584bd6a800a1cb 100644 (file)
@@ -289,7 +289,7 @@ char *mybase64(uint8_t digest[20])
 
 int main(int argc, char** argv)
 {
-  int i, j;
+  int i;
   SHA1_CTX context;
   uint8_t digest[20], buffer[16384];
   FILE* file;
index ebd34710f18ec0f7db8090a60cbbc38eeb4fa351..885bc6a4a416ab275a8feb14e3b1164d11900356 100644 (file)
@@ -5,11 +5,7 @@
 #include <signal.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_sigaction
-
-_syscall3(int,sigaction,int,sig,const struct sigaction *,act,struct sigaction *,oact);
-
-#else
+#if !defined(__NR_sigaction)
 
 int sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
 {
index afbcf3cf341450f05050ab04d49591cbb58f5884..76d2b1a7f6c939230d28483eb7c61fae5a5b9169 100644 (file)
@@ -5,11 +5,7 @@
 #include <signal.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_sigpending
-
-_syscall1(int,sigpending,sigset_t *,set);
-
-#else
+#ifndef __NR_sigpending
 
 int sigpending(sigset_t *set)
 {
index 3a90f67732eb6c508d56677c647906207062ed9e..b5e58b28b8489f77c627b18b09eb747560827cd1 100644 (file)
@@ -5,11 +5,7 @@
 #include <signal.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_sigprocmask
-
-_syscall3(int,sigprocmask,int,how,const sigset_t *,set,sigset_t *,oset);
-
-#else
+#ifndef __NR_sigprocmask
 
 int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
 {
index 85cdea20ca4fa215ba24df1814ecf19d6107dfa3..a927999ae68ac68c396775b8b7a4db86f768f207 100644 (file)
@@ -5,11 +5,7 @@
 #include <signal.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_sigsuspend
-
-_syscall1(int,sigsuspend,const sigset_t *,mask);
-
-#else
+#ifndef __NR_sigsuspend
 
 int sigsuspend(const sigset_t *mask)
 {
index cf4daf603616ff11a21fdc391c9beebbf1481b8d..fd82b2b49f2a7de3ff3ba376043dc32b4b7e2822 100644 (file)
@@ -1,17 +1,32 @@
 #!/usr/bin/perl
-($arch, $file) = @ARGV;
+
+$v = $ENV{'KBUILD_VERBOSE'};
+$quiet = defined($v) ? !$v : 0;
+
+@args = ();
+for $arg ( @ARGV ) {
+    if ( $arg =~ /^-/ ) {
+       if ( $arg eq '-q' ) {
+           $quiet = 1;
+       } else {
+           die "$0: Unknown option: $arg\n";
+       }
+    } else {
+       push(@args, $arg);
+    }
+}
+($file, $arch) = @args;
 
 if (!open(FILE, "< $file")) {
-    print STDERR "$file: $!\n";
-    exit(1);
+    die "$file: $!\n";
 }
 
 while ( defined($line = <FILE>) ) {
     chomp $line;
-    $line =~ s/\s*\#.*$//;     # Strip comments and trailing blanks
+    $line =~ s/\s*[\#\;].*$//; # Strip comments and trailing blanks
     next unless $line;
 
-    if ( $line =~ /^\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
+    if ( $line =~ /^\s*\<\?\>\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
        $type = $1;
        $name = $2;
        $argv = $3;
@@ -26,7 +41,7 @@ while ( defined($line = <FILE>) ) {
        $nargs = $i;
 
        if ( $arch eq 'i386' ) {
-           open(OUT, "> socketcalls/${name}.S")
+           open(OUT, '>', "socketcalls/${name}.S")
                or die "$0: Cannot open socketcalls/${name}.S\n";
 
            print OUT "#include <sys/socketcalls.h>\n";
@@ -39,33 +54,31 @@ while ( defined($line = <FILE>) ) {
            print OUT "\tmovb \$SYS_\U${name}\E,%al\n";
            print OUT "\tjmp __socketcall_common\n";
            print OUT "\t.size ${name},.-${name}\n";
+           close(OUT);
        } else {
-           open(OUT, "> socketcalls/${name}.c")
+           open(OUT, '>', "socketcalls/${name}.c")
                or die "$0: Cannot open socketcalls/${name}.c\n";
-           print OUT "#include \"socketcommon.h\"\n\n";
-           
-           print OUT "#ifdef __NR_$name\n\n";
-           print OUT "_syscall", scalar(@args), "(", $type, ',', $name;
-           $i = 0;
-           foreach $arg ( @args ) {
-               print OUT ",", $arg, ",a",$i++;
-           }
-           print OUT ");\n";
-           print OUT "\n#else\n\n";
-           
+
+           print OUT "#include \"../socketcommon.h\"\n";
+           print OUT "\n";
+           print OUT "#ifndef __NR_${name}\n\n";
+
+           print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
+
            print OUT "$type $name (", join(', ', @cargs), ")\n";
            print OUT "{\n";
            print OUT "    unsigned long args[$nargs];\n";
            for ( $i = 0 ; $i < $nargs ; $i++ ) {
                print OUT "    args[$i] = (unsigned long)a$i;\n";
            }
-           print OUT "    return ($type) socketcall(SYS_\U${name}\E, args);\n";
-           print OUT "}\n";
-           print OUT "\n#endif\n";
+           print OUT "    return ($type) __socketcall(SYS_\U${name}\E, args);\n";
+           print OUT "}\n\n";
+
+           print OUT "#endif\n";
+
+           close(OUT);
        }
-       close(OUT);
     } else {
-       print STDERR "$file:$.: Could not parse input\n";
-       exit(1);
+       die "$file:$.: Could not parse input\n";
     }
 }
index 7a5acaadaf4594c7fef6ac0bc3a3fddca373df28..9c4b11fab8eca2b77a737ebf196d15543064b398 100644 (file)
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <linux/net.h>
-
-/*
- * Some architectures have socketcall(), some have real syscalls,
- * and some have both, but the syscall version is always preferred.
- * Look for __NR_<call> to probe for the existence of a syscall.
- */
-
-#ifdef __NR_socketcall
-static inline _syscall2(int,socketcall,int,call,unsigned long *,args);
-#endif
+#include <sys/socketcalls.h>
index a3df16d95c002fc906886db9175960c61383cef8..5f201d20476ffbdba7b56c285390fb1240f541d0 100644 (file)
@@ -5,8 +5,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-extern unsigned short __rand48_seed[3];
-
+unsigned short __rand48_seed[3]; /* Common with mrand48.c, lrand48.c */
 
 void srand48(long seedval)
 {
diff --git a/klibc/klibc/statfs.c b/klibc/klibc/statfs.c
new file mode 100644 (file)
index 0000000..60e9188
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * statfs.c
+ *
+ * On architectures which do statfs64, wrap the system call
+ */
+
+#include <sys/syscall.h>
+#include <sys/vfs.h>
+
+#ifdef __NR_statfs64
+
+extern int __statfs64(const char *, size_t, struct statfs *);
+
+int statfs(const char *path, struct statfs *buf)
+{
+  return __statfs64(path, sizeof *buf, buf);
+}
+
+#endif
index 62705553a6d000df790d183f2208c2827a1c1708..c8e3eac793517244258542cc535dda19ebbd430b 100644 (file)
@@ -7,18 +7,28 @@
 char *strerror(int errnum)
 {
   static char message[32] = "error "; /* enough for error 2^63-1 */
-
   char numbuf[32];
   char *p;
+  unsigned int e = (unsigned int)errnum;
+
+#ifdef WITH_ERRLIST
+  extern const int sys_nerr;
+  extern const char * const sys_errlist[];
+
+  if ( e < (unsigned int)sys_nerr && sys_errlist[e] )
+    return (char *)sys_errlist[e];
+#endif
 
   p = numbuf+sizeof numbuf;
   *--p = '\0';
 
   do {
-    *--p = (errnum % 10) + '0';
-    errnum /= 10;
-  } while ( errnum );
+    *--p = (e % 10) + '0';
+    e /= 10;
+  } while ( e );
+
+  memcpy(message+6, p, (numbuf+sizeof numbuf)-p);
 
-  return (char *)memcpy(message+6, p, (numbuf+sizeof numbuf)-p);
+  return message;
 }
 
diff --git a/klibc/klibc/strlcat.c b/klibc/klibc/strlcat.c
new file mode 100644 (file)
index 0000000..6111445
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * strlcat.c
+ */
+
+#include <string.h>
+#include <klibc/compiler.h>
+
+size_t strlcat(char *dst, const char *src, size_t size)
+{
+  size_t bytes = 0;
+  char *q = dst;
+  const char *p = src;
+  char ch;
+
+  while ( bytes < size && *q ) {
+    q++;
+    bytes++;
+  }
+
+  while ( (ch = *p++) ) {
+    if ( bytes < size )
+      *q++ = ch;
+
+    bytes++;
+  }
+
+  *q = '\0';
+  return bytes;
+}
+
+
diff --git a/klibc/klibc/strlcpy.c b/klibc/klibc/strlcpy.c
new file mode 100644 (file)
index 0000000..eb384c9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * strlcpy.c
+ */
+
+#include <string.h>
+#include <klibc/compiler.h>
+
+size_t strlcpy(char *dst, const char *src, size_t size)
+{
+  size_t bytes = 0;
+  char *q = dst;
+  const char *p = src;
+  char ch;
+
+  while ( (ch = *p++) ) {
+    if ( bytes < size )
+      *q++ = ch;
+
+    bytes++;
+  }
+
+  *q = '\0';
+  return bytes;
+}
+
+
index 99d957594cfd07507d800edd867d06dc7625a285..0dd9deb984f1323874d64ef8fb5f0d11e8273387 100644 (file)
@@ -3,9 +3,23 @@
  */
 
 #include <string.h>
+#include <klibc/compiler.h>
 
 char *strncat(char *dst, const char *src, size_t n)
 {
-  strncpy(strchr(dst, '\0'), src, n);
+  char *q = strchr(dst, '\0');
+  const char *p = src;
+  char ch;
+  size_t nn = q-dst;
+
+  if ( __likely(nn <= n) )
+    n -= nn;
+
+  while (n--) {
+    *q++ = ch = *p++;
+    if ( !ch )
+      break;
+  }
+
   return dst;
 }
index a8fe45fcbb588bccb28c9fadaf821adef5e0df10..06964f31d687c3ef7acabf3c9ce6076e60de103c 100644 (file)
@@ -1,7 +1,5 @@
 /*
  * strncpy.c
- *
- * strncpy()
  */
 
 #include <string.h>
@@ -12,11 +10,15 @@ char *strncpy(char *dst, const char *src, size_t n)
   const char *p = src;
   char ch;
 
-  while ( n-- ) {
+  while (n) {
+    n--;
     *q++ = ch = *p++;
     if ( !ch )
       break;
   }
 
+  /* The specs say strncpy() fills the entire buffer with NUL.  Sigh. */
+  memset(q, 0, n);
+
   return dst;
 }
diff --git a/klibc/klibc/strnlen.c b/klibc/klibc/strnlen.c
new file mode 100644 (file)
index 0000000..06b54c3
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * strnlen()
+ */
+
+#include <string.h>
+
+size_t strnlen(const char *s, size_t maxlen)
+{
+  const char *ss = s;
+
+  /* Important: the maxlen test must precede the reference through ss;
+     since the byte beyond the maximum may segfault */
+  while ((maxlen > 0) && *ss) {
+       ss++;
+       maxlen--;
+  }
+  return ss-s;
+}
+
diff --git a/klibc/klibc/strtotimespec.c b/klibc/klibc/strtotimespec.c
new file mode 100644 (file)
index 0000000..b426bf8
--- /dev/null
@@ -0,0 +1,5 @@
+#define NAME    strtotimespec
+#define TIMEX   struct timespec
+#define FSEC    tv_nsec
+#define DECIMALS 9
+#include "strtotimex.c"
diff --git a/klibc/klibc/strtotimeval.c b/klibc/klibc/strtotimeval.c
new file mode 100644 (file)
index 0000000..280d4bc
--- /dev/null
@@ -0,0 +1,5 @@
+#define NAME    strtotimeval
+#define TIMEX   struct timeval
+#define FSEC    tv_usec
+#define DECIMALS 6
+#include "strtotimex.c"
diff --git a/klibc/klibc/strtotimex.c b/klibc/klibc/strtotimex.c
new file mode 100644 (file)
index 0000000..0f6c2f9
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * strtotimex.c
+ *
+ * Nonstandard function which takes a string and converts it to a
+ * struct timespec/timeval.  Returns a pointer to the first non-numeric
+ * character in the string.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+char * NAME (const char *str, TIMEX *ts)
+{
+  int n;
+  char *s, *s0;
+  __typeof__(ts->FSEC) fs;     /* Fractional seconds */
+
+  ts->tv_sec = strntoumax(str, &s, 10, ~(size_t)0);
+  fs = 0;
+
+  if ( *s == '.' ) {
+    s0 = s+1;
+
+    fs = strntoumax(s0, &s, 10, DECIMALS);
+    n = s-s0;
+    
+    while ( isdigit(*s) )
+      s++;
+    
+    for ( ; n < DECIMALS ; n++ )
+      fs *= 10;
+  }
+
+  ts->FSEC = fs;
+  return s;
+}
index b530a9b8c7d41df74de64d18ed1e8ef3ca2dbee3..1c48ce58ff623856d484ef66144fa948a3fb99e3 100644 (file)
@@ -1,46 +1,99 @@
 #!/usr/bin/perl
-($arch, $file) = @ARGV;
+#
+# Script to parse the SYSCALLS file and generate appropriate
+# stubs.
 
-if (!open(FILE, "< $file")) {
-    print STDERR "$file: $!\n";
-    exit(1);
+$v = $ENV{'KBUILD_VERBOSE'};
+$quiet = defined($v) ? !$v : 0;
+
+@args = ();
+for $arg ( @ARGV ) {
+    if ( $arg =~ /^-/ ) {
+       if ( $arg eq '-q' ) {
+           $quiet = 1;
+       } else {
+           die "$0: Unknown option: $arg\n";
+       }
+    } else {
+       push(@args, $arg);
+    }
+}
+($file, $arch, $bits, $unistd, $havesyscall) = @args;
+
+require "arch/$arch/sysstub.ph";
+
+if (!open(UNISTD, '<', $unistd)) {
+    die "$0: $unistd: $!\n";
+}
+while ( defined($line = <UNISTD>) ) {
+    chomp $line;
+
+    if ( $line =~ /^\#\s*define\s+__NR_([A-Za-z0-9_]+)\s+(.*\S)\s*$/ ) {
+       $syscalls{$1} = $2;
+       print STDERR "SYSCALL FOUND: $1\n" unless ( $quiet );
+    }
+}
+close(UNISTD);
+
+if (!open(HAVESYS, '>', $havesyscall)) {
+    die "$0: $havesyscall: $!\n";
+}
+
+print HAVESYS "#ifndef _KLIBC_HAVESYSCALL_H\n";
+print HAVESYS "#define _KLIBC_HAVESYSCALL_H 1\n\n";
+
+if (!open(FILE, '<', $file)) {
+    die "$0: $file: $!\n";
 }
 
 while ( defined($line = <FILE>) ) {
     chomp $line;
-    $line =~ s/\s*\#.*$//;     # Strip comments and trailing blanks
+    $line =~ s/\s*(|[\#;].*)$//; # Strip comments and trailing blanks
     next unless $line;
 
-    if ( $line =~ /^\s*(\<[^\>]+\>\s+|)([^\(\<\>]+[^\@\:A-Za-z0-9_])([A-Za-z0-9_]+)(|\@[A-Za-z0-9_]+)(|\:\:[A-Za-z0-9_]+)\s*\(([^\:\)]*)\)\s*$/ ) {
-       $archs = $1;
-       $type  = $2;
-       $sname = $3;
-       $stype = $4;
-       $fname = $5;
-       $argv  = $6;
+    if ( $line =~ /^\s*(\<[^\>]+\>\s+|)([A-Za-z0-9_\*\s]+)\s+([A-Za-z0-9_,]+)(|\@[A-Za-z0-9_]+)(|\:\:[A-Za-z0-9_]+)\s*\(([^\:\)]*)\)\s*$/ ) {
+       $archs  = $1;
+       $type   = $2;
+       $snames = $3;
+       $stype  = $4;
+       $fname  = $5;
+       $argv   = $6;
 
-       $doit = 1;
+       $doit  = 1;
+       $maybe = 0;
        if ( $archs ne '' ) {
-           die "$0: Internal error"
-               unless ( $archs =~ /^\<(|\!)([^\>\!]+)\>/ );
-           $not = $1;
-           $list = $2;
+           die "$file:$.: Invalid architecture spec: <$archs>\n"
+               unless ( $archs =~ /^\<(|\?)(|\!)([^\>\!\?]*)\>/ );
+           $maybe = $1 ne '';
+           $not = $2 ne '';
+           $list = $3;
 
-           $doit = ($not eq '') ? 0 : 1;
+           $doit = $not || ($list eq '');
 
            @list = split(/,/, $list);
            foreach  $a ( @list ) {
-               if ( $a eq $arch ) {
-                   $doit = ($not eq '') ? 1 : 0;
+               if ( $a eq $arch || $a eq $bits ) {
+                   $doit = !$not;
                    last;
                }
            }
        }
        next if ( ! $doit );
 
-       $type =~ s/\s*$//;
+       undef $sname;
+       foreach $sn ( split(/,/, $snames) ) {
+           if ( defined $syscalls{$sn} ) {
+               $sname = $sn;
+               last;
+           }
+       }
+       if ( !defined($sname) ) {
+           next if ( $maybe );
+           die "$file:$.: Undefined system call: $snames\n";
+       }
 
-       $stype =~ s/^\@/_/;
+       $type  =~ s/\s*$//;
+       $stype =~ s/^\@//;
 
        if ( $fname eq '' ) {
            $fname = $sname;
@@ -50,32 +103,12 @@ while ( defined($line = <FILE>) ) {
 
        @args = split(/\s*\,\s*/, $argv);
 
-       open(OUT, "> syscalls/${fname}.c")
-           or die "$0: Cannot open syscalls/${fname}.c\n";
-
-       if ( $fname eq "rt_sigaction") {
-           print OUT "#ifdef __x86_64__\n\n";
-           print OUT "struct sigaction;\n\n";
-            print OUT "#endif\n\n"
-       }
-
-       print OUT "#include \"syscommon.h\"\n\n";
-       
-       if ( $fname ne $sname ) {
-           print OUT "#undef __NR_${fname}\n";
-           print OUT "#define __NR_${fname} __NR_${sname}\n\n";
-       }
-
-       print OUT "_syscall", scalar(@args), $stype, "(", $type, ',', $fname;
-
-       $i = 0;
-       foreach $arg ( @args ) {
-           print OUT ",", $arg, ",a",$i++;
-       }
-       print OUT ");\n";
-       close(OUT);
+       print HAVESYS "#define _KLIBC_HAVE_SYSCALL_${fname} ${sname}\n";
+       make_sysstub($fname, $type, $sname, $stype, @args);
     } else {
-       print STDERR "$file:$.: Could not parse input\n";
-       exit(1);
+       die "$file:$.: Could not parse input: \"$line\"\n";
     }
 }
+
+print HAVESYS "\n#endif\n";
+close(HAVESYS);
index 10a2dce40543dd5c647f61f0b02b1cb0288db02b..592992ba6b2a82e710307c8f298cdebada689db0 100644 (file)
@@ -18,7 +18,7 @@
 #define LOGDEV "/dev/kmsg"
 
 /* Max length of ID string */
-#define MAXID 31
+#define MAXID 31               /* MAXID+6 must be < BUFLEN */
 
 int __syslog_fd = -1;
 static char id[MAXID+1];
@@ -43,16 +43,12 @@ void openlog(const char *ident, int option, int facility)
 void vsyslog(int prio, const char *format, va_list ap)
 {
   char buf[BUFLEN];
-  int rv, len;
+  int len;
   int fd;
 
   if ( __syslog_fd == -1 )
     openlog(NULL, 0, 0);
 
-  fd = __syslog_fd;
-  if ( fd == -1 )
-    fd = 2;                    /* Failed to open log, write to stderr */
-
   buf[0] = '<';
   buf[1] = LOG_PRI(prio)+'0';
   buf[2] = '>';
@@ -61,13 +57,16 @@ void vsyslog(int prio, const char *format, va_list ap)
   if ( *id )
     len += sprintf(buf+3, "%s: ", id);
 
-  rv = vsnprintf(buf+len, BUFLEN-len, format, ap);
+  len += vsnprintf(buf+len, BUFLEN-len, format, ap);
 
-  len += rv;
   if ( len > BUFLEN-1 ) len = BUFLEN-1;
-  buf[len] = '\n';
+  buf[len++] = '\n';
+
+  fd = __syslog_fd;
+  if ( fd == -1 )
+    fd = 2;                    /* Failed to open log, write to stderr */
 
-  write(fd, buf, len+1);
+  write(fd, buf, len);
 }
 
 void syslog(int prio, const char *format, ...)
diff --git a/klibc/klibc/tests/fcntl.c b/klibc/klibc/tests/fcntl.c
new file mode 100644 (file)
index 0000000..f504ad9
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Simple test of fcntl
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char *argv[])
+{
+  int fd = open(argv[0], O_RDONLY);
+  struct flock l;
+  long flags;
+
+  (void)argc;
+
+  if ( fd < 0 ) {
+    perror("open");
+    exit(1);
+  }
+
+  /* Get the flags on this FD */
+
+  if ( (flags = fcntl(fd, F_GETFL)) == -1 ) {
+    perror("F_GETFL");
+    exit(1);
+  }
+
+  if ( flags != (O_RDONLY|O_LARGEFILE) )
+    fprintf(stderr, "flags = %#lx\n", flags);
+
+  /* Set a lock on this FD */
+  memset(&l, 0, sizeof l);
+  l.l_type   = F_RDLCK;
+  l.l_whence = SEEK_SET;
+  l.l_start  = 123;
+  l.l_len    = 456;
+
+  if ( fcntl(fd, F_SETLK, &l) == -1 ) {
+    perror("F_SETLK");
+    exit(1);
+  }
+
+  /* Eventually, fork and try to conflict with this lock... */
+
+  return 0;
+}
+
+  
+  
diff --git a/klibc/klibc/tests/getpagesize.c b/klibc/klibc/tests/getpagesize.c
new file mode 100644 (file)
index 0000000..bda37e1
--- /dev/null
@@ -0,0 +1,11 @@
+#include <unistd.h>
+#include <stdio.h>
+
+int main(void)
+{
+  printf("getpagesize()    = %d\n"
+        "__getpageshift() = %d\n",
+        getpagesize(), __getpageshift());
+
+  return 0;
+}
diff --git a/klibc/klibc/tests/malloctest2.c b/klibc/klibc/tests/malloctest2.c
new file mode 100644 (file)
index 0000000..b392046
--- /dev/null
@@ -0,0 +1,60 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define NCYCLES 32768
+#define NSLOTS  4096
+
+struct slot {
+  char *ptr;
+  size_t size;
+};
+
+struct slot s[NSLOTS];
+
+int main(void)
+{
+  size_t sp, sq;
+  char *p, *ep, *q, *eq;
+  int r, i, j;
+  int ok;
+  int err = 0;
+
+  for ( r = 0 ; r < NCYCLES ; r++ ) {
+    i = lrand48() % NSLOTS;
+
+    if ( s[i].ptr ) {
+      free(s[i].ptr);
+      printf("Freed     %8zu bytes at %p\n", s[i].size, s[i].ptr);
+      s[i].ptr  = NULL;
+      s[i].size = 0;
+    } else {
+      sp = lrand48();          /* 32-bit random number */
+      sp >>= 12+(lrand48() % 20);
+
+      s[i].size = sp;
+      s[i].ptr  = p = malloc(sp);
+      ep = p+sp;
+      ok = 1;
+      for ( j = 0 ; j < NSLOTS ; j++ ) {
+       q = s[j].ptr;
+       if ( i != j && q ) {
+         sq = s[j].size;
+         eq = q+sq;
+         
+         if ( (p < q && ep > q) || (p >= q && p < eq) ) {
+           ok = 0;
+           err = 1;
+           break;
+         }
+       }
+      }
+      printf("Allocated %8zu bytes at %p, ok = %d\n", sp, p, ok);
+
+      if ( p )
+       memset(p, 0xee, sp);    /* Poison this memory */
+    }
+  }
+  return err;
+}
+
index e57cd05a5035363f1472c4d5ca9dab8fb2679a02..f0f5a40379f73f0e8a96ba990e86499c5062317b 100644 (file)
@@ -3,7 +3,7 @@
 
 int main(void)
 {
-  const char hello[] = "Hello, World!\n";
+  static const char hello[] = "Hello, World!\n";
   _fwrite(hello, sizeof hello-1, stdout);
   return 0;
 }
diff --git a/klibc/klibc/tests/minips.c b/klibc/klibc/tests/minips.c
deleted file mode 100644 (file)
index 2089827..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright 1998 by Albert Cahalan; all rights reserved.
- * This file may be used subject to the terms and conditions of the
- * GNU Library General Public License Version 2, or any later version
- * at your option, as published by the Free Software Foundation.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Library General Public License for more details.
- */
-
-/* This is a minimal /bin/ps, designed to be smaller than the old ps
- * while still supporting some of the more important features of the
- * new ps. (for total size, note that this ps does not need libproc)
- * It is suitable for Linux-on-a-floppy systems only.
- *
- * Maintainers: do not compile or install for normal systems.
- * Anyone needing this will want to tweak their compiler anyway.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <dirent.h>
-
-#include <asm/param.h>  /* HZ */
-#include <asm/page.h>   /* PAGE_SIZE */
-
-static int P_euid;
-static int P_pid;
-static char P_cmd[16];
-static char P_state;
-static int P_ppid, P_pgrp, P_session, P_tty, P_tpgid;
-static unsigned long P_flags, P_min_flt, P_cmin_flt, P_maj_flt, P_cmaj_flt, P_utime, P_stime;
-static long P_cutime, P_cstime, P_priority, P_nice, P_timeout, P_it_real_value;
-static unsigned long P_start_time, P_vsize;
-static long P_rss;
-static unsigned long P_rss_rlim, P_start_code, P_end_code, P_start_stack, P_kstk_esp, P_kstk_eip;
-static unsigned P_signal, P_blocked, P_sigignore, P_sigcatch;
-static unsigned long P_wchan, P_nswap, P_cnswap;
-
-
-#if 0
-static int screen_cols = 80;
-static int w_count;
-#endif
-
-static int want_one_pid;
-static const char *want_one_command;
-static int select_notty;
-static int select_all;
-
-static int ps_format;
-static int old_h_option;
-
-/* we only pretend to support this */
-static int show_args;    /* implicit with -f and all BSD options */
-static int bsd_c_option; /* this option overrides the above */
-
-static int ps_argc;    /* global argc */
-static char **ps_argv; /* global argv */
-static int thisarg;    /* index into ps_argv */
-static char *flagptr;  /* current location in ps_argv[thisarg] */
-
-
-#ifndef PAGE_SIZE
-#warning PAGE_SIZE not defined, assuming it is 4096
-#define PAGE_SIZE 4096
-#endif
-
-#ifndef HZ
-#warning HZ not defined, assuming it is 100
-#define HZ 100
-#endif
-
-
-
-static void usage(void){
-  fprintf(stderr,
-    "-C   select by command name (minimal ps only accepts one)\n"
-    "-p   select by process ID (minimal ps only accepts one)\n"
-    "-e   all processes (same as ax)\n"
-    "a    all processes w/ tty, including other users\n"
-    "x    processes w/o controlling ttys\n"
-    "-f   full format\n"
-    "-j,j job control format\n"
-    "v    virtual memory format\n"
-    "-l,l long format\n"
-    "u    user-oriented format\n"
-    "-o   user-defined format (limited support, only \"ps -o pid=\")\n"
-    "h    no header\n"
-/*
-    "-A   all processes (same as ax)\n"
-    "c    true command name\n"
-    "-w,w wide output\n"
-*/
-  );
-  exit(1);
-}
-
-/*
- * Return the next argument, or call the usage function.
- * This handles both:   -oFOO   -o FOO
- */
-static const char *get_opt_arg(void){
-  const char *ret;
-  ret = flagptr+1;    /* assume argument is part of ps_argv[thisarg] */
-  if(*ret) return ret;
-  if(++thisarg >= ps_argc) usage();   /* there is nothing left */
-  /* argument is the new ps_argv[thisarg] */
-  ret = ps_argv[thisarg];
-  if(!ret || !*ret) usage();
-  return ret;
-}
-
-
-/* return the PID, or 0 if nothing good */
-static void parse_pid(const char *str){
-  char *endp;
-  int num;
-  if(!str)            goto bad;
-  num = strtol(str, &endp, 0);
-  if(*endp != '\0')   goto bad;
-  if(num<1)           goto bad;
-  if(want_one_pid)    goto bad;
-  want_one_pid = num;
-  return;
-bad:
-  usage();
-}
-
-/***************** parse SysV options, including Unix98  *****************/
-static void parse_sysv_option(void){
-  do{
-    switch(*flagptr){
-    /**** selection ****/
-    case 'C': /* end */
-      if(want_one_command) usage();
-      want_one_command = get_opt_arg();
-      return; /* can't have any more options */
-    case 'p': /* end */
-      parse_pid(get_opt_arg());
-      return; /* can't have any more options */
-    case 'A':
-    case 'e':
-      select_all++;
-      select_notty++;
-case 'w':    /* here for now, since the real one is not used */
-      break;
-    /**** output format ****/
-    case 'f':
-      show_args = 1;
-      /* FALL THROUGH */
-    case 'j':
-    case 'l':
-      if(ps_format) usage();
-      ps_format = *flagptr;
-      break;
-    case 'o': /* end */
-      /* We only support a limited form: "ps -o pid="  (yes, just "pid=") */
-      if(strcmp(get_opt_arg(),"pid=")) usage();
-      if(ps_format) usage();
-      ps_format = 'o';
-      old_h_option++;
-      return; /* can't have any more options */
-    /**** other stuff ****/
-#if 0
-    case 'w':
-      w_count++;
-      break;
-#endif
-    default:
-      usage();
-    } /* switch */
-  }while(*++flagptr);
-}
-
-/************************* parse BSD options **********************/
-static void parse_bsd_option(void){
-  do{
-    switch(*flagptr){
-    /**** selection ****/
-    case 'a':
-      select_all++;
-      break;
-    case 'x':
-      select_notty++;
-      break;
-    case 'p': /* end */
-      parse_pid(get_opt_arg());
-      return; /* can't have any more options */
-    /**** output format ****/
-    case 'j':
-    case 'l':
-    case 'u':
-    case 'v':
-      if(ps_format) usage();
-      ps_format = 0x80 | *flagptr;  /* use 0x80 to tell BSD from SysV */
-      break;
-    /**** other stuff ****/
-    case 'c':
-      bsd_c_option++;
-#if 0
-      break;
-#endif
-    case 'w':
-#if 0
-      w_count++;
-#endif
-      break;
-    case 'h':
-      old_h_option++;
-      break;
-    default:
-      usage();
-    } /* switch */
-  }while(*++flagptr);
-}
-
-#if 0
-/* not used yet */
-static void choose_dimensions(void){
-  struct winsize ws;
-  char *columns;
-  /* screen_cols is 80 by default */
-  if(ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col>30) screen_cols = ws.ws_col;
-  columns = getenv("COLUMNS");
-  if(columns && *columns){
-    long t;
-    char *endptr;
-    t = strtol(columns, &endptr, 0);
-    if(!*endptr && (t>30) && (t<(long)999999999)) screen_cols = (int)t;
-  }
-  if(w_count && (screen_cols<132)) screen_cols=132;
-  if(w_count>1) screen_cols=999999999;
-}
-#endif
-
-static void arg_parse(int argc, char *argv[]){
-  int sel = 0;  /* to verify option sanity */
-  ps_argc = argc;
-  ps_argv = argv;
-  thisarg = 0;
-  /**** iterate over the args ****/
-  while(++thisarg < ps_argc){
-    flagptr = ps_argv[thisarg];
-    switch(*flagptr){
-    case '0' ... '9':
-      show_args = 1;
-      parse_pid(flagptr);
-      break;
-    case '-':
-      flagptr++;
-      parse_sysv_option();
-      break;
-    default:
-      show_args = 1;
-      parse_bsd_option();
-      break;
-    }
-  }
-  /**** sanity check and clean-up ****/
-  if(want_one_pid) sel++;
-  if(want_one_command) sel++;
-  if(select_notty || select_all) sel++;
-  if(sel>1 || select_notty>1 || select_all>1 || bsd_c_option>1 || old_h_option>1) usage();
-  if(bsd_c_option) show_args = 0;
-}
-
-/* return 1 if it works, or 0 for failure */
-static int stat2proc(int pid) {
-    char buf[800]; /* about 40 fields, 64-bit decimal is about 20 chars */
-    int num;
-    int fd;
-    char* tmp;
-    struct stat sb; /* stat() used to get EUID */
-    snprintf(buf, 32, "/proc/%d/stat", pid);
-    if ( (fd = open(buf, O_RDONLY, 0) ) == -1 ) return 0;
-    num = read(fd, buf, sizeof buf - 1);
-    fstat(fd, &sb);
-    P_euid = sb.st_uid;
-    close(fd);
-    if(num<80) return 0;
-    buf[num] = '\0';
-    tmp = strrchr(buf, ')');      /* split into "PID (cmd" and "<rest>" */
-    *tmp = '\0';                  /* replace trailing ')' with NUL */
-    /* parse these two strings separately, skipping the leading "(". */
-    memset(P_cmd, 0, sizeof P_cmd);          /* clear */
-    sscanf(buf, "%d (%15c", &P_pid, P_cmd);  /* comm[16] in kernel */
-    num = sscanf(tmp + 2,                    /* skip space after ')' too */
-       "%c "
-       "%d %d %d %d %d "
-       "%lu %lu %lu %lu %lu %lu %lu "
-       "%ld %ld %ld %ld %ld %ld "
-       "%lu %lu "
-       "%ld "
-       "%lu %lu %lu %lu %lu %lu "
-       "%u %u %u %u " /* no use for RT signals */
-       "%lu %lu %lu",
-       &P_state,
-       &P_ppid, &P_pgrp, &P_session, &P_tty, &P_tpgid,
-       &P_flags, &P_min_flt, &P_cmin_flt, &P_maj_flt, &P_cmaj_flt, &P_utime, &P_stime,
-       &P_cutime, &P_cstime, &P_priority, &P_nice, &P_timeout, &P_it_real_value,
-       &P_start_time, &P_vsize,
-       &P_rss,
-       &P_rss_rlim, &P_start_code, &P_end_code, &P_start_stack, &P_kstk_esp, &P_kstk_eip,
-       &P_signal, &P_blocked, &P_sigignore, &P_sigcatch,
-       &P_wchan, &P_nswap, &P_cnswap
-    );
-/*    fprintf(stderr, "stat2proc converted %d fields.\n",num); */
-    P_vsize /= 1024;
-    P_rss *= (PAGE_SIZE/1024);
-    if(num < 30) return 0;
-    if(P_pid != pid) return 0;
-    return 1;
-}
-
-static const char *do_time(unsigned long t){
-  int hh,mm,ss;
-  static char buf[32];
-  int cnt = 0;
-  t /= HZ;
-  ss = t%60;
-  t /= 60;
-  mm = t%60;
-  t /= 60;
-  hh = t%24;
-  t /= 24;
-  if(t) cnt = snprintf(buf, sizeof buf, "%d-", (int)t);
-  snprintf(cnt + buf, sizeof(buf)-cnt, "%02d:%02d:%02d", hh, mm, ss);
-  return buf;
-}
-
-static void print_proc(void){
-  char tty[16];
-  snprintf(tty, sizeof tty, "%3d,%-3d", (P_tty>>8)&0xff, P_tty&0xff);
-  switch(ps_format){
-  case 0:
-    printf("%5d %s %s", P_pid, tty, do_time(P_utime+P_stime));
-    break;
-  case 'o':
-    printf("%d\n", P_pid);
-    return; /* don't want the command */
-  case 'l':
-    printf(
-      "%03x %c %5d %5d %5d  - %3d %3d - "
-      "%5ld %06x %s %s",
-      (unsigned)P_flags&0x777, P_state, P_euid, P_pid, P_ppid,
-      (int)P_priority, (int)P_nice, P_vsize/(PAGE_SIZE/1024),
-      (unsigned)(P_wchan&0xffffff), tty, do_time(P_utime+P_stime)
-    );
-    break;
-  case 'f':
-    printf(
-      "%5d %5d %5d  -   -   %s %s",
-      P_euid, P_pid, P_ppid, tty, do_time(P_utime+P_stime)
-    );
-    break;
-  case 'j':
-    printf(
-      "%5d %5d %5d %s %s",
-      P_pid, P_pgrp, P_session, tty, do_time(P_utime+P_stime)
-    );
-    break;
-  case 'u'|0x80:
-    printf(
-      "%5d %5d    -    - %5ld %5ld %s %c   -   %s",
-      P_euid, P_pid, P_vsize, P_rss, tty, P_state,
-      do_time(P_utime+P_stime)
-    );
-    break;
-  case 'v'|0x80:
-    printf(
-      "%5d %s %c %s %6d   -   - %5d    -",
-      P_pid, tty, P_state, do_time(P_utime+P_stime), (int)P_maj_flt,
-      (int)P_rss
-    );
-    break;
-  case 'j'|0x80:
-    printf(
-      "%5d %5d %5d %5d %s %5d %c %5d %s",
-      P_ppid, P_pid, P_pgrp, P_session, tty, P_tpgid, P_state, P_euid, do_time(P_utime+P_stime)
-    );
-    break;
-  case 'l'|0x80:
-    printf(
-      "%03x %5d %5d %5d %3d %3d "
-      "%5ld %4ld %06x %c %s %s",
-      (unsigned)P_flags&0x777, P_euid, P_pid, P_ppid, (int)P_priority, (int)P_nice,
-      P_vsize, P_rss, (unsigned)(P_wchan&0xffffff), P_state, tty, do_time(P_utime+P_stime)
-    );
-    break;
-  default:
-    break;
-  }
-  if(show_args) printf(" [%s]\n", P_cmd);
-  else          printf(" %s\n", P_cmd);
-}
-
-
-int main(int argc, char *argv[]){
-  arg_parse(argc, argv);
-#if 0
-  choose_dimensions();
-#endif
-  if(!old_h_option){
-    const char *head;
-    switch(ps_format){
-    default: /* can't happen */
-    case 0:        head = "  PID TTY         TIME CMD"; break;
-    case 'l':      head = "  F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN    TTY       TIME CMD"; break;
-    case 'f':      head = "  UID   PID  PPID  C STIME   TTY       TIME CMD"; break;
-    case 'j':      head = "  PID  PGID   SID TTY         TIME CMD"; break;
-    case 'u'|0x80: head = "  UID   PID %CPU %MEM   VSZ   RSS   TTY   S START     TIME COMMAND"; break;
-    case 'v'|0x80: head = "  PID   TTY   S     TIME  MAJFL TRS DRS   RSS %MEM COMMAND"; break;
-    case 'j'|0x80: head = " PPID   PID  PGID   SID   TTY   TPGID S   UID     TIME COMMAND"; break;
-    case 'l'|0x80: head = "  F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  S   TTY       TIME COMMAND"; break;
-    }
-    printf("%s\n",head);
-  }
-  if(want_one_pid){
-    if(stat2proc(want_one_pid)) print_proc();
-    else exit(1);
-  }else{
-    struct dirent *ent;          /* dirent handle */
-    DIR *dir;
-    int ouruid;
-    int found_a_proc;
-    found_a_proc = 0;
-    ouruid = getuid();
-    dir = opendir("/proc");
-    while(( ent = readdir(dir) )){
-      if(*ent->d_name<'0' || *ent->d_name>'9') continue;
-      if(!stat2proc(atoi(ent->d_name))) continue;
-      if(want_one_command){
-        if(strcmp(want_one_command,P_cmd)) continue;
-      }else{
-        if(!select_notty && P_tty==-1) continue;
-        if(!select_all && P_euid!=ouruid) continue;
-      }
-      found_a_proc++;
-      print_proc();
-    }
-    closedir(dir);
-    exit(!found_a_proc);
-  }
-  return 0;
-}
diff --git a/klibc/klibc/tests/mmaptest.c b/klibc/klibc/tests/mmaptest.c
new file mode 100644 (file)
index 0000000..a654aff
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * mmaptest.c
+ *
+ * Test some simple cases of mmap()
+ */
+
+#include <sys/mman.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <sys/syscall.h>
+
+int main(int argc, char *argv[])
+{
+  void *foo;
+
+  (void)argc; (void)argv;
+
+  /* Important case, this is how we get memory for malloc() */
+  errno = 0;
+  foo = mmap(0, 65536, PROT_READ|PROT_WRITE,
+            MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
+
+  printf("mmap() returned %p, errno = %d\n", foo, errno);
+
+  return 0;
+}
diff --git a/klibc/klibc/tests/opentest.c b/klibc/klibc/tests/opentest.c
new file mode 100644 (file)
index 0000000..5a54d2f
--- /dev/null
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+int main(void)
+{
+  char buffer[1024];
+  FILE *f;
+
+  f = fopen("/etc/passwd", "r");
+  fgets(buffer, 1024, f);
+  fclose(f);
+
+  printf("Line 1 = %s", buffer);
+
+  return 0;
+}
+
+  
diff --git a/klibc/klibc/tests/stat.c b/klibc/klibc/tests/stat.c
new file mode 100644 (file)
index 0000000..74b0bdd
--- /dev/null
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
+#include <sys/types.h>
+
+static void do_stat(const char *path)
+{
+  struct stat st;
+
+  if ( stat(path, &st) ) {
+    perror(path);
+    exit(1);
+  }
+
+  printf("Path = %s\n"
+        "   st_dev       = %#jx (%u,%u)\n"
+        "   st_ino       = %ju\n"
+        "   st_mode      = %#jo\n"
+        "   st_nlink     = %ju\n"
+        "   st_uid       = %ju\n"
+        "   st_gid       = %ju\n"
+        "   st_rdev      = %#jx (%u,%u)\n"
+        "   st_size      = %ju\n"
+        "   st_blksize   = %ju\n"
+        "   st_blocks    = %ju\n",
+        path,
+        (uintmax_t)st.st_dev, major(st.st_dev), minor(st.st_dev),
+        (uintmax_t)st.st_ino,
+        (uintmax_t)st.st_mode,
+        (uintmax_t)st.st_nlink,
+        (uintmax_t)st.st_uid,
+        (uintmax_t)st.st_gid,
+        (uintmax_t)st.st_rdev, major(st.st_rdev), minor(st.st_rdev),
+        (uintmax_t)st.st_size,
+        (uintmax_t)st.st_blksize,
+        (uintmax_t)st.st_blocks);
+
+#ifdef _STATBUF_ST_NSEC
+  printf("   st_atim      = %jd.%09u\n"
+        "   st.mtim      = %jd.%09u\n"
+        "   st.ctim      = %jd.%09u\n",
+        (uintmax_t)st.st_atim.tv_sec, (unsigned int)st.st_atim.tv_nsec,
+        (uintmax_t)st.st_mtim.tv_sec, (unsigned int)st.st_mtim.tv_nsec,
+        (uintmax_t)st.st_ctim.tv_sec, (unsigned int)st.st_ctim.tv_nsec);
+#else
+  printf("   st_atime     = %jd\n"
+        "   st.mtime     = %jd\n"
+        "   st.ctime     = %jd\n",
+        (uintmax_t)st.st_atime,
+        (uintmax_t)st.st_mtime,
+        (uintmax_t)st.st_ctime);
+#endif
+}
+
+int main(int argc, char *argv[])
+{
+  int i;
+
+  for ( i = 1 ; i < argc ; i++ )
+    do_stat(argv[i]);
+
+  return 0;
+}
diff --git a/klibc/klibc/tests/statfs.c b/klibc/klibc/tests/statfs.c
new file mode 100644 (file)
index 0000000..9b7a26d
--- /dev/null
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/vfs.h>
+
+static void do_statfs(const char *path)
+{
+  struct statfs sfs;
+
+  if ( statfs(path, &sfs) ) {
+    perror(path);
+    exit(1);
+  }
+
+  printf("Path = %s\n"
+        "   f_type     = %#jx\n"
+        "   f_bsize    = %jd\n"
+        "   f_blocks   = %jd\n"
+        "   f_bfree    = %jd\n"
+        "   f_bavail   = %jd\n"
+        "   f_files    = %jd\n"
+        "   f_ffree    = %jd\n"
+        "   f_namelen  = %jd\n",
+        path,
+        (uintmax_t)sfs.f_type,
+        (intmax_t)sfs.f_bsize,
+        (intmax_t)sfs.f_blocks,
+        (intmax_t)sfs.f_bfree,
+        (intmax_t)sfs.f_bavail,
+        (intmax_t)sfs.f_files,
+        (intmax_t)sfs.f_ffree,
+        (intmax_t)sfs.f_namelen);
+}
+
+int main(int argc, char *argv[])
+{
+  int i;
+
+  for ( i = 1 ; i < argc ; i++ )
+    do_statfs(argv[i]);
+
+  return 0;
+}
diff --git a/klibc/klibc/tests/strtoimax.c b/klibc/klibc/tests/strtoimax.c
new file mode 100644 (file)
index 0000000..5af0d79
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * strtoimaxtest.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+int main(int argc, char *argv[])
+{
+  int i;
+  char *ep;
+  intmax_t iv;
+
+  for ( i = 1 ; i < argc ; i++ ) {
+    iv = strtoimax(argv[i], &ep, 0);
+    printf("strtoimax(\"%s\") = %jd\n", argv[i], iv);
+    if ( *ep )
+      printf("   ep = \"%s\"\n", ep);
+  }
+
+  return 0;
+}
+
diff --git a/klibc/klibc/tests/strtotime.c b/klibc/klibc/tests/strtotime.c
new file mode 100644 (file)
index 0000000..815d40d
--- /dev/null
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <time.h>
+
+int main(int argc, char *argv[])
+{
+  struct timeval tv;
+  struct timespec ts;
+  int i;
+  const char *rv, *rs;
+
+  for ( i = 1 ; i < argc ; i++ ) {
+    rs = strtotimespec(argv[i], &ts);
+    rv = strtotimeval(argv[i], &tv);
+    printf("String:   \"%s\"\n"
+          "Timespec: %ld.%09ld\n"
+          "Residual: \"%s\"\n"
+          "Timeval:  %ld.%06ld\n"
+          "Residual: \"%s\"\n",
+          argv[i],
+          (long)ts.tv_sec, (long)ts.tv_nsec, rs,
+          (long)tv.tv_sec, (long)tv.tv_usec, rv);
+  }
+  
+  return 0;
+}
+
+          
index 8f6e89738d03bcc97c684a4c20418df4e3d7335c..92f82ccee0101f03febc723ed9f3b9c940aab6da 100644 (file)
@@ -6,11 +6,7 @@
 #include <sys/time.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_time
-
-_syscall1(time_t,time,time_t *,t);
-
-#else
+#ifndef __NR_time
 
 time_t time(time_t *t)
 {
index a00b58962944e1713427c512cea7295d0fb44cef..2c8607756a4fce2b7ce278db94873711db9c4946 100644 (file)
@@ -7,13 +7,7 @@
 #include <sys/types.h>
 #include <sys/syscall.h>
 
-#ifdef __NR_utime
-
-_syscall2(int,utime,const char *,filename,const struct utimbuf *,buf);
-
-#else
-
-static inline _syscall2(int,utimes,const char *,filename, const struct timeval *,tvp);
+#ifndef __NR_utime
 
 int utime(const char *filename, const struct utimbuf *buf)
 {
diff --git a/klibc/klibc/vasprintf.c b/klibc/klibc/vasprintf.c
new file mode 100644 (file)
index 0000000..5066dbb
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * vasprintf.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int vasprintf(char **bufp, const char *format, va_list ap)
+{
+  va_list ap1;
+  int bytes;
+  char *p;
+
+  va_copy(ap1, ap);
+
+  bytes = vsnprintf(NULL, 0, format, ap1);
+  va_end(ap1);
+
+  *bufp = p = malloc(bytes+1);
+  if ( !p )
+    return -1;
+  
+  return vsnprintf(p, bytes, format, ap);
+}
index 31ba1bdaa52015553a61bc5b92cfcae426fcc7cb..30a3f4aab8957970ae50ac5f381bbcf5bcac11c9 100644 (file)
@@ -1 +1 @@
-0.117
+0.181