diff options
Diffstat (limited to 'klibc/klibc')
282 files changed, 3207 insertions, 6693 deletions
diff --git a/klibc/klibc/MCONFIG b/klibc/klibc/MCONFIG index 253a9461b7..5b6eecd037 100644 --- a/klibc/klibc/MCONFIG +++ b/klibc/klibc/MCONFIG @@ -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 diff --git a/klibc/klibc/Makefile b/klibc/klibc/Makefile index 7ed03a8e87..d7e75f1814 100644 --- a/klibc/klibc/Makefile +++ b/klibc/klibc/Makefile @@ -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 diff --git a/klibc/klibc/README b/klibc/klibc/README index d69fa8de41..edc8524f22 100644 --- a/klibc/klibc/README +++ b/klibc/klibc/README @@ -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 index 1ab4e367a2..0000000000 --- a/klibc/klibc/SOCKETCALLS +++ /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 index 0000000000..e70b3fc16e --- /dev/null +++ b/klibc/klibc/SOCKETCALLS.def @@ -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 index 82081201b4..0000000000 --- a/klibc/klibc/SYSCALLS +++ /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 index 0000000000..dbd7dc8434 --- /dev/null +++ b/klibc/klibc/SYSCALLS.def @@ -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" diff --git a/klibc/klibc/__shared_init.c b/klibc/klibc/__shared_init.c index 63e3f4644e..592a3db6f5 100644 --- a/klibc/klibc/__shared_init.c +++ b/klibc/klibc/__shared_init.c @@ -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" diff --git a/klibc/klibc/__static_init.c b/klibc/klibc/__static_init.c index 5a90b5cd88..0b59eedaa7 100644 --- a/klibc/klibc/__static_init.c +++ b/klibc/klibc/__static_init.c @@ -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" diff --git a/klibc/klibc/alarm.c b/klibc/klibc/alarm.c index ca7bb37f92..40c0969432 100644 --- a/klibc/klibc/alarm.c +++ b/klibc/klibc/alarm.c @@ -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() */ diff --git a/klibc/klibc/arch/alpha/Makefile.inc b/klibc/klibc/arch/alpha/Makefile.inc index 2a1100f962..62fce9dc28 100644 --- a/klibc/klibc/arch/alpha/Makefile.inc +++ b/klibc/klibc/arch/alpha/Makefile.inc @@ -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)) diff --git a/klibc/klibc/arch/alpha/crt0.S b/klibc/klibc/arch/alpha/crt0.S index 6c2958117d..904b539741 100644 --- a/klibc/klibc/arch/alpha/crt0.S +++ b/klibc/klibc/arch/alpha/crt0.S @@ -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 index 9dc570a6f5..0000000000 --- a/klibc/klibc/arch/alpha/include/klibc/archsetjmp.h +++ /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 index b870a05131..0000000000 --- a/klibc/klibc/arch/alpha/include/klibc/archsignal.h +++ /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 index 16ed658987..0000000000 --- a/klibc/klibc/arch/alpha/include/klibc/archsys.h +++ /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 index e22db90412..0000000000 --- a/klibc/klibc/arch/alpha/include/machine/asm.h +++ /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 */ diff --git a/klibc/klibc/arch/alpha/setjmp.S b/klibc/klibc/arch/alpha/setjmp.S index e1ad642539..5d915f2dbe 100644 --- a/klibc/klibc/arch/alpha/setjmp.S +++ b/klibc/klibc/arch/alpha/setjmp.S @@ -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 index 0000000000..0c87414b1a --- /dev/null +++ b/klibc/klibc/arch/alpha/syscall.S @@ -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 index 0000000000..c00db88960 --- /dev/null +++ b/klibc/klibc/arch/alpha/sysdual.S @@ -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 index 0000000000..a24b6c07dc --- /dev/null +++ b/klibc/klibc/arch/alpha/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/arm/Makefile.inc b/klibc/klibc/arch/arm/Makefile.inc index 3ec8c051b2..0603d850bd 100644 --- a/klibc/klibc/arch/arm/Makefile.inc +++ b/klibc/klibc/arch/arm/Makefile.inc @@ -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 diff --git a/klibc/klibc/arch/arm/crt0.S b/klibc/klibc/arch/arm/crt0.S index 8cd3640c30..fc1104ef0e 100644 --- a/klibc/klibc/arch/arm/crt0.S +++ b/klibc/klibc/arch/arm/crt0.S @@ -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 index c956b50a90..0000000000 --- a/klibc/klibc/arch/arm/include/klibc/archsetjmp.h +++ /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 index 77685e62f0..0000000000 --- a/klibc/klibc/arch/arm/include/klibc/archsignal.h +++ /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 index 1a77e53a65..0000000000 --- a/klibc/klibc/arch/arm/include/klibc/archsys.h +++ /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 */ diff --git a/klibc/klibc/arch/arm/setjmp-arm.S b/klibc/klibc/arch/arm/setjmp-arm.S index bcb30b4221..1a29ee7f71 100644 --- a/klibc/klibc/arch/arm/setjmp-arm.S +++ b/klibc/klibc/arch/arm/setjmp-arm.S @@ -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 index 0000000000..0e73f68ed0 --- /dev/null +++ b/klibc/klibc/arch/arm/syscall.S @@ -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 index 0000000000..bf953ccd80 --- /dev/null +++ b/klibc/klibc/arch/arm/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/cris/MCONFIG b/klibc/klibc/arch/cris/MCONFIG index 27809ebbe7..2762494a30 100644 --- a/klibc/klibc/arch/cris/MCONFIG +++ b/klibc/klibc/arch/cris/MCONFIG @@ -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 diff --git a/klibc/klibc/arch/cris/Makefile.inc b/klibc/klibc/arch/cris/Makefile.inc index 41183fd64b..75fa17ba99 100644 --- a/klibc/klibc/arch/cris/Makefile.inc +++ b/klibc/klibc/arch/cris/Makefile.inc @@ -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 index 0000000000..3cca9edfa8 --- /dev/null +++ b/klibc/klibc/arch/cris/__negdi2.S @@ -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 index 0000000000..989c82b2ba --- /dev/null +++ b/klibc/klibc/arch/cris/crt0.S @@ -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 index 0000000000..29081dc953 --- /dev/null +++ b/klibc/klibc/arch/cris/divide.c @@ -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 index 73b2e196c9..0000000000 --- a/klibc/klibc/arch/cris/include/klibc/archsignal.h +++ /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 index dfdc70a6de..0000000000 --- a/klibc/klibc/arch/cris/include/klibc/archsys.h +++ /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 index 0000000000..43162418af --- /dev/null +++ b/klibc/klibc/arch/cris/setjmp.S @@ -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 index 0000000000..d71495aba2 --- /dev/null +++ b/klibc/klibc/arch/cris/syscall.S @@ -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 index 0000000000..6c894f62f5 --- /dev/null +++ b/klibc/klibc/arch/cris/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/i386/MCONFIG b/klibc/klibc/arch/i386/MCONFIG index 516b1b6738..2421452eea 100644 --- a/klibc/klibc/arch/i386/MCONFIG +++ b/klibc/klibc/arch/i386/MCONFIG @@ -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) diff --git a/klibc/klibc/arch/i386/Makefile.inc b/klibc/klibc/arch/i386/Makefile.inc index 171248a796..5c320cb453 100644 --- a/klibc/klibc/arch/i386/Makefile.inc +++ b/klibc/klibc/arch/i386/Makefile.inc @@ -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 index db04314b8c..0000000000 --- a/klibc/klibc/arch/i386/include/klibc/archsetjmp.h +++ /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 index b092ba6d3a..0000000000 --- a/klibc/klibc/arch/i386/include/klibc/archsignal.h +++ /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 index e21487b256..0000000000 --- a/klibc/klibc/arch/i386/include/klibc/archsys.h +++ /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 index 410aba06d3..0000000000 --- a/klibc/klibc/arch/i386/include/klibc/diverr.h +++ /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 index b051464dfc..0000000000 --- a/klibc/klibc/arch/i386/include/sys/io.h +++ /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 index d3272393dc..0000000000 --- a/klibc/klibc/arch/i386/include/sys/vm86.h +++ /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 index 0000000000..4f492a1566 --- /dev/null +++ b/klibc/klibc/arch/i386/open.S @@ -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 diff --git a/klibc/klibc/arch/i386/socketcall.S b/klibc/klibc/arch/i386/socketcall.S index 6bac1e6913..b13d204c32 100644 --- a/klibc/klibc/arch/i386/socketcall.S +++ b/klibc/klibc/arch/i386/socketcall.S @@ -16,18 +16,22 @@ .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 index 0000000000..f8fa7b4dd3 --- /dev/null +++ b/klibc/klibc/arch/i386/syscall.S @@ -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 index 0000000000..eaa8180911 --- /dev/null +++ b/klibc/klibc/arch/i386/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/ia64/Makefile.inc b/klibc/klibc/arch/ia64/Makefile.inc index 781448770e..6363c1f948 100644 --- a/klibc/klibc/arch/ia64/Makefile.inc +++ b/klibc/klibc/arch/ia64/Makefile.inc @@ -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 index bd639c0b00..0000000000 --- a/klibc/klibc/arch/ia64/include/klibc/archsetjmp.h +++ /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 index 5b01f19bc2..0000000000 --- a/klibc/klibc/arch/ia64/include/klibc/archsignal.h +++ /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 index fe331acf55..0000000000 --- a/klibc/klibc/arch/ia64/include/klibc/archsys.h +++ /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 */ diff --git a/klibc/klibc/arch/ia64/pipe.c b/klibc/klibc/arch/ia64/pipe.c index 5f5dd05727..0b641e8702 100644 --- a/klibc/klibc/arch/ia64/pipe.c +++ b/klibc/klibc/arch/ia64/pipe.c @@ -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 index 0000000000..e3f264c0e4 --- /dev/null +++ b/klibc/klibc/arch/ia64/syscall.S @@ -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 index 0000000000..34031a29ae --- /dev/null +++ b/klibc/klibc/arch/ia64/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/ia64/vfork.S b/klibc/klibc/arch/ia64/vfork.S index 0354fa9ef7..efcd03f7f1 100644 --- a/klibc/klibc/arch/ia64/vfork.S +++ b/klibc/klibc/arch/ia64/vfork.S @@ -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 index 714527f6b0..0000000000 --- a/klibc/klibc/arch/m68k/include/klibc/archsignal.h +++ /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 index 8f6bed8e94..0000000000 --- a/klibc/klibc/arch/m68k/include/klibc/archsys.h +++ /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 */ diff --git a/klibc/klibc/arch/mips/MCONFIG b/klibc/klibc/arch/mips/MCONFIG index 52b518461f..a248973815 100644 --- a/klibc/klibc/arch/mips/MCONFIG +++ b/klibc/klibc/arch/mips/MCONFIG @@ -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 diff --git a/klibc/klibc/arch/mips/Makefile.inc b/klibc/klibc/arch/mips/Makefile.inc index 09a2d2f736..e257023f34 100644 --- a/klibc/klibc/arch/mips/Makefile.inc +++ b/klibc/klibc/arch/mips/Makefile.inc @@ -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 index 40e5be2736..0000000000 --- a/klibc/klibc/arch/mips/include/klibc/archsetjmp.h +++ /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 index 3b72908636..0000000000 --- a/klibc/klibc/arch/mips/include/klibc/archsignal.h +++ /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 index f696cdfaa7..0000000000 --- a/klibc/klibc/arch/mips/include/klibc/archsys.h +++ /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 index e5239a6cef..0000000000 --- a/klibc/klibc/arch/mips/include/machine/asm.h +++ /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 index eb103ace2c..0000000000 --- a/klibc/klibc/arch/mips/include/sgidefs.h +++ /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 index 0000000000..d75c9de70c --- /dev/null +++ b/klibc/klibc/arch/mips/klibc.ld @@ -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 index 0000000000..d5c1fe1c7d --- /dev/null +++ b/klibc/klibc/arch/mips/syscall.S @@ -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 index 0000000000..abe599c17d --- /dev/null +++ b/klibc/klibc/arch/mips/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/mips/vfork.S b/klibc/klibc/arch/mips/vfork.S index aca8083aa4..9829867fab 100644 --- a/klibc/klibc/arch/mips/vfork.S +++ b/klibc/klibc/arch/mips/vfork.S @@ -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 index 56b0fd323e..0000000000 --- a/klibc/klibc/arch/mips64/include/klibc/archsignal.h +++ /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 index 81e5106e16..0000000000 --- a/klibc/klibc/arch/mips64/include/klibc/archsys.h +++ /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 */ diff --git a/klibc/klibc/arch/parisc/Makefile.inc b/klibc/klibc/arch/parisc/Makefile.inc index abe9155bf4..980a543ed2 100644 --- a/klibc/klibc/arch/parisc/Makefile.inc +++ b/klibc/klibc/arch/parisc/Makefile.inc @@ -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 index 3190e8528e..0000000000 --- a/klibc/klibc/arch/parisc/include/klibc/archsignal.h +++ /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 index 5013ba8794..0000000000 --- a/klibc/klibc/arch/parisc/include/klibc/archsys.h +++ /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 index 0000000000..99ef5fe103 --- /dev/null +++ b/klibc/klibc/arch/parisc/syscall.c @@ -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 index 0000000000..eb6b5dd92a --- /dev/null +++ b/klibc/klibc/arch/parisc/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/ppc/MCONFIG b/klibc/klibc/arch/ppc/MCONFIG index fcb0992150..ff7c44db9a 100644 --- a/klibc/klibc/arch/ppc/MCONFIG +++ b/klibc/klibc/arch/ppc/MCONFIG @@ -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 diff --git a/klibc/klibc/arch/ppc/Makefile.inc b/klibc/klibc/arch/ppc/Makefile.inc index 3bd2c0643c..c6bb975f0f 100644 --- a/klibc/klibc/arch/ppc/Makefile.inc +++ b/klibc/klibc/arch/ppc/Makefile.inc @@ -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 index 53e2fccc3b..0000000000 --- a/klibc/klibc/arch/ppc/include/klibc/archsetjmp.h +++ /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 index 567a547ef9..0000000000 --- a/klibc/klibc/arch/ppc/include/klibc/archsignal.h +++ /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 index 17a28859e5..0000000000 --- a/klibc/klibc/arch/ppc/include/klibc/archsys.h +++ /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 index 0000000000..0a7c37c903 --- /dev/null +++ b/klibc/klibc/arch/ppc/syscall.S @@ -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 index 0000000000..542ab5575c --- /dev/null +++ b/klibc/klibc/arch/ppc/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/ppc64/MCONFIG b/klibc/klibc/arch/ppc64/MCONFIG index 6997693e99..86526f895c 100644 --- a/klibc/klibc/arch/ppc64/MCONFIG +++ b/klibc/klibc/arch/ppc64/MCONFIG @@ -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 diff --git a/klibc/klibc/arch/ppc64/Makefile.inc b/klibc/klibc/arch/ppc64/Makefile.inc index 3ab3a8c8e6..928df1aeb7 100644 --- a/klibc/klibc/arch/ppc64/Makefile.inc +++ b/klibc/klibc/arch/ppc64/Makefile.inc @@ -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 index 006a2e27be..0000000000 --- a/klibc/klibc/arch/ppc64/include/klibc/archsetjmp.h +++ /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 index 8452f6e4bc..0000000000 --- a/klibc/klibc/arch/ppc64/include/klibc/archsignal.h +++ /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 index 4f81fee00d..0000000000 --- a/klibc/klibc/arch/ppc64/include/klibc/archsys.h +++ /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 */ diff --git a/klibc/klibc/arch/ppc64/setjmp.S b/klibc/klibc/arch/ppc64/setjmp.S index 1dcc67035e..30db419140 100644 --- a/klibc/klibc/arch/ppc64/setjmp.S +++ b/klibc/klibc/arch/ppc64/setjmp.S @@ -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 index 0000000000..a5895fe88e --- /dev/null +++ b/klibc/klibc/arch/ppc64/syscall.c @@ -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 index 0000000000..1469cc6071 --- /dev/null +++ b/klibc/klibc/arch/ppc64/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/s390/Makefile.inc b/klibc/klibc/arch/s390/Makefile.inc index c50f4f2886..49b64ddbc6 100644 --- a/klibc/klibc/arch/s390/Makefile.inc +++ b/klibc/klibc/arch/s390/Makefile.inc @@ -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 index 11a641ed5a..0000000000 --- a/klibc/klibc/arch/s390/include/klibc/archsetjmp.h +++ /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 index 1f8de28b4b..0000000000 --- a/klibc/klibc/arch/s390/include/klibc/archsignal.h +++ /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 index 1cd0948f3c..0000000000 --- a/klibc/klibc/arch/s390/include/klibc/archsys.h +++ /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 index 0000000000..51ff07f44c --- /dev/null +++ b/klibc/klibc/arch/s390/mmap.c @@ -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 index 0000000000..c0f17c453c --- /dev/null +++ b/klibc/klibc/arch/s390/syscall.c @@ -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 index 0000000000..3838a1f1b2 --- /dev/null +++ b/klibc/klibc/arch/s390/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/s390x/Makefile.inc b/klibc/klibc/arch/s390x/Makefile.inc index eff8f951ac..9d614e07b2 100644 --- a/klibc/klibc/arch/s390x/Makefile.inc +++ b/klibc/klibc/arch/s390x/Makefile.inc @@ -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 index dd3ed0d47c..0000000000 --- a/klibc/klibc/arch/s390x/include/klibc/archsetjmp.h +++ /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 index 08c9a0073a..0000000000 --- a/klibc/klibc/arch/s390x/include/klibc/archsignal.h +++ /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 index 15f7113bb4..0000000000 --- a/klibc/klibc/arch/s390x/include/klibc/archsys.h +++ /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 index 0000000000..158f0933a4 --- /dev/null +++ b/klibc/klibc/arch/s390x/mmap.c @@ -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 index 0000000000..c0f17c453c --- /dev/null +++ b/klibc/klibc/arch/s390x/syscall.c @@ -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 index 0000000000..10a47f7b07 --- /dev/null +++ b/klibc/klibc/arch/s390x/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/sh/Makefile.inc b/klibc/klibc/arch/sh/Makefile.inc index 16d7ea1e18..ccabfa496b 100644 --- a/klibc/klibc/arch/sh/Makefile.inc +++ b/klibc/klibc/arch/sh/Makefile.inc @@ -7,7 +7,8 @@ # accordingly. # -ARCHOBJS = arch/sh/setjmp.o +ARCHOBJS = arch/sh/setjmp.o \ + arch/sh/syscall.o ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS)) diff --git a/klibc/klibc/arch/sh/crt0.S b/klibc/klibc/arch/sh/crt0.S index c9938a5612..21a37655f2 100644 --- a/klibc/klibc/arch/sh/crt0.S +++ b/klibc/klibc/arch/sh/crt0.S @@ -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 index 28dd932fbc..0000000000 --- a/klibc/klibc/arch/sh/include/klibc/archsetjmp.h +++ /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 index 6c4e5976ad..0000000000 --- a/klibc/klibc/arch/sh/include/klibc/archsignal.h +++ /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 index 5f8050a536..0000000000 --- a/klibc/klibc/arch/sh/include/klibc/archsys.h +++ /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 index 0000000000..41a0486679 --- /dev/null +++ b/klibc/klibc/arch/sh/syscall.S @@ -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 index 0000000000..add5d35892 --- /dev/null +++ b/klibc/klibc/arch/sh/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/sparc/Makefile.inc b/klibc/klibc/arch/sparc/Makefile.inc index 0186810aca..6ea66114fa 100644 --- a/klibc/klibc/arch/sparc/Makefile.inc +++ b/klibc/klibc/arch/sparc/Makefile.inc @@ -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 index 92c1c74c9d..0000000000 --- a/klibc/klibc/arch/sparc/include/klibc/archsetjmp.h +++ /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 index 6af3709033..0000000000 --- a/klibc/klibc/arch/sparc/include/klibc/archsignal.h +++ /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 index fe6e68df8a..0000000000 --- a/klibc/klibc/arch/sparc/include/klibc/archsys.h +++ /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 index b622bd8cf1..0000000000 --- a/klibc/klibc/arch/sparc/include/machine/asm.h +++ /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 index b09175c7f4..0000000000 --- a/klibc/klibc/arch/sparc/include/machine/frame.h +++ /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 index 42c3ef6ae2..0000000000 --- a/klibc/klibc/arch/sparc/include/machine/trap.h +++ /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 index 0000000000..c0273f77ca --- /dev/null +++ b/klibc/klibc/arch/sparc/syscall.S @@ -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 index 0000000000..a66c76e9db --- /dev/null +++ b/klibc/klibc/arch/sparc/sysfork.S @@ -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 index 0000000000..baad9e3d82 --- /dev/null +++ b/klibc/klibc/arch/sparc/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/sparc64/Makefile.inc b/klibc/klibc/arch/sparc64/Makefile.inc index d59f9878e9..06b79537a3 100644 --- a/klibc/klibc/arch/sparc64/Makefile.inc +++ b/klibc/klibc/arch/sparc64/Makefile.inc @@ -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 index 022a31e542..0000000000 --- a/klibc/klibc/arch/sparc64/include/klibc/archsetjmp.h +++ /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 index f81bd668bb..0000000000 --- a/klibc/klibc/arch/sparc64/include/klibc/archsignal.h +++ /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 index 651e4f7f09..0000000000 --- a/klibc/klibc/arch/sparc64/include/klibc/archsys.h +++ /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 index 0000000000..7ab9d95f11 --- /dev/null +++ b/klibc/klibc/arch/sparc64/syscall.S @@ -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 index 0000000000..739c35ede3 --- /dev/null +++ b/klibc/klibc/arch/sparc64/sysfork.S @@ -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 index 0000000000..2ef2c6b66e --- /dev/null +++ b/klibc/klibc/arch/sparc64/sysstub.ph @@ -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; diff --git a/klibc/klibc/arch/x86_64/MCONFIG b/klibc/klibc/arch/x86_64/MCONFIG index ecb14ccb70..f3c87410a6 100644 --- a/klibc/klibc/arch/x86_64/MCONFIG +++ b/klibc/klibc/arch/x86_64/MCONFIG @@ -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 diff --git a/klibc/klibc/arch/x86_64/Makefile.inc b/klibc/klibc/arch/x86_64/Makefile.inc index c84443f4e1..d6cc1204e4 100644 --- a/klibc/klibc/arch/x86_64/Makefile.inc +++ b/klibc/klibc/arch/x86_64/Makefile.inc @@ -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 index 90d0a0d263..0000000000 --- a/klibc/klibc/arch/x86_64/include/klibc/archsetjmp.h +++ /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 index 74e82e1dd0..0000000000 --- a/klibc/klibc/arch/x86_64/include/klibc/archsignal.h +++ /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 index 2ec72cd397..0000000000 --- a/klibc/klibc/arch/x86_64/include/klibc/archsys.h +++ /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 index 4a0ae44985..0000000000 --- a/klibc/klibc/arch/x86_64/include/sys/io.h +++ /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 index 0000000000..f2c74ae974 --- /dev/null +++ b/klibc/klibc/arch/x86_64/syscall.S @@ -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 index 0000000000..07af1227ca --- /dev/null +++ b/klibc/klibc/arch/x86_64/sysstub.ph @@ -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 index 0000000000..457d34bb15 --- /dev/null +++ b/klibc/klibc/asprintf.c @@ -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; +} diff --git a/klibc/klibc/ctypes.c b/klibc/klibc/ctypes.c index c7adc9882c..acfa05ab65 100644 --- a/klibc/klibc/ctypes.c +++ b/klibc/klibc/ctypes.c @@ -10,41 +10,41 @@ 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 index 0000000000..75d7146205 --- /dev/null +++ b/klibc/klibc/daemon.c @@ -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 index 53079b09d6..0000000000 --- a/klibc/klibc/fdatasync.c +++ /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); diff --git a/klibc/klibc/fork.c b/klibc/klibc/fork.c index d7e4db89a1..daf313eaf2 100644 --- a/klibc/klibc/fork.c +++ b/klibc/klibc/fork.c @@ -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 index 0000000000..09e4674947 --- /dev/null +++ b/klibc/klibc/fstatfs.c @@ -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 diff --git a/klibc/klibc/getcwd.c b/klibc/klibc/getcwd.c index 350ec69a63..613ca0529c 100644 --- a/klibc/klibc/getcwd.c +++ b/klibc/klibc/getcwd.c @@ -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 index 2d975b1586..0000000000 --- a/klibc/klibc/getpagesize.c +++ /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 - - diff --git a/klibc/klibc/getpriority.c b/klibc/klibc/getpriority.c index d6db2cc6b9..4ea630487d 100644 --- a/klibc/klibc/getpriority.c +++ b/klibc/klibc/getpriority.c @@ -10,16 +10,14 @@ #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 index 41a4d94d44..0000000000 --- a/klibc/klibc/include/alloca.h +++ /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 index 043b148e17..0000000000 --- a/klibc/klibc/include/arpa/inet.h +++ /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 index 58cc37c487..0000000000 --- a/klibc/klibc/include/assert.h +++ /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 index f90e524b2b..0000000000 --- a/klibc/klibc/include/bits32/bitsize/limits.h +++ /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 index bf6e695ed3..0000000000 --- a/klibc/klibc/include/bits32/bitsize/stddef.h +++ /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 index 40b464961c..0000000000 --- a/klibc/klibc/include/bits32/bitsize/stdint.h +++ /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 index 8157dd06e0..0000000000 --- a/klibc/klibc/include/bits32/bitsize/stdintconst.h +++ /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 index b44fe01186..0000000000 --- a/klibc/klibc/include/bits32/bitsize/stdintlimits.h +++ /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 index 7b20da085b..0000000000 --- a/klibc/klibc/include/bits64/bitsize/limits.h +++ /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 index 3e72621862..0000000000 --- a/klibc/klibc/include/bits64/bitsize/stddef.h +++ /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 index f569f526b6..0000000000 --- a/klibc/klibc/include/bits64/bitsize/stdint.h +++ /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 index 65f2db0501..0000000000 --- a/klibc/klibc/include/bits64/bitsize/stdintconst.h +++ /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 index d110d17d2d..0000000000 --- a/klibc/klibc/include/bits64/bitsize/stdintlimits.h +++ /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 index 3f5cfad558..0000000000 --- a/klibc/klibc/include/ctype.h +++ /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 index 10dd138ee5..0000000000 --- a/klibc/klibc/include/dirent.h +++ /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 index 52f47d042e..0000000000 --- a/klibc/klibc/include/elf.h +++ /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 index 44f89ccbbc..0000000000 --- a/klibc/klibc/include/endian.h +++ /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 index b2e666504d..0000000000 --- a/klibc/klibc/include/errno.h +++ /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 index e90959c7e9..0000000000 --- a/klibc/klibc/include/fcntl.h +++ /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 index 03ceb31560..0000000000 --- a/klibc/klibc/include/grp.h +++ /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 index e00fa63160..0000000000 --- a/klibc/klibc/include/inttypes.h +++ /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 index 6c01474cc1..0000000000 --- a/klibc/klibc/include/klibc/compiler.h +++ /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 index 4d8c8d36c2..0000000000 --- a/klibc/klibc/include/klibc/diverr.h +++ /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 index f9c3467211..0000000000 --- a/klibc/klibc/include/klibc/extern.h +++ /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 index f1532e5323..0000000000 --- a/klibc/klibc/include/limits.h +++ /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 index 1aa8e7b90c..0000000000 --- a/klibc/klibc/include/net/if.h +++ /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 index a25f1b4759..0000000000 --- a/klibc/klibc/include/net/if_arp.h +++ /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 index 060ef22070..0000000000 --- a/klibc/klibc/include/net/if_ether.h +++ /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 index b5e8e0e11f..0000000000 --- a/klibc/klibc/include/net/if_packet.h +++ /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 index 92dc843bb1..0000000000 --- a/klibc/klibc/include/netinet/in.h +++ /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 index 46584ca627..0000000000 --- a/klibc/klibc/include/netinet/in6.h +++ /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 index 8aecbe66a3..0000000000 --- a/klibc/klibc/include/netinet/ip.h +++ /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 index bb5d307e98..0000000000 --- a/klibc/klibc/include/netinet/tcp.h +++ /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 index b809b4ee6e..0000000000 --- a/klibc/klibc/include/netinet/udp.h +++ /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 index 8710d92ebd..0000000000 --- a/klibc/klibc/include/poll.h +++ /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 index 5e6103965f..0000000000 --- a/klibc/klibc/include/sched.h +++ /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 index b504eb6d08..0000000000 --- a/klibc/klibc/include/setjmp.h +++ /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 index 513b4e5a04..0000000000 --- a/klibc/klibc/include/signal.h +++ /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 index cc324b825d..0000000000 --- a/klibc/klibc/include/stdarg.h +++ /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 index 125d2352ec..0000000000 --- a/klibc/klibc/include/stddef.h +++ /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 index 47fec18594..0000000000 --- a/klibc/klibc/include/stdint.h +++ /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 index fba1e30746..0000000000 --- a/klibc/klibc/include/stdio.h +++ /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 index af97eea636..0000000000 --- a/klibc/klibc/include/stdlib.h +++ /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 index 1debb55af0..0000000000 --- a/klibc/klibc/include/string.h +++ /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 index 0700f4b561..0000000000 --- a/klibc/klibc/include/sys/dirent.h +++ /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 index 652de5bc5f..0000000000 --- a/klibc/klibc/include/sys/elf32.h +++ /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 index 750ddac4d9..0000000000 --- a/klibc/klibc/include/sys/elf64.h +++ /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 index f984f6a56b..0000000000 --- a/klibc/klibc/include/sys/elfcommon.h +++ /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 index 823486b776..0000000000 --- a/klibc/klibc/include/sys/fsuid.h +++ /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 index b0cee4c02c..0000000000 --- a/klibc/klibc/include/sys/ioctl.h +++ /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 index 0fc5f5d945..0000000000 --- a/klibc/klibc/include/sys/klog.h +++ /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 index 3d8a2f63c2..0000000000 --- a/klibc/klibc/include/sys/mman.h +++ /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 index 313c90ec0e..0000000000 --- a/klibc/klibc/include/sys/mount.h +++ /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 index 63a0661f43..0000000000 --- a/klibc/klibc/include/sys/param.h +++ /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 index eaf56610d7..0000000000 --- a/klibc/klibc/include/sys/reboot.h +++ /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 index ef14bde9f6..0000000000 --- a/klibc/klibc/include/sys/resource.h +++ /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 index 7caf8c931b..0000000000 --- a/klibc/klibc/include/sys/select.h +++ /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 index cbc2b89591..0000000000 --- a/klibc/klibc/include/sys/socket.h +++ /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 index dac9f9aab6..0000000000 --- a/klibc/klibc/include/sys/socketcalls.h +++ /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 index f7bb5aacc5..0000000000 --- a/klibc/klibc/include/sys/stat.h +++ /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 index 907c7f9b9a..0000000000 --- a/klibc/klibc/include/sys/syscall.h +++ /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 index 4051c6897a..0000000000 --- a/klibc/klibc/include/sys/sysinfo.h +++ /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 index 7f1e0822b3..0000000000 --- a/klibc/klibc/include/sys/sysmacros.h +++ /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 index b503d21076..0000000000 --- a/klibc/klibc/include/sys/time.h +++ /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 index 0aaeeb1612..0000000000 --- a/klibc/klibc/include/sys/types.h +++ /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 index fc2525d11a..0000000000 --- a/klibc/klibc/include/sys/uio.h +++ /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 index df42d719f7..0000000000 --- a/klibc/klibc/include/sys/un.h +++ /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 index d1d635d242..0000000000 --- a/klibc/klibc/include/sys/utime.h +++ /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 index f2990f5711..0000000000 --- a/klibc/klibc/include/sys/utsname.h +++ /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 index 8c1577c4bf..0000000000 --- a/klibc/klibc/include/sys/vfs.h +++ /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 index 4cfafc9408..0000000000 --- a/klibc/klibc/include/sys/wait.h +++ /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 index 551527a042..0000000000 --- a/klibc/klibc/include/syslog.h +++ /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 index 08a5e56855..0000000000 --- a/klibc/klibc/include/termios.h +++ /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 index c69c231ec8..0000000000 --- a/klibc/klibc/include/time.h +++ /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 index 13ff03b012..0000000000 --- a/klibc/klibc/include/unistd.h +++ /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 index 3dfa03a14a..0000000000 --- a/klibc/klibc/include/utime.h +++ /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 */ - diff --git a/klibc/klibc/inet/bindresvport.c b/klibc/klibc/inet/bindresvport.c index c30054edfd..750bd709c4 100644 --- a/klibc/klibc/inet/bindresvport.c +++ b/klibc/klibc/inet/bindresvport.c @@ -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; } diff --git a/klibc/klibc/interp.S b/klibc/klibc/interp.S index 303943697b..b1a2701999 100644 --- a/klibc/klibc/interp.S +++ b/klibc/klibc/interp.S @@ -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 index 0000000000..a2ead11e5f --- /dev/null +++ b/klibc/klibc/jrand48.c @@ -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 index 0000000000..e91edc44a3 --- /dev/null +++ b/klibc/klibc/libc_init.c @@ -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)); +} diff --git a/klibc/klibc/llseek.c b/klibc/klibc/llseek.c index fdffc16e2c..2102a503e9 100644 --- a/klibc/klibc/llseek.c +++ b/klibc/klibc/llseek.c @@ -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> @@ -10,24 +12,17 @@ #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 diff --git a/klibc/klibc/lrand48.c b/klibc/klibc/lrand48.c index 4d05de2e89..8c0a3de176 100644 --- a/klibc/klibc/lrand48.c +++ b/klibc/klibc/lrand48.c @@ -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; } diff --git a/klibc/klibc/makeerrlist.pl b/klibc/klibc/makeerrlist.pl index 00acb8a3d5..f42704f88a 100644 --- a/klibc/klibc/makeerrlist.pl +++ b/klibc/klibc/makeerrlist.pl @@ -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"; diff --git a/klibc/klibc/malloc.c b/klibc/klibc/malloc.c index 20a2350d71..976353c201 100644 --- a/klibc/klibc/malloc.c +++ b/klibc/klibc/malloc.c @@ -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 */ diff --git a/klibc/klibc/malloc.h b/klibc/klibc/malloc.h index e053f71401..456295069a 100644 --- a/klibc/klibc/malloc.h +++ b/klibc/klibc/malloc.h @@ -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 diff --git a/klibc/klibc/mmap.c b/klibc/klibc/mmap.c index 89cf3a6a8f..196f1c088f 100644 --- a/klibc/klibc/mmap.c +++ b/klibc/klibc/mmap.c @@ -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 index 0000000000..886ae9f03c --- /dev/null +++ b/klibc/klibc/mrand48.c @@ -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); +} diff --git a/klibc/klibc/nice.c b/klibc/klibc/nice.c index f0d97a3cd0..5a18de9091 100644 --- a/klibc/klibc/nice.c +++ b/klibc/klibc/nice.c @@ -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 index 0000000000..fb7c5772fd --- /dev/null +++ b/klibc/klibc/nrand48.c @@ -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); +} diff --git a/klibc/klibc/open.c b/klibc/klibc/open.c index 0d7db10c4a..d52b53a699 100644 --- a/klibc/klibc/open.c +++ b/klibc/klibc/open.c @@ -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 diff --git a/klibc/klibc/pause.c b/klibc/klibc/pause.c index 5748728472..1f7b9342de 100644 --- a/klibc/klibc/pause.c +++ b/klibc/klibc/pause.c @@ -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) { diff --git a/klibc/klibc/perror.c b/klibc/klibc/perror.c index 45585cd577..26f8ce8f6d 100644 --- a/klibc/klibc/perror.c +++ b/klibc/klibc/perror.c @@ -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 index 0000000000..0e35adda17 --- /dev/null +++ b/klibc/klibc/putchar.c @@ -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); +} diff --git a/klibc/klibc/qsort.c b/klibc/klibc/qsort.c index e2197ea2ae..185f4dac69 100644 --- a/klibc/klibc/qsort.c +++ b/klibc/klibc/qsort.c @@ -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); diff --git a/klibc/klibc/readdir.c b/klibc/klibc/readdir.c index bb216a1951..acfe588713 100644 --- a/klibc/klibc/readdir.c +++ b/klibc/klibc/readdir.c @@ -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; } diff --git a/klibc/klibc/sbrk.c b/klibc/klibc/sbrk.c index 03ab3c14bb..f7401dcfe2 100644 --- a/klibc/klibc/sbrk.c +++ b/klibc/klibc/sbrk.c @@ -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; } diff --git a/klibc/klibc/seed48.c b/klibc/klibc/seed48.c index f8353c8715..ac916d6165 100644 --- a/klibc/klibc/seed48.c +++ b/klibc/klibc/seed48.c @@ -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 index 2404bb1e64..0000000000 --- a/klibc/klibc/select.c +++ /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 index f1a8c6b45c..0000000000 --- a/klibc/klibc/setresgid.c +++ /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 index a587acbae3..0000000000 --- a/klibc/klibc/setresuid.c +++ /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 - diff --git a/klibc/klibc/sha1hash.c b/klibc/klibc/sha1hash.c index 600d51248c..f81e08b17c 100644 --- a/klibc/klibc/sha1hash.c +++ b/klibc/klibc/sha1hash.c @@ -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; diff --git a/klibc/klibc/sigaction.c b/klibc/klibc/sigaction.c index ebd34710f1..885bc6a4a4 100644 --- a/klibc/klibc/sigaction.c +++ b/klibc/klibc/sigaction.c @@ -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) { diff --git a/klibc/klibc/sigpending.c b/klibc/klibc/sigpending.c index afbcf3cf34..76d2b1a7f6 100644 --- a/klibc/klibc/sigpending.c +++ b/klibc/klibc/sigpending.c @@ -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) { diff --git a/klibc/klibc/sigprocmask.c b/klibc/klibc/sigprocmask.c index 3a90f67732..b5e58b28b8 100644 --- a/klibc/klibc/sigprocmask.c +++ b/klibc/klibc/sigprocmask.c @@ -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) { diff --git a/klibc/klibc/sigsuspend.c b/klibc/klibc/sigsuspend.c index 85cdea20ca..a927999ae6 100644 --- a/klibc/klibc/sigsuspend.c +++ b/klibc/klibc/sigsuspend.c @@ -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) { diff --git a/klibc/klibc/socketcalls.pl b/klibc/klibc/socketcalls.pl index cf4daf6036..fd82b2b49f 100644 --- a/klibc/klibc/socketcalls.pl +++ b/klibc/klibc/socketcalls.pl @@ -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"; } } diff --git a/klibc/klibc/socketcommon.h b/klibc/klibc/socketcommon.h index 7a5acaadaf..9c4b11fab8 100644 --- a/klibc/klibc/socketcommon.h +++ b/klibc/klibc/socketcommon.h @@ -13,13 +13,4 @@ #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> diff --git a/klibc/klibc/srand48.c b/klibc/klibc/srand48.c index a3df16d95c..5f201d2047 100644 --- a/klibc/klibc/srand48.c +++ b/klibc/klibc/srand48.c @@ -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 index 0000000000..60e9188a09 --- /dev/null +++ b/klibc/klibc/statfs.c @@ -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 diff --git a/klibc/klibc/strerror.c b/klibc/klibc/strerror.c index 62705553a6..c8e3eac793 100644 --- a/klibc/klibc/strerror.c +++ b/klibc/klibc/strerror.c @@ -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 index 0000000000..6111445f06 --- /dev/null +++ b/klibc/klibc/strlcat.c @@ -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 index 0000000000..eb384c9885 --- /dev/null +++ b/klibc/klibc/strlcpy.c @@ -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; +} + + diff --git a/klibc/klibc/strncat.c b/klibc/klibc/strncat.c index 99d957594c..0dd9deb984 100644 --- a/klibc/klibc/strncat.c +++ b/klibc/klibc/strncat.c @@ -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; } diff --git a/klibc/klibc/strncpy.c b/klibc/klibc/strncpy.c index a8fe45fcbb..06964f31d6 100644 --- a/klibc/klibc/strncpy.c +++ b/klibc/klibc/strncpy.c @@ -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 index 0000000000..06b54c3189 --- /dev/null +++ b/klibc/klibc/strnlen.c @@ -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 index 0000000000..b426bf8d0f --- /dev/null +++ b/klibc/klibc/strtotimespec.c @@ -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 index 0000000000..280d4bcd3a --- /dev/null +++ b/klibc/klibc/strtotimeval.c @@ -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 index 0000000000..0f6c2f9181 --- /dev/null +++ b/klibc/klibc/strtotimex.c @@ -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; +} diff --git a/klibc/klibc/syscalls.pl b/klibc/klibc/syscalls.pl index b530a9b8c7..1c48ce58ff 100644 --- a/klibc/klibc/syscalls.pl +++ b/klibc/klibc/syscalls.pl @@ -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); diff --git a/klibc/klibc/syslog.c b/klibc/klibc/syslog.c index 10a2dce405..592992ba6b 100644 --- a/klibc/klibc/syslog.c +++ b/klibc/klibc/syslog.c @@ -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 index 0000000000..f504ad90f7 --- /dev/null +++ b/klibc/klibc/tests/fcntl.c @@ -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 index 0000000000..bda37e1f6b --- /dev/null +++ b/klibc/klibc/tests/getpagesize.c @@ -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 index 0000000000..b392046929 --- /dev/null +++ b/klibc/klibc/tests/malloctest2.c @@ -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; +} + diff --git a/klibc/klibc/tests/microhello.c b/klibc/klibc/tests/microhello.c index e57cd05a50..f0f5a40379 100644 --- a/klibc/klibc/tests/microhello.c +++ b/klibc/klibc/tests/microhello.c @@ -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 index 20898270f4..0000000000 --- a/klibc/klibc/tests/minips.c +++ /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 index 0000000000..a654affb83 --- /dev/null +++ b/klibc/klibc/tests/mmaptest.c @@ -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 index 0000000000..5a54d2fce2 --- /dev/null +++ b/klibc/klibc/tests/opentest.c @@ -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 index 0000000000..74b0bddf44 --- /dev/null +++ b/klibc/klibc/tests/stat.c @@ -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 index 0000000000..9b7a26d916 --- /dev/null +++ b/klibc/klibc/tests/statfs.c @@ -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 index 0000000000..5af0d7912b --- /dev/null +++ b/klibc/klibc/tests/strtoimax.c @@ -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 index 0000000000..815d40da99 --- /dev/null +++ b/klibc/klibc/tests/strtotime.c @@ -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; +} + + diff --git a/klibc/klibc/time.c b/klibc/klibc/time.c index 8f6e89738d..92f82ccee0 100644 --- a/klibc/klibc/time.c +++ b/klibc/klibc/time.c @@ -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) { diff --git a/klibc/klibc/utime.c b/klibc/klibc/utime.c index a00b589629..2c8607756a 100644 --- a/klibc/klibc/utime.c +++ b/klibc/klibc/utime.c @@ -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 index 0000000000..5066dbbfaf --- /dev/null +++ b/klibc/klibc/vasprintf.c @@ -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); +} |