summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/Makefile85
-rw-r--r--mdk-stage1/Makefile.common40
-rw-r--r--mdk-stage1/dietlibc/AUTHOR1
-rw-r--r--mdk-stage1/dietlibc/Makefile83
-rw-r--r--mdk-stage1/dietlibc/README11
-rw-r--r--mdk-stage1/dietlibc/alpha/Makefile.add5
-rw-r--r--mdk-stage1/dietlibc/alpha/__longjmp.S38
-rw-r--r--mdk-stage1/dietlibc/alpha/accept.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/bind.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/clone.S42
-rw-r--r--mdk-stage1/dietlibc/alpha/connect.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/divq.S102
-rw-r--r--mdk-stage1/dietlibc/alpha/getegid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/geteuid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/getgid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getpeername.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getpid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getppid.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/getsockname.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/getuid.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/listen.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/mmap.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/pipe.S17
-rw-r--r--mdk-stage1/dietlibc/alpha/recv.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/recvfrom.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/send.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/sendto.S4
-rw-r--r--mdk-stage1/dietlibc/alpha/setjmp.S46
-rw-r--r--mdk-stage1/dietlibc/alpha/setsockopt.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/signal.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/sigprocmask.S7
-rw-r--r--mdk-stage1/dietlibc/alpha/socket.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/socketcall.S5
-rw-r--r--mdk-stage1/dietlibc/alpha/start.S35
-rw-r--r--mdk-stage1/dietlibc/alpha/strlen.c32
-rw-r--r--mdk-stage1/dietlibc/alpha/time.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/unified.S29
-rw-r--r--mdk-stage1/dietlibc/alpha/utime.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/waitpid.S9
-rw-r--r--mdk-stage1/dietlibc/dietdirent.h6
-rw-r--r--mdk-stage1/dietlibc/dietfeatures.h16
-rw-r--r--mdk-stage1/dietlibc/dietstdio.h64
-rw-r--r--mdk-stage1/dietlibc/dirstream.h78
-rw-r--r--mdk-stage1/dietlibc/i386/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/i386/__longjmp.S20
-rw-r--r--mdk-stage1/dietlibc/i386/mmap.c16
-rw-r--r--mdk-stage1/dietlibc/i386/select.S6
-rw-r--r--mdk-stage1/dietlibc/i386/setjmp.S64
-rw-r--r--mdk-stage1/dietlibc/i386/start.S28
-rw-r--r--mdk-stage1/dietlibc/i386/strchr.S47
-rw-r--r--mdk-stage1/dietlibc/i386/unified.S33
-rw-r--r--mdk-stage1/dietlibc/include/arpa/inet.h15
-rw-r--r--mdk-stage1/dietlibc/include/assert.h23
-rw-r--r--mdk-stage1/dietlibc/include/ctype.h13
-rw-r--r--mdk-stage1/dietlibc/include/dirent.h61
-rw-r--r--mdk-stage1/dietlibc/include/elf.h1989
-rw-r--r--mdk-stage1/dietlibc/include/endian.h43
-rw-r--r--mdk-stage1/dietlibc/include/errno.h10
-rw-r--r--mdk-stage1/dietlibc/include/fcntl.h24
-rw-r--r--mdk-stage1/dietlibc/include/features.h1
-rw-r--r--mdk-stage1/dietlibc/include/ftw.h51
-rw-r--r--mdk-stage1/dietlibc/include/grp.h18
-rw-r--r--mdk-stage1/dietlibc/include/limits.h10
-rw-r--r--mdk-stage1/dietlibc/include/malloc.h1
-rw-r--r--mdk-stage1/dietlibc/include/net/if.h9
-rw-r--r--mdk-stage1/dietlibc/include/netdb.h48
-rw-r--r--mdk-stage1/dietlibc/include/netinet/in.h6
-rw-r--r--mdk-stage1/dietlibc/include/netinet/in_systm.h0
-rw-r--r--mdk-stage1/dietlibc/include/netinet/ip.h6
-rw-r--r--mdk-stage1/dietlibc/include/paths.h7
-rw-r--r--mdk-stage1/dietlibc/include/pwd.h20
-rw-r--r--mdk-stage1/dietlibc/include/setjmp.h121
-rw-r--r--mdk-stage1/dietlibc/include/signal.h14
-rw-r--r--mdk-stage1/dietlibc/include/stdint.h6
-rw-r--r--mdk-stage1/dietlibc/include/stdio.h67
-rw-r--r--mdk-stage1/dietlibc/include/stdlib.h37
-rw-r--r--mdk-stage1/dietlibc/include/string.h42
-rw-r--r--mdk-stage1/dietlibc/include/sys/cdefs.h24
-rw-r--r--mdk-stage1/dietlibc/include/sys/ioctl.h10
-rw-r--r--mdk-stage1/dietlibc/include/sys/mman.h25
-rw-r--r--mdk-stage1/dietlibc/include/sys/mount.h81
-rw-r--r--mdk-stage1/dietlibc/include/sys/resource.h7
-rw-r--r--mdk-stage1/dietlibc/include/sys/select.h0
-rw-r--r--mdk-stage1/dietlibc/include/sys/socket.h20
-rw-r--r--mdk-stage1/dietlibc/include/sys/stat.h48
-rw-r--r--mdk-stage1/dietlibc/include/sys/time.h24
-rw-r--r--mdk-stage1/dietlibc/include/sys/types.h33
-rw-r--r--mdk-stage1/dietlibc/include/sys/utsname.h35
-rw-r--r--mdk-stage1/dietlibc/include/sys/vfs.h11
-rw-r--r--mdk-stage1/dietlibc/include/sys/wait.h14
-rw-r--r--mdk-stage1/dietlibc/include/termios.h178
-rw-r--r--mdk-stage1/dietlibc/include/time.h31
-rw-r--r--mdk-stage1/dietlibc/include/unistd.h77
-rw-r--r--mdk-stage1/dietlibc/include/utime.h16
-rw-r--r--mdk-stage1/dietlibc/include/utmp.h72
-rw-r--r--mdk-stage1/dietlibc/lib/__dtostr.c82
-rw-r--r--mdk-stage1/dietlibc/lib/__lltostr.c34
-rw-r--r--mdk-stage1/dietlibc/lib/__ltostr.c34
-rw-r--r--mdk-stage1/dietlibc/lib/__xmknod.c6
-rw-r--r--mdk-stage1/dietlibc/lib/_brk.c14
-rw-r--r--mdk-stage1/dietlibc/lib/abort.c14
-rw-r--r--mdk-stage1/dietlibc/lib/accept.c14
-rw-r--r--mdk-stage1/dietlibc/lib/alarm.c47
-rw-r--r--mdk-stage1/dietlibc/lib/alloc.c217
-rw-r--r--mdk-stage1/dietlibc/lib/assert_fail.c27
-rw-r--r--mdk-stage1/dietlibc/lib/atexit.c23
-rw-r--r--mdk-stage1/dietlibc/lib/atof.c5
-rw-r--r--mdk-stage1/dietlibc/lib/atoi.c8
-rw-r--r--mdk-stage1/dietlibc/lib/atol.c8
-rw-r--r--mdk-stage1/dietlibc/lib/bind.c12
-rw-r--r--mdk-stage1/dietlibc/lib/cfgetospeed.c6
-rw-r--r--mdk-stage1/dietlibc/lib/closedir.c28
-rw-r--r--mdk-stage1/dietlibc/lib/connect.c14
-rw-r--r--mdk-stage1/dietlibc/lib/creat64.c5
-rw-r--r--mdk-stage1/dietlibc/lib/errlist.c132
-rw-r--r--mdk-stage1/dietlibc/lib/errno_location.c5
-rw-r--r--mdk-stage1/dietlibc/lib/execl.c24
-rw-r--r--mdk-stage1/dietlibc/lib/execvp.c55
-rw-r--r--mdk-stage1/dietlibc/lib/ftw.c52
-rw-r--r--mdk-stage1/dietlibc/lib/getdomainname.c17
-rw-r--r--mdk-stage1/dietlibc/lib/getenv.c17
-rw-r--r--mdk-stage1/dietlibc/lib/gethostname.c18
-rw-r--r--mdk-stage1/dietlibc/lib/getpeername.c13
-rw-r--r--mdk-stage1/dietlibc/lib/getservent.c141
-rw-r--r--mdk-stage1/dietlibc/lib/getsockname.c13
-rw-r--r--mdk-stage1/dietlibc/lib/getsockopt.c13
-rw-r--r--mdk-stage1/dietlibc/lib/htons.c12
-rw-r--r--mdk-stage1/dietlibc/lib/if_indextoname.c29
-rw-r--r--mdk-stage1/dietlibc/lib/if_nametoindex.c27
-rw-r--r--mdk-stage1/dietlibc/lib/isalnum.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isalpha.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isascii.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isatty.c20
-rw-r--r--mdk-stage1/dietlibc/lib/isblank.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isdigit.c6
-rw-r--r--mdk-stage1/dietlibc/lib/isspace.c6
-rw-r--r--mdk-stage1/dietlibc/lib/listen.c13
-rw-r--r--mdk-stage1/dietlibc/lib/lockf.c37
-rw-r--r--mdk-stage1/dietlibc/lib/longjmp.c51
-rw-r--r--mdk-stage1/dietlibc/lib/memccmp.c17
-rw-r--r--mdk-stage1/dietlibc/lib/memccpy.c19
-rw-r--r--mdk-stage1/dietlibc/lib/memchr.c9
-rw-r--r--mdk-stage1/dietlibc/lib/memcmp.c14
-rw-r--r--mdk-stage1/dietlibc/lib/memcpy.c12
-rw-r--r--mdk-stage1/dietlibc/lib/memmove.c23
-rw-r--r--mdk-stage1/dietlibc/lib/memset.c9
-rw-r--r--mdk-stage1/dietlibc/lib/mkfifo.c6
-rw-r--r--mdk-stage1/dietlibc/lib/nop.c7
-rw-r--r--mdk-stage1/dietlibc/lib/open64.c11
-rw-r--r--mdk-stage1/dietlibc/lib/opendir.c63
-rw-r--r--mdk-stage1/dietlibc/lib/perror.c16
-rw-r--r--mdk-stage1/dietlibc/lib/pread.c10
-rw-r--r--mdk-stage1/dietlibc/lib/pread64.c13
-rw-r--r--mdk-stage1/dietlibc/lib/putenv.c37
-rw-r--r--mdk-stage1/dietlibc/lib/puts.c6
-rw-r--r--mdk-stage1/dietlibc/lib/raise.c8
-rw-r--r--mdk-stage1/dietlibc/lib/readdir.c83
-rw-r--r--mdk-stage1/dietlibc/lib/recv.c13
-rw-r--r--mdk-stage1/dietlibc/lib/recvfrom.c12
-rw-r--r--mdk-stage1/dietlibc/lib/rewind.c6
-rw-r--r--mdk-stage1/dietlibc/lib/rewinddir.c17
-rw-r--r--mdk-stage1/dietlibc/lib/sbrk.c20
-rw-r--r--mdk-stage1/dietlibc/lib/seekdir.c15
-rw-r--r--mdk-stage1/dietlibc/lib/send.c13
-rw-r--r--mdk-stage1/dietlibc/lib/sendto.c13
-rw-r--r--mdk-stage1/dietlibc/lib/set_errno.c9
-rw-r--r--mdk-stage1/dietlibc/lib/setsockopt.c13
-rw-r--r--mdk-stage1/dietlibc/lib/sigaddset.c21
-rw-r--r--mdk-stage1/dietlibc/lib/sigemptyset.c14
-rw-r--r--mdk-stage1/dietlibc/lib/sigjmp.c36
-rw-r--r--mdk-stage1/dietlibc/lib/sleep.c11
-rw-r--r--mdk-stage1/dietlibc/lib/snprintf.c14
-rw-r--r--mdk-stage1/dietlibc/lib/socket.c12
-rw-r--r--mdk-stage1/dietlibc/lib/sprintf.c15
-rw-r--r--mdk-stage1/dietlibc/lib/sscanf.c13
-rw-r--r--mdk-stage1/dietlibc/lib/strcat.c18
-rw-r--r--mdk-stage1/dietlibc/lib/strchr.c16
-rw-r--r--mdk-stage1/dietlibc/lib/strcmp.c16
-rw-r--r--mdk-stage1/dietlibc/lib/strcpy.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strcspn.c17
-rw-r--r--mdk-stage1/dietlibc/lib/strdup.c9
-rw-r--r--mdk-stage1/dietlibc/lib/strerror.c10
-rw-r--r--mdk-stage1/dietlibc/lib/strlcat.c72
-rw-r--r--mdk-stage1/dietlibc/lib/strlcpy.c68
-rw-r--r--mdk-stage1/dietlibc/lib/strlen.c47
-rw-r--r--mdk-stage1/dietlibc/lib/strncat.c19
-rw-r--r--mdk-stage1/dietlibc/lib/strncmp.c6
-rw-r--r--mdk-stage1/dietlibc/lib/strncpy.c10
-rw-r--r--mdk-stage1/dietlibc/lib/strpbrk.c11
-rw-r--r--mdk-stage1/dietlibc/lib/strrchr.c18
-rw-r--r--mdk-stage1/dietlibc/lib/strspn.c17
-rw-r--r--mdk-stage1/dietlibc/lib/strstr.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtod.c52
-rw-r--r--mdk-stage1/dietlibc/lib/strtok.c6
-rw-r--r--mdk-stage1/dietlibc/lib/strtok_r.c21
-rw-r--r--mdk-stage1/dietlibc/lib/strtol.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtoll.c15
-rw-r--r--mdk-stage1/dietlibc/lib/strtoul.c39
-rw-r--r--mdk-stage1/dietlibc/lib/strtoull.c39
-rw-r--r--mdk-stage1/dietlibc/lib/sys_siglist.c37
-rw-r--r--mdk-stage1/dietlibc/lib/tcgetattr.c7
-rw-r--r--mdk-stage1/dietlibc/lib/tcsetattr.c23
-rw-r--r--mdk-stage1/dietlibc/lib/telldir.c38
-rw-r--r--mdk-stage1/dietlibc/lib/ttyname.c59
-rw-r--r--mdk-stage1/dietlibc/lib/vfork.c6
-rw-r--r--mdk-stage1/dietlibc/lib/vfprintf.c15
-rw-r--r--mdk-stage1/dietlibc/lib/vprintf.c20
-rw-r--r--mdk-stage1/dietlibc/lib/vsnprintf.c239
-rw-r--r--mdk-stage1/dietlibc/lib/vsprintf.c11
-rw-r--r--mdk-stage1/dietlibc/lib/vsscanf.c241
-rw-r--r--mdk-stage1/dietlibc/lib/wait.c6
-rw-r--r--mdk-stage1/dietlibc/lib/wait3.c5
-rw-r--r--mdk-stage1/dietlibc/ppc/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/ppc/__longjmp.S61
-rw-r--r--mdk-stage1/dietlibc/ppc/mmap.c37
-rw-r--r--mdk-stage1/dietlibc/ppc/setjmp.S56
-rw-r--r--mdk-stage1/dietlibc/ppc/start.S44
-rw-r--r--mdk-stage1/dietlibc/ppc/unified.S21
-rw-r--r--mdk-stage1/dietlibc/sparc/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/sparc/__longjmp.S66
-rw-r--r--mdk-stage1/dietlibc/sparc/fork.S19
-rw-r--r--mdk-stage1/dietlibc/sparc/mmap.c43
-rw-r--r--mdk-stage1/dietlibc/sparc/pipe.S20
-rw-r--r--mdk-stage1/dietlibc/sparc/setjmp.S35
-rw-r--r--mdk-stage1/dietlibc/sparc/start.S46
-rw-r--r--mdk-stage1/dietlibc/sparc/udiv.S363
-rw-r--r--mdk-stage1/dietlibc/sparc/umul.S170
-rw-r--r--mdk-stage1/dietlibc/sparc/unified.S28
-rw-r--r--mdk-stage1/dietlibc/sparc/urem.S362
-rw-r--r--mdk-stage1/dietlibc/start.h10
-rw-r--r--mdk-stage1/dietlibc/syscalls.h82
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/__pread.S4
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/_llseek.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/access.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/brk.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chmod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/chroot.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/close.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/dup.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/dup2.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/execve.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/exit.S6
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchmod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fchown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fcntl.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/flock.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fork.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fstatfs.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/fsync.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/ftruncate.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getcwd.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getdents.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getdents64.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getegid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/geteuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getgroups.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getpgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getpid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getppid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getresgid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getresuid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getrlimit.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getrusage.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getsid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/gettimeofday.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/getuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/ioctl.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/kill.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/lchown.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/link.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/lseek.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mkdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mknod.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mprotect.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/mremap.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/munmap.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/nanosleep.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/open.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/pipe.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/poll.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/pwrite.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/read.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/readlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/rename.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/rmdir.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/select.S4
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sendfile.S5
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setdomainname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setgroups.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sethostname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setitimer.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setpgid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setregid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setresgid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setresuid.S7
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setreuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setrlimit.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setsid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/setuid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigaction.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/signal.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigpending.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigprocmask.S6
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sigsuspend.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/socketcall.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/statfs.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/swapoff.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/swapon.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/symlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/sync.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/syslog.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/time.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/truncate.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/umask.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/umount.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/uname.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/unlink.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/utime.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/vhangup.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/wait4.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/waitpid.S3
-rw-r--r--mdk-stage1/dietlibc/syscalls.s/write.S5
-rw-r--r--mdk-stage1/insmod-busybox/Makefile29
-rw-r--r--mdk-stage1/insmod-busybox/busybox.h4
-rw-r--r--mdk-stage1/insmod-busybox/insmod.c13
-rw-r--r--mdk-stage1/insmod-busybox/utility.c24
-rw-r--r--mdk-stage1/mar/Makefile24
-rw-r--r--mdk-stage1/probing.c4
-rw-r--r--mdk-stage1/stage1.c4
-rw-r--r--mdk-stage1/stdio-frontend.c14
-rw-r--r--mdk-stage1/tools.c5
337 files changed, 9478 insertions, 84 deletions
diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile
index 26e12c860..889d9f4c3 100644
--- a/mdk-stage1/Makefile
+++ b/mdk-stage1/Makefile
@@ -21,16 +21,19 @@
VERSION = cooker
+top_dir = .
+
+include $(top_dir)/Makefile.common
+
ARCH := $(patsubst i%86,i386,$(shell uname -m))
ARCH := $(patsubst sparc%,sparc,$(ARCH))
+CFLAGS = -Os -pipe -Wall -Werror -fomit-frame-pointer
-CFLAGS = -Os -Wall -Werror -fomit-frame-pointer
-INCLUDES = -I.
DEFS = -DVERSION=\"$(VERSION)\"
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CFLAGS)
+COMPILE = $(CC) $(DEFS) $(CFLAGS)
#- stage1 "loader"
@@ -49,20 +52,31 @@ STDIO_FRONTEND_LIBS =
WSLIB_FRONTEND_SRC = wslib-frontend.c
WSLIB_FRONTEND_LIBS = /usr/lib/libwslib.a
- #- default frontend is newt
-F = NEWT
FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC))
FRONTEND_LIBS = $($(F)_FRONTEND_LIBS)
+FRONTEND_LINK = $(FRONTEND_OBJS) $(FRONTEND_LIBS)
+MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK)
+
+ifeq (DIETLIBC, $(L))
+ifeq (NEWT, $(F))
+MEDIAS_FRONTEND_LINK = $(subst .c,.o,$(STDIO_FRONTEND_SRC)) $(STDIO_FRONTEND_LIBS)
+else
+MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK)
+endif
+endif
+
+
+GLIBC_STAGE1_OWN_LIBS = insmod-busybox/libinsmod.a mar/libmar.a
+DIETLIBC_STAGE1_OWN_LIBS = insmod-busybox/libinsmod-DIET.a mar/libmar-DIET.a
+STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS)
-STAGE1_OWN_LIBS = insmod-busybox/libinsmod.a mar/libmar.a
STAGE1_OTHER_LIBS = /usr/lib/libz.a
STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a
-
#- stage1 itself
STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c
CDROMSRC = cdrom.c
@@ -74,8 +88,6 @@ ALLSRC = $(INITSRC) $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC)
STAGE1OBJS = $(subst .c,.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC))
-STAGE1OBJS_UTILS = $(FRONTEND_OBJS) $(STAGE1_OWN_LIBS) $(FRONTEND_LIBS) $(STAGE1_OTHER_LIBS)
-
STAGE1OBJS-CDROM = $(subst .c,-CDROM.o,$(STAGE1SRC) $(CDROMSRC))
@@ -92,14 +104,9 @@ STAGE1OBJS-NETWORK = $(subst .c,-NETWORK.o,$(STAGE1SRC) $(NETWORKSRC))
NETWORK_DEFS = -DDISABLE_CDROM -DDISABLE_DISK
-
-
-
ifeq (i386, $(ARCH))
MINILIC=minilibc.o
LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o
-LDFLAGS_STAGE1 = -static
-STATIC=-static
endif
ifeq (sparc, $(ARCH))
MINILIBC=minilibc.o /usr/lib/libc.a
@@ -108,7 +115,7 @@ LDFLAGS_STAGE1 = -static
endif
-BINS = init stage1-full stage1-cdrom stage1-network stage1-disk
+BINS = init stage1-cdrom stage1-disk stage1-network stage1-full
#ifeq (i386, $(ARCH))
@@ -127,7 +134,7 @@ BINS = init stage1-full stage1-cdrom stage1-network stage1-disk
#BINS += stage1-all
#endif
-DIRS = mar insmod-busybox pci-resource
+DIRS = dietlibc mar insmod-busybox pci-resource
all: dirs $(BINS)
@@ -137,48 +144,42 @@ dirs:
[ "$$n" = "." ] || make -C $$n ;\
done
-
init: $(INITOBJS)
$(CC) $(LDFLAGS_INIT) -o $@ $(INITOBJS)
- strip -s $@
-
-stage1-cdrom: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-CDROM) $(STAGE1OBJS_UTILS)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-CDROM) $(STAGE1OBJS_UTILS)
- strip -s $@
-
-stage1-network: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-NETWORK) $(STAGE1OBJS_UTILS)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-NETWORK) $(STAGE1OBJS_UTILS) $(STAGE1_NETWORK_LIBS)
- strip -s $@
+ $(STRIPCMD) $@
-stage1-disk: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-DISK) $(STAGE1OBJS_UTILS)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-DISK) $(STAGE1OBJS_UTILS)
- strip -s $@
+stage1-cdrom: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-CDROM) $(MEDIAS_FRONTEND_LINK)
+ $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-CDROM) $(MEDIAS_FRONTEND_LINK) $(STAGE1_OWN_LIBS) $(STAGE1_OTHER_LIBS) $(STAGE1_LIBC)
+ $(STRIPCMD) $@
-stage1-pcmcia: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-PCMIA) $(STAGE1OBJS_UTILS)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-PCMIA) $(STAGE1OBJS_UTILS)
- strip -s $@
+stage1-disk: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-DISK) $(MEDIAS_FRONTEND_LINK)
+ $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-DISK) $(MEDIAS_FRONTEND_LINK) $(STAGE1_OWN_LIBS) $(STAGE1_OTHER_LIBS) $(STAGE1_LIBC)
+ $(STRIPCMD) $@
-stage1-full: $(STAGE1_OWN_LIBS) $(STAGE1OBJS) $(STAGE1OBJS_UTILS)
- $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS) $(STAGE1OBJS_UTILS) $(STAGE1_NETWORK_LIBS)
- strip -s $@
+stage1-network: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-NETWORK) $(FRONTEND_LINK)
+ $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-NETWORK) $(FRONTEND_LINK) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_OTHER_LIBS) $(STAGE1_NETWORK_LIBS)
+ $(STRIPCMD) $@
+stage1-pcmcia: $(STAGE1_OWN_LIBS) $(STAGE1OBJS-PCMIA) $(FRONTEND_LINK)
+ $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS-PCMIA) $(FRONTEND_LINK) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_OTHER_LIBS) $(STAGE1_LIBC)
+ $(STRIPCMD) $@
-#stage1-network-diet: $(STAGE1OBJS) stage1-network.o $(NETOBJS)
-# gcc -nostdlib -o $@ ../../../tmp/dietlibc/start.o $^ ../../../tmp/dietlibc/dietlibc.a
-# strip -s $@
+stage1-full: $(STAGE1_OWN_LIBS) $(STAGE1OBJS) $(FRONTEND_LINK)
+ $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS) $(FRONTEND_LINK) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_OTHER_LIBS) $(STAGE1_NETWORK_LIBS)
+ $(STRIPCMD) $@
$(STAGE1OBJS-CDROM): %-CDROM.o: %.c
- $(COMPILE) $(CDROM_DEFS) -c $< -o $@
+ $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@
$(STAGE1OBJS-DISK): %-DISK.o: %.c
- $(COMPILE) $(DISK_DEFS) -c $< -o $@
+ $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@
$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c
- $(COMPILE) $(NETWORK_DEFS) -c $< -o $@
+ $(COMPILE) $(GLIBC_INCLUDES) $(NETWORK_DEFS) -c $< -o $@
.c.o:
- $(COMPILE) -c $<
+ $(COMPILE) $(GLIBC_INCLUDES) -c $<
clean:
diff --git a/mdk-stage1/Makefile.common b/mdk-stage1/Makefile.common
new file mode 100644
index 000000000..9d2d3f9f3
--- /dev/null
+++ b/mdk-stage1/Makefile.common
@@ -0,0 +1,40 @@
+ # -*- makefile -*-
+ #******************************************************************************
+ #
+ # Guillaume Cottenceau (gc@mandrakesoft.com)
+ #
+ # Copyright 2000 MandrakeSoft
+ #
+ # This software may be freely redistributed under the terms of the GNU
+ # public license.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ #
+ #*****************************************************************************
+
+
+ #- default lib is dietlibc (honoured by main Makefile whenever possible)
+L = DIETLIBC
+# L = GLIBC
+
+ #- default frontend is newt (honoured by main Makefile whenever possible)
+F = NEWT
+# F = STDIO
+
+
+DIETLIBC_INCLUDES = -I$(top_dir)/dietlibc/include -I.
+GLIBC_INCLUDES = -I.
+INCLUDES = $($(L)_INCLUDES)
+
+GLIBC_LDFLAGS_STAGE1 = -static
+DIETLIBC_LDFLAGS_STAGE1 = -nostdlib $(top_dir)/dietlibc/start.o
+LDFLAGS_STAGE1 = $($(L)_LDFLAGS_STAGE1)
+
+GLIBC_LIBC =
+DIETLIBC_LIBC = $(top_dir)/dietlibc/dietlibc.a
+STAGE1_LIBC = $($(L)_LIBC)
+
+STRIPCMD = strip -R .note -R .comment
+
diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR
new file mode 100644
index 000000000..6d8ab1a05
--- /dev/null
+++ b/mdk-stage1/dietlibc/AUTHOR
@@ -0,0 +1 @@
+Felix von Leitner <felix-dietlibc@fefe.de>
diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile
new file mode 100644
index 000000000..74aca4f27
--- /dev/null
+++ b/mdk-stage1/dietlibc/Makefile
@@ -0,0 +1,83 @@
+all: start.o dietlibc.a elftrunc
+
+ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/')
+
+CFLAGS=-pipe
+CROSS=
+
+VPATH=syscalls.c
+
+SYSCALLOBJ=$(patsubst syscalls.s/%.S,%.o,$(wildcard syscalls.s/*.S))
+
+LIBOBJ=$(patsubst lib/%.c,%.o,$(wildcard lib/*.c))
+
+include $(ARCH)/Makefile.add
+
+ifeq ($(CFLAGS),-pipe)
+CFLAGS+=-O -fomit-frame-pointer
+endif
+
+#CFLAGS += -g
+CFLAGS += -Wall
+
+.SUFFIXES:
+.SUFFIXES: .S .c
+
+%.o: %.S
+ $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $<
+
+%.o: %.c
+ $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $<
+# $(CROSS)strip -x -R .comment -R .note $@
+
+dietlibc.a: $(SYSCALLOBJ) $(LIBOBJ) __longjmp.o longjmp.o setjmp.o \
+start.o unified.o mmap.o mount.o
+ $(CROSS)ar cru dietlibc.a $^
+
+libdietc.so: dietlibc.a
+ $(CROSS)ld -whole-archive -shared -o $@ $^
+
+$(SYSCALLOBJ): syscalls.h
+
+elftrunc: contrib/elftrunc.c start.o dietlibc.a
+ $(CROSS)gcc $(CFLAGS) -nostdlib -o $@ $^
+
+djb: compile load
+
+compile:
+ echo 'exec gcc $(CFLAGS) -I$(HOME)/projects/dietlibc/include -c $${1+"$$@"}' > $@
+ chmod 755 $@
+
+load:
+ echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(HOME)/projects/dietlibc/start.o "$$main".o $${1+"$$@"} $(HOME)/projects/dietlibc/dietlibc.a -lgcc' > $@
+ chmod 755 $@
+
+clean:
+ rm -f *.o *.a t t1 compile load elftrunc exports mapfile libdietc.so
+ $(MAKE) -C examples clean
+
+tar: clean
+ cd .. && tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2
+
+exports: dietlibc.a
+ nm -g dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > exports
+
+.PHONY: t t1
+t:
+ $(CROSS)gcc -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c start.o dietlibc.a -lgcc -Wl,-Map,mapfile
+
+t1:
+ $(CROSS)gcc -g -o t1 t.c
+
+install:
+ cp start.o $(prefix)/lib/dietstart.o
+ cp dietlibc.a $(prefix)/lib/libdietc.a
+
+.PHONY: sparc ppc mips arm alpha i386
+
+sparc ppc alpha i386:
+ $(MAKE) ARCH=$@ CROSS=$@-linux- all t libdietc.so
+
+mips arm:
+ $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t libdietc.so
+
diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README
new file mode 100644
index 000000000..c17aefcc5
--- /dev/null
+++ b/mdk-stage1/dietlibc/README
@@ -0,0 +1,11 @@
+diet glibc to statically link programs that don't need all the bloat
+from glibc.
+
+malloc, printf and scanf contributed from Olaf Dreesen.
+
+Usage:
+ gcc -I~/dietlibc/include -Os -pipe -c *.c
+ gcc -nostdlib -o ncp ~/dietlibc/start.o *.o ~/dietlibc/dietlibc.a
+
+If you use the glibc includes, directory reading (and maybe other
+functions) will fail. You have been warned!
diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add
new file mode 100644
index 000000000..da3791eb6
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/Makefile.add
@@ -0,0 +1,5 @@
+
+CFLAGS+=-Os -fno-builtin -Iinclude -fomit-frame-pointer -fstrict-aliasing
+override VPATH=alpha:syscalls.s:lib
+
+LIBOBJ+=divq.o
diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S
new file mode 100644
index 000000000..d86d76717
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/__longjmp.S
@@ -0,0 +1,38 @@
+#ifdef __alpha__
+
+#include <setjmp.h>
+
+.text
+.align 2
+
+.global __longjmp
+__longjmp:
+ mov $17, $0 /* a1 -> v0 */
+
+ ldq $9, (JB_S0*8) ($16) /* s0 */
+ ldq $10, (JB_S1*8) ($16) /* s1 */
+ ldq $11, (JB_S2*8) ($16) /* s2 */
+ ldq $12, (JB_S3*8) ($16) /* s3 */
+ ldq $13, (JB_S4*8) ($16) /* s4 */
+ ldq $14, (JB_S5*8) ($16) /* s5 */
+
+ ldq $26, (JB_PC*8) ($16) /* ra */
+ ldq $fp, (JB_FP*8) ($16) /* fp */
+ ldq $1, (JB_SP*8) ($16) /* sp */
+
+ ldt $f2, (JB_F2*8) ($16) /* f2 */
+ ldt $f3, (JB_F3*8) ($16) /* f3 */
+ ldt $f4, (JB_F4*8) ($16) /* f4 */
+ ldt $f5, (JB_F5*8) ($16) /* f5 */
+ ldt $f6, (JB_F6*8) ($16) /* f6 */
+ ldt $f7, (JB_F7*8) ($16) /* f7 */
+ ldt $f8, (JB_F8*8) ($16) /* f8 */
+ ldt $f9, (JB_F9*8) ($16) /* f9 */
+
+ cmoveq $0, 0x1, $0
+ mov $1, $sp
+
+ ret $31, ($26), 1
+
+
+#endif
diff --git a/mdk-stage1/dietlibc/alpha/accept.S b/mdk-stage1/dietlibc/alpha/accept.S
new file mode 100644
index 000000000..43a40ee6f
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/accept.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_accept
+syscall(accept,accept)
diff --git a/mdk-stage1/dietlibc/alpha/bind.S b/mdk-stage1/dietlibc/alpha/bind.S
new file mode 100644
index 000000000..86a04cb70
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/bind.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(bind,bind)
diff --git a/mdk-stage1/dietlibc/alpha/clone.S b/mdk-stage1/dietlibc/alpha/clone.S
new file mode 100644
index 000000000..f01620595
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/clone.S
@@ -0,0 +1,42 @@
+#include "syscalls.h"
+#include <asm/errno.h>
+
+.text
+.align 2
+.weak clone
+clone:
+.global __clone
+.type __clone,@function
+clone:
+ ldiq $0, EINVAL
+ beq $16, .Lerror
+ beq $17, .Lerror
+
+ subq $17, 16, $17
+ stq $16, 0($17)
+ stq $19, 8($17)
+ mov $18, $16
+
+ lda $0, __NR_pipe($31)
+ callsys
+ bne $19, .Lerror
+
+ beq $0, .Lstart_thread
+
+ ret $31, ($26), 0x01
+
+.Lerror:
+ jmp error_unified_syscall
+
+.Lstart_thread:
+ clr $fp
+
+ ldq $27, 0($sp)
+ ldq $16, 8($sp)
+
+ jsr $26, ($27), 0x04
+
+ ldgp $gp, 0($26)
+ mov $0, $16
+ jsr $26, _exit
+
diff --git a/mdk-stage1/dietlibc/alpha/connect.S b/mdk-stage1/dietlibc/alpha/connect.S
new file mode 100644
index 000000000..da3675760
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/connect.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_connect
+syscall(connect,connect)
diff --git a/mdk-stage1/dietlibc/alpha/divq.S b/mdk-stage1/dietlibc/alpha/divq.S
new file mode 100644
index 000000000..cf70862c4
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/divq.S
@@ -0,0 +1,102 @@
+/* taken from glibc 2.2 */
+
+ .set noreorder
+ .set noat
+
+ .ent __divqu
+ .globl __divqu
+
+ .align 3
+__divqu :
+ lda $30 , - 48 ($30 )
+ .frame $30 , 48 , $23 , 0
+ .prologue 0
+$udiv:
+ stq $1 , 0($30 )
+ mov $25 , $1
+ stq $2 , 8($30 )
+ mov $24 , $2
+ stq $0 , 16($30 )
+ clr $27
+ stq $3 , 24($30 )
+ ldiq $0 , 1
+ stq $4 ,32($30 )
+ beq $1 , $divbyzero
+
+ .align 3
+
+
+1: cmpult $1 , $2 , $at
+ blt $1 , 2f
+ addq $1 , $1 , $1
+ addq $0 , $0 , $0
+ bne $at , 1b
+ unop
+2:
+3: addq $27 ,$0 , $4
+ srl $0 , 1, $0
+ cmpule $1 , $2 , $at
+ subq $2 , $1 , $3
+ cmovne $at ,$4 , $27
+ srl $1 , 1, $1
+ cmovne $at , $3 , $2
+ bne $0 , 3b
+
+$done: ldq $1 , 0($30 )
+ ldq $2 , 8($30 )
+ ldq $0 , 16($30 )
+ ldq $3 , 24($30 )
+ ldq $4 ,32($30 )
+ lda $30 , 48 ($30 )
+ ret $31 , ($23 ), 1
+
+$divbyzero:
+ mov $16 , $3
+ ldiq $16 , -2
+ call_pal 170
+ mov $3 , $16
+ clr $27
+ br $done
+
+ .end __divqu
+
+ .ent __divq
+ .globl __divq
+
+ .align 3
+__divq :
+ lda $30 , - 48 ($30 )
+ .frame $30 , 48 , $23 , 0
+ .prologue 0
+ or $24 , $25 , $at
+
+ bge $at , $udiv
+
+
+ stq $24 , 0($30 )
+ negq $24 , $at
+ stq $25 , 8($30 )
+ cmovge $at , $at , $24
+ stq $23 , 16($30 )
+ negq $25 , $at
+ stq $3 , 24($30 )
+ cmovge $at , $at , $25
+
+
+ bsr $23 , __divqu
+
+
+ ldq $24 , 0($30 )
+ ldq $25 , 8($30 )
+ xor $24 , $25 , $at
+ negq $27 , $3
+
+ ldq $23 , 16($30 )
+ cmovlt $at , $3 , $27
+ ldq $3 , 24($30 )
+
+ lda $30 , 48 ($30 )
+ ret $31 , ($23 ), 1
+
+ .end __divq
+
diff --git a/mdk-stage1/dietlibc/alpha/getegid.S b/mdk-stage1/dietlibc/alpha/getegid.S
new file mode 100644
index 000000000..89c35d45e
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getegid.S
@@ -0,0 +1,11 @@
+.text
+.align 2
+.global getegid
+getegid:
+ lda $sp,-8($sp)
+ stq $26, 0($sp)
+ jsr getgid
+ ldq $26, 0($sp)
+ lda $sp, 8($sp)
+ cmovge $0, $20, $0
+ ret
diff --git a/mdk-stage1/dietlibc/alpha/geteuid.S b/mdk-stage1/dietlibc/alpha/geteuid.S
new file mode 100644
index 000000000..087ca7348
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/geteuid.S
@@ -0,0 +1,11 @@
+.text
+.align 2
+.global geteuid
+geteuid:
+ lda $sp,-8($sp)
+ stq $26, 0($sp)
+ jsr getuid
+ ldq $26, 0($sp)
+ lda $sp, 8($sp)
+ cmovge $0, $20, $0
+ ret
diff --git a/mdk-stage1/dietlibc/alpha/getgid.S b/mdk-stage1/dietlibc/alpha/getgid.S
new file mode 100644
index 000000000..7350082f3
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getgid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getxgid,getgid)
diff --git a/mdk-stage1/dietlibc/alpha/getpeername.S b/mdk-stage1/dietlibc/alpha/getpeername.S
new file mode 100644
index 000000000..3b3f48b1a
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getpeername.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getpeername,getpeername)
diff --git a/mdk-stage1/dietlibc/alpha/getpid.S b/mdk-stage1/dietlibc/alpha/getpid.S
new file mode 100644
index 000000000..d8b3523b2
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getpid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getxpid,getpid)
diff --git a/mdk-stage1/dietlibc/alpha/getppid.S b/mdk-stage1/dietlibc/alpha/getppid.S
new file mode 100644
index 000000000..e181268c3
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getppid.S
@@ -0,0 +1,11 @@
+.text
+.align 2
+.global getppid
+getppid:
+ lda $sp,-8($sp)
+ stq $26, 0($sp)
+ jsr getpid
+ ldq $26, 0($sp)
+ lda $sp, 8($sp)
+ cmovge $0, $20, $0
+ ret
diff --git a/mdk-stage1/dietlibc/alpha/getsockname.S b/mdk-stage1/dietlibc/alpha/getsockname.S
new file mode 100644
index 000000000..2727d88da
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getsockname.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getsockname,getsockname)
diff --git a/mdk-stage1/dietlibc/alpha/getsockopt.S b/mdk-stage1/dietlibc/alpha/getsockopt.S
new file mode 100644
index 000000000..44b4a910a
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getsockopt.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getsockopt,getsockopt)
diff --git a/mdk-stage1/dietlibc/alpha/getuid.S b/mdk-stage1/dietlibc/alpha/getuid.S
new file mode 100644
index 000000000..fcb5570c2
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/getuid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getxuid,getuid)
diff --git a/mdk-stage1/dietlibc/alpha/listen.S b/mdk-stage1/dietlibc/alpha/listen.S
new file mode 100644
index 000000000..1102831d4
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/listen.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(listen,listen)
diff --git a/mdk-stage1/dietlibc/alpha/mmap.S b/mdk-stage1/dietlibc/alpha/mmap.S
new file mode 100644
index 000000000..2e57fbb74
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/mmap.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mmap,mmap)
diff --git a/mdk-stage1/dietlibc/alpha/pipe.S b/mdk-stage1/dietlibc/alpha/pipe.S
new file mode 100644
index 000000000..3dfef10bf
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/pipe.S
@@ -0,0 +1,17 @@
+#include "syscalls.h"
+
+.text
+.align 2
+.global pipe
+.type pipe,@function
+pipe:
+ lda $0, __NR_pipe($31)
+ callsys
+ bne $19, .Lerror
+ stl $0, 0($16)
+ stl $20, 4($16)
+ clr $0
+ ret $31, ($26), 0x01
+.Lerror:
+ br error_unified_syscall
+
diff --git a/mdk-stage1/dietlibc/alpha/recv.S b/mdk-stage1/dietlibc/alpha/recv.S
new file mode 100644
index 000000000..71b2e37dc
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/recv.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_recv
+syscall(recv,recv)
diff --git a/mdk-stage1/dietlibc/alpha/recvfrom.S b/mdk-stage1/dietlibc/alpha/recvfrom.S
new file mode 100644
index 000000000..64779cbb8
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/recvfrom.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_recvfrom
+syscall(recvfrom,recvfrom)
diff --git a/mdk-stage1/dietlibc/alpha/send.S b/mdk-stage1/dietlibc/alpha/send.S
new file mode 100644
index 000000000..baed3b173
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/send.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_send
+syscall(send,send)
diff --git a/mdk-stage1/dietlibc/alpha/sendto.S b/mdk-stage1/dietlibc/alpha/sendto.S
new file mode 100644
index 000000000..19169b26b
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/sendto.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_sendto
+syscall(sendto,sendto)
diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S
new file mode 100644
index 000000000..3768056be
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/setjmp.S
@@ -0,0 +1,46 @@
+#include <setjmp.h>
+
+.text
+.global __sigsetjmp
+__sigsetjmp:
+ ldgp $gp, 0($gp)
+
+ mov $sp, $1
+ lda $sp, -16($sp)
+
+ stq $26, 0($sp) /* save ra */
+
+ stq $9, (JB_S0*8) ($16) /* s0 */
+ stq $10, (JB_S1*8) ($16) /* s1 */
+ stq $11, (JB_S2*8) ($16) /* s2 */
+ stq $12, (JB_S3*8) ($16) /* s3 */
+ stq $13, (JB_S4*8) ($16) /* s4 */
+ stq $14, (JB_S5*8) ($16) /* s5 */
+
+ stq $26, (JB_PC*8) ($16) /* ra */
+ stq $fp, (JB_FP*8) ($16) /* fp */
+ stq $1, (JB_SP*8) ($16) /* sp */
+
+ stt $f2, (JB_F2*8) ($16) /* f2 */
+ stt $f3, (JB_F3*8) ($16) /* f3 */
+ stt $f4, (JB_F4*8) ($16) /* f4 */
+ stt $f5, (JB_F5*8) ($16) /* f5 */
+ stt $f6, (JB_F6*8) ($16) /* f6 */
+ stt $f7, (JB_F7*8) ($16) /* f7 */
+ stt $f8, (JB_F8*8) ($16) /* f8 */
+ stt $f9, (JB_F9*8) ($16) /* f9 */
+
+ br $26, __sigjmp_save /* call __sigjmp_save */
+
+ ldq $26, 0($sp) /* restore ra */
+
+ lda $sp, 16($sp)
+ ret $31, ($26), 1 /* back to caller */
+
+.weak setjmp
+setjmp:
+.weak __setjmp
+__setjmp:
+ ldgp $gp, 0($gp)
+ mov 0, $17
+ br __sigsetjmp
diff --git a/mdk-stage1/dietlibc/alpha/setsockopt.S b/mdk-stage1/dietlibc/alpha/setsockopt.S
new file mode 100644
index 000000000..e3fe1d321
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/setsockopt.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setsockopt,setsockopt)
diff --git a/mdk-stage1/dietlibc/alpha/signal.S b/mdk-stage1/dietlibc/alpha/signal.S
new file mode 100644
index 000000000..ceca0f02d
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/signal.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(osf_signal,signal)
diff --git a/mdk-stage1/dietlibc/alpha/sigprocmask.S b/mdk-stage1/dietlibc/alpha/sigprocmask.S
new file mode 100644
index 000000000..8255a739a
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/sigprocmask.S
@@ -0,0 +1,7 @@
+#include "syscalls.h"
+
+.text
+.align 2
+.weak sigprocmask
+sigprocmask:
+syscall(osf_sigprocmask,__sigprocmask)
diff --git a/mdk-stage1/dietlibc/alpha/socket.S b/mdk-stage1/dietlibc/alpha/socket.S
new file mode 100644
index 000000000..85401f56e
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/socket.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(socket,socket)
diff --git a/mdk-stage1/dietlibc/alpha/socketcall.S b/mdk-stage1/dietlibc/alpha/socketcall.S
new file mode 100644
index 000000000..b150bd5d5
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/socketcall.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+/*
+ * Doesn't exist on alpha ( accept, bind, ... are SYSCALLS !?! )
+ */
diff --git a/mdk-stage1/dietlibc/alpha/start.S b/mdk-stage1/dietlibc/alpha/start.S
new file mode 100644
index 000000000..00b8e950d
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/start.S
@@ -0,0 +1,35 @@
+#include "start.h"
+
+#ifdef __alpha__
+
+.text
+.align 2
+ .set noreorder
+
+.global __start
+__start:
+.global _start
+_start:
+ clr $fp /* clear frame pointer */
+
+ br $gp,.Lstart /* set global pointer */
+.Lstart:
+ ldgp $gp, 0($gp)
+
+/* prepare to call main */
+ ldl $16, 0($sp) /* argc */
+
+ lda $17, 8($sp) /* argv */
+
+ addq $16, 1, $18 /* argp */
+ s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */
+
+ stq $18, environ
+
+ mov $0, $21 /* mov v0(dynload) to a5 */
+
+ jsr $26, main
+ mov $0, $16
+ jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */
+
+#endif
diff --git a/mdk-stage1/dietlibc/alpha/strlen.c b/mdk-stage1/dietlibc/alpha/strlen.c
new file mode 100644
index 000000000..ac532254a
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/strlen.c
@@ -0,0 +1,32 @@
+#include <string.h>
+
+static const unsigned long long magic = 0x0101010101010101LL;
+
+size_t strlen(const char *s)
+{
+ const char *t = s;
+ unsigned long long word;
+
+ if (!s) return 0;
+
+ /* Byte compare up until 64 bit word boundary */
+ for (; ((unsigned long long) t & 7); t++)
+ if (!*t) return t - s;
+
+ /* Word compare */
+ do {
+ word = *((unsigned long long *) t); t += 8;
+ word = (word - magic) &~ word;
+ word &= (magic << 7);
+ } while (word == 0);
+
+ /* word & 0x8080808080808080 == word */
+ word = (word - 1) & (magic << 8);
+ word += (word << 32);
+ word += (word << 16);
+ word += (word << 8);
+ t += word >> 56;
+ return ((const char *) t) - 8 - s;
+}
+
+
diff --git a/mdk-stage1/dietlibc/alpha/time.S b/mdk-stage1/dietlibc/alpha/time.S
new file mode 100644
index 000000000..56a4f9b38
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/time.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(osf_gettimeofday,time)
diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S
new file mode 100644
index 000000000..02a1c9bcd
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/unified.S
@@ -0,0 +1,29 @@
+#include <dietfeatures.h>
+
+.global __unified_syscall
+__unified_syscall:
+ callsys
+ bne $19, .Lerror
+ ret $31, ($26), 0x01
+
+.Lerror:
+.global error_unified_syscall
+error_unified_syscall:
+#ifdef WANT_THREAD_SAVE
+ lda $sp, -16($sp) /* alloc 2 qwords on stack */
+ stq $26, 0($sp) /* save ra to stack */
+ stq $0, 8($sp) /* save v0 to stack */
+
+ jsr $26, __errno_location /* call __errno_location */
+
+ ldq $1, 8($sp) /* write old v0 to errno */
+ stl $1, 0($0)
+
+ lda $0, -1($31) /* new return value is -1 */
+ ldq $26, 0($sp) /* restore return address */
+ lda $sp, 16($sp) /* free 2 qwords on stack */
+#else
+ lda $1, errno
+ stl $0, 0($1)
+#endif
+ ret $31, ($26), 0x01 /* return */
diff --git a/mdk-stage1/dietlibc/alpha/utime.S b/mdk-stage1/dietlibc/alpha/utime.S
new file mode 100644
index 000000000..a9a8aada6
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/utime.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(utimes,utime)
diff --git a/mdk-stage1/dietlibc/alpha/waitpid.S b/mdk-stage1/dietlibc/alpha/waitpid.S
new file mode 100644
index 000000000..0ff429e17
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/waitpid.S
@@ -0,0 +1,9 @@
+#include <syscalls.h>
+
+.text
+.align 2
+.weak __libc_waitpid
+.global waitpid
+waitpid:
+ clr $19
+ br wait4
diff --git a/mdk-stage1/dietlibc/dietdirent.h b/mdk-stage1/dietlibc/dietdirent.h
new file mode 100644
index 000000000..d732cf7dc
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietdirent.h
@@ -0,0 +1,6 @@
+struct __dirstream {
+ int fd;
+ char buf[1024];
+ unsigned int num;
+ unsigned int cur;
+}; /* stream data from opendir() */
diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h
new file mode 100644
index 000000000..0e83a6437
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietfeatures.h
@@ -0,0 +1,16 @@
+
+/* feel free to comment some of these out to reduce code size */
+
+#define WANT_FLOATING_POINT_IN_PRINTF
+#define WANT_FLOATING_POINT_IN_SCANF
+#define WANT_NULL_PRINTF
+
+/* #define SLASH_PROC_OK */
+
+// #define WANT_BUFFERED_STDIO
+
+/* use errno_location instead of errno */
+// #define WANT_THREAD_SAVE
+
+/* do you want smaller or faster string routines? */
+#define WANT_SMALL_STRING_ROUTINES
diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h
new file mode 100644
index 000000000..5cacbde23
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietstdio.h
@@ -0,0 +1,64 @@
+/* diet stdio -- no buffering ;-} */
+
+#include "dietfeatures.h"
+#include <sys/types.h>
+
+#define BUFSIZE 128
+
+typedef struct __file {
+ int fd;
+ int flags;
+#ifdef WANT_BUFFERED_STDIO
+ int seekofs;
+ int bm;
+ char buf[BUFSIZE];
+ struct __file *next;
+#endif
+} FILE;
+
+extern FILE *__stdio_root;
+
+#define ERRORINDICATOR 1
+#define EOFINDICATOR 2
+#define BUFINPUT 4
+#define BUFLINEWISE 8
+
+/* internal function to flush buffer.
+ * However, if next is BUFINPUT and the buffer is an input buffer, it
+ * will not be flushed. Vice versa for output */
+extern int __fflush4(FILE *stream,int next);
+
+FILE *fopen (const char *path, const char *mode);
+FILE *fdopen (int fildes, const char *mode);
+FILE *freopen (const char *path, const char *mode, FILE *stream);
+
+int fgetc(FILE *stream);
+char *fgets(char *s, int size, FILE *stream);
+int getc(FILE *stream);
+int getchar(void);
+char *gets(char *s);
+int ungetc(int c, FILE *stream);
+
+int fputc(int c, FILE *stream);
+int fputs(const char *s, FILE *stream);
+int putc(int c, FILE *stream);
+int putchar(int c);
+int puts(const char *s);
+
+int fseek( FILE *stream, long offset, int whence);
+long ftell( FILE *stream);
+void rewind( FILE *stream);
+int fgetpos( FILE *stream, fpos_t *pos);
+int fsetpos( FILE *stream, fpos_t *pos);
+
+size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream);
+
+size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream);
+
+int fflush(FILE *stream);
+
+int fclose(FILE *stream);
+
+extern FILE *stdout, *stderr, *stdin;
+
+#define EOF (int)(-1)
diff --git a/mdk-stage1/dietlibc/dirstream.h b/mdk-stage1/dietlibc/dirstream.h
new file mode 100644
index 000000000..dc8fba79c
--- /dev/null
+++ b/mdk-stage1/dietlibc/dirstream.h
@@ -0,0 +1,78 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/*
+ * POSIX Standard: 5.1.2 Directory Operations <dirent.h>
+ */
+
+#ifndef _DIRSTREAM_H
+
+#define _DIRSTREAM_H 1
+
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef _POSIX_THREADS
+#include <pthread.h>
+#endif
+
+/* For now, syscall readdir () only supports one entry at a time. It
+ * will be changed in the future.
+#define NUMENT 3
+*/
+#ifndef NUMENT
+#define NUMENT 1
+#endif
+
+#define SINGLE_READDIR 11
+#define MULTI_READDIR 12
+#define NEW_READDIR 13
+
+/* Directory stream type. */
+struct __dirstream {
+ /* file descriptor */
+ int dd_fd;
+
+ /* offset of the next dir entry in buffer */
+ off_t dd_nextloc;
+
+ /* bytes of valid entries in buffer */
+ size_t dd_size;
+
+ /* -> directory buffer */
+ struct dirent *dd_buf;
+
+ /* we have to convert */
+ struct dirent convbuf;
+
+ /* offset of the next dir entry in directory. */
+ off_t dd_nextoff;
+
+ /* total size of buffer */
+ size_t dd_max;
+
+ enum {unknown, have_getdents, no_getdents} dd_getdents;
+
+ /* lock */
+#ifdef _POSIX_THREADS
+ pthread_mutex_t *dd_lock;
+#else
+ void *dd_lock;
+#endif
+}; /* stream data from opendir() */
+
+#endif /* dirent.h */
diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add
new file mode 100644
index 000000000..8d2914e66
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/Makefile.add
@@ -0,0 +1,3 @@
+
+CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer
+override VPATH=i386:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S
new file mode 100644
index 000000000..312e01ed1
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/__longjmp.S
@@ -0,0 +1,20 @@
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+.text
+.global __longjmp
+__longjmp:
+ movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */
+ movl 8(%esp), %eax /* Second argument is return value. */
+ /* Save the return address now. */
+ movl (JB_PC*4)(%ecx), %edx
+ /* Restore registers. */
+ movl (JB_BX*4)(%ecx), %ebx
+ movl (JB_SI*4)(%ecx), %esi
+ movl (JB_DI*4)(%ecx), %edi
+ movl (JB_BP*4)(%ecx), %ebp
+ movl (JB_SP*4)(%ecx), %esp
+ /* Jump to saved PC. */
+ jmp *%edx
+.size __longjmp,.-__longjmp;
diff --git a/mdk-stage1/dietlibc/i386/mmap.c b/mdk-stage1/dietlibc/i386/mmap.c
new file mode 100644
index 000000000..26ecb55c0
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/mmap.c
@@ -0,0 +1,16 @@
+#include <linux/types.h>
+#include <linux/unistd.h>
+
+#define __NR__mmap __NR_mmap
+_syscall1(int,_mmap,unsigned long *,buffer)
+
+char *mmap(char *addr, size_t len, int prot, int flags, int fd, unsigned long off) {
+ unsigned long buffer[6];
+ buffer[0] = (unsigned long)addr;
+ buffer[1] = (unsigned long)len;
+ buffer[2] = (unsigned long)prot;
+ buffer[3] = (unsigned long)flags;
+ buffer[4] = (unsigned long)fd;
+ buffer[5] = (unsigned long)off;
+ return (char*) _mmap(buffer);
+}
diff --git a/mdk-stage1/dietlibc/i386/select.S b/mdk-stage1/dietlibc/i386/select.S
new file mode 100644
index 000000000..6e9fce8e3
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/select.S
@@ -0,0 +1,6 @@
+#include "syscalls.h"
+
+.text
+.weak select
+select:
+syscall(_newselect,select)
diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S
new file mode 100644
index 000000000..d7898e58f
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/setjmp.S
@@ -0,0 +1,64 @@
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+/* setjmp for i386.
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+.section .rodata
+.text
+.weak setjmp
+setjmp:
+.globl __setjmp
+__setjmp:
+ popl %eax /* Pop return address. */
+ popl %ecx /* Pop jmp_buf. */
+ pushl $0 /* Push zero argument. */
+ pushl %ecx /* Push jmp_buf. */
+ pushl %eax /* Push back return address. */
+
+.globl __sigsetjmp
+__sigsetjmp:
+ movl 4(%esp), %eax /* User's jmp_buf in %eax. */
+ /* Save registers. */
+ movl %ebx, (JB_BX*4)(%eax)
+ movl %esi, (JB_SI*4)(%eax)
+ movl %edi, (JB_DI*4)(%eax)
+ movl %ebp, (JB_BP*4)(%eax)
+ leal 4(%esp), %ecx /* Save SP as it will be after we return. */
+ movl %ecx, (JB_SP*4)(%eax)
+ movl 0(%esp), %ecx /* Save PC we are returning to now. */
+ movl %ecx, (JB_PC*4)(%eax)
+
+ /* Make a tail call to __sigjmp_save; it takes the same args. */
+#ifdef PIC
+ /* We cannot use the PLT, because it requires that %ebx be set, but
+ we can't save and restore our caller's value. Instead, we do an
+ indirect jump through the GOT, using for the temporary register
+ %ecx, which is call-clobbered. */
+ call L(here)
+L(here):
+ popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx
+ movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx
+ jmp *%ecx
+#else
+ jmp __sigjmp_save
+#endif
+.size __sigsetjmp,.-__sigsetjmp;
diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S
new file mode 100644
index 000000000..8a2ba7e38
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/start.S
@@ -0,0 +1,28 @@
+#include "start.h"
+
+#ifdef __i386__
+.text
+.globl _start
+_start:
+#if 0
+ popl %ecx
+ movl %esp, %edx
+ leal 4(%esp,%ecx,4),%eax
+#else
+ movl (%esp),%ecx /* %ecx = argc */
+ leal 4(%esp),%edx /* %edx = argv */
+
+ leal 4(%edx,%ecx,4),%eax /* eax = 4*ecx+4 = envp */
+#endif
+ pushl %eax
+ pushl %edx
+ pushl %ecx
+ movl %eax,environ
+
+ call main
+ pushl %eax
+ call exit
+.Lfefe:
+ .size _start,.Lfefe-_start
+#endif
+
diff --git a/mdk-stage1/dietlibc/i386/strchr.S b/mdk-stage1/dietlibc/i386/strchr.S
new file mode 100644
index 000000000..0a2a5aa52
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/strchr.S
@@ -0,0 +1,47 @@
+#define NEW
+
+.text
+.global strchr
+strchr:
+ mov %esi,%edx
+ mov 0x4(%esp,1),%esi
+ mov 0x8(%esp,1),%cl
+ cld
+.L1:
+ lods (%esi),%eax
+ cmp %al,%cl
+ jz .Lafound
+ test %al,%al
+ jz .Lnotfound
+
+ cmp %ah,%cl
+ jz .Lbfound
+ test %ah,%ah
+ jz .Lnotfound
+
+ shr $16,%eax
+ cmp %al,%cl
+ jz .Lcfound
+ test %al,%al
+ jz .Lnotfound
+
+ cmp %ah,%cl
+ jz .Ldfound
+ test %ah,%ah
+
+ jnz .L1
+.Lnotfound:
+ sub %eax,%eax
+ mov %edx,%esi
+ ret
+.Lafound:
+ dec %esi
+.Lbfound:
+ dec %esi
+.Lcfound:
+ dec %esi
+.Ldfound:
+ mov %esi,%eax
+ mov %edx,%esi
+ dec %eax
+ ret
diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S
new file mode 100644
index 000000000..c3cd11001
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/unified.S
@@ -0,0 +1,33 @@
+#include <dietfeatures.h>
+
+.text
+.global __unified_syscall
+__unified_syscall:
+ and $0xff,%eax
+ push %edi
+ push %esi
+ push %ebx
+ movl 0x10(%esp),%ebx
+ movl 0x14(%esp),%ecx
+ movl 0x18(%esp),%edx
+ movl 0x1c(%esp),%edi
+ movl 0x20(%esp),%esi
+ int $0x80
+ cmp $-124,%eax
+ jbe .Lnoerror
+#ifdef WANT_THREAD_SAVE
+ movl %eax,%ebx
+ call __errno_location
+ neg %ebx
+ movl %ebx,(%eax)
+#else
+ neg %eax
+ mov %eax,errno
+#endif
+ xor %eax,%eax
+ dec %eax
+.Lnoerror:
+ pop %ebx
+ pop %esi
+ pop %edi
+ ret
diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h
new file mode 100644
index 000000000..6aa71a162
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/arpa/inet.h
@@ -0,0 +1,15 @@
+#ifndef _ARPA_INET_H
+#define _ARPA_INET_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+int inet_aton(const char *cp, struct in_addr *inp) __THROW;
+unsigned long int inet_addr(const char *cp) __THROW;
+unsigned long int inet_network(const char *cp) __THROW;
+char *inet_ntoa(struct in_addr in) __THROW;
+struct in_addr inet_makeaddr(int net, int host) __THROW;
+unsigned long int inet_lnaof(struct in_addr in) __THROW;
+unsigned long int inet_netof(struct in_addr in) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h
new file mode 100644
index 000000000..adf956022
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/assert.h
@@ -0,0 +1,23 @@
+#ifndef _ASSERT_H
+#define _ASSERT_H
+
+#include <sys/cdefs.h>
+
+/* This prints an "Assertion failed" message and aborts. */
+extern void __assert_fail (__const char *__assertion, __const char *__file,
+ unsigned int __line, __const char *__function)
+ __THROW __attribute__ ((__noreturn__));
+
+#ifdef __PRETTY_FUNCTION__
+#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
+#else
+#define __ASSERT_FUNCTION __func__
+#endif
+
+#undef assert
+# define assert(expr) \
+ ((void) ((expr) ? 0 : \
+ (__assert_fail (#expr, \
+ __FILE__, __LINE__, __ASSERT_FUNCTION), 0)))
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/ctype.h b/mdk-stage1/dietlibc/include/ctype.h
new file mode 100644
index 000000000..c8f4e5a34
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/ctype.h
@@ -0,0 +1,13 @@
+#ifndef _CTYPE_H
+#define _CTYPE_H
+
+#include <sys/cdefs.h>
+
+extern int isascii (int c) __THROW;
+extern int isblank (int c) __THROW;
+extern int isalnum (int c) __THROW;
+extern int isalpha (int c) __THROW;
+extern int isdigit (int c) __THROW;
+extern int isspace (int c) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h
new file mode 100644
index 000000000..d277c0762
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/dirent.h
@@ -0,0 +1,61 @@
+#ifndef _DIRENT_H
+#define _DIRENT_H 1
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#include <linux/dirent.h>
+
+#if 0
+struct dirent
+ {
+#ifndef __USE_FILE_OFFSET64
+ ino_t d_ino;
+ off_t d_off;
+#else
+ ino64_t d_ino;
+ off64_t d_off;
+#endif
+ unsigned short int d_reclen;
+ unsigned char d_type;
+ char d_name[256]; /* We must not include limits.h! */
+ };
+
+#ifdef __USE_LARGEFILE64
+struct dirent64
+ {
+ ino64_t d_ino;
+ off64_t d_off;
+ unsigned short int d_reclen;
+ unsigned char d_type;
+ char d_name[256]; /* We must not include limits.h! */
+ };
+#endif
+#endif
+
+#define d_fileno d_ino /* Backwards compatibility. */
+
+#undef _DIRENT_HAVE_D_NAMLEN
+#define _DIRENT_HAVE_D_RECLEN
+#define _DIRENT_HAVE_D_OFF
+#define _DIRENT_HAVE_D_TYPE
+
+#define opendir(name) __dietopendir(name)
+#define closedir(dir) __dietclosedir(dir)
+#define readdir(dir) __dietreaddir(dir)
+#define readdir64(dir) __dietreaddir64(dir)
+#define rewinddir(dir) __dietrewinddir64(dir)
+#define seekdir(dir,pos) __dietseekdir(dir,pos)
+#define telldir(dir) __diettelldir(dir)
+
+typedef struct __dirstream DIR;
+
+DIR *opendir (const char *__name) __THROW;
+int closedir (DIR *__dirp) __THROW;
+struct dirent *readdir (DIR *__dirp) __THROW;
+struct dirent64 *readdir64 (DIR *__dirp) __THROW;
+void rewinddir (DIR *__dirp) __THROW;
+void seekdir (DIR *__dirp, long int __pos) __THROW;
+long int telldir (DIR *__dirp) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h
new file mode 100644
index 000000000..bf9f1ea89
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/elf.h
@@ -0,0 +1,1989 @@
+/* This file defines standard ELF types, structures, and macros.
+ Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _ELF_H
+#define _ELF_H 1
+
+/* Standard ELF types. */
+
+#include <stdint.h>
+
+/* Type for a 16-bit quantity. */
+typedef uint16_t Elf32_Half;
+typedef uint16_t Elf64_Half;
+
+/* Types for signed and unsigned 32-bit quantities. */
+typedef uint32_t Elf32_Word;
+typedef int32_t Elf32_Sword;
+typedef uint32_t Elf64_Word;
+typedef int32_t Elf64_Sword;
+
+/* Types for signed and unsigned 64-bit quantities. */
+typedef uint64_t Elf32_Xword;
+typedef int64_t Elf32_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+/* Type of addresses. */
+typedef uint32_t Elf32_Addr;
+typedef uint64_t Elf64_Addr;
+
+/* Type of file offsets. */
+typedef uint32_t Elf32_Off;
+typedef uint64_t Elf64_Off;
+
+/* Type for section indices, which are 16-bit quantities. */
+typedef uint16_t Elf32_Section;
+typedef uint16_t Elf64_Section;
+
+/* Type for version symbol information. */
+typedef Elf32_Half Elf32_Versym;
+typedef Elf64_Half Elf64_Versym;
+
+
+/* The ELF file header. This appears at the start of every ELF file. */
+
+#define EI_NIDENT (16)
+
+typedef struct
+{
+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ Elf32_Half e_type; /* Object file type */
+ Elf32_Half e_machine; /* Architecture */
+ Elf32_Word e_version; /* Object file version */
+ Elf32_Addr e_entry; /* Entry point virtual address */
+ Elf32_Off e_phoff; /* Program header table file offset */
+ Elf32_Off e_shoff; /* Section header table file offset */
+ Elf32_Word e_flags; /* Processor-specific flags */
+ Elf32_Half e_ehsize; /* ELF header size in bytes */
+ Elf32_Half e_phentsize; /* Program header table entry size */
+ Elf32_Half e_phnum; /* Program header table entry count */
+ Elf32_Half e_shentsize; /* Section header table entry size */
+ Elf32_Half e_shnum; /* Section header table entry count */
+ Elf32_Half e_shstrndx; /* Section header string table index */
+} Elf32_Ehdr;
+
+typedef struct
+{
+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ Elf64_Half e_type; /* Object file type */
+ Elf64_Half e_machine; /* Architecture */
+ Elf64_Word e_version; /* Object file version */
+ Elf64_Addr e_entry; /* Entry point virtual address */
+ Elf64_Off e_phoff; /* Program header table file offset */
+ Elf64_Off e_shoff; /* Section header table file offset */
+ Elf64_Word e_flags; /* Processor-specific flags */
+ Elf64_Half e_ehsize; /* ELF header size in bytes */
+ Elf64_Half e_phentsize; /* Program header table entry size */
+ Elf64_Half e_phnum; /* Program header table entry count */
+ Elf64_Half e_shentsize; /* Section header table entry size */
+ Elf64_Half e_shnum; /* Section header table entry count */
+ Elf64_Half e_shstrndx; /* Section header string table index */
+} Elf64_Ehdr;
+
+/* Fields in the e_ident array. The EI_* macros are indices into the
+ array. The macros under each EI_* macro are the values the byte
+ may have. */
+
+#define EI_MAG0 0 /* File identification byte 0 index */
+#define ELFMAG0 0x7f /* Magic number byte 0 */
+
+#define EI_MAG1 1 /* File identification byte 1 index */
+#define ELFMAG1 'E' /* Magic number byte 1 */
+
+#define EI_MAG2 2 /* File identification byte 2 index */
+#define ELFMAG2 'L' /* Magic number byte 2 */
+
+#define EI_MAG3 3 /* File identification byte 3 index */
+#define ELFMAG3 'F' /* Magic number byte 3 */
+
+/* Conglomeration of the identification bytes, for easy testing as a word. */
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define EI_CLASS 4 /* File class byte index */
+#define ELFCLASSNONE 0 /* Invalid class */
+#define ELFCLASS32 1 /* 32-bit objects */
+#define ELFCLASS64 2 /* 64-bit objects */
+#define ELFCLASSNUM 3
+
+#define EI_DATA 5 /* Data encoding byte index */
+#define ELFDATANONE 0 /* Invalid data encoding */
+#define ELFDATA2LSB 1 /* 2's complement, little endian */
+#define ELFDATA2MSB 2 /* 2's complement, big endian */
+#define ELFDATANUM 3
+
+#define EI_VERSION 6 /* File version byte index */
+ /* Value must be EV_CURRENT */
+
+#define EI_OSABI 7 /* OS ABI identification */
+#define ELFOSABI_SYSV 0 /* UNIX System V ABI */
+#define ELFOSABI_HPUX 1 /* HP-UX */
+#define ELFOSABI_ARM 97 /* ARM */
+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
+
+#define EI_ABIVERSION 8 /* ABI version */
+
+#define EI_PAD 9 /* Byte index of padding bytes */
+
+/* Legal values for e_type (object file type). */
+
+#define ET_NONE 0 /* No file type */
+#define ET_REL 1 /* Relocatable file */
+#define ET_EXEC 2 /* Executable file */
+#define ET_DYN 3 /* Shared object file */
+#define ET_CORE 4 /* Core file */
+#define ET_NUM 5 /* Number of defined types */
+#define ET_LOOS 0xfe00 /* OS-specific range start */
+#define ET_HIOS 0xfeff /* OS-specific range end */
+#define ET_LOPROC 0xff00 /* Processor-specific range start */
+#define ET_HIPROC 0xffff /* Processor-specific range end */
+
+/* Legal values for e_machine (architecture). */
+
+#define EM_NONE 0 /* No machine */
+#define EM_M32 1 /* AT&T WE 32100 */
+#define EM_SPARC 2 /* SUN SPARC */
+#define EM_386 3 /* Intel 80386 */
+#define EM_68K 4 /* Motorola m68k family */
+#define EM_88K 5 /* Motorola m88k family */
+#define EM_860 7 /* Intel 80860 */
+#define EM_MIPS 8 /* MIPS R3000 big-endian */
+#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
+
+#define EM_PARISC 15 /* HPPA */
+#define EM_VPP500 17 /* Fujitsu VPP500 */
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+#define EM_960 19 /* Intel 80960 */
+#define EM_PPC 20 /* PowerPC */
+#define EM_PPC64 21 /* PowerPC 64-bit */
+
+#define EM_V800 36 /* NEC V800 series */
+#define EM_FR20 37 /* Fujitsu FR20 */
+#define EM_RH32 38 /* TRW RH-32 */
+#define EM_RCE 39 /* Motorola RCE */
+#define EM_ARM 40 /* ARM */
+#define EM_FAKE_ALPHA 41 /* Digital Alpha */
+#define EM_SH 42 /* Hitachi SH */
+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
+#define EM_TRICORE 44 /* Siemens Tricore */
+#define EM_ARC 45 /* Argonaut RISC Core */
+#define EM_H8_300 46 /* Hitachi H8/300 */
+#define EM_H8_300H 47 /* Hitachi H8/300H */
+#define EM_H8S 48 /* Hitachi H8S */
+#define EM_H8_500 49 /* Hitachi H8/500 */
+#define EM_IA_64 50 /* Intel Merced */
+#define EM_MIPS_X 51 /* Stanford MIPS-X */
+#define EM_COLDFIRE 52 /* Motorola Coldfire */
+#define EM_68HC12 53 /* Motorola M68HC12 */
+#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/
+#define EM_PCP 55 /* Siemens PCP */
+#define EM_NCPU 56 /* Sony nCPU embeeded RISC */
+#define EM_NDR1 57 /* Denso NDR1 microprocessor */
+#define EM_STARCORE 58 /* Motorola Start*Core processor */
+#define EM_ME16 59 /* Toyota ME16 processor */
+#define EM_ST100 60 /* STMicroelectronic ST100 processor */
+#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/
+#define EM_X8664 62 /* AMD x86-64 */
+
+#define EM_FX66 66 /* Siemens FX66 microcontroller */
+#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */
+#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */
+#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */
+#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */
+#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */
+#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */
+#define EM_SVX 73 /* Silicon Graphics SVx */
+#define EM_AT19 74 /* STMicroelectronics ST19 8 bit mc */
+#define EM_VAX 75 /* Digital VAX */
+#define EM_NUM 76
+
+/* If it is necessary to assign new unofficial EM_* values, please
+ pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
+ chances of collision with official or non-GNU unofficial values. */
+
+#define EM_ALPHA 0x9026
+#define EM_S390 0xA390 /* IBM S390 */
+
+/* Legal values for e_version (version). */
+
+#define EV_NONE 0 /* Invalid ELF version */
+#define EV_CURRENT 1 /* Current version */
+#define EV_NUM 2
+
+/* Section header. */
+
+typedef struct
+{
+ Elf32_Word sh_name; /* Section name (string tbl index) */
+ Elf32_Word sh_type; /* Section type */
+ Elf32_Word sh_flags; /* Section flags */
+ Elf32_Addr sh_addr; /* Section virtual addr at execution */
+ Elf32_Off sh_offset; /* Section file offset */
+ Elf32_Word sh_size; /* Section size in bytes */
+ Elf32_Word sh_link; /* Link to another section */
+ Elf32_Word sh_info; /* Additional section information */
+ Elf32_Word sh_addralign; /* Section alignment */
+ Elf32_Word sh_entsize; /* Entry size if section holds table */
+} Elf32_Shdr;
+
+typedef struct
+{
+ Elf64_Word sh_name; /* Section name (string tbl index) */
+ Elf64_Word sh_type; /* Section type */
+ Elf64_Xword sh_flags; /* Section flags */
+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
+ Elf64_Off sh_offset; /* Section file offset */
+ Elf64_Xword sh_size; /* Section size in bytes */
+ Elf64_Word sh_link; /* Link to another section */
+ Elf64_Word sh_info; /* Additional section information */
+ Elf64_Xword sh_addralign; /* Section alignment */
+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
+} Elf64_Shdr;
+
+/* Special section indices. */
+
+#define SHN_UNDEF 0 /* Undefined section */
+#define SHN_LORESERVE 0xff00 /* Start of reserved indices */
+#define SHN_LOPROC 0xff00 /* Start of processor-specific */
+#define SHN_HIPROC 0xff1f /* End of processor-specific */
+#define SHN_LOOS 0xff20 /* Start of OS-specific */
+#define SHN_HIOS 0xff3f /* End of OS-specific */
+#define SHN_ABS 0xfff1 /* Associated symbol is absolute */
+#define SHN_COMMON 0xfff2 /* Associated symbol is common */
+#define SHN_XINDEX 0xffff /* Index is in extra table. */
+#define SHN_HIRESERVE 0xffff /* End of reserved indices */
+
+/* Legal values for sh_type (section type). */
+
+#define SHT_NULL 0 /* Section header table entry unused */
+#define SHT_PROGBITS 1 /* Program data */
+#define SHT_SYMTAB 2 /* Symbol table */
+#define SHT_STRTAB 3 /* String table */
+#define SHT_RELA 4 /* Relocation entries with addends */
+#define SHT_HASH 5 /* Symbol hash table */
+#define SHT_DYNAMIC 6 /* Dynamic linking information */
+#define SHT_NOTE 7 /* Notes */
+#define SHT_NOBITS 8 /* Program space with no data (bss) */
+#define SHT_REL 9 /* Relocation entries, no addends */
+#define SHT_SHLIB 10 /* Reserved */
+#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
+#define SHT_INIT_ARRAY 14 /* Array of constructors */
+#define SHT_FINI_ARRAY 15 /* Array of destructors */
+#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
+#define SHT_GROUP 17 /* Section group */
+#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
+#define SHT_NUM 19 /* Number of defined types. */
+#define SHT_LOOS 0x60000000 /* Start OS-specific */
+#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
+#define SHT_SUNW_move 0x6ffffffa
+#define SHT_SUNW_COMDAT 0x6ffffffb
+#define SHT_SUNW_syminfo 0x6ffffffc
+#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
+#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
+#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
+#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
+#define SHT_HIOS 0x6fffffff /* End OS-specific type */
+#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
+#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
+#define SHT_LOUSER 0x80000000 /* Start of application-specific */
+#define SHT_HIUSER 0x8fffffff /* End of application-specific */
+
+/* Legal values for sh_flags (section flags). */
+
+#define SHF_WRITE (1 << 0) /* Writable */
+#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */
+#define SHF_EXECINSTR (1 << 2) /* Executable */
+#define SHF_MERGE (1 << 4) /* Might be merged */
+#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */
+#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */
+#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling
+ required */
+#define SHF_MASKOS 0x0ff00000 /* OS-specific. */
+#define SHF_MASKPROC 0xf0000000 /* Processor-specific */
+
+/* Section group handling. */
+#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */
+
+/* Symbol table entry. */
+
+typedef struct
+{
+ Elf32_Word st_name; /* Symbol name (string tbl index) */
+ Elf32_Addr st_value; /* Symbol value */
+ Elf32_Word st_size; /* Symbol size */
+ unsigned char st_info; /* Symbol type and binding */
+ unsigned char st_other; /* Symbol visibility */
+ Elf32_Section st_shndx; /* Section index */
+} Elf32_Sym;
+
+typedef struct
+{
+ Elf64_Word st_name; /* Symbol name (string tbl index) */
+ unsigned char st_info; /* Symbol type and binding */
+ unsigned char st_other; /* Symbol visibility */
+ Elf64_Section st_shndx; /* Section index */
+ Elf64_Addr st_value; /* Symbol value */
+ Elf64_Xword st_size; /* Symbol size */
+} Elf64_Sym;
+
+/* The syminfo section if available contains additional information about
+ every dynamic symbol. */
+
+typedef struct
+{
+ Elf32_Half si_boundto; /* Direct bindings, symbol bound to */
+ Elf32_Half si_flags; /* Per symbol flags */
+} Elf32_Syminfo;
+
+typedef struct
+{
+ Elf64_Half si_boundto; /* Direct bindings, symbol bound to */
+ Elf64_Half si_flags; /* Per symbol flags */
+} Elf64_Syminfo;
+
+/* Possible values for si_boundto. */
+#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */
+#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */
+#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */
+
+/* Possible bitmasks for si_flags. */
+#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */
+#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */
+#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */
+#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy
+ loaded */
+/* Syminfo version values. */
+#define SYMINFO_NONE 0
+#define SYMINFO_CURRENT 1
+#define SYMINFO_NUM 2
+
+
+/* Special section index. */
+
+#define SHN_UNDEF 0 /* No section, undefined symbol. */
+
+/* How to extract and insert information held in the st_info field. */
+
+#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4)
+#define ELF32_ST_TYPE(val) ((val) & 0xf)
+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
+
+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */
+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
+#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type))
+
+/* Legal values for ST_BIND subfield of st_info (symbol binding). */
+
+#define STB_LOCAL 0 /* Local symbol */
+#define STB_GLOBAL 1 /* Global symbol */
+#define STB_WEAK 2 /* Weak symbol */
+#define STB_NUM 3 /* Number of defined types. */
+#define STB_LOOS 10 /* Start of OS-specific */
+#define STB_HIOS 12 /* End of OS-specific */
+#define STB_LOPROC 13 /* Start of processor-specific */
+#define STB_HIPROC 15 /* End of processor-specific */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_NOTYPE 0 /* Symbol type is unspecified */
+#define STT_OBJECT 1 /* Symbol is a data object */
+#define STT_FUNC 2 /* Symbol is a code object */
+#define STT_SECTION 3 /* Symbol associated with a section */
+#define STT_FILE 4 /* Symbol's name is file name */
+#define STT_COMMON 5 /* Symbol is a common data object */
+#define STT_NUM 6 /* Number of defined types. */
+#define STT_LOOS 10 /* Start of OS-specific */
+#define STT_HIOS 12 /* End of OS-specific */
+#define STT_LOPROC 13 /* Start of processor-specific */
+#define STT_HIPROC 15 /* End of processor-specific */
+
+
+/* Symbol table indices are found in the hash buckets and chain table
+ of a symbol hash table section. This special index value indicates
+ the end of a chain, meaning no further symbols are found in that bucket. */
+
+#define STN_UNDEF 0 /* End of a chain. */
+
+
+/* How to extract and insert information held in the st_other field. */
+
+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
+
+/* For ELF64 the definitions are the same. */
+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
+
+/* Symbol visibility specification encoded in the st_other field. */
+#define STV_DEFAULT 0 /* Default symbol visibility rules */
+#define STV_INTERNAL 1 /* Processor specific hidden class */
+#define STV_HIDDEN 2 /* Sym unavailable in other modules */
+#define STV_PROTECTED 3 /* Not preemptible, not exported */
+
+
+/* Relocation table entry without addend (in section of type SHT_REL). */
+
+typedef struct
+{
+ Elf32_Addr r_offset; /* Address */
+ Elf32_Word r_info; /* Relocation type and symbol index */
+} Elf32_Rel;
+
+/* I have seen two different definitions of the Elf64_Rel and
+ Elf64_Rela structures, so we'll leave them out until Novell (or
+ whoever) gets their act together. */
+/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */
+
+typedef struct
+{
+ Elf64_Addr r_offset; /* Address */
+ Elf64_Xword r_info; /* Relocation type and symbol index */
+} Elf64_Rel;
+
+/* Relocation table entry with addend (in section of type SHT_RELA). */
+
+typedef struct
+{
+ Elf32_Addr r_offset; /* Address */
+ Elf32_Word r_info; /* Relocation type and symbol index */
+ Elf32_Sword r_addend; /* Addend */
+} Elf32_Rela;
+
+typedef struct
+{
+ Elf64_Addr r_offset; /* Address */
+ Elf64_Xword r_info; /* Relocation type and symbol index */
+ Elf64_Sxword r_addend; /* Addend */
+} Elf64_Rela;
+
+/* How to extract and insert information held in the r_info field. */
+
+#define ELF32_R_SYM(val) ((val) >> 8)
+#define ELF32_R_TYPE(val) ((val) & 0xff)
+#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff))
+
+#define ELF64_R_SYM(i) ((i) >> 32)
+#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
+#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type))
+
+/* Program segment header. */
+
+typedef struct
+{
+ Elf32_Word p_type; /* Segment type */
+ Elf32_Off p_offset; /* Segment file offset */
+ Elf32_Addr p_vaddr; /* Segment virtual address */
+ Elf32_Addr p_paddr; /* Segment physical address */
+ Elf32_Word p_filesz; /* Segment size in file */
+ Elf32_Word p_memsz; /* Segment size in memory */
+ Elf32_Word p_flags; /* Segment flags */
+ Elf32_Word p_align; /* Segment alignment */
+} Elf32_Phdr;
+
+typedef struct
+{
+ Elf64_Word p_type; /* Segment type */
+ Elf64_Word p_flags; /* Segment flags */
+ Elf64_Off p_offset; /* Segment file offset */
+ Elf64_Addr p_vaddr; /* Segment virtual address */
+ Elf64_Addr p_paddr; /* Segment physical address */
+ Elf64_Xword p_filesz; /* Segment size in file */
+ Elf64_Xword p_memsz; /* Segment size in memory */
+ Elf64_Xword p_align; /* Segment alignment */
+} Elf64_Phdr;
+
+/* Legal values for p_type (segment type). */
+
+#define PT_NULL 0 /* Program header table entry unused */
+#define PT_LOAD 1 /* Loadable program segment */
+#define PT_DYNAMIC 2 /* Dynamic linking information */
+#define PT_INTERP 3 /* Program interpreter */
+#define PT_NOTE 4 /* Auxiliary information */
+#define PT_SHLIB 5 /* Reserved */
+#define PT_PHDR 6 /* Entry for header table itself */
+#define PT_NUM 7 /* Number of defined types */
+#define PT_LOOS 0x60000000 /* Start of OS-specific */
+#define PT_HIOS 0x6fffffff /* End of OS-specific */
+#define PT_LOPROC 0x70000000 /* Start of processor-specific */
+#define PT_HIPROC 0x7fffffff /* End of processor-specific */
+
+/* Legal values for p_flags (segment flags). */
+
+#define PF_X (1 << 0) /* Segment is executable */
+#define PF_W (1 << 1) /* Segment is writable */
+#define PF_R (1 << 2) /* Segment is readable */
+#define PF_MASKOS 0x0ff00000 /* OS-specific */
+#define PF_MASKPROC 0xf0000000 /* Processor-specific */
+
+/* Legal values for note segment descriptor types for core files. */
+
+#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */
+#define NT_FPREGSET 2 /* Contains copy of fpregset struct */
+#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */
+#define NT_PRXREG 4 /* Contains copy of prxregset struct */
+#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */
+#define NT_AUXV 6 /* Contains copy of auxv array */
+#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */
+#define NT_PSTATUS 10 /* Contains copy of pstatus struct */
+#define NT_PSINFO 13 /* Contains copy of psinfo struct */
+#define NT_PRCRED 14 /* Contains copy of prcred struct */
+#define NT_UTSNAME 15 /* Contains copy of utsname struct */
+#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */
+#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */
+#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct*/
+
+/* Legal values for the note segment descriptor types for object files. */
+
+#define NT_VERSION 1 /* Contains a version string. */
+
+
+/* Dynamic section entry. */
+
+typedef struct
+{
+ Elf32_Sword d_tag; /* Dynamic entry type */
+ union
+ {
+ Elf32_Word d_val; /* Integer value */
+ Elf32_Addr d_ptr; /* Address value */
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct
+{
+ Elf64_Sxword d_tag; /* Dynamic entry type */
+ union
+ {
+ Elf64_Xword d_val; /* Integer value */
+ Elf64_Addr d_ptr; /* Address value */
+ } d_un;
+} Elf64_Dyn;
+
+/* Legal values for d_tag (dynamic entry type). */
+
+#define DT_NULL 0 /* Marks end of dynamic section */
+#define DT_NEEDED 1 /* Name of needed library */
+#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
+#define DT_PLTGOT 3 /* Processor defined value */
+#define DT_HASH 4 /* Address of symbol hash table */
+#define DT_STRTAB 5 /* Address of string table */
+#define DT_SYMTAB 6 /* Address of symbol table */
+#define DT_RELA 7 /* Address of Rela relocs */
+#define DT_RELASZ 8 /* Total size of Rela relocs */
+#define DT_RELAENT 9 /* Size of one Rela reloc */
+#define DT_STRSZ 10 /* Size of string table */
+#define DT_SYMENT 11 /* Size of one symbol table entry */
+#define DT_INIT 12 /* Address of init function */
+#define DT_FINI 13 /* Address of termination function */
+#define DT_SONAME 14 /* Name of shared object */
+#define DT_RPATH 15 /* Library search path (deprecated) */
+#define DT_SYMBOLIC 16 /* Start symbol search here */
+#define DT_REL 17 /* Address of Rel relocs */
+#define DT_RELSZ 18 /* Total size of Rel relocs */
+#define DT_RELENT 19 /* Size of one Rel reloc */
+#define DT_PLTREL 20 /* Type of reloc in PLT */
+#define DT_DEBUG 21 /* For debugging; unspecified */
+#define DT_TEXTREL 22 /* Reloc might modify .text */
+#define DT_JMPREL 23 /* Address of PLT relocs */
+#define DT_BIND_NOW 24 /* Process relocations of object */
+#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
+#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
+#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
+#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
+#define DT_RUNPATH 29 /* Library search path */
+#define DT_FLAGS 30 /* Flags for the object being loaded */
+#define DT_ENCODING 32 /* Start of encoded range */
+#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
+#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
+#define DT_NUM 34 /* Number used */
+#define DT_LOOS 0x60000000 /* Start of OS-specific */
+#define DT_HIOS 0x6fffffff /* End of OS-specific */
+#define DT_LOPROC 0x70000000 /* Start of processor-specific */
+#define DT_HIPROC 0x7fffffff /* End of processor-specific */
+#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */
+
+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
+ Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's
+ approach. */
+#define DT_VALRNGLO 0x6ffffd00
+#define DT_PLTPADSZ 0x6ffffdf9
+#define DT_MOVEENT 0x6ffffdfa
+#define DT_MOVESZ 0x6ffffdfb
+#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */
+#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting
+ the following DT_* entry. */
+#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */
+#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */
+#define DT_VALRNGHI 0x6ffffdff
+
+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
+ Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
+
+ If any adjustment is made to the ELF object after it has been
+ built these entries will need to be adjusted. */
+#define DT_ADDRRNGLO 0x6ffffe00
+#define DT_SYMINFO 0x6ffffeff /* syminfo table */
+#define DT_ADDRRNGHI 0x6ffffeff
+
+/* The versioning entry types. The next are defined as part of the
+ GNU extension. */
+#define DT_VERSYM 0x6ffffff0
+
+#define DT_RELACOUNT 0x6ffffff9
+#define DT_RELCOUNT 0x6ffffffa
+
+/* These were chosen by Sun. */
+#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */
+#define DT_VERDEF 0x6ffffffc /* Address of version definition
+ table */
+#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */
+#define DT_VERNEED 0x6ffffffe /* Address of table with needed
+ versions */
+#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */
+#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
+#define DT_VERSIONTAGNUM 16
+
+/* Sun added these machine-independent extensions in the "processor-specific"
+ range. Be compatible. */
+#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */
+#define DT_FILTER 0x7fffffff /* Shared object to get values from */
+#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRANUM 3
+
+/* Values of `d_un.d_val' in the DT_FLAGS entry. */
+#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */
+#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */
+#define DF_TEXTREL 0x00000004 /* Object contains text relocations */
+#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */
+
+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
+ entry in the dynamic section. */
+#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
+#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
+#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */
+#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
+#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/
+#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/
+#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */
+#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */
+#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */
+#define DF_1_TRANS 0x00000200
+#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */
+#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */
+#define DF_1_NODUMP 0x00001000
+#define DF_1_CONFALT 0x00002000
+#define DF_1_ENDFILTEE 0x00004000
+
+/* Flags for the feature selection in DT_FEATURE_1. */
+#define DTF_1_PARINIT 0x00000001
+#define DTF_1_CONFEXP 0x00000002
+
+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */
+#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */
+#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not
+ generally available. */
+
+/* Version definition sections. */
+
+typedef struct
+{
+ Elf32_Half vd_version; /* Version revision */
+ Elf32_Half vd_flags; /* Version information */
+ Elf32_Half vd_ndx; /* Version Index */
+ Elf32_Half vd_cnt; /* Number of associated aux entries */
+ Elf32_Word vd_hash; /* Version name hash value */
+ Elf32_Word vd_aux; /* Offset in bytes to verdaux array */
+ Elf32_Word vd_next; /* Offset in bytes to next verdef
+ entry */
+} Elf32_Verdef;
+
+typedef struct
+{
+ Elf64_Half vd_version; /* Version revision */
+ Elf64_Half vd_flags; /* Version information */
+ Elf64_Half vd_ndx; /* Version Index */
+ Elf64_Half vd_cnt; /* Number of associated aux entries */
+ Elf64_Word vd_hash; /* Version name hash value */
+ Elf64_Word vd_aux; /* Offset in bytes to verdaux array */
+ Elf64_Word vd_next; /* Offset in bytes to next verdef
+ entry */
+} Elf64_Verdef;
+
+
+/* Legal values for vd_version (version revision). */
+#define VER_DEF_NONE 0 /* No version */
+#define VER_DEF_CURRENT 1 /* Current version */
+#define VER_DEF_NUM 2 /* Given version number */
+
+/* Legal values for vd_flags (version information flags). */
+#define VER_FLG_BASE 0x1 /* Version definition of file itself */
+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
+
+/* Auxialiary version information. */
+
+typedef struct
+{
+ Elf32_Word vda_name; /* Version or dependency names */
+ Elf32_Word vda_next; /* Offset in bytes to next verdaux
+ entry */
+} Elf32_Verdaux;
+
+typedef struct
+{
+ Elf64_Word vda_name; /* Version or dependency names */
+ Elf64_Word vda_next; /* Offset in bytes to next verdaux
+ entry */
+} Elf64_Verdaux;
+
+
+/* Version dependency section. */
+
+typedef struct
+{
+ Elf32_Half vn_version; /* Version of structure */
+ Elf32_Half vn_cnt; /* Number of associated aux entries */
+ Elf32_Word vn_file; /* Offset of filename for this
+ dependency */
+ Elf32_Word vn_aux; /* Offset in bytes to vernaux array */
+ Elf32_Word vn_next; /* Offset in bytes to next verneed
+ entry */
+} Elf32_Verneed;
+
+typedef struct
+{
+ Elf64_Half vn_version; /* Version of structure */
+ Elf64_Half vn_cnt; /* Number of associated aux entries */
+ Elf64_Word vn_file; /* Offset of filename for this
+ dependency */
+ Elf64_Word vn_aux; /* Offset in bytes to vernaux array */
+ Elf64_Word vn_next; /* Offset in bytes to next verneed
+ entry */
+} Elf64_Verneed;
+
+
+/* Legal values for vn_version (version revision). */
+#define VER_NEED_NONE 0 /* No version */
+#define VER_NEED_CURRENT 1 /* Current version */
+#define VER_NEED_NUM 2 /* Given version number */
+
+/* Auxiliary needed version information. */
+
+typedef struct
+{
+ Elf32_Word vna_hash; /* Hash value of dependency name */
+ Elf32_Half vna_flags; /* Dependency specific information */
+ Elf32_Half vna_other; /* Unused */
+ Elf32_Word vna_name; /* Dependency name string offset */
+ Elf32_Word vna_next; /* Offset in bytes to next vernaux
+ entry */
+} Elf32_Vernaux;
+
+typedef struct
+{
+ Elf64_Word vna_hash; /* Hash value of dependency name */
+ Elf64_Half vna_flags; /* Dependency specific information */
+ Elf64_Half vna_other; /* Unused */
+ Elf64_Word vna_name; /* Dependency name string offset */
+ Elf64_Word vna_next; /* Offset in bytes to next vernaux
+ entry */
+} Elf64_Vernaux;
+
+
+/* Legal values for vna_flags. */
+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
+
+
+/* Auxiliary vector. */
+
+/* This vector is normally only used by the program interpreter. The
+ usual definition in an ABI supplement uses the name auxv_t. The
+ vector is not usually defined in a standard <elf.h> file, but it
+ can't hurt. We rename it to avoid conflicts. The sizes of these
+ types are an arrangement between the exec server and the program
+ interpreter, so we don't fully specify them here. */
+
+typedef struct
+{
+ int a_type; /* Entry type */
+ union
+ {
+ long int a_val; /* Integer value */
+ void *a_ptr; /* Pointer value */
+ void (*a_fcn) (void); /* Function pointer value */
+ } a_un;
+} Elf32_auxv_t;
+
+typedef struct
+{
+ long int a_type; /* Entry type */
+ union
+ {
+ long int a_val; /* Integer value */
+ void *a_ptr; /* Pointer value */
+ void (*a_fcn) (void); /* Function pointer value */
+ } a_un;
+} Elf64_auxv_t;
+
+/* Legal values for a_type (entry type). */
+
+#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_CLKTCK 17 /* Frequency of times() */
+
+/* Some more special a_type values describing the hardware. */
+#define AT_PLATFORM 15 /* String identifying platform. */
+#define AT_HWCAP 16 /* Machine dependent hints about
+ processor capabilities. */
+
+/* This entry gives some information about the FPU initialization
+ performed by the kernel. */
+#define AT_FPUCW 18 /* Used FPU control word. */
+
+
+/* Note section contents. Each entry in the note section begins with
+ a header of a fixed form. */
+
+typedef struct
+{
+ Elf32_Word n_namesz; /* Length of the note's name. */
+ Elf32_Word n_descsz; /* Length of the note's descriptor. */
+ Elf32_Word n_type; /* Type of the note. */
+} Elf32_Nhdr;
+
+typedef struct
+{
+ Elf64_Word n_namesz; /* Length of the note's name. */
+ Elf64_Word n_descsz; /* Length of the note's descriptor. */
+ Elf64_Word n_type; /* Type of the note. */
+} Elf64_Nhdr;
+
+/* Known names of notes. */
+
+/* Solaris entries in the note section have this name. */
+#define ELF_NOTE_SOLARIS "SUNW Solaris"
+
+/* Note entries for GNU systems have this name. */
+#define ELF_NOTE_GNU "GNU"
+
+
+/* Defined types of notes for Solaris. */
+
+/* Value of descriptor (one word) is desired pagesize for the binary. */
+#define ELF_NOTE_PAGESIZE_HINT 1
+
+
+/* Defined note types for GNU systems. */
+
+/* ABI information. The descriptor consists of words:
+ word 0: OS descriptor
+ word 1: major version of the ABI
+ word 2: minor version of the ABI
+ word 3: subminor version of the ABI
+*/
+#define ELF_NOTE_ABI 1
+
+/* Known OSes. These value can appear in word 0 of an ELF_NOTE_ABI
+ note section entry. */
+#define ELF_NOTE_OS_LINUX 0
+#define ELF_NOTE_OS_GNU 1
+#define ELF_NOTE_OS_SOLARIS2 2
+
+
+/* Move records. */
+typedef struct
+{
+ Elf32_Xword m_value; /* Symbol value. */
+ Elf32_Word m_info; /* Size and index. */
+ Elf32_Word m_poffset; /* Symbol offset. */
+ Elf32_Half m_repeat; /* Repeat count. */
+ Elf32_Half m_stride; /* Stride info. */
+} Elf32_Move;
+
+typedef struct
+{
+ Elf64_Xword m_value; /* Symbol value. */
+ Elf64_Xword m_info; /* Size and index. */
+ Elf64_Xword m_poffset; /* Symbol offset. */
+ Elf64_Half m_repeat; /* Repeat count. */
+ Elf64_Half m_stride; /* Stride info. */
+} Elf64_Move;
+
+/* Macro to construct move records. */
+#define ELF32_M_SYM(info) ((info) >> 8)
+#define ELF32_M_SIZE(info) ((unsigned char) (info))
+#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size))
+
+#define ELF64_M_SYM(info) ELF32_M_SYM (info)
+#define ELF64_M_SIZE(info) ELF32_M_SIZE (info)
+#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size)
+
+
+/* Motorola 68k specific definitions. */
+
+/* Values for Elf32_Ehdr.e_flags. */
+#define EF_CPU32 0x00810000
+
+/* m68k relocs. */
+
+#define R_68K_NONE 0 /* No reloc */
+#define R_68K_32 1 /* Direct 32 bit */
+#define R_68K_16 2 /* Direct 16 bit */
+#define R_68K_8 3 /* Direct 8 bit */
+#define R_68K_PC32 4 /* PC relative 32 bit */
+#define R_68K_PC16 5 /* PC relative 16 bit */
+#define R_68K_PC8 6 /* PC relative 8 bit */
+#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */
+#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */
+#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */
+#define R_68K_GOT32O 10 /* 32 bit GOT offset */
+#define R_68K_GOT16O 11 /* 16 bit GOT offset */
+#define R_68K_GOT8O 12 /* 8 bit GOT offset */
+#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */
+#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */
+#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */
+#define R_68K_PLT32O 16 /* 32 bit PLT offset */
+#define R_68K_PLT16O 17 /* 16 bit PLT offset */
+#define R_68K_PLT8O 18 /* 8 bit PLT offset */
+#define R_68K_COPY 19 /* Copy symbol at runtime */
+#define R_68K_GLOB_DAT 20 /* Create GOT entry */
+#define R_68K_JMP_SLOT 21 /* Create PLT entry */
+#define R_68K_RELATIVE 22 /* Adjust by program base */
+/* Keep this the last entry. */
+#define R_68K_NUM 23
+
+/* Intel 80386 specific definitions. */
+
+/* i386 relocs. */
+
+#define R_386_NONE 0 /* No reloc */
+#define R_386_32 1 /* Direct 32 bit */
+#define R_386_PC32 2 /* PC relative 32 bit */
+#define R_386_GOT32 3 /* 32 bit GOT entry */
+#define R_386_PLT32 4 /* 32 bit PLT address */
+#define R_386_COPY 5 /* Copy symbol at runtime */
+#define R_386_GLOB_DAT 6 /* Create GOT entry */
+#define R_386_JMP_SLOT 7 /* Create PLT entry */
+#define R_386_RELATIVE 8 /* Adjust by program base */
+#define R_386_GOTOFF 9 /* 32 bit offset to GOT */
+#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */
+/* Keep this the last entry. */
+#define R_386_NUM 11
+
+/* SUN SPARC specific definitions. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_REGISTER 13 /* Global register reserved to app. */
+
+/* Values for Elf64_Ehdr.e_flags. */
+
+#define EF_SPARCV9_MM 3
+#define EF_SPARCV9_TSO 0
+#define EF_SPARCV9_PSO 1
+#define EF_SPARCV9_RMO 2
+#define EF_SPARC_LEDATA 0x800000 /* little endian data */
+#define EF_SPARC_EXT_MASK 0xFFFF00
+#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */
+#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */
+#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */
+#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */
+
+/* SPARC relocs. */
+
+#define R_SPARC_NONE 0 /* No reloc */
+#define R_SPARC_8 1 /* Direct 8 bit */
+#define R_SPARC_16 2 /* Direct 16 bit */
+#define R_SPARC_32 3 /* Direct 32 bit */
+#define R_SPARC_DISP8 4 /* PC relative 8 bit */
+#define R_SPARC_DISP16 5 /* PC relative 16 bit */
+#define R_SPARC_DISP32 6 /* PC relative 32 bit */
+#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */
+#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */
+#define R_SPARC_HI22 9 /* High 22 bit */
+#define R_SPARC_22 10 /* Direct 22 bit */
+#define R_SPARC_13 11 /* Direct 13 bit */
+#define R_SPARC_LO10 12 /* Truncated 10 bit */
+#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */
+#define R_SPARC_GOT13 14 /* 13 bit GOT entry */
+#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */
+#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */
+#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */
+#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */
+#define R_SPARC_COPY 19 /* Copy symbol at runtime */
+#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */
+#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */
+#define R_SPARC_RELATIVE 22 /* Adjust by program base */
+#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */
+
+/* Additional Sparc64 relocs. */
+
+#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */
+#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */
+#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */
+#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */
+#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */
+#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */
+#define R_SPARC_10 30 /* Direct 10 bit */
+#define R_SPARC_11 31 /* Direct 11 bit */
+#define R_SPARC_64 32 /* Direct 64 bit */
+#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */
+#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */
+#define R_SPARC_HM10 35 /* High middle 10 bits of ... */
+#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */
+#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */
+#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */
+#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */
+#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */
+#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */
+#define R_SPARC_7 43 /* Direct 7 bit */
+#define R_SPARC_5 44 /* Direct 5 bit */
+#define R_SPARC_6 45 /* Direct 6 bit */
+#define R_SPARC_DISP64 46 /* PC relative 64 bit */
+#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */
+#define R_SPARC_HIX22 48 /* High 22 bit complemented */
+#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */
+#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */
+#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */
+#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */
+#define R_SPARC_REGISTER 53 /* Global register usage */
+#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */
+#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */
+/* Keep this the last entry. */
+#define R_SPARC_NUM 56
+
+/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
+
+#define DT_SPARC_REGISTER 0x70000001
+#define DT_SPARC_NUM 2
+
+/* Bits present in AT_HWCAP, primarily for Sparc32. */
+
+#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */
+#define HWCAP_SPARC_STBAR 2
+#define HWCAP_SPARC_SWAP 4
+#define HWCAP_SPARC_MULDIV 8
+#define HWCAP_SPARC_V9 16 /* The cpu is v9, so v8plus is ok. */
+
+/* MIPS R3000 specific definitions. */
+
+/* Legal values for e_flags field of Elf32_Ehdr. */
+
+#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */
+#define EF_MIPS_PIC 2 /* Contains PIC code */
+#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */
+#define EF_MIPS_XGOT 8
+#define EF_MIPS_64BIT_WHIRL 16
+#define EF_MIPS_ABI2 32
+#define EF_MIPS_ABI_ON32 64
+#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */
+
+/* Legal values for MIPS architecture level. */
+
+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
+
+/* The following are non-official names and should not be used. */
+
+#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
+#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
+#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
+#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
+#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
+
+/* Special section indices. */
+
+#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */
+#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */
+#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */
+#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */
+#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */
+
+/* Legal values for sh_type field of Elf32_Shdr. */
+
+#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */
+#define SHT_MIPS_MSYM 0x70000001
+#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */
+#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */
+#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */
+#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/
+#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */
+#define SHT_MIPS_PACKAGE 0x70000007
+#define SHT_MIPS_PACKSYM 0x70000008
+#define SHT_MIPS_RELD 0x70000009
+#define SHT_MIPS_IFACE 0x7000000b
+#define SHT_MIPS_CONTENT 0x7000000c
+#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */
+#define SHT_MIPS_SHDR 0x70000010
+#define SHT_MIPS_FDESC 0x70000011
+#define SHT_MIPS_EXTSYM 0x70000012
+#define SHT_MIPS_DENSE 0x70000013
+#define SHT_MIPS_PDESC 0x70000014
+#define SHT_MIPS_LOCSYM 0x70000015
+#define SHT_MIPS_AUXSYM 0x70000016
+#define SHT_MIPS_OPTSYM 0x70000017
+#define SHT_MIPS_LOCSTR 0x70000018
+#define SHT_MIPS_LINE 0x70000019
+#define SHT_MIPS_RFDESC 0x7000001a
+#define SHT_MIPS_DELTASYM 0x7000001b
+#define SHT_MIPS_DELTAINST 0x7000001c
+#define SHT_MIPS_DELTACLASS 0x7000001d
+#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */
+#define SHT_MIPS_DELTADECL 0x7000001f
+#define SHT_MIPS_SYMBOL_LIB 0x70000020
+#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */
+#define SHT_MIPS_TRANSLATE 0x70000022
+#define SHT_MIPS_PIXIE 0x70000023
+#define SHT_MIPS_XLATE 0x70000024
+#define SHT_MIPS_XLATE_DEBUG 0x70000025
+#define SHT_MIPS_WHIRL 0x70000026
+#define SHT_MIPS_EH_REGION 0x70000027
+#define SHT_MIPS_XLATE_OLD 0x70000028
+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
+
+/* Legal values for sh_flags field of Elf32_Shdr. */
+
+#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */
+#define SHF_MIPS_MERGE 0x20000000
+#define SHF_MIPS_ADDR 0x40000000
+#define SHF_MIPS_STRINGS 0x80000000
+#define SHF_MIPS_NOSTRIP 0x08000000
+#define SHF_MIPS_LOCAL 0x04000000
+#define SHF_MIPS_NAMES 0x02000000
+#define SHF_MIPS_NODUPE 0x01000000
+
+
+/* Symbol tables. */
+
+/* MIPS specific values for `st_other'. */
+#define STO_MIPS_DEFAULT 0x0
+#define STO_MIPS_INTERNAL 0x1
+#define STO_MIPS_HIDDEN 0x2
+#define STO_MIPS_PROTECTED 0x3
+#define STO_MIPS_SC_ALIGN_UNUSED 0xff
+
+/* MIPS specific values for `st_info'. */
+#define STB_MIPS_SPLIT_COMMON 13
+
+/* Entries found in sections of type SHT_MIPS_GPTAB. */
+
+typedef union
+{
+ struct
+ {
+ Elf32_Word gt_current_g_value; /* -G value used for compilation */
+ Elf32_Word gt_unused; /* Not used */
+ } gt_header; /* First entry in section */
+ struct
+ {
+ Elf32_Word gt_g_value; /* If this value were used for -G */
+ Elf32_Word gt_bytes; /* This many bytes would be used */
+ } gt_entry; /* Subsequent entries in section */
+} Elf32_gptab;
+
+/* Entry found in sections of type SHT_MIPS_REGINFO. */
+
+typedef struct
+{
+ Elf32_Word ri_gprmask; /* General registers used */
+ Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */
+ Elf32_Sword ri_gp_value; /* $gp register value */
+} Elf32_RegInfo;
+
+/* Entries found in sections of type SHT_MIPS_OPTIONS. */
+
+typedef struct
+{
+ unsigned char kind; /* Determines interpretation of the
+ variable part of descriptor. */
+ unsigned char size; /* Size of descriptor, including header. */
+ Elf32_Section section; /* Section header index of section affected,
+ 0 for global options. */
+ Elf32_Word info; /* Kind-specific information. */
+} Elf_Options;
+
+/* Values for `kind' field in Elf_Options. */
+
+#define ODK_NULL 0 /* Undefined. */
+#define ODK_REGINFO 1 /* Register usage information. */
+#define ODK_EXCEPTIONS 2 /* Exception processing options. */
+#define ODK_PAD 3 /* Section padding options. */
+#define ODK_HWPATCH 4 /* Hardware workarounds performed */
+#define ODK_FILL 5 /* record the fill value used by the linker. */
+#define ODK_TAGS 6 /* reserve space for desktop tools to write. */
+#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */
+#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */
+
+/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */
+
+#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */
+#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */
+#define OEX_PAGE0 0x10000 /* page zero must be mapped. */
+#define OEX_SMM 0x20000 /* Force sequential memory mode? */
+#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */
+#define OEX_PRECISEFP OEX_FPDBUG
+#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */
+
+#define OEX_FPU_INVAL 0x10
+#define OEX_FPU_DIV0 0x08
+#define OEX_FPU_OFLO 0x04
+#define OEX_FPU_UFLO 0x02
+#define OEX_FPU_INEX 0x01
+
+/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */
+
+#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */
+#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */
+#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */
+#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */
+
+#define OPAD_PREFIX 0x1
+#define OPAD_POSTFIX 0x2
+#define OPAD_SYMBOL 0x4
+
+/* Entry found in `.options' section. */
+
+typedef struct
+{
+ Elf32_Word hwp_flags1; /* Extra flags. */
+ Elf32_Word hwp_flags2; /* Extra flags. */
+} Elf_Options_Hw;
+
+/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */
+
+#define OHWA0_R4KEOP_CHECKED 0x00000001
+#define OHWA1_R4KEOP_CLEAN 0x00000002
+
+/* MIPS relocs. */
+
+#define R_MIPS_NONE 0 /* No reloc */
+#define R_MIPS_16 1 /* Direct 16 bit */
+#define R_MIPS_32 2 /* Direct 32 bit */
+#define R_MIPS_REL32 3 /* PC relative 32 bit */
+#define R_MIPS_26 4 /* Direct 26 bit shifted */
+#define R_MIPS_HI16 5 /* High 16 bit */
+#define R_MIPS_LO16 6 /* Low 16 bit */
+#define R_MIPS_GPREL16 7 /* GP relative 16 bit */
+#define R_MIPS_LITERAL 8 /* 16 bit literal entry */
+#define R_MIPS_GOT16 9 /* 16 bit GOT entry */
+#define R_MIPS_PC16 10 /* PC relative 16 bit */
+#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */
+#define R_MIPS_GPREL32 12 /* GP relative 32 bit */
+
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+#define R_MIPS_GOT_HI16 22
+#define R_MIPS_GOT_LO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+#define R_MIPS_CALL_HI16 30
+#define R_MIPS_CALL_LO16 31
+#define R_MIPS_SCN_DISP 32
+#define R_MIPS_REL16 33
+#define R_MIPS_ADD_IMMEDIATE 34
+#define R_MIPS_PJUMP 35
+#define R_MIPS_RELGOT 36
+#define R_MIPS_JALR 37
+/* Keep this the last entry. */
+#define R_MIPS_NUM 38
+
+/* Legal values for p_type field of Elf32_Phdr. */
+
+#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
+#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
+#define PT_MIPS_OPTIONS 0x70000002
+
+/* Special program header types. */
+
+#define PF_MIPS_LOCAL 0x10000000
+
+/* Legal values for d_tag field of Elf32_Dyn. */
+
+#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */
+#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */
+#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */
+#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */
+#define DT_MIPS_FLAGS 0x70000005 /* Flags */
+#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */
+#define DT_MIPS_MSYM 0x70000007
+#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */
+#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */
+#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */
+#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */
+#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */
+#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */
+#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */
+#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */
+#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */
+#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */
+#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in
+ DT_MIPS_DELTA_CLASS. */
+#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */
+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
+ DT_MIPS_DELTA_INSTANCE. */
+#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */
+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
+ DT_MIPS_DELTA_RELOC. */
+#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta
+ relocations refer to. */
+#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
+ DT_MIPS_DELTA_SYM. */
+#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
+ class declaration. */
+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
+ DT_MIPS_DELTA_CLASSSYM. */
+#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */
+#define DT_MIPS_PIXIE_INIT 0x70000023
+#define DT_MIPS_SYMBOL_LIB 0x70000024
+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
+#define DT_MIPS_LOCAL_GOTIDX 0x70000026
+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
+#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */
+#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */
+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
+#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
+ function stored in GOT. */
+#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added
+ by rld on dlopen() calls. */
+#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
+#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */
+#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */
+#define DT_MIPS_NUM 0x32
+
+/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
+
+#define RHF_NONE 0 /* No flags */
+#define RHF_QUICKSTART (1 << 0) /* Use quickstart */
+#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */
+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */
+#define RHF_NO_MOVE (1 << 3)
+#define RHF_SGI_ONLY (1 << 4)
+#define RHF_GUARANTEE_INIT (1 << 5)
+#define RHF_DELTA_C_PLUS_PLUS (1 << 6)
+#define RHF_GUARANTEE_START_INIT (1 << 7)
+#define RHF_PIXIE (1 << 8)
+#define RHF_DEFAULT_DELAY_LOAD (1 << 9)
+#define RHF_REQUICKSTART (1 << 10)
+#define RHF_REQUICKSTARTED (1 << 11)
+#define RHF_CORD (1 << 12)
+#define RHF_NO_UNRES_UNDEF (1 << 13)
+#define RHF_RLD_ORDER_SAFE (1 << 14)
+
+/* Entries found in sections of type SHT_MIPS_LIBLIST. */
+
+typedef struct
+{
+ Elf32_Word l_name; /* Name (string table index) */
+ Elf32_Word l_time_stamp; /* Timestamp */
+ Elf32_Word l_checksum; /* Checksum */
+ Elf32_Word l_version; /* Interface version */
+ Elf32_Word l_flags; /* Flags */
+} Elf32_Lib;
+
+typedef struct
+{
+ Elf64_Word l_name; /* Name (string table index) */
+ Elf64_Word l_time_stamp; /* Timestamp */
+ Elf64_Word l_checksum; /* Checksum */
+ Elf64_Word l_version; /* Interface version */
+ Elf64_Word l_flags; /* Flags */
+} Elf64_Lib;
+
+
+/* Legal values for l_flags. */
+
+#define LL_NONE 0
+#define LL_EXACT_MATCH (1 << 0) /* Require exact match */
+#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */
+#define LL_REQUIRE_MINOR (1 << 2)
+#define LL_EXPORTS (1 << 3)
+#define LL_DELAY_LOAD (1 << 4)
+#define LL_DELTA (1 << 5)
+
+/* Entries found in sections of type SHT_MIPS_CONFLICT. */
+
+typedef Elf32_Addr Elf32_Conflict;
+
+
+/* HPPA specific definitions. */
+
+/* Legal values for e_flags field of Elf32_Ehdr. */
+
+#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
+#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
+#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
+#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
+#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
+ prediction. */
+#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
+#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
+
+/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
+
+#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
+#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
+#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
+
+/* Additional section indeces. */
+
+#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
+ symbols in ANSI C. */
+#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
+
+/* Legal values for sh_type field of Elf32_Shdr. */
+
+#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
+#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
+#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
+
+/* Legal values for sh_flags field of Elf32_Shdr. */
+
+#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
+#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
+#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
+
+#define STT_HP_OPAQUE (STT_LOOS + 0x1)
+#define STT_HP_STUB (STT_LOOS + 0x2)
+
+/* HPPA relocs. */
+
+#define R_PARISC_NONE 0 /* No reloc. */
+#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
+#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
+#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
+#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
+#define R_PARISC_DIR14R 5 /* Right 14 bits of eff. address. */
+#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
+#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
+#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
+#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
+#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
+#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
+#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
+#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
+#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
+#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
+#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
+#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
+#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
+#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
+#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
+#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
+#define R_PARISC_FPTR64 64 /* 64 bits function address. */
+#define R_PARISC_PLABEL32 65 /* 32 bits function address. */
+#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
+#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
+#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
+#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
+#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
+#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
+#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
+#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
+#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
+#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
+#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
+#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
+#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
+#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
+#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
+#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
+#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
+#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
+#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LORESERVE 128
+#define R_PARISC_COPY 128 /* Copy relocation. */
+#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
+#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
+#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
+#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
+#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
+#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
+#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
+#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
+#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_HIRESERVE 255
+
+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PT_HP_TLS (PT_LOOS + 0x0)
+#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
+#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
+#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
+#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
+#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
+#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
+#define PT_HP_PARALLEL (PT_LOOS + 0x10)
+#define PT_HP_FASTBIND (PT_LOOS + 0x11)
+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
+#define PT_HP_STACK (PT_LOOS + 0x14)
+
+#define PT_PARISC_ARCHEXT 0x70000000
+#define PT_PARISC_UNWIND 0x70000001
+
+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PF_PARISC_SBP 0x08000000
+
+#define PF_HP_PAGE_SIZE 0x00100000
+#define PF_HP_FAR_SHARED 0x00200000
+#define PF_HP_NEAR_SHARED 0x00400000
+#define PF_HP_CODE 0x01000000
+#define PF_HP_MODIFY 0x02000000
+#define PF_HP_LAZYSWAP 0x04000000
+#define PF_HP_SBP 0x08000000
+
+
+/* Alpha specific definitions. */
+
+/* Legal values for e_flags field of Elf64_Ehdr. */
+
+#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */
+#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */
+
+/* Legal values for sh_type field of Elf64_Shdr. */
+
+/* These two are primerily concerned with ECOFF debugging info. */
+#define SHT_ALPHA_DEBUG 0x70000001
+#define SHT_ALPHA_REGINFO 0x70000002
+
+/* Legal values for sh_flags field of Elf64_Shdr. */
+
+#define SHF_ALPHA_GPREL 0x10000000
+
+/* Legal values for st_other field of Elf64_Sym. */
+#define STO_ALPHA_NOPV 0x80 /* No PV required. */
+#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */
+
+/* Alpha relocs. */
+
+#define R_ALPHA_NONE 0 /* No reloc */
+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */
+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */
+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */
+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */
+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */
+#define R_ALPHA_OP_PUSH 12 /* OP stack push */
+#define R_ALPHA_OP_STORE 13 /* OP stack pop and store */
+#define R_ALPHA_OP_PSUB 14 /* OP stack subtract */
+#define R_ALPHA_OP_PRSHIFT 15 /* OP stack right shift */
+#define R_ALPHA_GPVALUE 16
+#define R_ALPHA_GPRELHIGH 17
+#define R_ALPHA_GPRELLOW 18
+#define R_ALPHA_IMMED_GP_16 19
+#define R_ALPHA_IMMED_GP_HI32 20
+#define R_ALPHA_IMMED_SCN_HI32 21
+#define R_ALPHA_IMMED_BR_HI32 22
+#define R_ALPHA_IMMED_LO32 23
+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */
+/* Keep this the last entry. */
+#define R_ALPHA_NUM 28
+
+
+/* PowerPC specific declarations */
+
+/* Values for Elf32/64_Ehdr.e_flags. */
+#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */
+
+/* Cygnus local bits below */
+#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib
+ flag */
+
+/* PowerPC relocations defined by the ABIs */
+#define R_PPC_NONE 0
+#define R_PPC_ADDR32 1 /* 32bit absolute address */
+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
+#define R_PPC_ADDR16 3 /* 16bit absolute address */
+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN 8
+#define R_PPC_ADDR14_BRNTAKEN 9
+#define R_PPC_REL24 10 /* PC relative 26 bit */
+#define R_PPC_REL14 11 /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN 12
+#define R_PPC_REL14_BRNTAKEN 13
+#define R_PPC_GOT16 14
+#define R_PPC_GOT16_LO 15
+#define R_PPC_GOT16_HI 16
+#define R_PPC_GOT16_HA 17
+#define R_PPC_PLTREL24 18
+#define R_PPC_COPY 19
+#define R_PPC_GLOB_DAT 20
+#define R_PPC_JMP_SLOT 21
+#define R_PPC_RELATIVE 22
+#define R_PPC_LOCAL24PC 23
+#define R_PPC_UADDR32 24
+#define R_PPC_UADDR16 25
+#define R_PPC_REL32 26
+#define R_PPC_PLT32 27
+#define R_PPC_PLTREL32 28
+#define R_PPC_PLT16_LO 29
+#define R_PPC_PLT16_HI 30
+#define R_PPC_PLT16_HA 31
+#define R_PPC_SDAREL16 32
+#define R_PPC_SECTOFF 33
+#define R_PPC_SECTOFF_LO 34
+#define R_PPC_SECTOFF_HI 35
+#define R_PPC_SECTOFF_HA 36
+/* Keep this the last entry. */
+#define R_PPC_NUM 37
+
+/* The remaining relocs are from the Embedded ELF ABI, and are not
+ in the SVR4 ELF ABI. */
+#define R_PPC_EMB_NADDR32 101
+#define R_PPC_EMB_NADDR16 102
+#define R_PPC_EMB_NADDR16_LO 103
+#define R_PPC_EMB_NADDR16_HI 104
+#define R_PPC_EMB_NADDR16_HA 105
+#define R_PPC_EMB_SDAI16 106
+#define R_PPC_EMB_SDA2I16 107
+#define R_PPC_EMB_SDA2REL 108
+#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF 110
+#define R_PPC_EMB_RELSEC16 111
+#define R_PPC_EMB_RELST_LO 112
+#define R_PPC_EMB_RELST_HI 113
+#define R_PPC_EMB_RELST_HA 114
+#define R_PPC_EMB_BIT_FLD 115
+#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */
+
+/* Diab tool relocations. */
+#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
+
+/* This is a phony reloc to handle any old fashioned TOC16 references
+ that may still be in object files. */
+#define R_PPC_TOC16 255
+
+
+/* ARM specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
+#define EF_NEW_ABI 0x80
+#define EF_OLD_ABI 0x100
+
+/* Additional symbol types for Thumb */
+#define STT_ARM_TFUNC 0xd
+
+/* ARM-specific values for sh_flags */
+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
+ in the input to a link step */
+
+/* ARM-specific program header flags */
+#define PF_ARM_SB 0x10000000 /* Segment contains the location
+ addressed by the static base */
+
+/* ARM relocs. */
+#define R_ARM_NONE 0 /* No reloc */
+#define R_ARM_PC24 1 /* PC relative 26 bit branch */
+#define R_ARM_ABS32 2 /* Direct 32 bit */
+#define R_ARM_REL32 3 /* PC relative 32 bit */
+#define R_ARM_PC13 4
+#define R_ARM_ABS16 5 /* Direct 16 bit */
+#define R_ARM_ABS12 6 /* Direct 12 bit */
+#define R_ARM_THM_ABS5 7
+#define R_ARM_ABS8 8 /* Direct 8 bit */
+#define R_ARM_SBREL32 9
+#define R_ARM_THM_PC22 10
+#define R_ARM_THM_PC8 11
+#define R_ARM_AMP_VCALL9 12
+#define R_ARM_SWI24 13
+#define R_ARM_THM_SWI8 14
+#define R_ARM_XPC25 15
+#define R_ARM_THM_XPC22 16
+#define R_ARM_COPY 20 /* Copy symbol at runtime */
+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+#define R_ARM_RELATIVE 23 /* Adjust by program base */
+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
+#define R_ARM_GOT32 26 /* 32 bit GOT entry */
+#define R_ARM_PLT32 27 /* 32 bit PLT address */
+#define R_ARM_GNU_VTENTRY 100
+#define R_ARM_GNU_VTINHERIT 101
+#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
+#define R_ARM_THM_PC9 103 /* thumb conditional branch */
+#define R_ARM_RXPC25 249
+#define R_ARM_RSBREL32 250
+#define R_ARM_THM_RPC22 251
+#define R_ARM_RREL32 252
+#define R_ARM_RABS22 253
+#define R_ARM_RPC24 254
+#define R_ARM_RBASE 255
+/* Keep this the last entry. */
+#define R_ARM_NUM 256
+
+/* IA-64 specific declarations. */
+
+/* Processor specific flags for the Ehdr e_flags field. */
+#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
+#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
+#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
+
+/* Processor specific values for the Phdr p_type field. */
+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
+#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
+
+/* Processor specific flags for the Phdr p_flags field. */
+#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Shdr sh_type field. */
+#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
+
+/* Processor specific flags for the Shdr sh_flags field. */
+#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
+#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Dyn d_tag field. */
+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
+#define DT_IA_64_NUM 1
+
+/* IA-64 relocations. */
+#define R_IA64_NONE 0x00 /* none */
+#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
+#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
+#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
+#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
+#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
+#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
+#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
+#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
+#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
+#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
+#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
+#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
+#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
+#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
+#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
+#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
+#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
+#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
+#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
+#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
+#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
+#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
+#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
+#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
+#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
+#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
+#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
+#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
+#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
+#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
+#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
+#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
+#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
+#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
+#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
+#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
+#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
+#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
+#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
+#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
+#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
+#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
+#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
+#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
+#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
+#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
+#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
+#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
+#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
+#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
+#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
+#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
+#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
+#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
+#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
+#define R_IA64_COPY 0x84 /* copy relocation */
+#define R_IA64_SUB 0x85 /* Addend and symbol difference */
+#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
+#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
+#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
+#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
+#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
+#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
+#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
+#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
+#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
+#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
+#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
+#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
+#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
+#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
+#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
+#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
+
+/* SH specific declarations */
+
+/* SH relocs. */
+#define R_SH_NONE 0
+#define R_SH_DIR32 1
+#define R_SH_REL32 2
+#define R_SH_DIR8WPN 3
+#define R_SH_IND12W 4
+#define R_SH_DIR8WPL 5
+#define R_SH_DIR8WPZ 6
+#define R_SH_DIR8BP 7
+#define R_SH_DIR8W 8
+#define R_SH_DIR8L 9
+#define R_SH_SWITCH16 25
+#define R_SH_SWITCH32 26
+#define R_SH_USES 27
+#define R_SH_COUNT 28
+#define R_SH_ALIGN 29
+#define R_SH_CODE 30
+#define R_SH_DATA 31
+#define R_SH_LABEL 32
+#define R_SH_SWITCH8 33
+#define R_SH_GNU_VTINHERIT 34
+#define R_SH_GNU_VTENTRY 35
+#define R_SH_GOT32 160
+#define R_SH_PLT32 161
+#define R_SH_COPY 162
+#define R_SH_GLOB_DAT 163
+#define R_SH_JMP_SLOT 164
+#define R_SH_RELATIVE 165
+#define R_SH_GOTOFF 166
+#define R_SH_GOTPC 167
+/* Keep this the last entry. */
+#define R_SH_NUM 256
+
+/* Additional s390 relocs */
+
+#define R_390_NONE 0 /* No reloc. */
+#define R_390_8 1 /* Direct 8 bit. */
+#define R_390_12 2 /* Direct 12 bit. */
+#define R_390_16 3 /* Direct 16 bit. */
+#define R_390_32 4 /* Direct 32 bit. */
+#define R_390_PC32 5 /* PC relative 32 bit. */
+#define R_390_GOT12 6 /* 12 bit GOT offset. */
+#define R_390_GOT32 7 /* 32 bit GOT offset. */
+#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
+#define R_390_COPY 9 /* Copy symbol at runtime. */
+#define R_390_GLOB_DAT 10 /* Create GOT entry. */
+#define R_390_JMP_SLOT 11 /* Create PLT entry. */
+#define R_390_RELATIVE 12 /* Adjust by program base. */
+#define R_390_GOTOFF 13 /* 32 bit offset to GOT. */
+#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */
+#define R_390_GOT16 15 /* 16 bit GOT offset. */
+#define R_390_PC16 16 /* PC relative 16 bit. */
+#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
+#define R_390_PLT16DBL 18 /* 32 bit PC rel. PLT shifted by 1. */
+/* Keep this the last entry. */
+#define R_390_NUM 19
+
+#endif /* elf.h */
diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h
new file mode 100644
index 000000000..463c24fff
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/endian.h
@@ -0,0 +1,43 @@
+#ifndef _ENDIAN_H
+#define _ENDIAN_H
+
+#define __LITTLE_ENDIAN 1234
+#define __BIG_ENDIAN 4321
+
+#ifdef __i386__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+
+#ifdef __sparc__
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+
+#ifdef __mips__
+#ifdef __MIPSEB__
+#define __BIG_ENDIAN__
+#endif
+#endif
+
+#ifndef __BYTE_ORDER
+#ifdef __BIG_ENDIAN__
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#else
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+#endif
+
+#define LITTLE_ENDIAN __LITTLE_ENDIAN
+#define BIG_ENDIAN __BIG_ENDIAN
+#define BYTE_ORDER __BYTE_ORDER
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) LO, HI
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) HI, LO
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h
new file mode 100644
index 000000000..f4ba482b5
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/errno.h
@@ -0,0 +1,10 @@
+#ifndef _ERRNO_H
+#define _ERRNO_H
+
+extern int errno;
+
+#include <linux/errno.h>
+
+extern void __set_errno(int error);
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h
new file mode 100644
index 000000000..b792502c1
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/fcntl.h
@@ -0,0 +1,24 @@
+#ifndef _FCNTL_H
+#define _FCNTL_H
+
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <asm/fcntl.h>
+
+extern int fcntl (int __fd, int __cmd, ...) __THROW;
+extern int open (const char *__file, int __oflag, ...) __THROW;
+extern int open64 (const char *__file, int __oflag, ...) __THROW;
+extern int creat (const char *__file, mode_t __mode) __THROW;
+extern int creat64 (const char *__file, mode_t __mode) __THROW;
+extern int lockf (int __fd, int __cmd, off_t __len) __THROW;
+extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW;
+
+#define F_ULOCK 0 /* Unlock a previously locked region. */
+#define F_LOCK 1 /* Lock a region for exclusive use. */
+#define F_TLOCK 2 /* Test and lock a region for exclusive use. */
+#define F_TEST 3 /* Test a region for other processes locks. */
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h
new file mode 100644
index 000000000..02f081006
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/features.h
@@ -0,0 +1 @@
+#warning "someone included features.h, apparently someone is including glibc headers!"
diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h
new file mode 100644
index 000000000..c888f0021
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/ftw.h
@@ -0,0 +1,51 @@
+#ifndef _FTW_H
+#define _FTW_H
+
+#include <sys/cdefs.h>
+#include <sys/stat.h>
+
+struct FTW
+ {
+ int base;
+ int level;
+ };
+
+int ftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth) __THROW;
+int nftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags) __THROW;
+
+enum
+{
+ FTW_F, /* Regular file. */
+#define FTW_F FTW_F
+ FTW_D, /* Directory. */
+#define FTW_D FTW_D
+ FTW_DNR, /* Unreadable directory. */
+#define FTW_DNR FTW_DNR
+ FTW_NS, /* Unstatable file. */
+#define FTW_NS FTW_NS
+ FTW_SL, /* Symbolic link. */
+# define FTW_SL FTW_SL
+/* These flags are only passed from the `nftw' function. */
+ FTW_DP, /* Directory, all subdirs have been visited. */
+# define FTW_DP FTW_DP
+ FTW_SLN /* Symbolic link naming non-existing file. */
+# define FTW_SLN FTW_SLN
+};
+
+typedef int (*__ftw_func_t) (__const char *__filename,
+ __const struct stat *__status, int __flag) __THROW;
+
+typedef int (*__nftw_func_t) (__const char *__filename,
+ __const struct stat *__status, int __flag,
+ struct FTW *__info) __THROW;
+
+#ifndef __NO_STAT64
+typedef int (*__ftw64_func_t) (__const char *__filename,
+ __const struct stat64 *__status, int __flag) __THROW;
+
+typedef int (*__nftw64_func_t) (__const char *__filename,
+ __const struct stat64 *__status,
+ int __flag, struct FTW *__info) __THROW;
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h
new file mode 100644
index 000000000..2acd0f208
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/grp.h
@@ -0,0 +1,18 @@
+#ifndef _GRP_H
+#define _GRP_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+struct group
+ {
+ char *gr_name; /* Group name. */
+ char *gr_passwd; /* Password. */
+ gid_t gr_gid; /* Group ID. */
+ char **gr_mem; /* Member list. */
+ };
+
+extern struct passwd *getgrgid (uid_t __uid) __THROW;
+extern struct passwd *getgrnam (const char *__name) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h
new file mode 100644
index 000000000..ccc02150d
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/limits.h
@@ -0,0 +1,10 @@
+#ifndef _LIMITS_H
+#define _LIMITS_H
+
+#include <linux/limits.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/malloc.h b/mdk-stage1/dietlibc/include/malloc.h
new file mode 100644
index 000000000..c8b49f26d
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/malloc.h
@@ -0,0 +1 @@
+#include <stdlib.h>
diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h
new file mode 100644
index 000000000..e6e7be441
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/net/if.h
@@ -0,0 +1,9 @@
+#ifndef _NET_IF_H
+#define _NET_IF_H
+
+#include <sys/cdefs.h>
+
+unsigned int if_nametoindex (const char *ifname) __THROW;
+char *if_indextoname (unsigned int ifindex, char *ifname) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h
new file mode 100644
index 000000000..29f452ee9
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netdb.h
@@ -0,0 +1,48 @@
+#ifndef _NETDB_H
+#define _NETDB_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+/* Absolute file name for network data base files. */
+#define _PATH_HEQUIV "/etc/hosts.equiv"
+#define _PATH_HOSTS "/etc/hosts"
+#define _PATH_NETWORKS "/etc/networks"
+#define _PATH_NSSWITCH_CONF "/etc/nsswitch.conf"
+#define _PATH_PROTOCOLS "/etc/protocols"
+#define _PATH_SERVICES "/etc/services"
+
+/* Description of data base entry for a single service. */
+struct servent
+{
+ char *s_name; /* Official service name. */
+ char **s_aliases; /* Alias list. */
+ int s_port; /* Port number. */
+ char *s_proto; /* Protocol to use. */
+};
+
+extern void endservent (void) __THROW;
+extern struct servent *getservent (void) __THROW;
+extern struct servent *getservbyname (__const char *__name,
+ __const char *__proto) __THROW;
+extern struct servent *getservbyport (int __port, __const char *__proto)
+ __THROW;
+
+struct hostent
+{
+ char *h_name; /* Official name of host. */
+ char **h_aliases; /* Alias list. */
+ int h_addrtype; /* Host address type. */
+ socklen_t h_length; /* Length of address. */
+ char **h_addr_list; /* List of addresses from name server. */
+#define h_addr h_addr_list[0] /* Address, for backward compatibility. */
+};
+
+extern void endhostent (void) __THROW;
+extern struct hostent *gethostent (void) __THROW;
+extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len,
+ int __type) __THROW;
+extern struct hostent *gethostbyname (const char *__name) __THROW;
+extern struct hostent *gethostbyname2 (const char *__name, int __af) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h
new file mode 100644
index 000000000..d83498a76
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/in.h
@@ -0,0 +1,6 @@
+#ifndef _NETINET_IN_H
+#define _NETINET_IN_H
+
+#include <linux/in.h>
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/netinet/in_systm.h b/mdk-stage1/dietlibc/include/netinet/in_systm.h
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/in_systm.h
diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h
new file mode 100644
index 000000000..35bf9cc42
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/netinet/ip.h
@@ -0,0 +1,6 @@
+#ifndef _NETINET_IP_H
+#define _NETINET_IP_H
+
+#include <linux/ip.h>
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h
new file mode 100644
index 000000000..aac47e870
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/paths.h
@@ -0,0 +1,7 @@
+#ifndef _PATHS_H
+#define _PATHS_H
+
+#define _PATH_BSHELL "/bin/sh"
+#define _PATH_DEFPATH "/bin:/usr/bin:"
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h
new file mode 100644
index 000000000..c7120917c
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/pwd.h
@@ -0,0 +1,20 @@
+#ifndef _PWD_H
+#define _PWD_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+struct passwd {
+ char *pw_name; /* Username. */
+ char *pw_passwd; /* Password. */
+ uid_t pw_uid; /* User ID. */
+ gid_t pw_gid; /* Group ID. */
+ char *pw_gecos; /* Real name. */
+ char *pw_dir; /* Home directory. */
+ char *pw_shell; /* Shell program. */
+};
+
+extern struct passwd *getpwuid (uid_t __uid) __THROW;
+extern struct passwd *getpwnam (const char *__name) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h
new file mode 100644
index 000000000..a49b450ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/setjmp.h
@@ -0,0 +1,121 @@
+#ifndef _SETJMP_H
+#define _SETJMP_H
+
+#include <sys/cdefs.h>
+
+#ifdef __i386__
+#ifndef __ASSEMBLER__
+typedef int __jmp_buf[6];
+#endif
+# define JB_BX 0
+# define JB_SI 1
+# define JB_DI 2
+# define JB_BP 3
+# define JB_SP 4
+# define JB_PC 5
+# define JB_SIZE 24
+#endif
+
+#ifdef __alpha__
+#define JB_S0 0
+#define JB_S1 1
+#define JB_S2 2
+#define JB_S3 3
+#define JB_S4 4
+#define JB_S5 5
+#define JB_PC 6
+#define JB_FP 7
+#define JB_SP 8
+#define JB_F2 9
+#define JB_F3 10
+#define JB_F4 11
+#define JB_F5 12
+#define JB_F6 13
+#define JB_F7 14
+#define JB_F8 15
+#define JB_F9 16
+#ifndef __ASSEMBLER__
+typedef long int __jmp_buf[17];
+#endif
+#endif
+
+#ifdef __mips__
+#ifndef __ASSEMBLER__
+typedef struct
+ {
+ void * __pc; /* Program counter. */
+ void * __sp; /* Stack pointer. */
+ int __regs[8]; /* Callee-saved registers s0 through s7. */
+ void * __fp; /* The frame pointer. */
+ void * __gp; /* The global pointer. */
+ int __fpc_csr; /* Floating point status register. */
+ double __fpregs[6]; /* Callee-saved floating point registers. */
+ } __jmp_buf[1];
+#endif
+#endif
+
+#ifdef __sparc__
+#define JB_SP 0
+#define JB_FP 1
+#define JB_PC 2
+#ifndef __ASSEMBLER__
+typedef int __jmp_buf[3];
+#endif
+#endif
+
+#ifdef __arm__
+#define __JMP_BUF_SP 8
+#ifndef __ASSEMBLER__
+typedef int __jmp_buf[10];
+#endif
+#endif
+
+#ifdef __powerpc__
+# define JB_GPR1 0 /* Also known as the stack pointer */
+# define JB_GPR2 1
+# define JB_LR 2 /* The address we will return to */
+# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */
+# define JB_CR 21 /* Condition code registers. */
+# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */
+# define JB_SIZE (58*4)
+#ifndef __ASSEMBLER__
+typedef long int __jmp_buf[58];
+#endif
+#endif
+
+#ifndef __ASSEMBLER__
+
+typedef int __sig_atomic_t;
+
+# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
+typedef struct
+ {
+ unsigned long int __val[_SIGSET_NWORDS];
+ } __sigset_t;
+
+/* Calling environment, plus possibly a saved signal mask. */
+typedef struct __jmp_buf_tag /* C++ doesn't like tagless structs. */
+ {
+ /* NOTE: The machine-dependent definitions of `__sigsetjmp'
+ assume that a `jmp_buf' begins with a `__jmp_buf'.
+ Do not move this member or add others before it. */
+ __jmp_buf __jmpbuf; /* Calling environment. */
+ int __mask_was_saved; /* Saved the signal mask? */
+ __sigset_t __saved_mask; /* Saved signal mask. */
+ } jmp_buf[1];
+
+extern int __sigsetjmp (jmp_buf __env, int __savemask) __THROW;
+
+extern void longjmp (jmp_buf __env, int __val)
+ __THROW __attribute__ ((__noreturn__));
+
+typedef jmp_buf sigjmp_buf;
+
+extern void siglongjmp (sigjmp_buf __env, int __val)
+ __THROW __attribute__ ((__noreturn__));
+
+#define setjmp(env) __sigsetjmp(env,0)
+
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h
new file mode 100644
index 000000000..d4d2b0f44
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/signal.h
@@ -0,0 +1,14 @@
+#ifndef _SIGNAL_H
+#define _SIGNAL_H
+
+#include <sys/cdefs.h>
+
+#include <linux/types.h>
+#include <linux/signal.h>
+
+int sigemptyset(sigset_t *set) __THROW;
+int sigaddset(sigset_t *set, int signum) __THROW;
+int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW;
+int raise (int sig) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h
new file mode 100644
index 000000000..d287e6794
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stdint.h
@@ -0,0 +1,6 @@
+#ifndef _STDINT_H
+#define _STDINT_H
+
+#include <sys/types.h>
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h
new file mode 100644
index 000000000..fcfd8e87c
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stdio.h
@@ -0,0 +1,67 @@
+#ifndef _STDIO_H
+#define _STDIO_H
+
+#include <sys/types.h>
+
+typedef struct __stdio_file FILE;
+
+FILE *fopen (const char *path, const char *mode);
+FILE *fdopen (int fildes, const char *mode);
+FILE *freopen (const char *path, const char *mode, FILE *stream);
+
+int printf(const char *format, ...);
+int fprintf(FILE *stream, const char *format, ...);
+int sprintf(char *str, const char *format, ...);
+int snprintf(char *str, size_t size, const char *format, ...);
+
+int scanf( const char *format, ...);
+int fscanf( FILE *stream, const char *format, ...);
+int sscanf( const char *str, const char *format, ...);
+
+#include <stdarg.h>
+
+int vprintf(const char *format, va_list ap);
+int vfprintf(FILE *stream, const char *format, va_list ap);
+int vsprintf(char *str, const char *format, va_list ap);
+int vsnprintf(char *str, size_t size, const char *format, va_list ap);
+
+int vscanf( const char *format, va_list ap);
+int vsscanf( const char *str, const char *format, va_list ap);
+int vfscanf( FILE *stream, const char *format, va_list ap);
+
+int fgetc(FILE *stream);
+char *fgets(char *s, int size, FILE *stream);
+int getc(FILE *stream);
+int getchar(void);
+char *gets(char *s);
+int ungetc(int c, FILE *stream);
+
+int fputc(int c, FILE *stream);
+int fputs(const char *s, FILE *stream);
+int putc(int c, FILE *stream);
+int putchar(int c);
+int puts(const char *s);
+
+int fseek( FILE *stream, long offset, int whence);
+long ftell( FILE *stream);
+void rewind( FILE *stream);
+int fgetpos( FILE *stream, fpos_t *pos);
+int fsetpos( FILE *stream, fpos_t *pos);
+
+size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream);
+
+size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream);
+
+int fflush(FILE *stream);
+
+int fclose(FILE *stream);
+
+extern FILE *stdin, *stdout, *stderr;
+
+#define EOF (int)(-1)
+
+void perror (const char *__s);
+
+#define BUFSIZ 128
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h
new file mode 100644
index 000000000..90f2fbbb7
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/stdlib.h
@@ -0,0 +1,37 @@
+#ifndef _STDLIB_H
+#define _STDLIB_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+void *calloc(size_t nmemb, size_t size) __THROW;
+void *malloc(size_t size) __THROW;
+void free(void *ptr) __THROW;
+void *realloc(void *ptr, size_t size) __THROW;
+
+void *alloca(size_t size);
+
+char *getenv(const char *name) __pure__;
+
+int atexit(void (*function)(void)) __THROW;
+
+double strtod(const char *nptr, char **endptr) __THROW;
+long int strtol(const char *nptr, char **endptr, int base);
+unsigned long int strtoul(const char *nptr, char **endptr, int base);
+
+int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+#ifdef __GNUC__
+long long int strtoll(const char *nptr, char **endptr, int base);
+unsigned long long int strtoull(const char *nptr, char **endptr, int base);
+int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase);
+#endif
+
+int atoi(const char *nptr);
+
+void abort(void);
+void exit(int);
+
+extern char **environ;
+
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h
new file mode 100644
index 000000000..133ac3b61
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/string.h
@@ -0,0 +1,42 @@
+#ifndef _STRING_H
+#define _STRING_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+char *strcpy(char *dest, const char *src) __THROW;
+char *strncpy(char *dest, const char *src, size_t n) __THROW;
+
+void *memccpy(void *dest, const void *src, int c, size_t n) __THROW;
+void *memcpy(void *dest, const void *src, size_t n) __THROW;
+void *memmove(void *dest, const void *src, size_t n) __THROW;
+
+int memccmp(const void *s1, const void *s2, int c, size_t n) __THROW __pure__;
+int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__;
+int strcmp(const char *s1, const char *s2) __THROW __pure__;
+int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
+char *strstr (const char *__haystack, const char *__needle) __THROW __pure__;
+
+size_t strlen(const char *s) __THROW __pure__;
+
+char *strdup(const char *s) __THROW;
+
+char *strchr(const char *s, int c) __THROW;
+char *strrchr(const char *s, int c) __THROW;
+
+char *strcat(char *dest, const char *src) __THROW;
+char *strncat(char *dest, const char *src, size_t n) __THROW;
+
+size_t strcspn(const char *s, const char *reject);
+
+void* memset(void *s, int c, size_t n) __THROW;
+
+#undef NULL
+#define NULL (void*)0
+
+#define bzero(s,n) memset(s,0,n)
+#define bcmp(s1,s2,n) memcmp(s1,s2,n)
+
+char *strerror (int __errnum) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h
new file mode 100644
index 000000000..9f256f59f
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/cdefs.h
@@ -0,0 +1,24 @@
+#ifndef _SYS_CDEFS_H
+#define _SYS_CDEFS_H
+
+#ifndef __cplusplus
+#define throw ()
+#define __THROW
+#else
+#define __THROW throw ()
+#endif
+
+#ifndef __GNUC__
+#define __attribute__(xyz)
+#endif
+
+#define __pure__
+#ifdef __GNUC__
+#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96))
+#undef __pure__
+#define __pure__ __attribute__ ((__pure__))
+#endif
+
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h
new file mode 100644
index 000000000..fca1aeeab
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/ioctl.h
@@ -0,0 +1,10 @@
+#ifndef _IOCTL_H
+#define _IOCTL_H
+
+#include <sys/cdefs.h>
+#include <linux/ioctl.h>
+#include <asm/ioctls.h>
+
+int ioctl(int d, int request, ...) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h
new file mode 100644
index 000000000..03faa37ae
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/mman.h
@@ -0,0 +1,25 @@
+#ifndef _SYS_MMAN_H
+#define _SYS_MMAN_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <linux/mman.h>
+
+#define MAP_FAILED ((void *) -1)
+
+extern void *mmap (void *__addr, size_t __len, int __prot,
+ int __flags, int __fd, off_t __offset);
+
+extern int munmap (void *__addr, size_t __len) __THROW;
+extern int mprotect (void *__addr, size_t __len, int __prot) __THROW;
+extern int msync (void *__addr, size_t __len, int __flags) __THROW;
+extern void *mremap (void *__addr, size_t __old_len, size_t __new_len,
+ int __may_move) __THROW;
+extern int mincore (void *__start, size_t __len, unsigned char *__vec);
+
+#ifdef __quad_t
+extern void *mmap64 (void *__addr, size_t __len, int __prot,
+ int __flags, int __fd, off64_t __offset) __THROW;
+#endif
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h
new file mode 100644
index 000000000..1c4368a2f
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/mount.h
@@ -0,0 +1,81 @@
+#ifndef _SYS_MOUNT_H
+#define _SYS_MOUNT_H 1
+
+#include <sys/ioctl.h>
+
+#define BLOCK_SIZE 1024
+#define BLOCK_SIZE_BITS 10
+
+/* These are the fs-independent mount-flags: up to 16 flags are
+ supported */
+enum
+{
+ MS_RDONLY = 1, /* Mount read-only. */
+#define MS_RDONLY MS_RDONLY
+ MS_NOSUID = 2, /* Ignore suid and sgid bits. */
+#define MS_NOSUID MS_NOSUID
+ MS_NODEV = 4, /* Disallow access to device special files. */
+#define MS_NODEV MS_NODEV
+ MS_NOEXEC = 8, /* Disallow program execution. */
+#define MS_NOEXEC MS_NOEXEC
+ MS_SYNCHRONOUS = 16, /* Writes are synced at once. */
+#define MS_SYNCHRONOUS MS_SYNCHRONOUS
+ MS_REMOUNT = 32, /* Alter flags of a mounted FS. */
+#define MS_REMOUNT MS_REMOUNT
+ MS_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
+#define MS_MANDLOCK MS_MANDLOCK
+ S_WRITE = 128, /* Write on file/directory/symlink. */
+#define S_WRITE S_WRITE
+ S_APPEND = 256, /* Append-only file. */
+#define S_APPEND S_APPEND
+ S_IMMUTABLE = 512, /* Immutable file. */
+#define S_IMMUTABLE S_IMMUTABLE
+ MS_NOATIME = 1024, /* Do not update access times. */
+#define MS_NOATIME MS_NOATIME
+ MS_NODIRATIME = 2048, /* Do not update directory access times. */
+#define MS_NODIRATIME MS_NODIRATIME
+ MS_BIND = 4096, /* Bind directory at different place. */
+#define MS_BIND MS_BIND
+};
+
+/* Flags that can be altered by MS_REMOUNT */
+#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK)
+
+
+/* Magic mount flag number. Has to be or-ed to the flag values. */
+
+#define MS_MGC_VAL 0xc0ed0000 /* Magic flag number to indicate "new" flags */
+#define MS_MGC_MSK 0xffff0000 /* Magic flag number mask */
+
+
+/* The read-only stuff doesn't really belong here, but any other place
+ is probably as bad and I don't want to create yet another include
+ file. */
+
+#define BLKROSET _IO(0x12, 93) /* Set device read-only (0 = read-write). */
+#define BLKROGET _IO(0x12, 94) /* Get read-only status (0 = read_write). */
+#define BLKRRPART _IO(0x12, 95) /* Re-read partition table. */
+#define BLKGETSIZE _IO(0x12, 96) /* Return device size. */
+#define BLKFLSBUF _IO(0x12, 97) /* Flush buffer cache. */
+#define BLKRASET _IO(0x12, 98) /* Set read ahead for block device. */
+#define BLKRAGET _IO(0x12, 99) /* Get current read ahead setting. */
+
+
+/* Possible value for FLAGS parameter of `umount2'. */
+enum
+{
+ MNT_FORCE = 1 /* Force unmounting. */
+#define MNT_FORCE MNT_FORCE
+};
+
+
+/* Mount a filesystem. */
+int mount(const char *specialfile, const char *dir, const char *filesystemtype, unsigned long rwflag, const void *data) __THROW;
+
+/* Unmount a filesystem. */
+extern int umount (const char *__special_file) __THROW;
+
+/* Unmount a filesystem. Force unmounting if FLAGS is set to MNT_FORCE. */
+extern int umount2 (const char *__special_file, int __flags) __THROW;
+
+#endif /* _SYS_MOUNT_H */
diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h
new file mode 100644
index 000000000..953fc0eb2
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/resource.h
@@ -0,0 +1,7 @@
+#ifndef _SYS_RESOURCE_H
+#define _SYS_RESOURCE_H
+
+#include <sys/cdefs.h>
+#include <linux/resource.h>
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/select.h
diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h
new file mode 100644
index 000000000..659c88e99
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/socket.h
@@ -0,0 +1,20 @@
+#ifndef _SYS_SOCKET_H
+#define _SYS_SOCKET_H
+
+#include <sys/types.h>
+#include <linux/socket.h>
+
+int socket(int domain, int type, int protocol);
+int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
+int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
+int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
+int recv(int s, void *buf, size_t len, int flags);
+int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
+int recvmsg(int s, struct msghdr *msg, int flags);
+int send(int s, const void *msg, size_t len, int flags);
+int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
+int sendmsg(int s, const struct msghdr *msg, int flags);
+int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
+int getsockname(int s , struct sockaddr * name , socklen_t * namelen );
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h
new file mode 100644
index 000000000..7c3504218
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/stat.h
@@ -0,0 +1,48 @@
+#ifndef _SYS_STAT_H
+#define _SYS_STAT_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#include <linux/stat.h>
+#include <asm/stat.h>
+
+#ifdef __alpha__
+#define __NO_STAT64
+#endif
+
+#define stat(file,buf) __dietstat(file,buf)
+#define fstat(file,buf) __dietfstat(file,buf)
+#define lstat(file,buf) __dietlstat(file,buf)
+
+#define stat64(file,buf) __dietstat64(file,buf)
+#define fstat64(file,buf) __dietfstat64(file,buf)
+#define lstat64(file,buf) __dietlstat64(file,buf)
+
+#define major(dev) (((dev)>>8) & 0xff)
+#define minor(dev) ((dev) & 0xff)
+#define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor)))
+
+extern int __dietstat (const char *__file, struct stat *__buf) __THROW;
+extern int __dietfstat (int __fd, struct stat *__buf) __THROW;
+extern int __dietlstat (const char *__file, struct stat *__buf) __THROW;
+
+#ifndef __NO_STAT64
+extern int __dietstat64 (const char *__file, struct stat64 *__buf) __THROW;
+extern int __dietfstat64 (int __fd, struct stat64 *__buf) __THROW;
+extern int __dietlstat64 (const char *__file, struct stat64 *__buf) __THROW;
+#endif
+
+extern int chmod (const char *__file, mode_t __mode) __THROW;
+
+extern int fchmod (int __fd, mode_t __mode) __THROW;
+
+extern mode_t umask (mode_t __mask) __THROW;
+
+extern int mkdir (const char *__path, mode_t __mode) __THROW;
+
+extern int mknod (const char *__path, mode_t __mode, dev_t __dev) __THROW;
+
+extern int mkfifo (const char *__path, mode_t __mode) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h
new file mode 100644
index 000000000..069d50a83
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/time.h
@@ -0,0 +1,24 @@
+#ifndef _SYS_TIME_H
+#define _SYS_TIME_H 1
+
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <linux/time.h>
+
+#if defined __USE_GNU || defined __USE_BSD
+typedef struct timezone *__timezone_ptr_t;
+#else
+typedef void *__timezone_ptr_t;
+#endif
+
+int getitimer(int which, struct itimerval *value) __THROW;
+int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) __THROW;
+
+int gettimeofday(struct timeval *tv, struct timezone *tz) __THROW;
+int settimeofday(const struct timeval *tv , const struct timezone *tz) __THROW;
+
+extern int adjtime (const struct timeval *__delta,
+ struct timeval *__olddelta) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h
new file mode 100644
index 000000000..34dbaa9f1
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/types.h
@@ -0,0 +1,33 @@
+#ifndef _SYS_TYPES_H
+#define _SYS_TYPES_H
+
+#include <linux/types.h>
+#include <linux/posix_types.h>
+#include <linux/socket.h>
+
+#ifdef __GNUC__
+#define __quad_t __quad_t
+typedef long long int __quad_t;
+typedef unsigned long long int __u_quad_t;
+#else
+#warning no long long support - no 64 bit file I/O support
+typedef long int __quad_t;
+typedef unsigned long int __u_quad_t;
+#endif
+
+
+#ifdef __quad_t
+typedef __quad_t off64_t;
+typedef __u_quad_t ino64_t;
+typedef __quad_t blkcnt64_t;
+#endif
+
+typedef long int fpos_t;
+
+#define socklen_t socklen_t
+typedef unsigned int socklen_t;
+
+typedef long int blksize_t;
+typedef long int blkcnt_t;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/utsname.h b/mdk-stage1/dietlibc/include/sys/utsname.h
new file mode 100644
index 000000000..37bf6c811
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/utsname.h
@@ -0,0 +1,35 @@
+#ifndef _SYS_UTSNAME_H
+#define _SYS_UTSNAME_H 1
+
+#include <sys/cdefs.h>
+
+/* Length of the entries in `struct utsname' is 65. */
+#define _UTSNAME_LENGTH 65
+#define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
+
+/* Linux provides as additional information in the `struct utsname'
+ the name of the current domain. Define _UTSNAME_DOMAIN_LENGTH
+ to a value != 0 to activate this entry. */
+#define _UTSNAME_DOMAIN_LENGTH _UTSNAME_LENGTH
+
+struct utsname {
+ /* Name of the implementation of the operating system. */
+ char sysname[_UTSNAME_LENGTH];
+
+ /* Name of this node on the network. */
+ char nodename[_UTSNAME_NODENAME_LENGTH];
+
+ /* Current release level of this implementation. */
+ char release[_UTSNAME_LENGTH];
+ /* Current version level of this release. */
+ char version[_UTSNAME_LENGTH];
+
+ /* Name of the hardware type the system is running on. */
+ char machine[_UTSNAME_LENGTH];
+
+ /* Name of the domain of this node on the network. */
+ char domainname[_UTSNAME_DOMAIN_LENGTH];
+};
+
+extern int uname (struct utsname *__name) __THROW;
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h
new file mode 100644
index 000000000..e4740a225
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/vfs.h
@@ -0,0 +1,11 @@
+#ifndef _SYS_VFS_H
+#define _SYS_VFS_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <linux/vfs.h>
+
+int statfs(const char *path, struct statfs *buf) __THROW;
+int fstatfs(int fd, struct statfs *buf) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h
new file mode 100644
index 000000000..91b5da348
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/sys/wait.h
@@ -0,0 +1,14 @@
+#ifndef _SYS_WAIT_H
+#define _SYS_WAIT_H
+
+#include <sys/cdefs.h>
+#include <sys/resource.h>
+
+pid_t wait(int *status) __THROW;
+pid_t waitpid(pid_t pid, int *status, int options) __THROW;
+
+pid_t wait3(int *status, int options, struct rusage *rusage) __THROW;
+
+pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h
new file mode 100644
index 000000000..fc297ea19
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/termios.h
@@ -0,0 +1,178 @@
+#ifndef _TERMIOS_H
+#define _TERMIOS_H
+
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+typedef unsigned int tcflag_t;
+
+#define NCCS 32
+struct termios
+ {
+ tcflag_t c_iflag; /* input mode flags */
+ tcflag_t c_oflag; /* output mode flags */
+ tcflag_t c_cflag; /* control mode flags */
+ tcflag_t c_lflag; /* local mode flags */
+ cc_t c_line; /* line discipline */
+ cc_t c_cc[NCCS]; /* control characters */
+ speed_t c_ispeed; /* input speed */
+ speed_t c_ospeed; /* output speed */
+ };
+
+/* c_cc characters */
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VTIME 5
+#define VMIN 6
+#define VSWTC 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VEOL 11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOL2 16
+
+/* c_iflag bits */
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK 0000020
+#define ISTRIP 0000040
+#define INLCR 0000100
+#define IGNCR 0000200
+#define ICRNL 0000400
+#define IUCLC 0001000
+#define IXON 0002000
+#define IXANY 0004000
+#define IXOFF 0010000
+#define IMAXBEL 0020000
+
+/* c_oflag bits */
+#define OPOST 0000001
+#define OLCUC 0000002
+#define ONLCR 0000004
+#define OCRNL 0000010
+#define ONOCR 0000020
+#define ONLRET 0000040
+#define OFILL 0000100
+#define OFDEL 0000200
+#define NLDLY 0000400
+#define NL0 0000000
+#define NL1 0000400
+#define CRDLY 0003000
+#define CR0 0000000
+#define CR1 0001000
+#define CR2 0002000
+#define CR3 0003000
+#define TABDLY 0014000
+#define TAB0 0000000
+#define TAB1 0004000
+#define TAB2 0010000
+#define TAB3 0014000
+#define BSDLY 0020000
+#define BS0 0000000
+#define BS1 0020000
+#define FFDLY 0100000
+#define FF0 0000000
+#define FF1 0100000
+
+#define VTDLY 0040000
+#define VT0 0000000
+#define VT1 0040000
+
+#define XTABS 0014000
+
+/* c_cflag bit meaning */
+#define CBAUD 0010017
+#define B0 0000000 /* hang up */
+#define B50 0000001
+#define B75 0000002
+#define B110 0000003
+#define B134 0000004
+#define B150 0000005
+#define B200 0000006
+#define B300 0000007
+#define B600 0000010
+#define B1200 0000011
+#define B1800 0000012
+#define B2400 0000013
+#define B4800 0000014
+#define B9600 0000015
+#define B19200 0000016
+#define B38400 0000017
+#define EXTA B19200
+#define EXTB B38400
+#define CSIZE 0000060
+#define CS5 0000000
+#define CS6 0000020
+#define CS7 0000040
+#define CS8 0000060
+#define CSTOPB 0000100
+#define CREAD 0000200
+#define PARENB 0000400
+#define PARODD 0001000
+#define HUPCL 0002000
+#define CLOCAL 0004000
+#define CBAUDEX 0010000
+#define B57600 0010001
+#define B115200 0010002
+#define B230400 0010003
+#define B460800 0010004
+#define B500000 0010005
+#define B576000 0010006
+#define B921600 0010007
+#define B1000000 0010010
+#define B1152000 0010011
+#define B1500000 0010012
+#define B2000000 0010013
+#define B2500000 0010014
+#define B3000000 0010015
+#define B3500000 0010016
+#define B4000000 0010017
+#define CIBAUD 002003600000 /* input baud rate (not used) */
+#define CRTSCTS 020000000000 /* flow control */
+
+/* c_lflag bits */
+#define ISIG 0000001
+#define ICANON 0000002
+#define XCASE 0000004
+#define ECHO 0000010
+#define ECHOE 0000020
+#define ECHOK 0000040
+#define ECHONL 0000100
+#define NOFLSH 0000200
+#define TOSTOP 0000400
+#define ECHOCTL 0001000
+#define ECHOPRT 0002000
+#define ECHOKE 0004000
+#define FLUSHO 0010000
+#define PENDIN 0040000
+#define IEXTEN 0100000
+
+/* tcflow() and TCXONC use these */
+#define TCOOFF 0
+#define TCOON 1
+#define TCIOFF 2
+#define TCION 3
+
+/* tcflush() and TCFLSH use these */
+#define TCIFLUSH 0
+#define TCOFLUSH 1
+#define TCIOFLUSH 2
+
+/* tcsetattr uses these */
+#define TCSANOW 0
+#define TCSADRAIN 1
+#define TCSAFLUSH 2
+
+
+#define _IOT_termios /* Hurd ioctl type field. */ \
+ _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2)
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h
new file mode 100644
index 000000000..adc3710a4
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/time.h
@@ -0,0 +1,31 @@
+#ifndef _TIME_H
+#define _TIME_H
+
+#include <sys/cdefs.h>
+#include <sys/time.h>
+
+struct tm
+{
+ int tm_sec; /* Seconds. [0-60] (1 leap second) */
+ int tm_min; /* Minutes. [0-59] */
+ int tm_hour; /* Hours. [0-23] */
+ int tm_mday; /* Day. [1-31] */
+ int tm_mon; /* Month. [0-11] */
+ int tm_year; /* Year - 1900. */
+ int tm_wday; /* Day of week. [0-6] */
+ int tm_yday; /* Days in year.[0-365] */
+ int tm_isdst; /* DST. [-1/0/1]*/
+
+ long int tm_gmtoff; /* Seconds east of UTC. */
+ const char *tm_zone; /* Timezone abbreviation. */
+};
+
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+
+int nanosleep(const struct timespec *req, struct timespec *rem) __THROW;
+unsigned int sleep(unsigned int secs) __THROW;
+
+struct tm *localtime(const time_t *timep) __THROW;
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h
new file mode 100644
index 000000000..a3c863586
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/unistd.h
@@ -0,0 +1,77 @@
+#ifndef _UNISTD_H
+#define _UNISTD_H
+
+#include <dirent.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+const enum {
+ SEEK_SET=0,
+ SEEK_CUR=1,
+ SEEK_END=2
+} __seek_types;
+
+off_t lseek(int fildes, off_t offset, int whence) __THROW;
+
+int chdir(const char *path) __THROW;
+int fchdir(int fd) __THROW;
+int mkdir(const char *pathname, mode_t mode) __THROW;
+int rmdir(const char *pathname) __THROW;
+char *getcwd(char *buf, size_t size) __THROW;
+
+int open(const char* pathname,int flags, ...) __THROW;
+int creat(const char* pathname,mode_t mode) __THROW;
+int write(int fd,const void* buf,size_t len) __THROW;
+int read(int fd,const void* buf,size_t len) __THROW;
+int close(int fd) __THROW;
+
+int pread(int fd, void *buf, size_t count, off_t offset);
+int pwrite(int fd, const void *buf, size_t count, off_t offset);
+
+int execve (const char *filename, char *const argv [], char *const envp[]) __THROW;
+int execl( const char *path, ...);
+int execv (const char *__path, char *const __argv[]) __THROW;
+
+pid_t getpid(void) __attribute__((const)) __THROW;
+pid_t getppid(void) __THROW;
+int kill(pid_t pid, int sig) __THROW;
+
+int mknod(const char *pathname, mode_t mode, dev_t dev) __THROW;
+
+int getdents(unsigned int fd, struct dirent *dirp, unsigned int count) __THROW;
+int getdents64(unsigned int fd, struct dirent64 *dirp, unsigned int count) __THROW;
+
+pid_t fork() __THROW;
+pid_t vfork() __THROW;
+
+int readlink(const char *path, char *buf, size_t bufsiz) __THROW;
+int symlink(const char *oldpath, const char *newpath) __THROW;
+int link(const char *oldpath, const char *newpath) __THROW;
+int unlink (const char *__name) __THROW;
+
+int chown(const char *path, uid_t owner, gid_t group) __THROW;
+int fchown(int fd, uid_t owner, gid_t group) __THROW;
+int lchown(const char *path, uid_t owner, gid_t group) __THROW;
+
+char *ttyname (int desc) __THROW;
+
+int brk(void *end_data_segment) __THROW;
+void *sbrk(ptrdiff_t increment) __THROW;
+
+int gethostname(char *name, size_t len) __THROW;
+
+/* Values for the second argument to access.
+ These may be OR'd together. */
+#define R_OK 4 /* Test for read permission. */
+#define W_OK 2 /* Test for write permission. */
+#define X_OK 1 /* Test for execute permission. */
+#define F_OK 0 /* Test for existence. */
+
+int access (char *__name, int __type) __THROW;
+
+int dup2 (int __fd, int __fd2) __THROW;
+
+pid_t setsid (void) __THROW;
+
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/utime.h b/mdk-stage1/dietlibc/include/utime.h
new file mode 100644
index 000000000..41674f379
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/utime.h
@@ -0,0 +1,16 @@
+#ifndef _UTIME_H
+#define _UTIME_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <time.h>
+
+struct utimbuf {
+ time_t actime; /* access time */
+ time_t modtime; /* modification time */
+};
+
+int utime(const char *filename, struct utimbuf *buf) __THROW;
+
+
+#endif
diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h
new file mode 100644
index 000000000..2f598257c
--- /dev/null
+++ b/mdk-stage1/dietlibc/include/utmp.h
@@ -0,0 +1,72 @@
+#ifndef _UTMP_H
+#define _UTMP_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <time.h>
+
+#define UT_LINESIZE 32
+#define UT_NAMESIZE 32
+#define UT_HOSTSIZE 256
+
+#define _PATH_UTMP "/var/run/utmp"
+#define _PATH_WTMP "/var/log/wtmp"
+
+/* The structure describing an entry in the database of
+ previous logins. */
+struct lastlog
+ {
+ time_t ll_time;
+ char ll_line[UT_LINESIZE];
+ char ll_host[UT_HOSTSIZE];
+ };
+
+/* The structure describing the status of a terminated process. This
+ type is used in `struct utmp' below. */
+struct exit_status
+ {
+ short int e_termination; /* Process termination status. */
+ short int e_exit; /* Process exit status. */
+ };
+
+/* The structure describing an entry in the user accounting database. */
+struct utmp
+{
+ short int ut_type; /* Type of login. */
+ pid_t ut_pid; /* Process ID of login process. */
+ char ut_line[UT_LINESIZE]; /* Devicename. */
+ char ut_id[4]; /* Inittab ID. */
+ char ut_user[UT_NAMESIZE]; /* Username. */
+ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
+ struct exit_status ut_exit; /* Exit status of a process marked
+ as DEAD_PROCESS. */
+ long int ut_session; /* Session ID, used for windowing. */
+ struct timeval ut_tv; /* Time entry was made. */
+ int32_t ut_addr_v6[4]; /* Internet address of remote host. */
+ char __unused[20]; /* Reserved for future use. */
+};
+
+/* Values for the `ut_type' field of a `struct utmp'. */
+#define EMPTY 0 /* No valid user accounting information. */
+
+#define RUN_LVL 1 /* The system's runlevel. */
+#define BOOT_TIME 2 /* Time of system boot. */
+#define NEW_TIME 3 /* Time after system clock changed. */
+#define OLD_TIME 4 /* Time when system clock changed. */
+
+#define INIT_PROCESS 5 /* Process spawned by the init process. */
+#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
+#define USER_PROCESS 7 /* Normal process. */
+#define DEAD_PROCESS 8 /* Terminated process. */
+
+#define ACCOUNTING 9
+
+/* Tell the user that we have a modern system with UT_HOST, UT_PID,
+ UT_TYPE, UT_ID and UT_TV fields. */
+#define _HAVE_UT_TYPE 1
+#define _HAVE_UT_PID 1
+#define _HAVE_UT_ID 1
+#define _HAVE_UT_TV 1
+#define _HAVE_UT_HOST 1
+
+#endif
diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c
new file mode 100644
index 000000000..def091f16
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__dtostr.c
@@ -0,0 +1,82 @@
+/* convert double to string. Helper for sprintf. */
+
+int __dtostr(double d,char *buf,int maxlen,int prec) {
+ unsigned long long *x=(unsigned long long *)&d;
+ /* step 1: extract sign, mantissa and exponent */
+ signed int s=*x>>63;
+ signed long e=((*x>>52)&((1<<11)-1))-1023;
+/* unsigned long long m=*x & ((1ull<<52)-1); */
+ /* step 2: exponent is base 2, compute exponent for base 10 */
+ signed long e10=1+(long)(e*0.30102999566398119802); /* log10(2) */
+ /* step 3: calculate 10^e10 */
+ int i;
+ double tmp=10.0;
+ char *oldbuf=buf;
+ int initial=1;
+
+ if (s) { d=-d; *buf='-'; --maxlen; buf++; }
+ if ((i=e10)>=0) {
+ while (i>10) { tmp=tmp*1e10; i-=10; }
+ while (i>1) { tmp=tmp*10; --i; }
+ } else {
+ i=(e10=-e10);
+ while (i>10) { tmp=tmp*1e-10; i-=10; }
+ while (i>1) { tmp=tmp/10; --i; }
+ }
+ while (d/tmp<1) {
+ --e10;
+ tmp/=10.0;
+ }
+ /* step 4: see if precision is sufficient to display all digits */
+ if (e10>prec) {
+ /* use scientific notation */
+ int len=__dtostr(d/tmp,buf,maxlen,prec);
+ if (len==0) return 0;
+ maxlen-=len; buf+=len;
+ if (--maxlen>=0) {
+ *buf='e';
+ ++buf;
+ }
+ for (len=1000; len>0; len/=10) {
+ if (e10>=len || !initial) {
+ if (--maxlen>=0) {
+ *buf=(e10/len)+'0';
+ ++buf;
+ }
+ initial=0;
+ e10=e10%len;
+ }
+ }
+ if (maxlen>=0) return buf-oldbuf;
+ return 0;
+ }
+ /* step 5: loop through the digits, inserting the decimal point when
+ * appropriate */
+ for (; prec>0; ) {
+ double tmp2=d/tmp;
+ char c;
+ d-=((int)tmp2*tmp);
+ c=((int)tmp2);
+ if ((!initial)||c) {
+ if (--maxlen>=0) {
+ initial=0;
+ *buf=c+'0';
+ ++buf;
+ } else
+ return 0;
+ --prec;
+ }
+ if (tmp>0.5 && tmp<1.5) {
+ tmp=1e-1;
+ initial=0;
+ if (--maxlen>=0) {
+ *buf='.';
+ ++buf;
+ } else
+ return 0;
+ } else
+ tmp/=10.0;
+ }
+ *buf=0;
+ return buf-oldbuf;
+}
diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c
new file mode 100644
index 000000000..f53dcfb80
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__lltostr.c
@@ -0,0 +1,34 @@
+#include <string.h>
+
+static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
+
+int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase)
+{
+ char *tmp;
+ int j=0;
+
+ s[--size]=0;
+
+ tmp=s+size;
+
+ if ((base==0)||(base>36)) base=10;
+
+ j=0;
+ if (!i)
+ {
+ *(--tmp)='0';
+ j=1;
+ }
+
+ while((tmp>s)&&(i))
+ {
+ tmp--;
+ *tmp=num[i%base];
+ if ((UpCase)&&(*tmp>96)) (*tmp)-=' ';
+ i=i/base;
+ j++;
+ }
+ memmove(s,tmp,j+1);
+
+ return j;
+}
diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c
new file mode 100644
index 000000000..b2ebeb074
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__ltostr.c
@@ -0,0 +1,34 @@
+#include <string.h>
+
+static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
+
+int __ltostr(char *s, int size, unsigned long i, int base, char UpCase)
+{
+ char *tmp;
+ int j=0;
+
+ s[--size]=0;
+
+ tmp=s+size;
+
+ if ((base==0)||(base>36)) base=10;
+
+ j=0;
+ if (!i)
+ {
+ *(--tmp)='0';
+ j=1;
+ }
+
+ while((tmp>s)&&(i))
+ {
+ tmp--;
+ *tmp=num[i%base];
+ if ((UpCase)&&(*tmp>96)) (*tmp)-=' ';
+ i=i/base;
+ j++;
+ }
+ memmove(s,tmp,j+1);
+
+ return j;
+}
diff --git a/mdk-stage1/dietlibc/lib/__xmknod.c b/mdk-stage1/dietlibc/lib/__xmknod.c
new file mode 100644
index 000000000..4739a1f5f
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/__xmknod.c
@@ -0,0 +1,6 @@
+#include <sys/stat.h>
+
+int __xmknod(int ver,char* filename,mode_t mode,dev_t *dev) {
+ return mknod(filename,mode,*dev);
+}
+
diff --git a/mdk-stage1/dietlibc/lib/_brk.c b/mdk-stage1/dietlibc/lib/_brk.c
new file mode 100644
index 000000000..6d0b29c03
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/_brk.c
@@ -0,0 +1,14 @@
+#include <unistd.h>
+
+extern int __diet_brk(void *end_data_segment);
+
+void* __curbrk=0;
+
+int __brk(void *end_data_segment) {
+ int res;
+ if ((res=__diet_brk(end_data_segment))==0)
+ __curbrk=end_data_segment;
+ return res;
+}
+
+int brk (void *end_data_segment) __attribute__((weak,alias("__brk")));
diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c
new file mode 100644
index 000000000..e6374c5ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/abort.c
@@ -0,0 +1,14 @@
+#include <linux/types.h>
+#include <linux/signal.h>
+#include <signal.h>
+
+extern int exit(int code) __attribute__ ((noreturn));
+
+void abort() {
+ sigset_t t;
+ if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT))
+ sigprocmask(SIG_UNBLOCK, &t, 0);
+ while (1)
+ if (raise(SIGABRT))
+ exit(127);
+}
diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c
new file mode 100644
index 000000000..a7ae824eb
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/accept.c
@@ -0,0 +1,14 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int accept(int a, void * addr, void * addr2) {
+#ifdef __i386__
+ return socketcall(SYS_ACCEPT, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) addr, (long) addr2 };
+ return socketcall(SYS_ACCEPT, args);
+#endif
+}
+
+int __libc_accept(int a, void * addr, void * addr2) __attribute__((weak,alias("accept")));
diff --git a/mdk-stage1/dietlibc/lib/alarm.c b/mdk-stage1/dietlibc/lib/alarm.c
new file mode 100644
index 000000000..fd35372f2
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/alarm.c
@@ -0,0 +1,47 @@
+/* Copyright (C) 1991, 1992, 1994, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <unistd.h>
+#include <sys/time.h>
+
+/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM.
+ If SECONDS is zero, any currently scheduled alarm will be cancelled.
+ The function returns the number of seconds remaining until the last
+ alarm scheduled would have signaled, or zero if there wasn't one.
+ There is no return value to indicate an error, but you can set `errno'
+ to 0 and check its value after calling `alarm', and this might tell you.
+ The signal may come late due to processor scheduling. */
+unsigned int
+alarm (seconds)
+ unsigned int seconds;
+{
+ struct itimerval old, new;
+ unsigned int retval;
+
+ new.it_interval.tv_usec = 0;
+ new.it_interval.tv_sec = 0;
+ new.it_value.tv_usec = 0;
+ new.it_value.tv_sec = (long int) seconds;
+ if (setitimer (ITIMER_REAL, &new, &old) < 0)
+ return 0;
+
+ retval = old.it_value.tv_sec;
+ if (old.it_value.tv_usec)
+ ++retval;
+ return retval;
+}
diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c
new file mode 100644
index 000000000..7e3bedc74
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/alloc.c
@@ -0,0 +1,217 @@
+/*
+ * malloc/free by O.Dreesen
+ */
+
+#include <linux/unistd.h>
+#include <asm/mman.h>
+#include <linux/errno.h>
+
+#if 0
+#include <sys/mman.h>
+#define _LIBC
+#include <errno.h>
+#endif
+
+#include <linux/types.h>
+
+#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
+#define MAP_ANON MAP_ANONYMOUS
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void*)-1)
+#endif
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+extern void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
+extern void *memset(void *s, int c, size_t n);
+extern void *memcpy(void *dest, const void *src, size_t n);
+
+typedef struct t_alloc_head {
+ struct t_alloc_head *ptr;
+ unsigned long size;
+} alloc_head;
+
+/* guess what ? the virtual block size */
+#define MEM_BLOCK_SIZE 4096
+
+/* minimum allocated bytes */
+#define MEM_ALLOC_MIN 4
+
+/* Initial start position in memory */
+#define MEM_ALLOC_START ((char*)0x18000000)
+
+/* Make every block align */
+#define MEM_ALIGN(s) (((s)+MEM_ALLOC_MIN-1)&(~(MEM_ALLOC_MIN-1)))
+#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(~(MEM_BLOCK_SIZE-1)))
+#define PAGE_ALIGNP(p) ((char*)PAGE_ALIGN((size_t)(p)))
+
+#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size)))
+#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head)))
+#define START_DATA(p) (((char*)(p))+sizeof(alloc_head))
+#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN)
+
+/* freelist handler */
+static alloc_head base = {&base,0};
+static char *alloc_get_end = MEM_ALLOC_START;
+
+void free(void *ptr)
+{
+ alloc_head *prev,*p,*block;
+
+ if (ptr==NULL) return;
+
+ block=START_BLOCK(ptr);
+ prev=&base;
+ for (p=prev->ptr ; ; prev=p, p=p->ptr)
+ {
+ if ((block>prev)&&(block<p)) break; /* found the gap block belongs */
+ if ((prev>p)&&(block<p)) break; /* block pre freelist */
+ if ((prev>p)&&(block>prev)) break; /* block after freelist */
+
+ /* emergency escape: freelist has ONLY one entry the freelist base */
+ if (p->ptr==p) break;
+ }
+ prev->ptr = block;
+
+ if (END_OF_BLOCK(block)==p)
+ { /* join right neighbor */
+ block->ptr = p->ptr;
+ block->size += p->size;
+ }
+ else
+ block->ptr = p;
+
+ if (END_OF_BLOCK(prev)==block)
+ { /* join left neighbor */
+ prev->size += block->size;
+ prev->ptr = block->ptr;
+ }
+}
+
+static void *alloc_get_mem(unsigned long size)
+{
+ char *tmp;
+ alloc_head *ah;
+
+ size=PAGE_ALIGN(size);
+
+ /* map free pages @ alloc_get_end */
+ tmp=mmap(alloc_get_end, size, PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0);
+ if (tmp==MAP_FAILED)
+ {
+ /* OK we can't map free pages @ alloc_get_end so try free position */
+ tmp=mmap(0, size, PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ if (tmp==MAP_FAILED)
+ {
+ errno = ENOMEM;
+ return NULL; /* PANIC ! */
+ }
+ alloc_get_end=tmp;
+ }
+
+ alloc_get_end+=size;
+
+ /* make a header */
+ ah=(alloc_head*)tmp;
+ ah->ptr=ah;
+ ah->size=size;
+
+ /* link new free maped pages in freelist */
+ free(START_DATA(tmp));
+
+ return &base;
+}
+
+void *malloc(size_t size)
+{
+ alloc_head *p, *prev;
+ size_t need;
+
+ /* needed MEM_ALLOC_MIN */
+ need=MIN_ALLOC(size);
+
+ prev=&base;
+ for (p=prev->ptr;;prev=p,p=p->ptr)
+ {
+ if (p->size>=need)
+ {
+ if (p->size==need)
+ { /* fit PERFECT */
+ prev->ptr=p->ptr; /* relink freelist */
+ }
+ else
+ {
+ alloc_head *tmp=(alloc_head*)(((char*)p)+need);
+
+ prev->ptr=tmp;
+ tmp->ptr=p->ptr;
+ tmp->size=p->size-need; /* remaining size */
+
+ p->size=need; /* set size */
+ }
+ p->ptr=p; /* self-link */
+
+ return (void*)START_DATA(p);
+ }
+ else if (p==&base)
+ {
+ if ((p=alloc_get_mem(need))==NULL) return NULL;
+ }
+ }
+ return NULL;
+}
+
+void *calloc(size_t nmemb,size_t size)
+{
+ size_t n=nmemb*size;
+ void *tmp=malloc(n);
+ if (tmp) memset(tmp,0,n);
+ return tmp;
+}
+
+void *realloc(void *ptr,size_t size)
+{
+ alloc_head *tmp=0,*tf=0;
+ long need=0;
+ long diff=0;
+
+ if (ptr)
+ {
+ if (size)
+ {
+ tmp=START_BLOCK(ptr);
+ need=MIN_ALLOC(size); /* only this size will survive */
+ diff=tmp->size-need;
+ if (diff<0)
+ {
+ if ((tf=malloc(size)))
+ {
+ memcpy(tf,ptr,tmp->size-sizeof(alloc_head));
+ free(ptr);
+ return tf;
+ }
+ return NULL;
+ }
+ if (diff>0)
+ {
+ tmp->size=need;
+ tf=END_OF_BLOCK(tmp);
+ tf->ptr=tf;
+ tf->size=diff;
+ free(START_DATA(tf));
+ }
+ return ptr;
+ }
+ else
+ free(ptr);
+ }
+ else if (size>0)
+ return malloc(size);
+ return NULL;
+}
diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c
new file mode 100644
index 000000000..caa70ef5b
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/assert_fail.c
@@ -0,0 +1,27 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+
+void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function)
+{
+ int alen=strlen(assertion);
+ int flen=strlen(file);
+ int fulen=strlen(function);
+ char *buf=(char*)alloca(alen+flen+fulen+50);
+ if (buf) {
+ char *tmp;
+ *buf=0;
+ if (file) strcat(strcat(buf,file),":");
+ tmp=buf+strlen(buf);
+ __ltostr(tmp,10,line,10,0);
+ strcat(buf,": ");
+ if (function) strcat(strcat(buf,function),": ");
+ strcat(buf,"Assertion `");
+ strcat(buf,assertion);
+ strcat(buf,"' failed.\n");
+ write(2,buf,strlen(buf));
+ }
+ abort();
+}
diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c
new file mode 100644
index 000000000..2b644bf49
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/atexit.c
@@ -0,0 +1,23 @@
+typedef void (*function)(void);
+
+static function __atexitlist[4];
+
+int atexit(function t) {
+ int i;
+ for (i=0; i<4; i++)
+ if (__atexitlist[i]==0) {
+ __atexitlist[i]=t;
+ return 0;
+ }
+ return -1;
+}
+
+extern void _exit(int code) __attribute__((noreturn));
+
+void exit(int code) {
+ if (__atexitlist[0]) __atexitlist[0]();
+ if (__atexitlist[1]) __atexitlist[1]();
+ if (__atexitlist[2]) __atexitlist[2]();
+ if (__atexitlist[3]) __atexitlist[3]();
+ _exit(code);
+}
diff --git a/mdk-stage1/dietlibc/lib/atof.c b/mdk-stage1/dietlibc/lib/atof.c
new file mode 100644
index 000000000..4839e5152
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/atof.c
@@ -0,0 +1,5 @@
+#include <stdlib.h>
+
+double atof(const char *nptr) {
+ return strtod(nptr,0);
+}
diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c
new file mode 100644
index 000000000..fe952b8c4
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/atoi.c
@@ -0,0 +1,8 @@
+int atoi(const char* s) {
+ int v=0;
+ int sign=1;
+ if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s;
+ while (*s && (*s>='0') && (*s<='9'))
+ v=v*10+*s++-'0';
+ return v*sign;
+}
diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c
new file mode 100644
index 000000000..558a004b9
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/atol.c
@@ -0,0 +1,8 @@
+long int atol(const char* s) {
+ long int v=0;
+ int sign=1;
+ if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s;
+ while (*s && (*s>='0') && (*s<='9'))
+ v=v*10+*s++-'0';
+ return v*sign;
+}
diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c
new file mode 100644
index 000000000..ec1c93e1b
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/bind.c
@@ -0,0 +1,12 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int bind(int a, void * b, int c) {
+#ifdef __i386__
+ return socketcall(SYS_BIND, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c };
+ return socketcall(SYS_BIND, args);
+#endif
+}
diff --git a/mdk-stage1/dietlibc/lib/cfgetospeed.c b/mdk-stage1/dietlibc/lib/cfgetospeed.c
new file mode 100644
index 000000000..4e392a239
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/cfgetospeed.c
@@ -0,0 +1,6 @@
+#include <termios.h>
+#include <sys/types.h>
+
+speed_t cfgetospeed(struct termios *termios_p) {
+ return termios_p->c_ospeed;
+}
diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c
new file mode 100644
index 000000000..c8d834f3b
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/closedir.c
@@ -0,0 +1,28 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#undef _POSIX_PTHREADS
+#include "dirstream.h"
+
+#undef closedir
+int closedir(DIR * dir)
+{
+ int fd;
+
+ if (!dir) {
+ errno = EBADF;
+ return -1;
+ }
+
+ /* We need to check dd_fd. */
+ if (dir->dd_fd == -1)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ fd = dir->dd_fd;
+ dir->dd_fd = -1;
+ free(dir->dd_buf);
+ free(dir);
+ return close(fd);
+}
diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c
new file mode 100644
index 000000000..f7f4f1ed7
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/connect.c
@@ -0,0 +1,14 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int connect(int a, void * b, int c) {
+#ifdef __i386__
+ return socketcall(SYS_CONNECT, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c };
+ return socketcall(SYS_CONNECT, args);
+#endif
+}
+
+int __libc_connect(int a, void * b, int c) __attribute__((weak,alias("connect")));
diff --git a/mdk-stage1/dietlibc/lib/creat64.c b/mdk-stage1/dietlibc/lib/creat64.c
new file mode 100644
index 000000000..923c1baaa
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/creat64.c
@@ -0,0 +1,5 @@
+#include <fcntl.h>
+
+int creat64(const char *file,mode_t mode) {
+ return open64(file,O_WRONLY|O_CREAT|O_TRUNC,mode);
+}
diff --git a/mdk-stage1/dietlibc/lib/errlist.c b/mdk-stage1/dietlibc/lib/errlist.c
new file mode 100644
index 000000000..d0e712190
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/errlist.c
@@ -0,0 +1,132 @@
+
+const char *const sys_errlist[] = {
+ "Success", /* 0 */
+ "Operation not permitted", /* EPERM */
+ "No such file or directory", /* ENOENT */
+ "No such process", /* ESRCH */
+ "Interrupted system call", /* EINTR */
+ "I/O error", /* EIO */
+ "No such device or address", /* ENXIO */
+ "Arg list too long", /* E2BIG */
+ "Exec format error", /* ENOEXEC */
+ "Bad file number", /* EBADF */
+ "No child processes", /* ECHILD */
+ "Try again", /* EAGAIN */
+ "Out of memory", /* ENOMEM */
+ "Permission denied", /* EACCES */
+ "Bad address", /* EFAULT */
+ "Block device required", /* ENOTBLK */
+ "Device or resource busy", /* EBUSY */
+ "File exists", /* EEXIST */
+ "Cross-device link", /* EXDEV */
+ "No such device", /* ENODEV */
+ "Not a directory", /* ENOTDIR */
+ "Is a directory", /* EISDIR */
+ "Invalid argument", /* EINVAL */
+ "File table overflow", /* ENFILE */
+ "Too many open files", /* EMFILE */
+ "Not a typewriter", /* ENOTTY */
+ "Text file busy", /* ETXTBSY */
+ "File too large", /* EFBIG */
+ "No space left on device", /* ENOSPC */
+ "Illegal seek", /* ESPIPE */
+ "Read-only file system", /* EROFS */
+ "Too many links", /* EMLINK */
+ "Broken pipe", /* EPIPE */
+ "Math argument out of domain of func", /* EDOM */
+ "Math result not representable", /* ERANGE */
+ "Resource deadlock would occur", /* EDEADLK */
+ "File name too long", /* ENAMETOOLONG */
+ "No record locks available", /* ENOLCK */
+ "Function not implemented", /* ENOSYS */
+ "Directory not empty", /* ENOTEMPTY */
+ "Too many symbolic links encountered", /* ELOOP */
+ "Operation would block", /* EWOULDBLOCK */
+ "No message of desired type", /* ENOMSG */
+ "Identifier removed", /* EIDRM */
+ "Channel number out of range", /* ECHRNG */
+ "Level 2 not synchronized", /* EL2NSYNC */
+ "Level 3 halted", /* EL3HLT */
+ "Level 3 reset", /* EL3RST */
+ "Link number out of range", /* ELNRNG */
+ "Protocol driver not attached", /* EUNATCH */
+ "No CSI structure available", /* ENOCSI */
+ "Level 2 halted", /* EL2HLT */
+ "Invalid exchange", /* EBADE */
+ "Invalid request descriptor", /* EBADR */
+ "Exchange full", /* EXFULL */
+ "No anode", /* ENOANO */
+ "Invalid request code", /* EBADRQC */
+ "Invalid slot", /* EBADSLT */
+ "File locking deadlock error", /* EDEADLOCK */
+ "Bad font file format", /* EBFONT */
+ "Device not a stream", /* ENOSTR */
+ "No data available", /* ENODATA */
+ "Timer expired", /* ETIME */
+ "Out of streams resources", /* ENOSR */
+ "Machine is not on the network", /* ENONET */
+ "Package not installed", /* ENOPKG */
+ "Object is remote", /* EREMOTE */
+ "Link has been severed", /* ENOLINK */
+ "Advertise error", /* EADV */
+ "Srmount error", /* ESRMNT */
+ "Communication error on send", /* ECOMM */
+ "Protocol error", /* EPROTO */
+ "Multihop attempted", /* EMULTIHOP */
+ "RFS specific error", /* EDOTDOT */
+ "Not a data message", /* EBADMSG */
+ "Value too large for defined data type", /* EOVERFLOW */
+ "Name not unique on network", /* ENOTUNIQ */
+ "File descriptor in bad state", /* EBADFD */
+ "Remote address changed", /* EREMCHG */
+ "Can not access a needed shared library", /* ELIBACC */
+ "Accessing a corrupted shared library", /* ELIBBAD */
+ ".lib section in a.out corrupted", /* ELIBSCN */
+ "Attempting to link in too many shared libraries", /* ELIBMAX */
+ "Cannot exec a shared library directly", /* ELIBEXEC */
+ "Illegal byte sequence", /* EILSEQ */
+ "Interrupted system call should be restarted", /* ERESTART */
+ "Streams pipe error", /* ESTRPIPE */
+ "Too many users", /* EUSERS */
+ "Socket operation on non-socket", /* ENOTSOCK */
+ "Destination address required", /* EDESTADDRREQ */
+ "Message too long", /* EMSGSIZE */
+ "Protocol wrong type for socket", /* EPROTOTYPE */
+ "Protocol not available", /* ENOPROTOOPT */
+ "Protocol not supported", /* EPROTONOSUPPORT */
+ "Socket type not supported", /* ESOCKTNOSUPPORT */
+ "Operation not supported on transport endpoint", /* EOPNOTSUPP */
+ "Protocol family not supported", /* EPFNOSUPPORT */
+ "Address family not supported by protocol", /* EAFNOSUPPORT */
+ "Address already in use", /* EADDRINUSE */
+ "Cannot assign requested address", /* EADDRNOTAVAIL */
+ "Network is down", /* ENETDOWN */
+ "Network is unreachable", /* ENETUNREACH */
+ "Network dropped connection because of reset", /* ENETRESET */
+ "Software caused connection abort", /* ECONNABORTED */
+ "Connection reset by peer", /* ECONNRESET */
+ "No buffer space available", /* ENOBUFS */
+ "Transport endpoint is already connected", /* EISCONN */
+ "Transport endpoint is not connected", /* ENOTCONN */
+ "Cannot send after transport endpoint shutdown", /* ESHUTDOWN */
+ "Too many references: cannot splice", /* ETOOMANYREFS */
+ "Connection timed out", /* ETIMEDOUT */
+ "Connection refused", /* ECONNREFUSED */
+ "Host is down", /* EHOSTDOWN */
+ "No route to host", /* EHOSTUNREACH */
+ "Operation already in progress", /* EALREADY */
+ "Operation now in progress", /* EINPROGRESS */
+ "Stale NFS file handle", /* ESTALE */
+ "Structure needs cleaning", /* EUCLEAN */
+ "Not a XENIX named type file", /* ENOTNAM */
+ "No XENIX semaphores available", /* ENAVAIL */
+ "Is a named type file", /* EISNAM */
+ "Remote I/O error", /* EREMOTEIO */
+ "Quota exceeded", /* EDQUOT */
+ "No medium found", /* ENOMEDIUM */
+ "Wrong medium type", /* EMEDIUMTYPE */
+ 0
+};
+
+
+const int sys_nerr = ((sizeof (sys_errlist))/(sizeof(char *))-1);
diff --git a/mdk-stage1/dietlibc/lib/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c
new file mode 100644
index 000000000..286f833c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/errno_location.c
@@ -0,0 +1,5 @@
+extern int errno;
+
+int *__errno_location() { return &errno; }
+
+int *errno_location() __attribute__((weak,alias("__errno_location")));
diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c
new file mode 100644
index 000000000..ae28fb850
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/execl.c
@@ -0,0 +1,24 @@
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+
+int execl( const char *path, ...) {
+ va_list ap;
+ int n,i;
+ char **argv,*tmp;
+ va_start(ap, path);
+ n=1;
+ while ((tmp=va_arg(ap,char *)))
+ ++n;
+ va_end (ap);
+ if ((argv=(char **)alloca(n*sizeof(char*)))) {
+ va_start(ap, path);
+ for (i=0; i<n; ++i)
+ argv[i]=va_arg(ap,char *);
+ va_end (ap);
+ return execve(path,argv,environ);
+ }
+ __set_errno(ENOMEM);
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c
new file mode 100644
index 000000000..809252990
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/execvp.c
@@ -0,0 +1,55 @@
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <paths.h>
+#include <errno.h>
+
+extern char **environ;
+
+static int exec_shell(const char *file, char *const argv[]) {
+ int i;
+
+ for (i = 0; argv[i]; i++);
+
+ if (1) {
+ char *shell_argv[i + 1];
+ shell_argv[0] = _PATH_BSHELL;
+ shell_argv[1] = (char *) file;
+ for (; i > 1; i--)
+ shell_argv[i] = argv[i - 1];
+ return execve(_PATH_BSHELL, shell_argv, environ);
+ }
+}
+
+int execvp(const char *file, char *const argv[]) {
+ char *path=getenv("PATH");
+ char *cur,*next;
+ char buf[PATH_MAX];
+ if (strchr((char*)file,'/')) {
+ if (execve(file,argv,environ)==-1) {
+ if (errno==ENOEXEC) exec_shell(file,argv);
+ return -1;
+ }
+ }
+ if (!path) path=_PATH_DEFPATH;
+ for (cur=path; cur; cur=next) {
+ next=strchr(cur,':');
+ if (!next)
+ next=cur+strlen(cur);
+ if (next==cur) {
+ buf[0]='.';
+ cur--;
+ } else
+ memmove(buf,cur,next-cur);
+ buf[next-cur]='/';
+ memmove(&buf[next-cur+1],file,strlen(file)+1);
+ if (execve(buf,argv,environ)==-1) {
+ if (errno==ENOEXEC) return exec_shell(buf,argv);
+ if ((errno!=EACCES) && (errno!=ENOENT)) return -1;
+ }
+ if (*next==0) break;
+ next++;
+ }
+ return -1;
+}
diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c
new file mode 100644
index 000000000..a3c04af9a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/ftw.c
@@ -0,0 +1,52 @@
+#include <linux/stat.h>
+#include <unistd.h>
+#include <limits.h>
+#include <ftw.h>
+#include <dirent.h>
+#include <string.h>
+#include <stdlib.h>
+
+int ftw(const char *dir,int (*fn)(const char *file, const struct stat *sb, int flag), int depth) {
+ char *cwd;
+ int cwdlen;
+ DIR *d;
+ struct dirent *de;
+ struct stat sb;
+ if (chdir(dir)) return -1;
+ cwd=alloca(PATH_MAX+1);
+ if (!getcwd(cwd,PATH_MAX)) return -1;
+ cwd[PATH_MAX]=0;
+ cwdlen=strlen(cwd);
+/* write(1,"ftw in ",7); puts(cwd); */
+ if (!(d=opendir("."))) return -1;
+ while ((de=readdir(d))) {
+ int res;
+ int flag;
+ int nlen;
+ char *filename;
+ if (de->d_name[0]=='.' &&
+ (de->d_name[1]==0 ||
+ (de->d_name[1]=='.' && de->d_name[2]==0))) continue;
+ nlen=strlen(de->d_name);
+ filename=alloca(nlen+cwdlen+3);
+ memmove(filename,cwd,cwdlen);
+ filename[cwdlen]='/';
+ memmove(filename+cwdlen+1,de->d_name,nlen+1);
+ if (!lstat(de->d_name,&sb)) {
+ if (S_ISLNK(sb.st_mode)) flag=FTW_SL; else
+ if (S_ISDIR(sb.st_mode)) flag=FTW_D; else
+ flag=FTW_F;
+ } else
+ flag=FTW_NS;
+ res=fn(filename,&sb,flag);
+ if (res) return res;
+ if (flag==FTW_D && depth>0) {
+ res=ftw(filename,fn,depth-1);
+ chdir(dir);
+ if (res) return res;
+ }
+/* puts(de->d_name); */
+ }
+ closedir(d);
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c
new file mode 100644
index 000000000..2554fe4c3
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getdomainname.c
@@ -0,0 +1,17 @@
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+#include <sys/utsname.h>
+
+int getdomainname(char *name,size_t len) {
+ struct utsname u;
+ int res=uname(&u);
+ if (res==0) {
+ int i;
+ if (len>=_UTSNAME_DOMAIN_LENGTH)
+ len=_UTSNAME_DOMAIN_LENGTH;
+ for (i=0; i<len; i++)
+ name[i]=u.domainname[i];
+ }
+ return res;
+}
diff --git a/mdk-stage1/dietlibc/lib/getenv.c b/mdk-stage1/dietlibc/lib/getenv.c
new file mode 100644
index 000000000..fc37e9927
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getenv.c
@@ -0,0 +1,17 @@
+#include <string.h>
+
+extern char **environ;
+
+extern char *getenv(const char *s)
+{
+ int i;
+ unsigned int len;
+
+ if (!environ || !s) return 0;
+ len = strlen(s);
+ for (i = 0;environ[i];++i)
+ if ((memcmp(environ[i],s,len)==0) && (environ[i][len] == '='))
+ return environ[i] + len + 1;
+ return 0;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c
new file mode 100644
index 000000000..ccc0fbc8e
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/gethostname.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE
+
+#include <sys/types.h>
+#include <sys/utsname.h>
+
+int gethostname(char *name,size_t len) {
+ struct utsname u;
+ int res=uname(&u);
+ if (res==0) {
+ int i;
+ if (len>=_UTSNAME_NODENAME_LENGTH)
+ len=_UTSNAME_NODENAME_LENGTH;
+ for (i=0; i<len; i++)
+ name[i]=u.nodename[i];
+ }
+ return res;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/getpeername.c b/mdk-stage1/dietlibc/lib/getpeername.c
new file mode 100644
index 000000000..8adcddf55
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getpeername.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int getpeername(int a, void * b, int c) {
+#ifdef __i386__
+ return socketcall(SYS_GETPEERNAME, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c };
+ return socketcall(SYS_GETPEERNAME, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/getservent.c b/mdk-stage1/dietlibc/lib/getservent.c
new file mode 100644
index 000000000..ee6a77c21
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getservent.c
@@ -0,0 +1,141 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <string.h>
+
+static int servicesfd=-1;
+static char* servicesmap;
+static unsigned int serviceslen;
+
+static char* aliases[10];
+
+static char *cur;
+
+static inline int isalpha(char c) {
+ return (c>='a' && c<='z') || (c>='A' && c<='Z');
+}
+
+static inline int isdigit(char c) {
+ return (c>='0' && c<='9');
+}
+
+static inline int isalnum(char c) {
+ return isalpha(c) || isdigit(c);
+}
+
+static inline int isblank(char c) {
+ return (c==' ' || c=='\t');
+}
+
+/* nameserver 42/tcp name # IEN 116 */
+struct servent *getservent(void) {
+ static struct servent se;
+ char *last;
+ int aliasidx;
+ if (servicesfd<0) {
+ servicesfd=open("/etc/services",O_RDONLY);
+ if (servicesfd<0) return 0;
+ serviceslen=lseek(servicesfd,0,SEEK_END);
+ servicesmap=mmap(0,serviceslen,PROT_READ|PROT_WRITE,MAP_PRIVATE,servicesfd,0);
+ if ((long)servicesmap==(-1)) goto error;
+ cur=servicesmap;
+ }
+ last=servicesmap+serviceslen;
+again:
+ se.s_name=0;
+ se.s_aliases=aliases; aliases[0]=0;
+ se.s_port=0;
+ se.s_proto=0;
+ if (cur>=last) return 0;
+ if (*cur=='#' || *cur=='\n') goto parseerror;
+ /* first, the primary name */
+ if (!isalpha(*cur)) goto parseerror;
+ se.s_name=cur;
+ se.s_aliases=aliases;
+ while (cur<last && isalnum(*cur)) cur++;
+ if (cur>=last) return 0;
+ if (*cur=='\n') goto parseerror;
+ *cur=0; cur++;
+ /* second, the port */
+ while (cur<last && isblank(*cur)) cur++;
+ while (cur<last && isdigit(*cur)) {
+ se.s_port=se.s_port*10+*cur-'0';
+ cur++;
+ }
+ se.s_port=htons(se.s_port);
+ if (cur>=last) return 0;
+ /* third, "/tcp" or "/udp" */
+ if (*cur!='/') goto parseerror;
+ cur++;
+ se.s_proto=cur;
+ while (cur<last && isalpha(*cur)) cur++;
+ if (cur>=last) return 0;
+ if (*cur=='\n') { *cur++=0; return &se; }
+ *cur=0; cur++;
+ /* now the aliases */
+ for (aliasidx=0;aliasidx<10;aliasidx++) {
+ while (cur<last && isblank(*cur)) cur++;
+ aliases[aliasidx]=cur;
+ while (cur<last && isalpha(*cur)) cur++;
+ if (cur>=last || !isblank(*cur)) break;
+ if (*cur=='\n') { *cur++=0; break; }
+ *cur++=0;
+ }
+ aliases[aliasidx]=0;
+ return &se;
+parseerror:
+ while (cur<last && *cur!='\n') cur++;
+ cur++;
+ goto again;
+error:
+ if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen);
+ if (servicesfd!=-1) close(servicesfd);
+ servicesmap=(char*)-1;
+ servicesfd=-1;
+ errno=ENOMEM;
+ return 0;
+}
+
+struct servent *getservbyname(const char *name, const char *proto) {
+ struct servent *s;
+ for (s=getservent(); s; s=getservent()) {
+ char **tmp;
+#if 0
+ write(1,"found ",6);
+ write(1,s->s_name,strlen(s->s_name));
+ write(1,"/",1);
+ write(1,s->s_proto,strlen(s->s_proto));
+ write(1,"\n",1);
+#endif
+ if (!strcmp(name,s->s_name) && !strcmp(proto,s->s_proto))
+ return s;
+ tmp=s->s_aliases;
+ while (*tmp)
+ if (!strcmp(name,*tmp++)) return s;
+ }
+ return 0;
+}
+
+struct servent *getservbyport(int port, const char *proto) {
+ struct servent *s;
+ for (s=getservent(); s; s=getservent()) {
+ if (port==s->s_port && !strcmp(proto,s->s_proto))
+ return s;
+ }
+ return 0;
+}
+
+void setservent(int stayopen) {
+ cur=servicesmap;
+}
+
+void endservent(void) {
+ if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen);
+ if (servicesfd!=-1) close(servicesfd);
+ servicesmap=(char*)-1;
+ servicesfd=-1;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/getsockname.c b/mdk-stage1/dietlibc/lib/getsockname.c
new file mode 100644
index 000000000..61a3ea24a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getsockname.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int getsockname(int a, void * b, int c) {
+#ifdef __i386__
+ return socketcall(SYS_GETSOCKNAME, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c };
+ return socketcall(SYS_GETSOCKNAME, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c
new file mode 100644
index 000000000..8c0a57557
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/getsockopt.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int getsockopt(int a, int b, int c, void *d, int e) {
+#ifdef __i386__
+ return socketcall(SYS_GETSOCKOPT, (long*)&a);
+#else
+ unsigned long args[] = { a, b, c, (long)d, e };
+ return socketcall(SYS_GETSOCKOPT, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c
new file mode 100644
index 000000000..92a43f937
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/htons.c
@@ -0,0 +1,12 @@
+#include <asm/byteorder.h>
+
+#undef htons
+#ifdef __i386__
+unsigned short int htons(unsigned short int netshort) {
+ return ___arch__swab16(netshort);
+}
+#else
+unsigned short int htons(unsigned short int netshort) {
+ return netshort;
+}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c
new file mode 100644
index 000000000..e683755f6
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/if_indextoname.c
@@ -0,0 +1,29 @@
+#include <linux/if.h>
+#include <linux/net.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+
+#ifndef SOCK_DGRAM
+#define SOCK_DGRAM 2
+#endif
+
+char* if_indextoname(unsigned int interface,char* blub) {
+ struct ifreq ifr;
+ int fd;
+
+ fd=socket(AF_INET6,SOCK_DGRAM,0);
+ if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
+ ifr.ifr_ifindex=interface;
+ if (ioctl(fd,SIOCGIFNAME,&ifr)==0) {
+ int i;
+ close(fd);
+ for (i=0; i<IFNAMSIZ-1; i++)
+ if (!(blub[i]=ifr.ifr_name[i]))
+ return blub;
+ blub[i]=0;
+ return blub;
+ }
+ close(fd);
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/if_nametoindex.c b/mdk-stage1/dietlibc/lib/if_nametoindex.c
new file mode 100644
index 000000000..5923963b1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/if_nametoindex.c
@@ -0,0 +1,27 @@
+#include <linux/if.h>
+#include <linux/net.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+
+#ifndef SOCK_DGRAM
+#define SOCK_DGRAM 2
+#endif
+
+int if_nametoindex(char* blub) {
+ struct ifreq ifr;
+ int fd;
+ char *tmp;
+ int len=sizeof(ifr.ifr_name);
+ fd=socket(AF_INET6,SOCK_DGRAM,0);
+ if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
+ for (tmp=ifr.ifr_name; len>0; --len) {
+ if ((*tmp++=*blub++)==0) break;
+ }
+ if (ioctl(fd,SIOCGIFINDEX,&ifr)==0) {
+ close(fd);
+ return ifr.ifr_ifindex;
+ }
+ close(fd);
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c
new file mode 100644
index 000000000..19e5151d5
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isalnum.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+int isalnum(int c) {
+ return isalpha(c) || isdigit(c);
+}
+
diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c
new file mode 100644
index 000000000..db04c3fae
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isalpha.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+inline int isalpha(int c) {
+ return (c>='a' && c<='z') || (c>='A' && c<='Z');
+}
+
diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c
new file mode 100644
index 000000000..e627efb41
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isascii.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+inline int isascii(int c) {
+ return (c & 0x80) == 0;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c
new file mode 100644
index 000000000..b31609720
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isatty.c
@@ -0,0 +1,20 @@
+#define ioctl libc_ioctl
+#include <termios.h>
+#undef ioctl
+#include <sys/ioctl.h>
+
+extern int errno;
+
+int isatty(int fd)
+{
+ int save;
+ int is_tty;
+ struct termios term;
+
+ save = errno;
+ is_tty = ioctl(fd, TCGETS, &term) == 0;
+ errno = save;
+
+ return is_tty;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c
new file mode 100644
index 000000000..034e543b1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isblank.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+int isblank(int ch)
+{
+ return ((ch==' ')||(ch=='\t'));
+}
diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c
new file mode 100644
index 000000000..734eb5197
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isdigit.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+inline int isdigit(int c) {
+ return (c>='0' && c<='9');
+}
+
diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c
new file mode 100644
index 000000000..ab39e81bc
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/isspace.c
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+int isspace(int ch)
+{
+ return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n'));
+}
diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c
new file mode 100644
index 000000000..56a51be06
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/listen.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int listen(int a, int b) {
+#ifdef __i386__
+ return socketcall(SYS_LISTEN, (long*)&a);
+#else
+ unsigned long args[] = { a, b, 0 };
+ return socketcall(SYS_LISTEN, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c
new file mode 100644
index 000000000..2b1d004ef
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/lockf.c
@@ -0,0 +1,37 @@
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+int lockf(int fd, int cmd, off_t len) {
+ struct flock fl;
+ fl.l_whence=SEEK_CUR;
+ fl.l_start=0;
+ fl.l_len=len;
+ fl.l_pid=0;
+ switch (cmd) {
+ case F_TEST:
+ if (fcntl(fd,F_GETLK,&fl)<0)
+ return -1;
+ if (fl.l_type == F_UNLCK || fl.l_pid == getpid ())
+ return 0;
+ errno=EACCES;
+ return -1;
+ case F_ULOCK:
+ fl.l_type=F_UNLCK;
+ cmd=F_SETLK;
+ break;
+ case F_LOCK:
+ fl.l_type = F_WRLCK;
+ cmd = F_SETLKW;
+ break;
+ case F_TLOCK:
+ fl.l_type = F_WRLCK;
+ cmd = F_SETLK;
+ break;
+ default:
+ errno=EINVAL;
+ return -1;
+ }
+ return fcntl(fd,cmd,&fl);
+}
diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c
new file mode 100644
index 000000000..d0a5719c1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/longjmp.c
@@ -0,0 +1,51 @@
+/* Copyright (C) 1991, 92, 94, 95, 97, 98 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* #include <stddef.h> */
+#include <setjmp.h>
+#include <signal.h>
+
+extern int __sigprocmask(int how,void* set,void* oldset);
+extern void __longjmp(void* env, int val);
+
+/*
+extern void _longjmp_unwind (jmp_buf env, int val);
+*/
+/* Set the signal mask to the one specified in ENV, and jump
+ to the position specified in ENV, causing the setjmp
+ call there to return VAL, or 1 if VAL is 0. */
+void __siglongjmp (sigjmp_buf env, int val)
+{
+ /* Perform any cleanups needed by the frames being unwound. */
+ /*
+ _longjmp_unwind (env, val);
+ */
+
+ if (env[0].__mask_was_saved)
+ /* Restore the saved signal mask. */
+ (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
+ (sigset_t *) NULL);
+
+ /* Call the machine-dependent function to restore machine state. */
+ __longjmp (env[0].__jmpbuf, val ?: 1);
+}
+
+void siglongjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
+void longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
+void _longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
+void __libc_longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp")));
diff --git a/mdk-stage1/dietlibc/lib/memccmp.c b/mdk-stage1/dietlibc/lib/memccmp.c
new file mode 100644
index 000000000..3a8c14f60
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memccmp.c
@@ -0,0 +1,17 @@
+#define _POSIX_SOURCE
+#define _XOPEN_SOURCE
+#include <sys/types.h>
+
+int memccmp(const void *dst, const void *src, int c, size_t count)
+{
+ register const char *a = dst;
+ register const char *b = src;
+ while (count--)
+ {
+ register int res=(*a - *b);
+ if (res) return res;
+ if (*a==c) return 0;
+ ++a; ++b;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/memccpy.c b/mdk-stage1/dietlibc/lib/memccpy.c
new file mode 100644
index 000000000..6d6ac98ab
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memccpy.c
@@ -0,0 +1,19 @@
+#define _POSIX_SOURCE
+#define _XOPEN_SOURCE
+#include <sys/types.h>
+
+void *memccpy(void *dst, const void *src, int c, size_t count)
+{
+ char *a = dst;
+ const char *b = src;
+ while (count--)
+ {
+ *a++ = *b;
+ if (*b==c)
+ {
+ return (void *)a;
+ }
+ b++;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c
new file mode 100644
index 000000000..93d81328a
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memchr.c
@@ -0,0 +1,9 @@
+#include <sys/types.h>
+
+char *memchr(const char *s, int c, size_t n) {
+ int i;
+ for (i=n; i; --i)
+ if (*s++==c)
+ return (char*)s;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c
new file mode 100644
index 000000000..8bce6c975
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memcmp.c
@@ -0,0 +1,14 @@
+#include <sys/types.h>
+
+int memcmp(const void *dst, const void *src, size_t count) {
+ register int r;
+ register const char *d=dst;
+ register const char *s=src;
+ while (count--) {
+ if ((r=(*d - *s)))
+ return r;
+ ++d;
+ ++s;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c
new file mode 100644
index 000000000..0c688b509
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memcpy.c
@@ -0,0 +1,12 @@
+#include <sys/types.h>
+
+void* memcpy(void* dst, const void* src, size_t count) {
+ register char *d=dst;
+ register const char *s=src;
+ ++count; /* this actually produces better code than using count-- */
+ while (--count) {
+ *d = *s;
+ ++d; ++s;
+ }
+ return dst;
+}
diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c
new file mode 100644
index 000000000..7adb2be91
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memmove.c
@@ -0,0 +1,23 @@
+#define _POSIX_SOURCE
+#define _XOPEN_SOURCE
+#include <sys/types.h>
+
+void *memmove(void *dst, const void *src, size_t count)
+{
+ char *a = dst;
+ const char *b = src;
+ if (src!=dst)
+ {
+ if (src>dst)
+ {
+ while (count--) *a++ = *b++;
+ }
+ else
+ {
+ a+=count-1;
+ b+=count-1;
+ while (count--) *a-- = *b--;
+ }
+ }
+ return dst;
+}
diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c
new file mode 100644
index 000000000..5f9ae49ee
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/memset.c
@@ -0,0 +1,9 @@
+#include <sys/types.h>
+
+void * memset(void * dst, int s, size_t count) {
+ register char * a = dst;
+ count++; /* this actually creates smaller code than using count-- */
+ while (--count)
+ *a++ = s;
+ return dst;
+}
diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c
new file mode 100644
index 000000000..97659490c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/mkfifo.c
@@ -0,0 +1,6 @@
+#include <linux/stat.h>
+#include <unistd.h>
+
+int mkfifo(char *fn,int mode) {
+ return mknod(fn,S_IFIFO|mode,0);
+}
diff --git a/mdk-stage1/dietlibc/lib/nop.c b/mdk-stage1/dietlibc/lib/nop.c
new file mode 100644
index 000000000..623278dee
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/nop.c
@@ -0,0 +1,7 @@
+
+int __fflush_stdin() __attribute__((weak,alias("__nop")));
+int __fflush_stdout() __attribute__((weak,alias("__nop")));
+int __fflush_stderr() __attribute__((weak,alias("__nop")));
+
+/* used for weak aliases */
+int __nop() { return 0; }
diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c
new file mode 100644
index 000000000..cab7e992e
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/open64.c
@@ -0,0 +1,11 @@
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <unistd.h>
+
+#ifdef O_LARGEFILE
+int open64(const char* file,int oflag,int mode) {
+ return open(file,oflag|O_LARGEFILE,mode);
+}
+
+int __libc_open64(const char* file,int oflag,int mode) __attribute__((weak,alias("open64")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c
new file mode 100644
index 000000000..05c0b9bc8
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/opendir.c
@@ -0,0 +1,63 @@
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#undef _POSIX_PTHREADS
+#include <errno.h>
+
+#include "dirstream.h"
+
+#ifndef O_DIRECTORY
+#define O_DIRECTORY 0200000 /* must be a directory */
+#endif
+
+/*
+ * opendir just makes an open() call - it return NULL if it fails
+ * (open sets errno), otherwise it returns a DIR * pointer.
+ */
+#undef opendir
+DIR *
+opendir(const char * name)
+{
+ int fd;
+ struct stat statbuf;
+ struct dirent *buf;
+ DIR *ptr;
+
+ /*
+ if (stat(name,&statbuf)) return NULL;
+ if (!S_ISDIR(statbuf.st_mode)) {
+ errno = ENOTDIR;
+ return NULL;
+ }
+ */
+ if ((fd = open(name,O_RDONLY|O_DIRECTORY)) < 0)
+ return NULL;
+ /* According to POSIX, directory streams should be closed when
+ * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>.
+ */
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
+ return NULL;
+ if (!(ptr=malloc(sizeof(*ptr)))) {
+ close(fd);
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ ptr->dd_max = statbuf.st_blksize;
+ if (ptr->dd_max < 512)
+ ptr->dd_max = 512;
+
+ if (!(buf=malloc(ptr->dd_max))) {
+ close(fd);
+ free(ptr);
+ errno = ENOMEM;
+ return NULL;
+ }
+ ptr->dd_fd = fd;
+ ptr->dd_nextoff = ptr->dd_nextloc = ptr->dd_size = 0;
+ ptr->dd_buf = buf;
+ ptr->dd_getdents = unknown;
+ return ptr;
+}
diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c
new file mode 100644
index 000000000..5476d76a1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/perror.c
@@ -0,0 +1,16 @@
+#include <unistd.h>
+#include <string.h>
+
+extern char *sys_errlist[];
+extern int sys_nerr;
+extern int errno;
+
+void perror(const char *s) {
+ register char *message="[unknown error]";
+ write(2,s,strlen(s));
+ write(2,": ",2);
+ if (errno>=0 && errno<sys_nerr)
+ message=sys_errlist[errno];
+ write(2,message,strlen(message));
+ write(2,"\n",1);
+}
diff --git a/mdk-stage1/dietlibc/lib/pread.c b/mdk-stage1/dietlibc/lib/pread.c
new file mode 100644
index 000000000..b922aa93e
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/pread.c
@@ -0,0 +1,10 @@
+#include <endian.h>
+#include <sys/types.h>
+
+extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b);
+
+size_t __libc_pread(int fd, void *buf, size_t count, off_t offset) {
+ return __pread(fd,buf,count,offset,0);
+}
+
+int pread(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread")));
diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c
new file mode 100644
index 000000000..e6ba4d103
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/pread64.c
@@ -0,0 +1,13 @@
+#include <endian.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef __NO_STAT64
+extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b);
+
+size_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset) {
+ return __pread(fd,buf,count,__LONG_LONG_PAIR (offset&0xffffffff,offset>>32));
+}
+
+int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64")));
+#endif
diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c
new file mode 100644
index 000000000..274b16b0e
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/putenv.c
@@ -0,0 +1,37 @@
+#include <stdlib.h>
+#include <string.h>
+
+int putenv(const char *string) {
+ int len;
+ int envc;
+ char *tmp;
+ const char **ep;
+ char **newenv;
+ static char **origenv=0;
+ if (!origenv) origenv=environ;
+ if (!(tmp=strchr(string,'=')))
+ len=strlen(string);
+ else
+ len=tmp-string+1;
+ for (envc=0, ep=(const char**)environ; *ep; ++ep) {
+ if (!memcmp(string,*ep,len)) { /* found */
+ if (!tmp) {
+ for (; ep[1]; ++ep) ep[0]=ep[1];
+ ep[0]=0;
+ return 0;
+ }
+ *ep=string;
+ return 0;
+ }
+ ++envc;
+ }
+ if (tmp) {
+ newenv=(char**)malloc((envc+2)*sizeof(char*));
+ if (!newenv) return -1;
+ newenv[0]=(char*)string;
+ memcpy(newenv+1,environ,(envc+1)*sizeof(char*));
+ if (environ!=origenv) free(environ);
+ environ=newenv;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/puts.c b/mdk-stage1/dietlibc/lib/puts.c
new file mode 100644
index 000000000..01f6e50c4
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/puts.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+#include <string.h>
+
+int puts(const char *s) {
+ return write(1,s,strlen(s)) && write(1,"\n",1);
+}
diff --git a/mdk-stage1/dietlibc/lib/raise.c b/mdk-stage1/dietlibc/lib/raise.c
new file mode 100644
index 000000000..606546034
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/raise.c
@@ -0,0 +1,8 @@
+#include <linux/types.h>
+#include <unistd.h>
+#include <signal.h>
+#include "syscalls.h"
+
+int raise(int sig) {
+ return kill(getpid(),sig);
+}
diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c
new file mode 100644
index 000000000..5accd32a1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/readdir.c
@@ -0,0 +1,83 @@
+#if 0
+
+Sorry, currently broken
+
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirstream.h"
+
+#ifdef __ELF__
+#pragma weak readdir = __libc_readdir
+#endif
+
+struct dirent *
+__libc_readdir(DIR * dir)
+{
+ int result;
+ struct dirent *de;
+
+ if (!dir) {
+ errno = EBADF;
+ return NULL;
+ }
+
+ /* Are we running an old kernel? */
+ if (dir->dd_getdents == no_getdents)
+ {
+ abort();
+ }
+
+ if (dir->dd_size <= dir->dd_nextloc)
+ {
+ /* read dir->dd_max bytes of directory entries. */
+ result=getdents(dir->dd_fd,dir->dd_buf,dir->dd_max);
+
+ /* We assume we have getdents (). */
+ dir->dd_getdents = have_getdents;
+ if (result <= 0)
+ {
+ result = -result;
+ if (result > 0)
+ {
+ /* Are we right? */
+ if (result == ENOSYS)
+ {
+ dir->dd_getdents = no_getdents;
+ abort();
+ }
+ errno = result;
+ }
+
+ return NULL;
+ }
+
+ dir->dd_size = result;
+ dir->dd_nextloc = 0;
+ }
+
+ de = (struct dirent *) (((char *)dir->dd_buf) + dir->dd_nextloc);
+
+ /* Am I right? H.J. */
+ dir->dd_nextloc += de->d_reclen;
+
+ /* We have to save the next offset here. */
+ dir->dd_nextoff = de->d_off;
+
+ /* convert */
+ dir->convbuf.d_ino=de->d_ino;
+ dir->convbuf.d_off=de->d_off;
+ dir->convbuf.d_reclen=de->d_reclen;
+ dir->convbuf.d_type=0;
+ if (strlen((char*)&de->d_type)>10)
+ de->d_name[10]=0;
+ strcpy(dir->convbuf.d_name,(char*)&de->d_type);
+ errno=0;
+
+ return &dir->convbuf;
+}
+
+#endif
diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c
new file mode 100644
index 000000000..cc778712c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/recv.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int recv(int a, const void * b, size_t c, int flags) {
+#ifdef __i386__
+ return socketcall(SYS_RECV,(long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c, flags };
+ return socketcall(SYS_RECV, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c
new file mode 100644
index 000000000..a07afe7ad
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/recvfrom.c
@@ -0,0 +1,12 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) {
+#ifdef __i386__
+ return socketcall(SYS_RECVFROM, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c, flags, (long) to, (long) tolen };
+ return socketcall(SYS_RECVFROM, args);
+#endif
+}
diff --git a/mdk-stage1/dietlibc/lib/rewind.c b/mdk-stage1/dietlibc/lib/rewind.c
new file mode 100644
index 000000000..48434a316
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/rewind.c
@@ -0,0 +1,6 @@
+#include <dietstdio.h>
+#include <unistd.h>
+
+void rewind( FILE *stream) {
+ fseek(stream, 0L, SEEK_SET);
+}
diff --git a/mdk-stage1/dietlibc/lib/rewinddir.c b/mdk-stage1/dietlibc/lib/rewinddir.c
new file mode 100644
index 000000000..138936527
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/rewinddir.c
@@ -0,0 +1,17 @@
+#include <unistd.h>
+#include <errno.h>
+
+#include "dirstream.h"
+
+/*
+ * rewinddir() just does an lseek(fd,0,0) - see close for comments
+ */
+void rewinddir(DIR * dir)
+{
+ if (!dir) {
+ errno = EBADF;
+ return;
+ }
+ lseek(dir->dd_fd,0,SEEK_SET);
+ dir->dd_nextoff = dir->dd_nextloc = dir->dd_size = 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c
new file mode 100644
index 000000000..945ad5a16
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sbrk.c
@@ -0,0 +1,20 @@
+#include <unistd.h>
+
+extern int __brk(void *end_data_segment);
+
+extern void* __curbrk;
+
+void* __sbrk(ptrdiff_t increment) {
+ void* oldbrk;
+ if (__curbrk==0)
+ if (__brk(0) < 0)
+ return (void*)-1;
+ if (increment==0)
+ return __curbrk;
+ oldbrk=__curbrk;
+ if (__brk(oldbrk+increment)<0)
+ return (void*)-1;
+ return oldbrk;
+}
+
+void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk")));
diff --git a/mdk-stage1/dietlibc/lib/seekdir.c b/mdk-stage1/dietlibc/lib/seekdir.c
new file mode 100644
index 000000000..f83052250
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/seekdir.c
@@ -0,0 +1,15 @@
+#include <unistd.h>
+#include <errno.h>
+
+#include "dirstream.h"
+
+#undef seekdir
+void seekdir(DIR * dir, off_t offset)
+{
+ if (!dir) {
+ errno = EBADF;
+ return;
+ }
+ dir->dd_nextoff = lseek(dir->dd_fd, offset, SEEK_SET);
+ dir->dd_size = dir->dd_nextloc = 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c
new file mode 100644
index 000000000..be43b4e63
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/send.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int send(int a, const void * b, size_t c, int flags) {
+#ifdef __i386__
+ return socketcall(SYS_SEND, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c, flags };
+ return socketcall(SYS_SEND, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c
new file mode 100644
index 000000000..e6c2560f3
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sendto.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) {
+#ifdef __i386__
+ return socketcall(SYS_SENDTO, (long*)&a);
+#else
+ unsigned long args[] = { a, (long) b, c, flags, (long) to, tolen };
+ return socketcall(SYS_SENDTO, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/set_errno.c b/mdk-stage1/dietlibc/lib/set_errno.c
new file mode 100644
index 000000000..6553bc496
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/set_errno.c
@@ -0,0 +1,9 @@
+extern int errno;
+
+void __set_errno(int error) __attribute__ ((weak));
+
+void __set_errno(int error)
+{
+ errno=error;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c
new file mode 100644
index 000000000..781e9c31c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/setsockopt.c
@@ -0,0 +1,13 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int setsockopt(int a, int b, int c, void *d, void *e) {
+#ifdef __i386__
+ return socketcall(SYS_SETSOCKOPT, (long*)&a);
+#else
+ unsigned long args[] = { a, b, c, (long)d, (long) e };
+ return socketcall(SYS_SETSOCKOPT, args);
+#endif
+}
+
diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c
new file mode 100644
index 000000000..0c9d95c28
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigaddset.c
@@ -0,0 +1,21 @@
+#define __USE_EXTERN_INLINES 1
+#include <signal.h>
+
+# define __sigmask(sig) \
+ (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
+
+# define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned long int)))
+
+# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
+typedef struct
+ {
+ unsigned long int __val[_SIGSET_NWORDS];
+ } __sigset_t;
+
+int __sigaddset(__sigset_t *set, int signo) {
+ unsigned long int __mask = __sigmask (signo);
+ unsigned long int __word = __sigword (signo);
+ return ((set->__val[__word] |= __mask), 0);
+}
+
+int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset")));
diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c
new file mode 100644
index 000000000..f4532f96e
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigemptyset.c
@@ -0,0 +1,14 @@
+#define __USE_EXTERN_INLINES 1
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+
+int sigemptyset(sigset_t *set) {
+ if (set==NULL) {
+ __set_errno(EINVAL);
+ return -1;
+ }
+ memset(set,0,sizeof(*set));
+ return 0;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c
new file mode 100644
index 000000000..d7db58fd2
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sigjmp.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+
+/* This function is called by the `sigsetjmp' macro
+ before doing a `__setjmp' on ENV[0].__jmpbuf.
+ Always return zero. */
+
+int
+__sigjmp_save (sigjmp_buf env, int savemask)
+{
+ env[0].__mask_was_saved = (savemask &&
+ sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
+ (sigset_t*)&env[0].__saved_mask) == 0);
+
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/sleep.c b/mdk-stage1/dietlibc/lib/sleep.c
new file mode 100644
index 000000000..ec5b99533
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sleep.c
@@ -0,0 +1,11 @@
+#include <linux/time.h>
+#include <time.h>
+
+unsigned int sleep(unsigned int secs) {
+ struct timespec t;
+ t.tv_sec=secs;
+ t.tv_nsec=0;
+ nanosleep(&t,&t);
+ return secs-t.tv_sec;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c
new file mode 100644
index 000000000..096c06115
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/snprintf.c
@@ -0,0 +1,14 @@
+#include <stdarg.h>
+#include <sys/types.h>
+
+int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+
+int snprintf(char *str,size_t size,const char *format,...)
+{
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vsnprintf(str,size,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c
new file mode 100644
index 000000000..1684a6a2b
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/socket.c
@@ -0,0 +1,12 @@
+#include <linux/net.h>
+
+extern int socketcall(int callno,long* args);
+
+int socket(int a, int b, int c) {
+#ifdef __i386__
+ return socketcall(SYS_SOCKET, (long*)&a);
+#else
+ unsigned long args[] = { a, b, c };
+ return socketcall(SYS_SOCKET, args);
+#endif
+}
diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c
new file mode 100644
index 000000000..f1b554ce2
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <linux/types.h>
+#include <stdlib.h>
+
+int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+
+int sprintf(char *dest,const char *format,...)
+{
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vsnprintf(dest,1000000,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c
new file mode 100644
index 000000000..341e74bba
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sscanf.c
@@ -0,0 +1,13 @@
+#include <stdarg.h>
+
+int vsscanf(const char *str, const char *format, va_list arg_ptr);
+
+int sscanf(const char *str, const char *format, ...)
+{
+ int n;
+ va_list arg_ptr;
+ va_start(arg_ptr, format);
+ n=vsscanf(str,format,arg_ptr);
+ va_end (arg_ptr);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/strcat.c b/mdk-stage1/dietlibc/lib/strcat.c
new file mode 100644
index 000000000..8a755afea
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strcat.c
@@ -0,0 +1,18 @@
+#include "dietfeatures.h"
+#include <string.h>
+
+char* strcat(register char* s,register const char* t)
+{
+ char *dest=s;
+ s+=strlen(s);
+ for (;;) {
+ if (!(*s = *t)) break; ++s; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ if (!(*s = *t)) break; ++s; ++t;
+ if (!(*s = *t)) break; ++s; ++t;
+ if (!(*s = *t)) break; ++s; ++t;
+#endif
+ }
+ return dest;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c
new file mode 100644
index 000000000..b908853f8
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strchr.c
@@ -0,0 +1,16 @@
+#include "dietfeatures.h"
+
+char *strchr(register const char *t, int c) {
+ register char ch;
+
+ ch = c;
+ for (;;) {
+ if (*t == ch) break; if (!*t) return 0; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ if (*t == ch) break; if (!*t) return 0; ++t;
+ if (*t == ch) break; if (!*t) return 0; ++t;
+ if (*t == ch) break; if (!*t) return 0; ++t;
+#endif
+ }
+ return (char*)t;
+}
diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c
new file mode 100644
index 000000000..0db324e66
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strcmp.c
@@ -0,0 +1,16 @@
+#include "dietfeatures.h"
+
+int strcmp(register const char *s,register const char *t) {
+ register char x;
+
+ for (;;) {
+ x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
+ x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
+ x = *s; if (x != *t) break; if (!x) break; ++s; ++t;
+#endif
+ }
+ return ((int)(unsigned int)(unsigned char) x)
+ - ((int)(unsigned int)(unsigned char) *t);
+}
diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c
new file mode 100644
index 000000000..49693c30d
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strcpy.c
@@ -0,0 +1,15 @@
+#include "dietfeatures.h"
+
+char* strcpy(register char* s,register const char* t)
+{
+ char *dest=s;
+ for (;;) {
+ if (!(*s = *t)) return dest; ++s; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ if (!(*s = *t)) return dest; ++s; ++t;
+ if (!(*s = *t)) return dest; ++s; ++t;
+ if (!(*s = *t)) return dest; ++s; ++t;
+#endif
+ }
+}
+
diff --git a/mdk-stage1/dietlibc/lib/strcspn.c b/mdk-stage1/dietlibc/lib/strcspn.c
new file mode 100644
index 000000000..37053c72c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strcspn.c
@@ -0,0 +1,17 @@
+#include <sys/types.h>
+#include <string.h>
+
+size_t strcspn(const char *s, const char *reject)
+{
+ size_t l=0;
+ int a=1,i,al=strlen(reject);
+
+ while((a)&&(*s))
+ {
+ for(i=0;(a)&&(i<al);i++)
+ if (*s==reject[i]) a=0;
+ if (a) l++;
+ s++;
+ }
+ return l;
+}
diff --git a/mdk-stage1/dietlibc/lib/strdup.c b/mdk-stage1/dietlibc/lib/strdup.c
new file mode 100644
index 000000000..6a2ea5f95
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strdup.c
@@ -0,0 +1,9 @@
+#include <string.h>
+#include <stdlib.h>
+
+char *strdup(const char *s) {
+ char *tmp=(char *)malloc(strlen(s)+1);
+ if (!tmp) return 0;
+ strcpy(tmp,s);
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c
new file mode 100644
index 000000000..f15b86aae
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strerror.c
@@ -0,0 +1,10 @@
+#include <string.h>
+
+extern char *sys_errlist[];
+extern int sys_nerr;
+
+char *strerror(int errnum) {
+ if (errnum>=0 && errnum<sys_nerr)
+ return sys_errlist[errnum];
+ return "[unknown error]";
+}
diff --git a/mdk-stage1/dietlibc/lib/strlcat.c b/mdk-stage1/dietlibc/lib/strlcat.c
new file mode 100644
index 000000000..fd35ec8af
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strlcat.c
@@ -0,0 +1,72 @@
+/* $OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $ */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * 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. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <string.h>
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left). At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(initial dst) + strlen(src); if retval >= siz,
+ * truncation occurred.
+ */
+size_t strlcat(dst, src, siz)
+ char *dst;
+ const char *src;
+ size_t siz;
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+ size_t dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (*d != '\0' && n-- != 0)
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return(dlen + strlen(s));
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return(dlen + (s - src)); /* count does not include NUL */
+}
diff --git a/mdk-stage1/dietlibc/lib/strlcpy.c b/mdk-stage1/dietlibc/lib/strlcpy.c
new file mode 100644
index 000000000..b935b9527
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strlcpy.c
@@ -0,0 +1,68 @@
+/* $OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $ */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * 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. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <string.h>
+
+/*
+ * Copy src to string dst of size siz. At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t strlcpy(dst, src, siz)
+ char *dst;
+ const char *src;
+ size_t siz;
+{
+ register char *d = dst;
+ register const char *s = src;
+ register size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c
new file mode 100644
index 000000000..56c085dac
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strlen.c
@@ -0,0 +1,47 @@
+#include <endian.h>
+#include "dietfeatures.h"
+#include <string.h>
+
+#ifdef WANT_SMALL_STRING_ROUTINES
+size_t strlen(const char *s) {
+ register int i;
+ if (!s) return 0;
+ for (i=0; *s; ++s) ++i;
+ return i;
+}
+#else
+static const unsigned long magic = 0x01010101;
+
+size_t strlen(const char *s)
+{
+ const char *t = s;
+ unsigned long word;
+
+ if (!s) return 0;
+
+ /* Byte compare up until word boundary */
+ for (; ((unsigned long) t & 3); t++)
+ if (!*t) return t - s;
+
+ /* Word compare */
+ do {
+ word = *((unsigned long *) t); t += 4;
+ word = (word - magic) &~ word;
+ word &= (magic << 7);
+ } while (word == 0);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* word & 0x80808080 == word */
+ word = (word - 1) & (magic << 10);
+ word += (word << 8) + (word << 16);
+ t += word >> 26;
+#else
+ if ((word & 0x80800000) == 0) {
+ word <<= 16;
+ t += 2;
+ }
+ if ((word & 0x80000000) == 0) t += 1;
+#endif
+ return ((const char *) t) - 4 - s;
+}
+#endif
diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c
new file mode 100644
index 000000000..1d3b94ca5
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strncat.c
@@ -0,0 +1,19 @@
+#include "dietfeatures.h"
+#include <string.h>
+
+char *strncat(char *s, const char *t, size_t n) {
+ char *dest=s;
+ register char *max=s+n-1;
+ s+=strlen(s);
+ for (;;) {
+ if (!(*s = *t)) break; if (++s==max) break; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ if (!(*s = *t)) break; if (++s==max) break; ++t;
+ if (!(*s = *t)) break; if (++s==max) break; ++t;
+ if (!(*s = *t)) break; if (++s==max) break; ++t;
+#endif
+ }
+ *s=0;
+ return dest;
+}
+
diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c
new file mode 100644
index 000000000..7c08c0fa7
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strncmp.c
@@ -0,0 +1,6 @@
+#include <sys/types.h>
+#include <string.h>
+
+int strncmp(const char *s1, const char *s2, size_t n) {
+ return memccmp(s1,s2,0,n);
+}
diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c
new file mode 100644
index 000000000..531387b7f
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strncpy.c
@@ -0,0 +1,10 @@
+#define _POSIX_SOURCE
+#define _XOPEN_SOURCE
+#include <sys/types.h>
+#include <string.h>
+
+char *strncpy(char *dest, const char *src, size_t n)
+{
+ memccpy(dest,src,0,n);
+ return dest;
+}
diff --git a/mdk-stage1/dietlibc/lib/strpbrk.c b/mdk-stage1/dietlibc/lib/strpbrk.c
new file mode 100644
index 000000000..e18fd2a2d
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strpbrk.c
@@ -0,0 +1,11 @@
+#include <sys/types.h>
+#include <string.h>
+
+char *strpbrk(const char *s, const char *accept) {
+ register int i,l=strlen(accept);
+ for (; *s; s++)
+ for (i=0; i<l; i++)
+ if (*s == accept[i])
+ return (char*)s;
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/strrchr.c b/mdk-stage1/dietlibc/lib/strrchr.c
new file mode 100644
index 000000000..3c91e9bc8
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strrchr.c
@@ -0,0 +1,18 @@
+#include <string.h>
+#include "dietfeatures.h"
+
+char *strrchr(const char *t, int c) {
+ register char ch;
+ register const char *l=0;
+
+ ch = c;
+ for (;;) {
+ if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
+#ifndef WANT_SMALL_STRING_ROUTINES
+ if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
+ if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
+ if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
+#endif
+ }
+ return (char*)l;
+}
diff --git a/mdk-stage1/dietlibc/lib/strspn.c b/mdk-stage1/dietlibc/lib/strspn.c
new file mode 100644
index 000000000..2b3a4c116
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strspn.c
@@ -0,0 +1,17 @@
+#include <sys/types.h>
+#include <string.h>
+
+size_t strspn(const char *s, const char *accept)
+{
+ size_t l=0;
+ int a=1,i,al=strlen(accept);
+
+ while((a)&&(*s))
+ {
+ for(a=i=0;(!a)&&(i<al);i++)
+ if (*s==accept[i]) a=1;
+ if (a) l++;
+ s++;
+ }
+ return l;
+}
diff --git a/mdk-stage1/dietlibc/lib/strstr.c b/mdk-stage1/dietlibc/lib/strstr.c
new file mode 100644
index 000000000..641d9d7ac
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strstr.c
@@ -0,0 +1,15 @@
+#include <sys/types.h>
+#include <string.h>
+
+char *strstr(const char *haystack, const char *needle) {
+ int nl=strlen(needle);
+ int hl=strlen(haystack);
+ int i;
+ if (nl>hl) return 0;
+ for (i=hl-nl+1; i; --i) {
+ if (!memcmp(haystack,needle,nl))
+ return (char*)haystack;
+ ++haystack;
+ }
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c
new file mode 100644
index 000000000..767be679f
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtod.c
@@ -0,0 +1,52 @@
+#include <string.h>
+
+extern char isspace(char c);
+
+#ifdef __GNUC__
+static inline char isdigit(char c) { return (c>='0' && c<='9'); }
+#endif
+
+double strtod(const char *nptr, char **endptr) {
+ double d=0;
+ register const char *c=nptr;
+ char neg=0;
+ while (*c && isspace(*c)) ++c;
+ switch (*c) {
+ case '-': neg=1;
+ case '+': c++; break;
+ default: break;
+ }
+ while (isdigit(*c)) {
+ d=d*10+(*c-'0');
+ ++c;
+ }
+ if (*c=='.') {
+ double factor=.1;
+ while (isdigit(*++c)) {
+ d=d+(factor*(*c-'0'));
+ factor/=10;
+ }
+ }
+ if ((*c|32)=='e') {
+ int exp=0;
+ char neg=0;
+ if (c[1]<'0') {
+ switch (*c) {
+ case '-': neg=1;
+ case '+': c++; break;
+ default:
+ d=0;
+ c=nptr;
+ goto done;
+ }
+ }
+ while (isdigit(*++c))
+ exp=exp*10+(*c-'0');
+ while (exp) { /* XXX: this introduces rounding errors */
+ d*=10; --exp;
+ }
+ }
+done:
+ if (endptr) *endptr=(char*)c;
+ return d;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c
new file mode 100644
index 000000000..525665e59
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtok.c
@@ -0,0 +1,6 @@
+char *strtok_r(char *s, const char *delim, char **ptrptr);
+static char *strtok_pos;
+char *strtok(char *s, const char *delim)
+{
+ return strtok_r(s,delim,&strtok_pos);
+}
diff --git a/mdk-stage1/dietlibc/lib/strtok_r.c b/mdk-stage1/dietlibc/lib/strtok_r.c
new file mode 100644
index 000000000..93f9401de
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtok_r.c
@@ -0,0 +1,21 @@
+#include <string.h>
+
+char *strtok_r(char *s, const char *delim, char **ptrptr)
+{
+ int i;
+ char *tmp=0;
+
+ if (s) (*ptrptr)=s;
+
+ if (**ptrptr)
+ {
+ while(!(i=strcspn(*ptrptr,delim))) (*ptrptr)++;
+ if (**ptrptr)
+ {
+ tmp=(*ptrptr);
+ (*ptrptr)+=i;
+ if (**ptrptr) *(*ptrptr)++=0;
+ }
+ }
+ return tmp;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c
new file mode 100644
index 000000000..ead89f408
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtol.c
@@ -0,0 +1,15 @@
+#include <ctype.h>
+
+extern unsigned long int strtoul(const char *nptr, char **endptr, int base);
+
+long int strtol(const char *nptr, char **endptr, int base)
+{
+ int neg=0;
+ unsigned long int v;
+
+ while(isspace(*nptr)) nptr++;
+
+ if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; }
+ v=strtoul(nptr,endptr,base);
+ return (neg?-v:v);
+}
diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c
new file mode 100644
index 000000000..7b8e28a1d
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtoll.c
@@ -0,0 +1,15 @@
+#include <ctype.h>
+
+extern unsigned long int strtoull(const char *nptr, char **endptr, int base);
+
+long int strtoll(const char *nptr, char **endptr, int base)
+{
+ int neg=0;
+ unsigned long long int v;
+
+ while(isspace(*nptr)) nptr++;
+
+ if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; }
+ v=strtoull(nptr,endptr,base);
+ return (neg?-v:v);
+}
diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c
new file mode 100644
index 000000000..bee849685
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtoul.c
@@ -0,0 +1,39 @@
+#include <ctype.h>
+
+static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
+
+unsigned long int strtoul(const char *nptr, char **endptr, int base)
+{
+ long int v=0;
+ int a=1,i;
+
+ while(isspace(*nptr)) nptr++;
+
+ if (*nptr == '+') { nptr++; }
+ if (!base)
+ {
+ if (*nptr=='0')
+ {
+ base=8;
+ if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16;
+ }
+ else
+ base=10;
+ }
+ while((a)&&(*nptr))
+ {
+ a=0;
+ for (i=0;(!a)&&(i<base);i++)
+ {
+ if ((*nptr == num[i]) || (*nptr == (num[i]-' ')))
+ {
+ a=1;
+ v=(v*base)+(&num[i]-num);
+ }
+ }
+ if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1;
+ if (a) nptr++;
+ }
+ if (endptr) *endptr=(char *)nptr;
+ return v;
+}
diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c
new file mode 100644
index 000000000..64f095f60
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strtoull.c
@@ -0,0 +1,39 @@
+#include <ctype.h>
+
+static char *num="0123456789abcdefghijklmnopqrstuvwxyz";
+
+unsigned long long int strtoull(const char *nptr, char **endptr, int base)
+{
+ long long int v=0;
+ int a=1,i;
+
+ while(isspace(*nptr)) nptr++;
+
+ if (*nptr == '+') { nptr++; }
+ if (!base)
+ {
+ if (*nptr=='0')
+ {
+ base=8;
+ if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16;
+ }
+ else
+ base=10;
+ }
+ while((a)&&(*nptr))
+ {
+ a=0;
+ for (i=0;(!a)&&(i<base);i++)
+ {
+ if ((*nptr == num[i]) || (*nptr == (num[i]-' ')))
+ {
+ a=1;
+ v=(v*base)+(&num[i]-num);
+ }
+ }
+ if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1;
+ if (a) nptr++;
+ }
+ if (endptr) *endptr=(char *)nptr;
+ return v;
+}
diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c
new file mode 100644
index 000000000..80d7b3fb0
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/sys_siglist.c
@@ -0,0 +1,37 @@
+const char *const sys_siglist[] =
+ {
+ "Signal 0",
+ "Hangup",
+ "Interrupt",
+ "Quit",
+ "Illegal instruction",
+ "Trace/breakpoint trap",
+ "IOT trap",
+ "EMT trap",
+ "Floating point exception",
+ "Killed",
+ "Bus error",
+ "Segmentation fault",
+ "Bad system call",
+ "Broken pipe",
+ "Alarm clock",
+ "Terminated",
+ "Urgent I/O condition",
+ "Stopped (signal)",
+ "Stopped",
+ "Continued",
+ "Child exited",
+ "Stopped (tty input)",
+ "Stopped (tty output)",
+ "I/O possible",
+ "CPU time limit exceeded",
+ "File size limit exceeded",
+ "Virtual timer expired",
+ "Profiling timer expired",
+ "Window changed",
+ "Resource lost",
+ "User defined signal 1",
+ "User defined signal 2",
+ 0
+ };
+
diff --git a/mdk-stage1/dietlibc/lib/tcgetattr.c b/mdk-stage1/dietlibc/lib/tcgetattr.c
new file mode 100644
index 000000000..f35d39442
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/tcgetattr.c
@@ -0,0 +1,7 @@
+#include <termios.h>
+#include <sys/ioctl.h>
+
+int tcgetattr(int fildes, struct termios *termios_p)
+{
+ return ioctl(fildes, TCGETS, termios_p);
+}
diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c
new file mode 100644
index 000000000..642588d47
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/tcsetattr.c
@@ -0,0 +1,23 @@
+#define tcsetattr libc_tcsetattr
+#include <termios.h>
+#include <sys/ioctl.h>
+#undef tcsetattr
+
+#include <asm/errno.h>
+
+extern int errno;
+
+int tcsetattr(int fildes, int optional_actions, struct termios *termios_p)
+{
+ switch (optional_actions) {
+ case TCSANOW:
+ return ioctl(fildes, TCSETS, termios_p);
+ case TCSADRAIN:
+ return ioctl(fildes, TCSETSW, termios_p);
+ case TCSAFLUSH:
+ return ioctl(fildes, TCSETSF, termios_p);
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
diff --git a/mdk-stage1/dietlibc/lib/telldir.c b/mdk-stage1/dietlibc/lib/telldir.c
new file mode 100644
index 000000000..eca175381
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/telldir.c
@@ -0,0 +1,38 @@
+#include <unistd.h>
+#include <errno.h>
+
+#include "dirstream.h"
+
+#undef telldir
+off_t
+telldir(DIR * dir)
+{
+ off_t offset;
+
+ if (!dir) {
+ errno = EBADF;
+ return -1;
+ }
+
+ switch (dir->dd_getdents)
+ {
+ case no_getdents:
+ /* We are running the old kernel. This is the starting offset
+ of the next readdir(). */
+ offset = lseek(dir->dd_fd, 0, SEEK_CUR);
+ break;
+
+ case unknown:
+ /* readdir () is not called yet. but seekdir () may be called. */
+ case have_getdents:
+ /* The next entry. */
+ offset = dir->dd_nextoff;
+ break;
+
+ default:
+ errno = EBADF;
+ offset = -1;
+ }
+
+ return offset;
+}
diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c
new file mode 100644
index 000000000..a6b479088
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/ttyname.c
@@ -0,0 +1,59 @@
+#include "dietfeatures.h"
+#include <unistd.h>
+#include <sys/stat.h>
+
+#ifdef __linux__
+
+extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+
+char *ttyname(int fd) {
+#ifdef SLASH_PROC_OK
+ char ibuf[20];
+ static char obuf[20];
+ strcpy(ibuf,"/proc/self/fd/");
+ ibuf[__ltostr(ibuf+14,6,fd,10,0)+14]=0;
+ if (readlink(ibuf,obuf,sizeof(obuf)-1)<0) return 0;
+ return obuf;
+#else
+ static char buf[20]="/dev/tty";
+ struct stat s;
+ char *c=buf+8;
+ int n;
+ if (fstat(fd,&s)) return 0;
+ if (S_ISCHR(s.st_mode)) {
+ n=minor(s.st_rdev);
+ switch (major(s.st_rdev)) {
+ case 4:
+ buf[5]='t'; buf[7]='y';
+ if (n>63) {
+ n-=64;
+ *c='S';
+ ++c;
+ }
+num:
+ c[__ltostr(c,6,n,10,0)]=0;
+ break;
+ case 2:
+ buf[5]='p'; buf[7]='y';
+ buf[8]='p'-(n>>4);
+ buf[9]=n%4+'0';
+ if (buf[9]>'9') *c+='a'-'0';
+ buf[10]=0;
+ case 136:
+ case 137:
+ case 138:
+ case 139:
+ buf[5]='p'; buf[7]='s';
+ n+=(major(s.st_rdev)-136)<<8;
+ *c='/'; ++c;
+ goto num;
+ default:
+ return 0;
+ }
+ return buf;
+ }
+ return 0;
+#endif
+}
+
+#endif
diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c
new file mode 100644
index 000000000..795cddb05
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vfork.c
@@ -0,0 +1,6 @@
+#include <linux/types.h>
+#include <unistd.h>
+
+pid_t vfork(void) {
+ return fork();
+}
diff --git a/mdk-stage1/dietlibc/lib/vfprintf.c b/mdk-stage1/dietlibc/lib/vfprintf.c
new file mode 100644
index 000000000..0ebfd1561
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vfprintf.c
@@ -0,0 +1,15 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int vfprintf(FILE *fstream, const char *format, va_list ap)
+{
+ char *tmp;
+ size_t n=vsnprintf(0, 1000000, format, ap);
+ tmp=alloca(n+2);
+ if (tmp) {
+ vsnprintf(tmp, n+1, format, ap);
+ fwrite(tmp, n,1, fstream);
+ }
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/vprintf.c b/mdk-stage1/dietlibc/lib/vprintf.c
new file mode 100644
index 000000000..bba98419f
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vprintf.c
@@ -0,0 +1,20 @@
+#include <stdarg.h>
+#include <linux/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+
+int vprintf(const char *format, va_list ap)
+{
+ int n;
+ char *printf_buf;
+/* char printf_buf[1024]; */
+ va_list temp = ap;
+ n=vsnprintf(0,1000000,format,temp);
+/* write(1,printf_buf,strlen(printf_buf)); */
+ printf_buf=alloca(n+2);
+ n=vsnprintf(printf_buf,n+1,format,ap);
+ write(1,printf_buf,n);
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/vsnprintf.c b/mdk-stage1/dietlibc/lib/vsnprintf.c
new file mode 100644
index 000000000..5bbc51620
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vsnprintf.c
@@ -0,0 +1,239 @@
+#include "dietfeatures.h"
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase);
+extern int __dtostr(double d,char *buf,int maxlen,int prec);
+
+#include <unistd.h>
+void print_int(int fd, int i)
+{
+ char buf[10];
+ char * chptr = buf + 9;
+ int j = 0;
+
+ if (i < 0)
+ {
+ write(1, "-", 1);
+ i = -1 * i;
+ }
+
+ while (i)
+ {
+ *chptr-- = '0' + (i % 10);
+ j++;
+ i = i / 10;
+ }
+
+ write(fd, chptr + 1, j);
+}
+
+int vsnprintf (char *str, size_t size, const char *format, va_list arg_ptr)
+{
+ size_t apos,i;
+ char ch,buf[1024];
+ char *pb;
+ char flag_in_sign;
+ char flag_hash,flag_zero,flag_left,flag_space,flag_sign,flag_dot,flag_long;
+ long number,width,preci,buf_len,pad;
+ char padwith;
+
+ size--;
+
+ apos=0;
+ while (apos<size)
+ {
+ ch=*format++;
+ switch (ch)
+ {
+ case '%':
+ flag_hash=0;
+ flag_zero=0;
+ flag_left=0;
+ flag_space=0;
+ flag_sign=0;
+ flag_dot=0;
+ flag_in_sign=0;
+ flag_long=0;
+
+ width=0;
+ padwith=' ';
+
+inn_vsnprintf:
+ if (apos>=size) continue; /* ARGL !!! */
+
+ ch=*format++;
+ switch (ch)
+ {
+/* Format end ?!? */
+ case 0:
+ return -1;
+ break;
+
+/* Format flag chars */
+ case '#':
+ flag_hash=1;
+ goto inn_vsnprintf;
+
+ case 'l':
+ flag_long=1;
+ goto inn_vsnprintf;
+
+ case '0':
+ padwith='0';
+ goto inn_vsnprintf;
+
+ case '-':
+ flag_left=1;
+ goto inn_vsnprintf;
+
+ case ' ':
+ flag_space=1;
+ goto inn_vsnprintf;
+
+ case '+':
+ flag_sign=1;
+ goto inn_vsnprintf;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if(flag_dot) return -1;
+ width=strtol(--format,&pb,10);
+ format=pb;
+ goto inn_vsnprintf;
+
+ case '.':
+ flag_dot=1;
+ preci=strtol(format,&pb,10);
+ format=pb;
+ goto inn_vsnprintf;
+
+/* Format conversion chars */
+ case 'c':
+ ch=(char)va_arg(arg_ptr,int);
+ case '%':
+ if (str) str[apos]=ch; ++apos;
+ break;
+
+ case 's':
+ pb=va_arg(arg_ptr,char *);
+#ifdef WANT_NULL_PRINTF
+ if (!pb) pb="(null)";
+#endif
+ buf_len=strlen(pb);
+
+print_out:
+ if (str) {
+ if (width && (!flag_left))
+ {
+ for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith;
+ }
+ for(i=0;(pb[i])&&(apos<size);i++) { str[apos++]=pb[i]; } /* strncpy */
+ if (width && (flag_left))
+ {
+ for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith;
+ }
+ } else {
+ if (width)
+ apos+=width;
+ else {
+ int a=strlen(pb);
+ if (a>size) apos+=size; else apos+=a;
+ }
+ }
+
+ break;
+
+ /* Numbers */
+ case 'b':
+ i=2;
+ goto num_vsnprintf;
+ case 'p':
+ flag_hash=1;
+ width=sizeof(void *)<<1;
+ padwith='0';
+ ch='x';
+ case 'X':
+ case 'x':
+ i=16;
+ if (flag_hash)
+ {
+ if (str) {
+ str[apos++]='0';
+ str[apos++]=ch;
+ } else
+ apos+=2;
+ }
+ goto num_vsnprintf;
+ case 'd':
+ case 'i':
+ flag_in_sign=1;
+ case 'u':
+ i=10;
+ goto num_vsnprintf;
+ case 'o':
+ i=8;
+ if (flag_hash) { if (str) str[apos]='0'; ++apos; }
+
+num_vsnprintf:
+ if (apos>=size) continue; /* ARGL !!! */
+
+ if (flag_long)
+ number=va_arg(arg_ptr,long);
+ else
+ number=va_arg(arg_ptr,int);
+
+ if (flag_in_sign && (number<0))
+ {
+ number*=-1;
+ flag_in_sign=2;
+ }
+
+ buf_len=__ltostr(buf+1,sizeof(buf)-1,(unsigned long) number,i,0);
+ pb=buf+1;
+
+ if (flag_in_sign==2)
+ {
+ *(--pb)='-';
+ buf_len++;
+ }
+ else if ((flag_in_sign)&&(flag_sign || flag_space))
+ {
+ *(--pb)=(flag_sign)?'+':' ';
+ buf_len++;
+ }
+ goto print_out;
+
+#ifdef WANT_FLOATING_POINT_IN_PRINTF
+ case 'g':
+ {
+ double d=va_arg(arg_ptr,double);
+ buf_len=__dtostr(d,buf,sizeof(buf),6);
+ pb=buf;
+ goto print_out;
+ }
+#endif
+ default:
+ break;
+ }
+ break;
+ case 0:
+ if (str) str[apos]=0;
+ return apos;
+ default:
+ if (str) str[apos]=ch; apos++;
+ break;
+ }
+ }
+ if (str) str[apos]=0;
+ return apos;
+}
diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c
new file mode 100644
index 000000000..af4eea852
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vsprintf.c
@@ -0,0 +1,11 @@
+#include <stdarg.h>
+#include <linux/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
+
+int vsprintf(char *str, const char *format, va_list ap)
+{
+ return vsnprintf(str, 1000000, format, ap);
+}
diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c
new file mode 100644
index 000000000..e370062e7
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/vsscanf.c
@@ -0,0 +1,241 @@
+#include "dietfeatures.h"
+#include <stdarg.h>
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+const char *skip_ws(const char *str)
+{
+ while ((*str)&&(isspace(*str))) str++;
+ return str;
+}
+
+extern double strtod(const char *s,char **f);
+
+int vsscanf(const char *str, const char *format, va_list arg_ptr)
+{
+ int n=0,div;
+ char ch;
+
+ char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong;
+ char flag_width;
+
+ unsigned long width;
+
+ /* arg_ptr tmps */
+ double d,*pd;
+ float *pf;
+
+ long l=0,*pl;
+ short *ph;
+ int *pi;
+ char *s;
+
+ while ((*str)&&(*format))
+ {
+ const char *prevfmt=format;
+ format=skip_ws(format);
+ ch=*format++;
+ if (!ch) continue;
+
+ switch (ch)
+ {
+ case '%':
+ div=0;
+ flag_discard=0;
+ flag_malloc=0;
+ flag_half=0;
+ flag_long=0;
+ flag_longlong=0;
+
+ flag_width=0;
+ width=-1;
+
+inn_vsscanf:
+ ch=*format++;
+
+ switch (ch)
+ {
+ case 0:
+ return 0;
+
+ case '%':
+ if (*(str++)!=ch) return n;
+ break;
+
+ /* flags */
+ case '*':
+ flag_discard=1;
+ goto inn_vsscanf;
+
+ case 'a':
+ flag_malloc=1;
+ goto inn_vsscanf;
+
+ case 'h':
+ flag_half=1;
+ goto inn_vsscanf;
+
+ case 'l':
+ if (flag_long) flag_longlong=1;
+ flag_long=1;
+ goto inn_vsscanf;
+
+ /* longlong ? NOT YET ! */
+ case 'q':
+ case 'L':
+ flag_longlong=1;
+ goto inn_vsscanf;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ width=strtol(format-1,&s,10);
+ format=s;
+ flag_width=1;
+ goto inn_vsscanf;
+
+ /* conversion */
+
+ case 'n':
+ while (width && *str)
+ {
+ *(s++)=*(str++);
+ --width;
+ l++;
+ }
+ if (!flag_discard)
+ {
+ pl=(long *)va_arg(arg_ptr,long*);
+ *pl=l;
+ ++n;
+ }
+ break;
+
+ case 'p':
+ case 'X':
+ case 'x':
+ div+=6;
+ case 'd':
+ div+=2;
+ case 'o':
+ div+=8;
+ case 'u':
+ case 'i':
+ if (*(str=skip_ws(str)))
+ {
+ l=strtol(str,&s,div);
+ if (str!=s)
+ {
+ if (!flag_discard)
+ {
+ if (flag_long)
+ {
+ pl=(long *)va_arg(arg_ptr,long*);
+ *pl=l;
+ }
+ else if (flag_half)
+ {
+ ph=(short *)va_arg(arg_ptr,short*);
+ *ph=l;
+ }
+ else
+ {
+ pi=(int *)va_arg(arg_ptr,int*);
+ *pi=l;
+ }
+ ++n;
+ }
+ str=s;
+ }
+ else
+ return n;
+ }
+ break;
+
+#ifdef WANT_FLOATING_POINT_IN_SCANF
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
+ if (*(str=skip_ws(str)))
+ {
+ d=strtod(str,&s);
+ if (str!=s)
+ {
+ if (!flag_discard)
+ {
+ if (flag_long)
+ {
+ pd=(double *)va_arg(arg_ptr,double*);
+ *pd=d;
+ }
+ else
+ {
+ pf=(float *)va_arg(arg_ptr,float*);
+ *pf=d;
+ }
+ ++n;
+ }
+ str=s;
+ }
+ else
+ return n;
+ }
+ break;
+#endif
+
+ case 'c':
+ if (!flag_discard)
+ {
+ s=(char *)va_arg(arg_ptr,char*);
+ ++n;
+ }
+ if (!flag_width) width=1;
+ while (width && *str)
+ {
+ if (!flag_discard) *(s++)=*(str);
+ ++str;
+ --width;
+ }
+ break;
+
+ case 's':
+ if (!flag_discard)
+ {
+ s=(char *)va_arg(arg_ptr,char*);
+ ++n;
+ }
+ if (*(str=skip_ws(str)))
+ {
+ while (width && *str && (!isspace(*str)))
+ {
+ if (!flag_discard) *(s++)=*(str);
+ ++str;
+ --width;
+ }
+ *s = '\0';
+ }
+ break;
+ }
+ break;
+
+ default:
+ if (prevfmt<format) {
+ while (prevfmt<format) {
+ if (*str!=*prevfmt) return n;
+ ++str; ++prevfmt;
+ }
+ } else
+ if (*(str++)!=ch) return n;
+ break;
+ }
+ }
+ return n;
+}
diff --git a/mdk-stage1/dietlibc/lib/wait.c b/mdk-stage1/dietlibc/lib/wait.c
new file mode 100644
index 000000000..8459af18c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/wait.c
@@ -0,0 +1,6 @@
+#include <sys/types.h>
+#include <sys/wait.h>
+
+pid_t wait(int *status) {
+ return waitpid(-1,status,0);
+}
diff --git a/mdk-stage1/dietlibc/lib/wait3.c b/mdk-stage1/dietlibc/lib/wait3.c
new file mode 100644
index 000000000..19e90740c
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/wait3.c
@@ -0,0 +1,5 @@
+#include <sys/wait.h>
+
+int wait3(int* status,int opts,struct rusage* rusage) {
+ return wait4(-1,status,opts,rusage);
+}
diff --git a/mdk-stage1/dietlibc/ppc/Makefile.add b/mdk-stage1/dietlibc/ppc/Makefile.add
new file mode 100644
index 000000000..b71031e05
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/Makefile.add
@@ -0,0 +1,3 @@
+
+CFLAGS+=-mpowerpc-gpopt -mpowerpc-gfxopt -Os
+override VPATH=ppc:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/ppc/__longjmp.S b/mdk-stage1/dietlibc/ppc/__longjmp.S
new file mode 100644
index 000000000..deada115e
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/__longjmp.S
@@ -0,0 +1,61 @@
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+
+#ifdef PIC
+#define JUMPTARGET(name) name##@plt
+#else
+#define JUMPTARGET(name) name
+#endif
+
+.global __longjmp
+.type __longjmp,@function
+.align 2
+__longjmp:
+ lwz 1,(JB_GPR1*4)(3)
+ lwz 2,(JB_GPR2*4)(3)
+ lwz 0,(JB_LR*4)(3)
+ lwz 14,((JB_GPRS+0)*4)(3)
+ lfd 14,((JB_FPRS+0*2)*4)(3)
+ lwz 15,((JB_GPRS+1)*4)(3)
+ lfd 15,((JB_FPRS+1*2)*4)(3)
+ lwz 16,((JB_GPRS+2)*4)(3)
+ lfd 16,((JB_FPRS+2*2)*4)(3)
+ lwz 17,((JB_GPRS+3)*4)(3)
+ lfd 17,((JB_FPRS+3*2)*4)(3)
+ lwz 18,((JB_GPRS+4)*4)(3)
+ lfd 18,((JB_FPRS+4*2)*4)(3)
+ lwz 19,((JB_GPRS+5)*4)(3)
+ lfd 19,((JB_FPRS+5*2)*4)(3)
+ lwz 20,((JB_GPRS+6)*4)(3)
+ lfd 20,((JB_FPRS+6*2)*4)(3)
+ mtlr 0
+ lwz 21,((JB_GPRS+7)*4)(3)
+ lfd 21,((JB_FPRS+7*2)*4)(3)
+ lwz 22,((JB_GPRS+8)*4)(3)
+ lfd 22,((JB_FPRS+8*2)*4)(3)
+ lwz 0,(JB_CR*4)(3)
+ lwz 23,((JB_GPRS+9)*4)(3)
+ lfd 23,((JB_FPRS+9*2)*4)(3)
+ lwz 24,((JB_GPRS+10)*4)(3)
+ lfd 24,((JB_FPRS+10*2)*4)(3)
+ lwz 25,((JB_GPRS+11)*4)(3)
+ lfd 25,((JB_FPRS+11*2)*4)(3)
+ mtcrf 0xFF,0
+ lwz 26,((JB_GPRS+12)*4)(3)
+ lfd 26,((JB_FPRS+12*2)*4)(3)
+ lwz 27,((JB_GPRS+13)*4)(3)
+ lfd 27,((JB_FPRS+13*2)*4)(3)
+ lwz 28,((JB_GPRS+14)*4)(3)
+ lfd 28,((JB_FPRS+14*2)*4)(3)
+ lwz 29,((JB_GPRS+15)*4)(3)
+ lfd 29,((JB_FPRS+15*2)*4)(3)
+ lwz 30,((JB_GPRS+16)*4)(3)
+ lfd 30,((JB_FPRS+16*2)*4)(3)
+ lwz 31,((JB_GPRS+17)*4)(3)
+ lfd 31,((JB_FPRS+17*2)*4)(3)
+ mr 3,4
+ blr
+.size __longjmp,.-__longjmp
+
diff --git a/mdk-stage1/dietlibc/ppc/mmap.c b/mdk-stage1/dietlibc/ppc/mmap.c
new file mode 100644
index 000000000..25d2926b2
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/mmap.c
@@ -0,0 +1,37 @@
+#include <linux/types.h>
+#include <linux/unistd.h>
+
+int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) {
+ 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) (start);
+ __sc_4 = (unsigned long) (length);
+ __sc_5 = (unsigned long) (prot);
+ __sc_6 = (unsigned long) (flags);
+ __sc_7 = (unsigned long) (fd);
+ __sc_8 = (unsigned long) (offset);
+ __sc_0 = __NR_mmap;
+ __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 (int);
+}
diff --git a/mdk-stage1/dietlibc/ppc/setjmp.S b/mdk-stage1/dietlibc/ppc/setjmp.S
new file mode 100644
index 000000000..50fa2bdd4
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/setjmp.S
@@ -0,0 +1,56 @@
+#include <setjmp.h>
+
+#ifdef PIC
+#define JUMPTARGET(name) name##@plt
+#else
+#define JUMPTARGET(name) name
+#endif
+
+.global __sigsetjmp
+.type __sigsetjmp,@function
+.align 2
+__sigsetjmp:
+ stw 1,(JB_GPR1*4)(3)
+ mflr 0
+ stw 2,(JB_GPR2*4)(3)
+ stw 14,((JB_GPRS+0)*4)(3)
+ stfd 14,((JB_FPRS+0*2)*4)(3)
+ stw 0,(JB_LR*4)(3)
+ stw 15,((JB_GPRS+1)*4)(3)
+ stfd 15,((JB_FPRS+1*2)*4)(3)
+ mfcr 0
+ stw 16,((JB_GPRS+2)*4)(3)
+ stfd 16,((JB_FPRS+2*2)*4)(3)
+ stw 0,(JB_CR*4)(3)
+ stw 17,((JB_GPRS+3)*4)(3)
+ stfd 17,((JB_FPRS+3*2)*4)(3)
+ stw 18,((JB_GPRS+4)*4)(3)
+ stfd 18,((JB_FPRS+4*2)*4)(3)
+ stw 19,((JB_GPRS+5)*4)(3)
+ stfd 19,((JB_FPRS+5*2)*4)(3)
+ stw 20,((JB_GPRS+6)*4)(3)
+ stfd 20,((JB_FPRS+6*2)*4)(3)
+ stw 21,((JB_GPRS+7)*4)(3)
+ stfd 21,((JB_FPRS+7*2)*4)(3)
+ stw 22,((JB_GPRS+8)*4)(3)
+ stfd 22,((JB_FPRS+8*2)*4)(3)
+ stw 23,((JB_GPRS+9)*4)(3)
+ stfd 23,((JB_FPRS+9*2)*4)(3)
+ stw 24,((JB_GPRS+10)*4)(3)
+ stfd 24,((JB_FPRS+10*2)*4)(3)
+ stw 25,((JB_GPRS+11)*4)(3)
+ stfd 25,((JB_FPRS+11*2)*4)(3)
+ stw 26,((JB_GPRS+12)*4)(3)
+ stfd 26,((JB_FPRS+12*2)*4)(3)
+ stw 27,((JB_GPRS+13)*4)(3)
+ stfd 27,((JB_FPRS+13*2)*4)(3)
+ stw 28,((JB_GPRS+14)*4)(3)
+ stfd 28,((JB_FPRS+14*2)*4)(3)
+ stw 29,((JB_GPRS+15)*4)(3)
+ stfd 29,((JB_FPRS+15*2)*4)(3)
+ stw 30,((JB_GPRS+16)*4)(3)
+ stfd 30,((JB_FPRS+16*2)*4)(3)
+ stw 31,((JB_GPRS+17)*4)(3)
+ stfd 31,((JB_FPRS+17*2)*4)(3)
+ b JUMPTARGET (__sigjmp_save)
+.size __sigsetjmp,.-__sigsetjmp
diff --git a/mdk-stage1/dietlibc/ppc/start.S b/mdk-stage1/dietlibc/ppc/start.S
new file mode 100644
index 000000000..c7afeecd2
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/start.S
@@ -0,0 +1,44 @@
+#include "start.h"
+
+#ifdef __powerpc__
+
+.text
+.global _start
+.type _start,@function
+_start:
+ /* Save the stack pointer, in case we're statically linked under Linux. */
+ mr 9,1
+ /* Set up an initial stack frame, and clear the LR. */
+ clrrwi 1,1,4
+ li 0,0
+ stwu 1,-16(1)
+ mtlr 0
+ stw 0,0(1)
+
+ /* r9 enthält den initialen Stackpointer.
+ argc = (r9)
+ argv = (r9+4)
+ envp = argv+(argc+1)*4 */
+
+ lwzu 3,0(9) /* argc */
+ addi 4,9,4 /* argv */
+ add 5,0,3 /* argc... */
+ addi 5,5,1 /* argc+1...*/
+ slwi 5,5,2 /* (argc+1)*4 */
+ add 5,5,4 /* argv+(argc+1)*4 */
+
+ lis 6,environ@ha
+ stw 5,environ@l(6)
+
+ bl main
+ b exit
+.size _start,.-_start
+
+
+/* Define a symbol for the first piece of initialized data. */
+ .section ".data"
+__data_start:
+
+
+#endif
+
diff --git a/mdk-stage1/dietlibc/ppc/unified.S b/mdk-stage1/dietlibc/ppc/unified.S
new file mode 100644
index 000000000..d2b419f0b
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc/unified.S
@@ -0,0 +1,21 @@
+#include <dietfeatures.h>
+
+.text
+.global __unified_syscall
+__unified_syscall:
+ sc
+ mfcr 0
+ andis. 9,0,4096
+ mr 0,3
+ beq .L1
+#ifdef WANT_THREAD_SAVE
+ bl __set_errno
+#else
+ lis 9,errno@ha
+ stw 3,errno@l(9)
+#endif
+ li 0,-1
+.L1:
+ mr 3,0
+ blr
+
diff --git a/mdk-stage1/dietlibc/sparc/Makefile.add b/mdk-stage1/dietlibc/sparc/Makefile.add
new file mode 100644
index 000000000..a12a0446a
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/Makefile.add
@@ -0,0 +1,3 @@
+
+CFLAGS+=-mcpu=supersparc -Os
+override VPATH=sparc:syscalls.s:lib
diff --git a/mdk-stage1/dietlibc/sparc/__longjmp.S b/mdk-stage1/dietlibc/sparc/__longjmp.S
new file mode 100644
index 000000000..81dd24af2
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/__longjmp.S
@@ -0,0 +1,66 @@
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+
+#define ENV(base,reg) [%base + (reg * 4)]
+#define ST_FLUSH_WINDOWS 3
+#define RW_FP [%fp + 0x48]
+
+.text
+.global __longjmp
+__longjmp:
+ /* Store our arguments in global registers so we can still
+ use them while unwinding frames and their register windows. */
+
+ ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
+ mov %o0, %g1 /* ENV in %g1 */
+ orcc %o1, %g0, %g2 /* VAL in %g2 */
+ be,a 0f /* Branch if zero; else skip delay slot. */
+ mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */
+0:
+ xor %fp, %g3, %o0
+ add %fp, 512, %o1
+ andncc %o0, 4095, %o0
+ bne .Lthread
+ cmp %o1, %g3
+ bl .Lthread
+
+ /* Now we will loop, unwinding the register windows up the stack
+ until the restored %fp value matches the target value in %g3. */
+
+.Lloop:
+ cmp %fp, %g3 /* Have we reached the target frame? */
+ bl,a .Lloop /* Loop while current fp is below target. */
+ restore /* Unwind register window in delay slot. */
+ be,a .Lfound /* Better have hit it exactly. */
+ ld ENV(g1,JB_SP), %o0 /* Delay slot: extract target SP. */
+
+.Lthread:
+ /*
+ * Do a "flush register windows trap". The trap handler in the
+ * kernel writes all the register windows to their stack slots, and
+ * marks them all as invalid (needing to be sucked up from the
+ * stack when used). This ensures that all information needed to
+ * unwind to these callers is in memory, not in the register
+ * windows.
+ */
+ ta ST_FLUSH_WINDOWS
+ ld ENV(g1,JB_PC), %o7 /* Set return PC. */
+ ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
+ sub %fp, 64, %sp /* Allocate a register frame. */
+ st %g3, RW_FP /* Set saved FP on restore below. */
+ retl
+ restore %g2, 0, %o0 /* Restore values from above register frame. */
+
+.Lfound:
+ /* We have unwound register windows so %fp matches the target. */
+ mov %o0, %sp /* OK, install new SP. */
+
+.Lsp_ok:
+ ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */
+ jmp %o0 + 8 /* Return there. */
+ mov %g2, %o0 /* Delay slot: set return value. */
+
+.size __longjmp, . - __longjmp
+
diff --git a/mdk-stage1/dietlibc/sparc/fork.S b/mdk-stage1/dietlibc/sparc/fork.S
new file mode 100644
index 000000000..150839971
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/fork.S
@@ -0,0 +1,19 @@
+#include "syscalls.h"
+
+.text
+.global fork
+fork:
+ mov 2, %g1
+ ta 0x10
+ bcc,a 1f
+ nop
+
+ sethi %hi(errno), %o3
+ or %o3, %lo(errno), %o3
+ st %i0, [%o3]
+
+ retl
+ mov -1, %o0
+1: dec %o1
+ retl
+ and %o0, %o1, %o0
diff --git a/mdk-stage1/dietlibc/sparc/mmap.c b/mdk-stage1/dietlibc/sparc/mmap.c
new file mode 100644
index 000000000..25ebdc24e
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/mmap.c
@@ -0,0 +1,43 @@
+#include <linux/types.h>
+#include <linux/unistd.h>
+
+#define __SYSCALL_STRING \
+ "ta 0x10;" \
+ "bcs 2f;" \
+ " nop;" \
+ "1:" \
+ ".subsection 2;" \
+ "2:" \
+ "save %%sp, -192, %%sp;" \
+ "call __errno_location;" \
+ " nop;" \
+ "st %%i0,[%%o0];" \
+ "ba 1b;" \
+ " restore %%g0, -1, %%o0;" \
+ ".previous;"
+
+#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \
+ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
+ "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
+ "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
+ "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
+ "cc", "memory"
+
+#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \
+({ \
+ 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); \
+ register long __g1 __asm__ ("g1") = __NR_##name; \
+ __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \
+ "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \
+ "r" (__o3), "r" (__o4), "r" (__o5) : \
+ __SYSCALL_CLOBBERS); \
+ __o0; \
+})
+int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) {
+ return inline_syscall6(mmap,start,length,prot,flags,fd,offset);
+}
diff --git a/mdk-stage1/dietlibc/sparc/pipe.S b/mdk-stage1/dietlibc/sparc/pipe.S
new file mode 100644
index 000000000..b8ad1d251
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/pipe.S
@@ -0,0 +1,20 @@
+#include "syscalls.h"
+
+.text
+.global pipe
+pipe:
+ mov __NR_pipe, %g1
+ ta 0x10
+ bcc,a .Lnoerror
+ nop
+ save %sp, -96, %sp
+ call __errno_location
+ nop
+ st %i0, [ %o0 ]
+ ret
+ restore %g0, -1, %o0
+.Lnoerror:
+ st %o0, [ %o2 ]
+ st %o1, [ %o2 + 4 ]
+ retl
+ mov %g0, %o0
diff --git a/mdk-stage1/dietlibc/sparc/setjmp.S b/mdk-stage1/dietlibc/sparc/setjmp.S
new file mode 100644
index 000000000..be77af3c4
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/setjmp.S
@@ -0,0 +1,35 @@
+#define _ASM
+#define _SETJMP_H
+#include <bits/setjmp.h>
+
+#define ST_FLUSH_WINDOWS 0x03
+
+.section .rodata
+.text
+.globl __setjmp
+__setjmp:
+ b 1f
+ set 0, %o1
+.size __setjmp,.-__setjmp
+
+.globl setjmp
+setjmp:
+ set 1, %o1
+.size setjmp,.-setjmp
+
+.globl __sigsetjmp
+__sigsetjmp:
+1:
+ /* Save our PC, SP and FP. Save the signal mask if requested with
+ a tail-call for simplicity; it always returns zero. */
+ ta ST_FLUSH_WINDOWS
+
+ st %o7, [%o0 + (JB_PC * 4)]
+ st %sp, [%o0 + (JB_SP * 4)]
+ st %fp, [%o0 + (JB_FP * 4)]
+
+ mov %o7, %g1
+ call __sigjmp_save
+ mov %g1, %o7
+.size __sigsetjmp,.-__sigsetjmp
+
diff --git a/mdk-stage1/dietlibc/sparc/start.S b/mdk-stage1/dietlibc/sparc/start.S
new file mode 100644
index 000000000..e948aaddc
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/start.S
@@ -0,0 +1,46 @@
+#include "start.h"
+
+#ifdef __sparc__
+ .section ".text"
+ .align 4
+ .global _start
+ .type _start,@function
+_start:
+
+ /* Terminate the stack frame, and reserve space for functions to
+ drop their arguments. */
+ mov %g0, %fp
+ sub %sp, 6*4, %sp
+
+ /* Extract the arguments and environment as encoded on the stack. The
+ argument info starts after one register window (16 words) past the SP. */
+ ld [%sp+22*4], %o0
+ add %sp, 23*4, %o1
+ add %o1, %o0, %o2
+ add %o2, %o0, %o2
+ add %o2, %o0, %o2
+ add %o2, %o0, %o2
+ add %o2, 4, %o2
+
+ sethi %hi(environ), %o3
+ or %o3, %lo(environ), %o3
+ st %o2, [%o3]
+
+ /* When starting a binary via the dynamic linker, %g1 contains the
+ address of the shared library termination function, which will be
+ registered with atexit(). If we are statically linked, this will
+ be NULL. */
+
+ /* Let libc do the rest of the initialization, and call main. */
+ call main
+ mov %g1, %o5
+
+ b exit
+ mov %o0, %i0
+
+ /* Die very horribly if exit returns. */
+ unimp
+
+ .size _start, .-_start
+#endif
+
diff --git a/mdk-stage1/dietlibc/sparc/udiv.S b/mdk-stage1/dietlibc/sparc/udiv.S
new file mode 100644
index 000000000..87479e7bd
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/udiv.S
@@ -0,0 +1,363 @@
+#ifdef __sparc__
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/*
+ * Division and remainder, from Appendix E of the Sparc Version 8
+ * Architecture Manual, with fixes from Gordon Irlam.
+ */
+
+/*
+ * Input: dividend and divisor in %o0 and %o1 respectively.
+ *
+ * m4 parameters:
+ * .udiv name of function to generate
+ * div div=div => %o0 / %o1; div=rem => %o0 % %o1
+ * false false=true => signed; false=false => unsigned
+ *
+ * Algorithm parameters:
+ * N how many bits per iteration we try to get (4)
+ * WORDSIZE total number of bits (32)
+ *
+ * Derived constants:
+ * TOPBITS number of bits in the top decade of a number
+ *
+ * Important variables:
+ * Q the partial quotient under development (initially 0)
+ * R the remainder so far, initially the dividend
+ * ITER number of main division loop iterations required;
+ * equal to ceil(log2(quotient) / N). Note that this
+ * is the log base (2^N) of the quotient.
+ * V the current comparand, initially divisor*2^(ITER*N-1)
+ *
+ * Cost:
+ * Current estimate for non-large dividend is
+ * ceil(log2(quotient) / N) * (10 + 7N/2) + C
+ * A large dividend is one greater than 2^(31-TOPBITS) and takes a
+ * different path, as the upper bits of the quotient must be developed
+ * one bit at a time.
+ */
+
+
+
+#define C_LABEL(name) name:
+
+#define C_SYMBOL_NAME(name) name
+
+#define ENTRY(name) \
+ .global C_SYMBOL_NAME(name); \
+ .align 4;\
+ C_LABEL(name);\
+ .type name,@function;
+
+#define LOC(name) . ## L ## name
+
+#define END(name) \
+ .size name, . - name
+
+#define ST_DIV0 0x02
+
+ENTRY(.udiv)
+
+ ! Ready to divide. Compute size of quotient; scale comparand.
+ orcc %o1, %g0, %o5
+ bne 1f
+ mov %o0, %o3
+
+ ! Divide by zero trap. If it returns, return 0 (about as
+ ! wrong as possible, but that is what SunOS does...).
+ ta ST_DIV0
+ retl
+ clr %o0
+
+1:
+ cmp %o3, %o5 ! if %o1 exceeds %o0, done
+ blu LOC(got_result) ! (and algorithm fails otherwise)
+ clr %o2
+ sethi %hi(1 << (32 - 4 - 1)), %g1
+ cmp %o3, %g1
+ blu LOC(not_really_big)
+ clr %o4
+
+ ! Here the dividend is >= 2**(31-N) or so. We must be careful here,
+ ! as our usual N-at-a-shot divide step will cause overflow and havoc.
+ ! The number of bits in the result here is N*ITER+SC, where SC <= N.
+ ! Compute ITER in an unorthodox manner: know we need to shift V into
+ ! the top decade: so do not even bother to compare to R.
+ 1:
+ cmp %o5, %g1
+ bgeu 3f
+ mov 1, %g2
+ sll %o5, 4, %o5
+ b 1b
+ add %o4, 1, %o4
+
+ ! Now compute %g2.
+ 2: addcc %o5, %o5, %o5
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
+
+ ! We get here if the %o1 overflowed while shifting.
+ ! This means that %o3 has the high-order bit set.
+ ! Restore %o5 and subtract from %o3.
+ sll %g1, 4, %g1 ! high order bit
+ srl %o5, 1, %o5 ! rest of %o5
+ add %o5, %g1, %o5
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
+
+ LOC(not_too_big):
+ 3: cmp %o5, %o3
+ blu 2b
+ nop
+ be LOC(do_single_div)
+ nop
+ /* NB: these are commented out in the V8-Sparc manual as well */
+ /* (I do not understand this) */
+ ! %o5 > %o3: went too far: back up 1 step
+ ! srl %o5, 1, %o5
+ ! dec %g2
+ ! do single-bit divide steps
+ !
+ ! We have to be careful here. We know that %o3 >= %o5, so we can do the
+ ! first divide step without thinking. BUT, the others are conditional,
+ ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high-
+ ! order bit set in the first step, just falling into the regular
+ ! division loop will mess up the first time around.
+ ! So we unroll slightly...
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
+ nop
+ sub %o3, %o5, %o3
+ mov 1, %o2
+ b LOC(end_single_divloop)
+ nop
+ LOC(single_divloop):
+ sll %o2, 1, %o2
+ bl 1f
+ srl %o5, 1, %o5
+ ! %o3 >= 0
+ sub %o3, %o5, %o3
+ b 2f
+ add %o2, 1, %o2
+ 1: ! %o3 < 0
+ add %o3, %o5, %o3
+ sub %o2, 1, %o2
+ 2:
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
+ tst %o3
+ b,a LOC(end_regular_divide)
+
+LOC(not_really_big):
+1:
+ sll %o5, 4, %o5
+ cmp %o5, %o3
+ bleu 1b
+ addcc %o4, 1, %o4
+ be LOC(got_result)
+ sub %o4, 1, %o4
+
+ tst %o3 ! set up for initial iteration
+LOC(divloop):
+ sll %o2, 4, %o2
+ ! depth 1, accumulated bits 0
+ bl LOC(1.16)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 2, accumulated bits 1
+ bl LOC(2.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 3, accumulated bits 3
+ bl LOC(3.19)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 7
+ bl LOC(4.23)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (7*2+1), %o2
+
+LOC(4.23):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (7*2-1), %o2
+
+
+LOC(3.19):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 5
+ bl LOC(4.21)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (5*2+1), %o2
+
+LOC(4.21):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (5*2-1), %o2
+
+
+
+LOC(2.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 3, accumulated bits 1
+ bl LOC(3.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 3
+ bl LOC(4.19)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (3*2+1), %o2
+
+LOC(4.19):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (3*2-1), %o2
+
+
+LOC(3.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 1
+ bl LOC(4.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (1*2+1), %o2
+
+LOC(4.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (1*2-1), %o2
+
+
+
+
+LOC(1.16):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 2, accumulated bits -1
+ bl LOC(2.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 3, accumulated bits -1
+ bl LOC(3.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -1
+ bl LOC(4.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-1*2+1), %o2
+
+LOC(4.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-1*2-1), %o2
+
+
+LOC(3.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -3
+ bl LOC(4.13)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-3*2+1), %o2
+
+LOC(4.13):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-3*2-1), %o2
+
+
+
+LOC(2.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 3, accumulated bits -3
+ bl LOC(3.13)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -5
+ bl LOC(4.11)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-5*2+1), %o2
+
+LOC(4.11):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-5*2-1), %o2
+
+
+LOC(3.13):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -7
+ bl LOC(4.9)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-7*2+1), %o2
+
+LOC(4.9):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-7*2-1), %o2
+
+
+
+
+ 9:
+LOC(end_regular_divide):
+ subcc %o4, 1, %o4
+ bge LOC(divloop)
+ tst %o3
+ bl,a LOC(got_result)
+ ! non-restoring fixup here (one instruction only!)
+ sub %o2, 1, %o2
+
+
+LOC(got_result):
+
+ retl
+ mov %o2, %o0
+
+END(.udiv)
+
+#endif
diff --git a/mdk-stage1/dietlibc/sparc/umul.S b/mdk-stage1/dietlibc/sparc/umul.S
new file mode 100644
index 000000000..15038ab2a
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/umul.S
@@ -0,0 +1,170 @@
+#ifdef __sparc__
+/*
+ * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the
+ * upper 32 bits of the 64-bit product).
+ *
+ * This code optimizes short (less than 13-bit) multiplies. Short
+ * multiplies require 25 instruction cycles, and long ones require
+ * 45 instruction cycles.
+ *
+ * On return, overflow has occurred (%o1 is not zero) if and only if
+ * the Z condition code is clear, allowing, e.g., the following:
+ *
+ * call .umul
+ * nop
+ * bnz overflow (or tnz)
+ */
+
+#define C_LABEL(name) name:
+
+#define C_SYMBOL_NAME(name) name
+
+#define ENTRY(name) \
+ .global C_SYMBOL_NAME(name); \
+ .align 4;\
+ C_LABEL(name);\
+ .type name,@function;
+
+#define LOC(name) . ## L ## name
+
+#define END(name) \
+ .size name, . - name
+
+ENTRY(.umul)
+ or %o0, %o1, %o4
+ mov %o0, %y ! multiplier -> Y
+ andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args
+ be LOC(mul_shortway) ! if zero, can do it the short way
+ andcc %g0, %g0, %o4 ! zero the partial product; clear N & V
+
+ /*
+ * Long multiply. 32 steps, followed by a final shift step.
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %o1, %o4 ! 13
+ mulscc %o4, %o1, %o4 ! 14
+ mulscc %o4, %o1, %o4 ! 15
+ mulscc %o4, %o1, %o4 ! 16
+ mulscc %o4, %o1, %o4 ! 17
+ mulscc %o4, %o1, %o4 ! 18
+ mulscc %o4, %o1, %o4 ! 19
+ mulscc %o4, %o1, %o4 ! 20
+ mulscc %o4, %o1, %o4 ! 21
+ mulscc %o4, %o1, %o4 ! 22
+ mulscc %o4, %o1, %o4 ! 23
+ mulscc %o4, %o1, %o4 ! 24
+ mulscc %o4, %o1, %o4 ! 25
+ mulscc %o4, %o1, %o4 ! 26
+ mulscc %o4, %o1, %o4 ! 27
+ mulscc %o4, %o1, %o4 ! 28
+ mulscc %o4, %o1, %o4 ! 29
+ mulscc %o4, %o1, %o4 ! 30
+ mulscc %o4, %o1, %o4 ! 31
+ mulscc %o4, %o1, %o4 ! 32
+ mulscc %o4, %g0, %o4 ! final shift
+
+ /*
+ * Normally, with the shift-and-add approach, if both numbers are
+ * positive you get the correct result. With 32-bit two's-complement
+ * numbers, -x is represented as
+ *
+ * x 32
+ * ( 2 - ------ ) mod 2 * 2
+ * 32
+ * 2
+ *
+ * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s,
+ * we can treat this as if the radix point were just to the left
+ * of the sign bit (multiply by 2^32), and get
+ *
+ * -x = (2 - x) mod 2
+ *
+ * Then, ignoring the `mod 2's for convenience:
+ *
+ * x * y = xy
+ * -x * y = 2y - xy
+ * x * -y = 2x - xy
+ * -x * -y = 4 - 2x - 2y + xy
+ *
+ * For signed multiplies, we subtract (x << 32) from the partial
+ * product to fix this problem for negative multipliers (see mul.s).
+ * Because of the way the shift into the partial product is calculated
+ * (N xor V), this term is automatically removed for the multiplicand,
+ * so we don't have to adjust.
+ *
+ * But for unsigned multiplies, the high order bit wasn't a sign bit,
+ * and the correction is wrong. So for unsigned multiplies where the
+ * high order bit is one, we end up with xy - (y << 32). To fix it
+ * we add y << 32.
+ */
+#if 0
+ tst %o1
+ bl,a 1f ! if %o1 < 0 (high order bit = 1),
+ add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half)
+1: rd %y, %o0 ! get lower half of product
+ retl
+ addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0
+#else
+ /* Faster code from tege@sics.se. */
+ sra %o1, 31, %o2 ! make mask from sign bit
+ and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1
+ rd %y, %o0 ! get lower half of product
+ retl
+ addcc %o4, %o2, %o1 ! add compensation and put upper half in place
+#endif
+
+LOC(mul_shortway):
+ /*
+ * Short multiply. 12 steps, followed by a final shift step.
+ * The resulting bits are off by 12 and (32-12) = 20 bit positions,
+ * but there is no problem with %o0 being negative (unlike above),
+ * and overflow is impossible (the answer is at most 24 bits long).
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %g0, %o4 ! final shift
+
+ /*
+ * %o4 has 20 of the bits that should be in the result; %y has
+ * the bottom 12 (as %y's top 12). That is:
+ *
+ * %o4 %y
+ * +----------------+----------------+
+ * | -12- | -20- | -12- | -20- |
+ * +------(---------+------)---------+
+ * -----result-----
+ *
+ * The 12 bits of %o4 left of the `result' area are all zero;
+ * in fact, all top 20 bits of %o4 are zero.
+ */
+
+ rd %y, %o5
+ sll %o4, 12, %o0 ! shift middle bits left 12
+ srl %o5, 20, %o5 ! shift low bits right 20
+ or %o5, %o0, %o0
+ retl
+ addcc %g0, %g0, %o1 ! %o1 = zero, and set Z
+
+END(.umul)
+#endif
diff --git a/mdk-stage1/dietlibc/sparc/unified.S b/mdk-stage1/dietlibc/sparc/unified.S
new file mode 100644
index 000000000..53b1612a9
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/unified.S
@@ -0,0 +1,28 @@
+#include <dietfeatures.h>
+
+.text
+.global __unified_syscall
+__unified_syscall:
+ ta 0x10
+
+ bcc 1f
+ save %sp, -104, %sp
+
+ neg %i0, %i0
+1:
+ add %i0, 0xff, %l2
+ cmp %l2, 0xfe
+ bgu 2f
+ neg %i0, %l3
+#ifdef WANT_THREAD_SAVE
+ call __errno_location
+ nop
+#else
+ sethi %hi(errno), %o0
+ or %o0, %lo(errno), %o0
+#endif
+ st %l3, [ %o0 ]
+ mov -1, %o0
+2:
+ ret
+ restore
diff --git a/mdk-stage1/dietlibc/sparc/urem.S b/mdk-stage1/dietlibc/sparc/urem.S
new file mode 100644
index 000000000..943cb7873
--- /dev/null
+++ b/mdk-stage1/dietlibc/sparc/urem.S
@@ -0,0 +1,362 @@
+#ifdef __sparc__
+ /* This file is generated from divrem.m4; DO NOT EDIT! */
+/*
+ * Division and remainder, from Appendix E of the Sparc Version 8
+ * Architecture Manual, with fixes from Gordon Irlam.
+ */
+
+/*
+ * Input: dividend and divisor in %o0 and %o1 respectively.
+ *
+ * m4 parameters:
+ * .urem name of function to generate
+ * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1
+ * false false=true => signed; false=false => unsigned
+ *
+ * Algorithm parameters:
+ * N how many bits per iteration we try to get (4)
+ * WORDSIZE total number of bits (32)
+ *
+ * Derived constants:
+ * TOPBITS number of bits in the top decade of a number
+ *
+ * Important variables:
+ * Q the partial quotient under development (initially 0)
+ * R the remainder so far, initially the dividend
+ * ITER number of main division loop iterations required;
+ * equal to ceil(log2(quotient) / N). Note that this
+ * is the log base (2^N) of the quotient.
+ * V the current comparand, initially divisor*2^(ITER*N-1)
+ *
+ * Cost:
+ * Current estimate for non-large dividend is
+ * ceil(log2(quotient) / N) * (10 + 7N/2) + C
+ * A large dividend is one greater than 2^(31-TOPBITS) and takes a
+ * different path, as the upper bits of the quotient must be developed
+ * one bit at a time.
+ */
+
+
+
+#define C_LABEL(name) name:
+
+#define C_SYMBOL_NAME(name) name
+
+#define ENTRY(name) \
+ .global C_SYMBOL_NAME(name); \
+ .align 4;\
+ C_LABEL(name);\
+ .type name,@function;
+
+#define LOC(name) . ## L ## name
+
+#define END(name) \
+ .size name, . - name
+
+#define ST_DIV0 0x02
+
+ENTRY(.urem)
+
+ ! Ready to divide. Compute size of quotient; scale comparand.
+ orcc %o1, %g0, %o5
+ bne 1f
+ mov %o0, %o3
+
+ ! Divide by zero trap. If it returns, return 0 (about as
+ ! wrong as possible, but that is what SunOS does...).
+ ta ST_DIV0
+ retl
+ clr %o0
+
+1:
+ cmp %o3, %o5 ! if %o1 exceeds %o0, done
+ blu LOC(got_result) ! (and algorithm fails otherwise)
+ clr %o2
+ sethi %hi(1 << (32 - 4 - 1)), %g1
+ cmp %o3, %g1
+ blu LOC(not_really_big)
+ clr %o4
+
+ ! Here the dividend is >= 2**(31-N) or so. We must be careful here,
+ ! as our usual N-at-a-shot divide step will cause overflow and havoc.
+ ! The number of bits in the result here is N*ITER+SC, where SC <= N.
+ ! Compute ITER in an unorthodox manner: know we need to shift V into
+ ! the top decade: so do not even bother to compare to R.
+ 1:
+ cmp %o5, %g1
+ bgeu 3f
+ mov 1, %g2
+ sll %o5, 4, %o5
+ b 1b
+ add %o4, 1, %o4
+
+ ! Now compute %g2.
+ 2: addcc %o5, %o5, %o5
+ bcc LOC(not_too_big)
+ add %g2, 1, %g2
+
+ ! We get here if the %o1 overflowed while shifting.
+ ! This means that %o3 has the high-order bit set.
+ ! Restore %o5 and subtract from %o3.
+ sll %g1, 4, %g1 ! high order bit
+ srl %o5, 1, %o5 ! rest of %o5
+ add %o5, %g1, %o5
+ b LOC(do_single_div)
+ sub %g2, 1, %g2
+
+ LOC(not_too_big):
+ 3: cmp %o5, %o3
+ blu 2b
+ nop
+ be LOC(do_single_div)
+ nop
+ /* NB: these are commented out in the V8-Sparc manual as well */
+ /* (I do not understand this) */
+ ! %o5 > %o3: went too far: back up 1 step
+ ! srl %o5, 1, %o5
+ ! dec %g2
+ ! do single-bit divide steps
+ !
+ ! We have to be careful here. We know that %o3 >= %o5, so we can do the
+ ! first divide step without thinking. BUT, the others are conditional,
+ ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high-
+ ! order bit set in the first step, just falling into the regular
+ ! division loop will mess up the first time around.
+ ! So we unroll slightly...
+ LOC(do_single_div):
+ subcc %g2, 1, %g2
+ bl LOC(end_regular_divide)
+ nop
+ sub %o3, %o5, %o3
+ mov 1, %o2
+ b LOC(end_single_divloop)
+ nop
+ LOC(single_divloop):
+ sll %o2, 1, %o2
+ bl 1f
+ srl %o5, 1, %o5
+ ! %o3 >= 0
+ sub %o3, %o5, %o3
+ b 2f
+ add %o2, 1, %o2
+ 1: ! %o3 < 0
+ add %o3, %o5, %o3
+ sub %o2, 1, %o2
+ 2:
+ LOC(end_single_divloop):
+ subcc %g2, 1, %g2
+ bge LOC(single_divloop)
+ tst %o3
+ b,a LOC(end_regular_divide)
+
+LOC(not_really_big):
+1:
+ sll %o5, 4, %o5
+ cmp %o5, %o3
+ bleu 1b
+ addcc %o4, 1, %o4
+ be LOC(got_result)
+ sub %o4, 1, %o4
+
+ tst %o3 ! set up for initial iteration
+LOC(divloop):
+ sll %o2, 4, %o2
+ ! depth 1, accumulated bits 0
+ bl LOC(1.16)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 2, accumulated bits 1
+ bl LOC(2.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 3, accumulated bits 3
+ bl LOC(3.19)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 7
+ bl LOC(4.23)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (7*2+1), %o2
+
+LOC(4.23):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (7*2-1), %o2
+
+
+LOC(3.19):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 5
+ bl LOC(4.21)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (5*2+1), %o2
+
+LOC(4.21):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (5*2-1), %o2
+
+
+
+LOC(2.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 3, accumulated bits 1
+ bl LOC(3.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 3
+ bl LOC(4.19)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (3*2+1), %o2
+
+LOC(4.19):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (3*2-1), %o2
+
+
+LOC(3.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits 1
+ bl LOC(4.17)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (1*2+1), %o2
+
+LOC(4.17):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (1*2-1), %o2
+
+
+
+
+LOC(1.16):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 2, accumulated bits -1
+ bl LOC(2.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 3, accumulated bits -1
+ bl LOC(3.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -1
+ bl LOC(4.15)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-1*2+1), %o2
+
+LOC(4.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-1*2-1), %o2
+
+
+LOC(3.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -3
+ bl LOC(4.13)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-3*2+1), %o2
+
+LOC(4.13):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-3*2-1), %o2
+
+
+
+LOC(2.15):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 3, accumulated bits -3
+ bl LOC(3.13)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -5
+ bl LOC(4.11)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-5*2+1), %o2
+
+LOC(4.11):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-5*2-1), %o2
+
+
+LOC(3.13):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ ! depth 4, accumulated bits -7
+ bl LOC(4.9)
+ srl %o5,1,%o5
+ ! remainder is positive
+ subcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-7*2+1), %o2
+
+LOC(4.9):
+ ! remainder is negative
+ addcc %o3,%o5,%o3
+ b 9f
+ add %o2, (-7*2-1), %o2
+
+
+
+
+ 9:
+LOC(end_regular_divide):
+ subcc %o4, 1, %o4
+ bge LOC(divloop)
+ tst %o3
+ bl,a LOC(got_result)
+ ! non-restoring fixup here (one instruction only!)
+ add %o3, %o1, %o3
+
+
+LOC(got_result):
+
+ retl
+ mov %o3, %o0
+
+END(.urem)
+#endif
diff --git a/mdk-stage1/dietlibc/start.h b/mdk-stage1/dietlibc/start.h
new file mode 100644
index 000000000..5983b0462
--- /dev/null
+++ b/mdk-stage1/dietlibc/start.h
@@ -0,0 +1,10 @@
+.section ".bss"
+ .align 8
+
+ .weak errno
+errno:
+ .long 0
+
+ .weak environ
+environ:
+ .long 0
diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h
new file mode 100644
index 000000000..5e9782ee9
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.h
@@ -0,0 +1,82 @@
+#ifdef __ASSEMBLER__
+
+#include <asm/unistd.h>
+
+#else
+
+#include <linux/unistd.h>
+
+#endif
+
+#ifdef __i386__
+
+#define syscall(name,sym) \
+.text; \
+.global sym; \
+sym: \
+ movb $__NR_##name,%al; \
+ jmp __unified_syscall
+
+#endif
+
+#ifdef __sparc__
+
+#define syscall(name,sym) \
+.text; \
+.global sym; \
+sym: \
+ b __unified_syscall; \
+ mov __NR_##name, %g1
+
+#endif
+
+#ifdef __powerpc__
+
+#define syscall(name,sym) \
+.text; \
+.global sym; \
+sym: \
+ li 0,__NR_##name; \
+ b __unified_syscall
+
+#endif
+
+
+#ifdef __mips__
+
+#define syscall(name,sym) \
+.text; \
+.global sym; \
+.ent sym; \
+sym: \
+ li $2,__NR_##name; \
+ la $25,__unified_syscall; \
+ jr $25; \
+.end sym
+
+#endif
+
+#ifdef __arm__
+
+#define syscall(name,sym) \
+.text; \
+.global sym; \
+sym: \
+ swi __NR_##name; \
+ b __unified_syscall
+
+#endif
+
+
+#ifdef __alpha__
+
+#define syscall(name,sym) \
+.text ; \
+.align 2 ; \
+.global sym ; \
+.type sym,@function ; \
+sym: ; \
+ lda $0, __NR_##name($31) ; \
+ br __unified_syscall
+
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/__pread.S b/mdk-stage1/dietlibc/syscalls.s/__pread.S
new file mode 100644
index 000000000..4603a1009
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/__pread.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.weak __libc_pread
+syscall(pread,__pread)
diff --git a/mdk-stage1/dietlibc/syscalls.s/_llseek.S b/mdk-stage1/dietlibc/syscalls.s/_llseek.S
new file mode 100644
index 000000000..3e240d822
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/_llseek.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(_llseek,_llseek)
diff --git a/mdk-stage1/dietlibc/syscalls.s/access.S b/mdk-stage1/dietlibc/syscalls.s/access.S
new file mode 100644
index 000000000..d1edafd8c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/access.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(access,access)
diff --git a/mdk-stage1/dietlibc/syscalls.s/brk.S b/mdk-stage1/dietlibc/syscalls.s/brk.S
new file mode 100644
index 000000000..6e21810bd
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/brk.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(brk,__diet_brk)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chdir.S b/mdk-stage1/dietlibc/syscalls.s/chdir.S
new file mode 100644
index 000000000..204f3dd6c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/chdir.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(chdir,chdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chmod.S b/mdk-stage1/dietlibc/syscalls.s/chmod.S
new file mode 100644
index 000000000..c1b85f5a4
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/chmod.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(chmod,chmod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chown.S b/mdk-stage1/dietlibc/syscalls.s/chown.S
new file mode 100644
index 000000000..daac3bf13
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/chown.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(chown,chown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/chroot.S b/mdk-stage1/dietlibc/syscalls.s/chroot.S
new file mode 100644
index 000000000..65de1e473
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/chroot.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(chroot,chroot)
diff --git a/mdk-stage1/dietlibc/syscalls.s/close.S b/mdk-stage1/dietlibc/syscalls.s/close.S
new file mode 100644
index 000000000..0f72ca1ae
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/close.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_close
+__libc_close:
+syscall(close,close)
diff --git a/mdk-stage1/dietlibc/syscalls.s/dup.S b/mdk-stage1/dietlibc/syscalls.s/dup.S
new file mode 100644
index 000000000..b2977fd43
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/dup.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(dup,dup)
diff --git a/mdk-stage1/dietlibc/syscalls.s/dup2.S b/mdk-stage1/dietlibc/syscalls.s/dup2.S
new file mode 100644
index 000000000..774bfbfe7
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/dup2.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(dup2,dup2)
diff --git a/mdk-stage1/dietlibc/syscalls.s/execve.S b/mdk-stage1/dietlibc/syscalls.s/execve.S
new file mode 100644
index 000000000..ff952ae7d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/execve.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(execve,execve)
diff --git a/mdk-stage1/dietlibc/syscalls.s/exit.S b/mdk-stage1/dietlibc/syscalls.s/exit.S
new file mode 100644
index 000000000..89d3145e9
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/exit.S
@@ -0,0 +1,6 @@
+#include "syscalls.h"
+
+.text
+.weak exit
+exit:
+syscall(exit,_exit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchdir.S b/mdk-stage1/dietlibc/syscalls.s/fchdir.S
new file mode 100644
index 000000000..0aeaf610b
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fchdir.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(fchdir,fchdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchmod.S b/mdk-stage1/dietlibc/syscalls.s/fchmod.S
new file mode 100644
index 000000000..30bc2e210
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fchmod.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(fchmod,fchmod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fchown.S b/mdk-stage1/dietlibc/syscalls.s/fchown.S
new file mode 100644
index 000000000..bc2a296ea
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fchown.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(fchown,fchown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fcntl.S b/mdk-stage1/dietlibc/syscalls.s/fcntl.S
new file mode 100644
index 000000000..8516bc232
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fcntl.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_fcntl
+__libc_fcntl:
+syscall(fcntl,fcntl)
diff --git a/mdk-stage1/dietlibc/syscalls.s/flock.S b/mdk-stage1/dietlibc/syscalls.s/flock.S
new file mode 100644
index 000000000..7b4daeff7
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/flock.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(flock,flock)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fork.S b/mdk-stage1/dietlibc/syscalls.s/fork.S
new file mode 100644
index 000000000..66732d27e
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fork.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_fork
+__libc_fork:
+syscall(fork,fork)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S b/mdk-stage1/dietlibc/syscalls.s/fstatfs.S
new file mode 100644
index 000000000..a23c8770c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fstatfs.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(fstatfs,fstatfs)
diff --git a/mdk-stage1/dietlibc/syscalls.s/fsync.S b/mdk-stage1/dietlibc/syscalls.s/fsync.S
new file mode 100644
index 000000000..624cbaf97
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/fsync.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(fsync,fsync)
diff --git a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S b/mdk-stage1/dietlibc/syscalls.s/ftruncate.S
new file mode 100644
index 000000000..dde57a615
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/ftruncate.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(ftruncate,ftruncate)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getcwd.S b/mdk-stage1/dietlibc/syscalls.s/getcwd.S
new file mode 100644
index 000000000..8ff0a026e
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getcwd.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getcwd,getcwd)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents.S b/mdk-stage1/dietlibc/syscalls.s/getdents.S
new file mode 100644
index 000000000..f476e939d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getdents.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getdents,getdents)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents64.S b/mdk-stage1/dietlibc/syscalls.s/getdents64.S
new file mode 100644
index 000000000..16859addf
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getdents64.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+#ifdef __NR_getdents64
+syscall(getdents64,getdents64)
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getegid.S b/mdk-stage1/dietlibc/syscalls.s/getegid.S
new file mode 100644
index 000000000..64843ee35
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getegid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getegid,getegid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/geteuid.S b/mdk-stage1/dietlibc/syscalls.s/geteuid.S
new file mode 100644
index 000000000..55dc00981
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/geteuid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(geteuid,geteuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getgid.S b/mdk-stage1/dietlibc/syscalls.s/getgid.S
new file mode 100644
index 000000000..39f092685
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getgid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getgid,getgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getgroups.S b/mdk-stage1/dietlibc/syscalls.s/getgroups.S
new file mode 100644
index 000000000..b4c57689c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getgroups.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getgroups,getgroups)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getpgid.S b/mdk-stage1/dietlibc/syscalls.s/getpgid.S
new file mode 100644
index 000000000..e568f060f
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getpgid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getpgid,getpgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getpid.S b/mdk-stage1/dietlibc/syscalls.s/getpid.S
new file mode 100644
index 000000000..093884785
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getpid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getpid,getpid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getppid.S b/mdk-stage1/dietlibc/syscalls.s/getppid.S
new file mode 100644
index 000000000..b05e64ae3
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getppid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getppid,getppid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getresgid.S b/mdk-stage1/dietlibc/syscalls.s/getresgid.S
new file mode 100644
index 000000000..a1d873c15
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getresgid.S
@@ -0,0 +1,7 @@
+#include "syscalls.h"
+
+#ifdef __NR_getresgid
+
+syscall(getresgid,getresgid)
+
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getresuid.S b/mdk-stage1/dietlibc/syscalls.s/getresuid.S
new file mode 100644
index 000000000..62f6d764f
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getresuid.S
@@ -0,0 +1,7 @@
+#include "syscalls.h"
+
+#ifdef __getresuid
+
+syscall(getresuid)
+
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S b/mdk-stage1/dietlibc/syscalls.s/getrlimit.S
new file mode 100644
index 000000000..1c63c0196
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getrlimit.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getrlimit,getrlimit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getrusage.S b/mdk-stage1/dietlibc/syscalls.s/getrusage.S
new file mode 100644
index 000000000..2972c4938
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getrusage.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getrusage,getrusage)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getsid.S b/mdk-stage1/dietlibc/syscalls.s/getsid.S
new file mode 100644
index 000000000..cf5cce9d5
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getsid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getsid,getsid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S b/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S
new file mode 100644
index 000000000..f364b787a
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(gettimeofday,gettimeofday)
diff --git a/mdk-stage1/dietlibc/syscalls.s/getuid.S b/mdk-stage1/dietlibc/syscalls.s/getuid.S
new file mode 100644
index 000000000..c53c25a7a
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/getuid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(getuid,getuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/ioctl.S b/mdk-stage1/dietlibc/syscalls.s/ioctl.S
new file mode 100644
index 000000000..463d319dc
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/ioctl.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(ioctl,ioctl)
diff --git a/mdk-stage1/dietlibc/syscalls.s/kill.S b/mdk-stage1/dietlibc/syscalls.s/kill.S
new file mode 100644
index 000000000..eb466dd33
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/kill.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(kill,kill)
diff --git a/mdk-stage1/dietlibc/syscalls.s/lchown.S b/mdk-stage1/dietlibc/syscalls.s/lchown.S
new file mode 100644
index 000000000..19dfefaef
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/lchown.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(lchown,lchown)
diff --git a/mdk-stage1/dietlibc/syscalls.s/link.S b/mdk-stage1/dietlibc/syscalls.s/link.S
new file mode 100644
index 000000000..8015d11c8
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/link.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(link,link)
diff --git a/mdk-stage1/dietlibc/syscalls.s/lseek.S b/mdk-stage1/dietlibc/syscalls.s/lseek.S
new file mode 100644
index 000000000..454827483
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/lseek.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(lseek,lseek)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mkdir.S b/mdk-stage1/dietlibc/syscalls.s/mkdir.S
new file mode 100644
index 000000000..d6214ee46
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/mkdir.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mkdir,mkdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mknod.S b/mdk-stage1/dietlibc/syscalls.s/mknod.S
new file mode 100644
index 000000000..c1b2af12d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/mknod.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mknod,mknod)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mprotect.S b/mdk-stage1/dietlibc/syscalls.s/mprotect.S
new file mode 100644
index 000000000..73e9a8e17
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/mprotect.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mprotect,mprotect)
diff --git a/mdk-stage1/dietlibc/syscalls.s/mremap.S b/mdk-stage1/dietlibc/syscalls.s/mremap.S
new file mode 100644
index 000000000..259ccec99
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/mremap.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mremap,mremap)
diff --git a/mdk-stage1/dietlibc/syscalls.s/munmap.S b/mdk-stage1/dietlibc/syscalls.s/munmap.S
new file mode 100644
index 000000000..b43a7b22d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/munmap.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(munmap,munmap)
diff --git a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S b/mdk-stage1/dietlibc/syscalls.s/nanosleep.S
new file mode 100644
index 000000000..7dce9956d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/nanosleep.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(nanosleep,nanosleep)
diff --git a/mdk-stage1/dietlibc/syscalls.s/open.S b/mdk-stage1/dietlibc/syscalls.s/open.S
new file mode 100644
index 000000000..11cfecd4a
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/open.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(open,open)
diff --git a/mdk-stage1/dietlibc/syscalls.s/pipe.S b/mdk-stage1/dietlibc/syscalls.s/pipe.S
new file mode 100644
index 000000000..03994d055
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/pipe.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(pipe,pipe)
diff --git a/mdk-stage1/dietlibc/syscalls.s/poll.S b/mdk-stage1/dietlibc/syscalls.s/poll.S
new file mode 100644
index 000000000..359f55ddd
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/poll.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(poll,poll)
diff --git a/mdk-stage1/dietlibc/syscalls.s/pwrite.S b/mdk-stage1/dietlibc/syscalls.s/pwrite.S
new file mode 100644
index 000000000..f52ead7b2
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/pwrite.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(pwrite,__pwrite)
diff --git a/mdk-stage1/dietlibc/syscalls.s/read.S b/mdk-stage1/dietlibc/syscalls.s/read.S
new file mode 100644
index 000000000..98ad98c17
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/read.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_read
+__libc_read:
+syscall(read,read)
diff --git a/mdk-stage1/dietlibc/syscalls.s/readlink.S b/mdk-stage1/dietlibc/syscalls.s/readlink.S
new file mode 100644
index 000000000..850e77c4e
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/readlink.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(readlink,readlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/rename.S b/mdk-stage1/dietlibc/syscalls.s/rename.S
new file mode 100644
index 000000000..f92f1dc5d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/rename.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(rename,rename)
diff --git a/mdk-stage1/dietlibc/syscalls.s/rmdir.S b/mdk-stage1/dietlibc/syscalls.s/rmdir.S
new file mode 100644
index 000000000..341216e8c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/rmdir.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(rmdir,rmdir)
diff --git a/mdk-stage1/dietlibc/syscalls.s/select.S b/mdk-stage1/dietlibc/syscalls.s/select.S
new file mode 100644
index 000000000..3353848ff
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/select.S
@@ -0,0 +1,4 @@
+#include "syscalls.h"
+
+.text
+syscall(select,select)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sendfile.S b/mdk-stage1/dietlibc/syscalls.s/sendfile.S
new file mode 100644
index 000000000..d56219dc6
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sendfile.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_sendfile
+__libc_sendfile:
+syscall(sendfile,sendfile)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S b/mdk-stage1/dietlibc/syscalls.s/setdomainname.S
new file mode 100644
index 000000000..eaade25da
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setdomainname.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setdomainname,setdomainname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setgid.S b/mdk-stage1/dietlibc/syscalls.s/setgid.S
new file mode 100644
index 000000000..69b18a9c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setgid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setgid,setgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setgroups.S b/mdk-stage1/dietlibc/syscalls.s/setgroups.S
new file mode 100644
index 000000000..ce8e800a6
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setgroups.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setgroups,setgroups)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sethostname.S b/mdk-stage1/dietlibc/syscalls.s/sethostname.S
new file mode 100644
index 000000000..7616d4848
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sethostname.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sethostname,sethostname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setitimer.S b/mdk-stage1/dietlibc/syscalls.s/setitimer.S
new file mode 100644
index 000000000..bcb0623ba
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setitimer.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setitimer,setitimer)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setpgid.S b/mdk-stage1/dietlibc/syscalls.s/setpgid.S
new file mode 100644
index 000000000..e93db31dc
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setpgid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setpgid,setpgid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setregid.S b/mdk-stage1/dietlibc/syscalls.s/setregid.S
new file mode 100644
index 000000000..3a7abbc28
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setregid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setregid,setregid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setresgid.S b/mdk-stage1/dietlibc/syscalls.s/setresgid.S
new file mode 100644
index 000000000..64cbac94e
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setresgid.S
@@ -0,0 +1,7 @@
+#include "syscalls.h"
+
+#ifdef __setresgid
+
+syscall(setresgid)
+
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/setresuid.S b/mdk-stage1/dietlibc/syscalls.s/setresuid.S
new file mode 100644
index 000000000..20b6abee9
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setresuid.S
@@ -0,0 +1,7 @@
+#include "syscalls.h"
+
+#ifdef __setresuid
+
+syscall(setresuid)
+
+#endif
diff --git a/mdk-stage1/dietlibc/syscalls.s/setreuid.S b/mdk-stage1/dietlibc/syscalls.s/setreuid.S
new file mode 100644
index 000000000..33ca8deed
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setreuid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setreuid,setreuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S b/mdk-stage1/dietlibc/syscalls.s/setrlimit.S
new file mode 100644
index 000000000..605105658
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setrlimit.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setrlimit,setrlimit)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setsid.S b/mdk-stage1/dietlibc/syscalls.s/setsid.S
new file mode 100644
index 000000000..d1ef1c58e
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setsid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setsid,setsid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/setuid.S b/mdk-stage1/dietlibc/syscalls.s/setuid.S
new file mode 100644
index 000000000..d20571cbf
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/setuid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(setuid,setuid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigaction.S b/mdk-stage1/dietlibc/syscalls.s/sigaction.S
new file mode 100644
index 000000000..32382870c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sigaction.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sigaction,sigaction)
diff --git a/mdk-stage1/dietlibc/syscalls.s/signal.S b/mdk-stage1/dietlibc/syscalls.s/signal.S
new file mode 100644
index 000000000..86c4d5db0
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/signal.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(signal,signal)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigpending.S b/mdk-stage1/dietlibc/syscalls.s/sigpending.S
new file mode 100644
index 000000000..08715bef5
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sigpending.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sigpending,sigpending)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S b/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S
new file mode 100644
index 000000000..8d6563b8f
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S
@@ -0,0 +1,6 @@
+#include "syscalls.h"
+
+.text
+.weak sigprocmask
+sigprocmask:
+syscall(sigprocmask,__sigprocmask)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S b/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S
new file mode 100644
index 000000000..c832c2b5d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sigsuspend,sigsuspend)
diff --git a/mdk-stage1/dietlibc/syscalls.s/socketcall.S b/mdk-stage1/dietlibc/syscalls.s/socketcall.S
new file mode 100644
index 000000000..5837c049a
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/socketcall.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(socketcall,socketcall)
diff --git a/mdk-stage1/dietlibc/syscalls.s/statfs.S b/mdk-stage1/dietlibc/syscalls.s/statfs.S
new file mode 100644
index 000000000..7560f569d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/statfs.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(statfs,statfs)
diff --git a/mdk-stage1/dietlibc/syscalls.s/swapoff.S b/mdk-stage1/dietlibc/syscalls.s/swapoff.S
new file mode 100644
index 000000000..f75ec94e0
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/swapoff.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(swapoff,swapoff)
diff --git a/mdk-stage1/dietlibc/syscalls.s/swapon.S b/mdk-stage1/dietlibc/syscalls.s/swapon.S
new file mode 100644
index 000000000..d10594168
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/swapon.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(swapon,swapon)
diff --git a/mdk-stage1/dietlibc/syscalls.s/symlink.S b/mdk-stage1/dietlibc/syscalls.s/symlink.S
new file mode 100644
index 000000000..07a6a7fdc
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/symlink.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(symlink,symlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/sync.S b/mdk-stage1/dietlibc/syscalls.s/sync.S
new file mode 100644
index 000000000..1ee021693
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/sync.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(sync,sync)
diff --git a/mdk-stage1/dietlibc/syscalls.s/syslog.S b/mdk-stage1/dietlibc/syscalls.s/syslog.S
new file mode 100644
index 000000000..55df87d53
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/syslog.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(syslog,syslog)
diff --git a/mdk-stage1/dietlibc/syscalls.s/time.S b/mdk-stage1/dietlibc/syscalls.s/time.S
new file mode 100644
index 000000000..26c79091c
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/time.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(time,time)
diff --git a/mdk-stage1/dietlibc/syscalls.s/truncate.S b/mdk-stage1/dietlibc/syscalls.s/truncate.S
new file mode 100644
index 000000000..7052bdcee
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/truncate.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(truncate,truncate)
diff --git a/mdk-stage1/dietlibc/syscalls.s/umask.S b/mdk-stage1/dietlibc/syscalls.s/umask.S
new file mode 100644
index 000000000..9f8ffeda6
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/umask.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(umask,umask)
diff --git a/mdk-stage1/dietlibc/syscalls.s/umount.S b/mdk-stage1/dietlibc/syscalls.s/umount.S
new file mode 100644
index 000000000..4a423d964
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/umount.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(umount,umount)
diff --git a/mdk-stage1/dietlibc/syscalls.s/uname.S b/mdk-stage1/dietlibc/syscalls.s/uname.S
new file mode 100644
index 000000000..a460d2aa6
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/uname.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(uname,uname)
diff --git a/mdk-stage1/dietlibc/syscalls.s/unlink.S b/mdk-stage1/dietlibc/syscalls.s/unlink.S
new file mode 100644
index 000000000..bd6713061
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/unlink.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(unlink,unlink)
diff --git a/mdk-stage1/dietlibc/syscalls.s/utime.S b/mdk-stage1/dietlibc/syscalls.s/utime.S
new file mode 100644
index 000000000..08cd22158
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/utime.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(utime,utime)
diff --git a/mdk-stage1/dietlibc/syscalls.s/vhangup.S b/mdk-stage1/dietlibc/syscalls.s/vhangup.S
new file mode 100644
index 000000000..6e2d1d343
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/vhangup.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(vhangup,vhangup)
diff --git a/mdk-stage1/dietlibc/syscalls.s/wait4.S b/mdk-stage1/dietlibc/syscalls.s/wait4.S
new file mode 100644
index 000000000..ca6773569
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/wait4.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(wait4,wait4)
diff --git a/mdk-stage1/dietlibc/syscalls.s/waitpid.S b/mdk-stage1/dietlibc/syscalls.s/waitpid.S
new file mode 100644
index 000000000..569d8f68d
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/waitpid.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(waitpid,waitpid)
diff --git a/mdk-stage1/dietlibc/syscalls.s/write.S b/mdk-stage1/dietlibc/syscalls.s/write.S
new file mode 100644
index 000000000..409575be0
--- /dev/null
+++ b/mdk-stage1/dietlibc/syscalls.s/write.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.weak __libc_write
+__libc_write:
+syscall(write,write)
diff --git a/mdk-stage1/insmod-busybox/Makefile b/mdk-stage1/insmod-busybox/Makefile
index 451e3b262..ca05279e9 100644
--- a/mdk-stage1/insmod-busybox/Makefile
+++ b/mdk-stage1/insmod-busybox/Makefile
@@ -8,30 +8,47 @@
#
#*****************************************************************************
+top_dir = ..
-all: insmod libinsmod.a
+include $(top_dir)/Makefile.common
+
+
+all: insmod libinsmod.a libinsmod-DIET.a
clean:
- rm -f *.o insmod libinsmod.a
+ rm -f *.o insmod libinsmod.a libinsmod-DIET.a
+
FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.47"' -DBB_BT='"2000.12.06-14:02+0000"'
+
insmod: insmod-frontend.o insmod.o utility-standalone.o
gcc -o $@ $^
+ $(STRIPCMD) $@
libinsmod.a: insmod.o utility.o
ar cru $@ $^
ranlib $@
+libinsmod-DIET.a: insmod-DIET.o utility-DIET.o
+ ar cru $@ $^
+ ranlib $@
+
insmod-frontend.o: insmod-frontend.c busybox.h
- gcc $(FLAGS) insmod-frontend.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c
utility.o: utility.c busybox.h
- gcc $(FLAGS) utility.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) utility.c
+
+utility-DIET.o: utility.c busybox.h
+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ utility.c
utility-standalone.o: utility.c busybox.h
- gcc $(FLAGS) -o $@ -D_STANDALONE_ utility.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c
insmod.o: insmod.c busybox.h
- gcc $(FLAGS) insmod.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c
+
+insmod-DIET.o: insmod.c busybox.h
+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c
diff --git a/mdk-stage1/insmod-busybox/busybox.h b/mdk-stage1/insmod-busybox/busybox.h
index 69f455435..72d5e0a69 100644
--- a/mdk-stage1/insmod-busybox/busybox.h
+++ b/mdk-stage1/insmod-busybox/busybox.h
@@ -37,8 +37,6 @@
#include <errno.h>
#include <sys/stat.h>
#include <sys/param.h>
-#include <mntent.h>
-#include <regex.h>
/* for the _syscall() macros */
#include <sys/syscall.h>
#include <linux/unistd.h>
@@ -394,7 +392,7 @@ extern void print_file(FILE *file);
extern int print_file_by_name(char *filename);
extern char process_escape_sequence(char **ptr);
extern char *get_last_path_component(char *path);
-extern void xregcomp(regex_t *preg, const char *regex, int cflags);
+// extern void xregcomp(regex_t *preg, const char *regex, int cflags);
#ifndef DMALLOC
extern void *xmalloc (size_t size);
diff --git a/mdk-stage1/insmod-busybox/insmod.c b/mdk-stage1/insmod-busybox/insmod.c
index ac5f191fb..86c9ad181 100644
--- a/mdk-stage1/insmod-busybox/insmod.c
+++ b/mdk-stage1/insmod-busybox/insmod.c
@@ -45,7 +45,6 @@
#include <dirent.h>
#include <ctype.h>
#include <assert.h>
-#include <getopt.h>
#include <sys/utsname.h>
//----------------------------------------------------------------------------
@@ -2926,13 +2925,11 @@ extern int insmod_main( int argc, char **argv)
}
obj_allocate_commons(f);
- if (optind < argc) {
- if (m_has_modinfo
- ? !new_process_module_arguments(f, argc - optind, argv + optind)
- : !old_process_module_arguments(f, argc - optind, argv + optind))
- {
- goto out;
- }
+ if (m_has_modinfo
+ ? !new_process_module_arguments(f, argc-1, argv+1)
+ : !old_process_module_arguments(f, argc-1, argv+1))
+ {
+ goto out;
}
arch_create_got(f);
diff --git a/mdk-stage1/insmod-busybox/utility.c b/mdk-stage1/insmod-busybox/utility.c
index c5f26b8d9..89e460dd0 100644
--- a/mdk-stage1/insmod-busybox/utility.c
+++ b/mdk-stage1/insmod-busybox/utility.c
@@ -78,30 +78,30 @@ const char mtab_file[] = "/dev/mtab";
#endif
#ifdef _STANDALONE_
-extern void errorMsg(const char *s, ...)
+void errorMsg(const char *s, ...)
{
va_list p;
- va_start(p, s);
fflush(stdout);
- fprintf(stderr, "busybox: ");
- vfprintf(stderr, s, p);
- fprintf(stderr, "\n");
+ printf("busybox: ");
+ va_start(p, s);
+ vprintf(s, p);
va_end(p);
- fflush(stderr);
+ printf("\n");
+ fflush(stdout);
}
-extern void fatalError(const char *s, ...)
+void fatalError(const char *s, ...)
{
va_list p;
- va_start(p, s);
fflush(stdout);
- fprintf(stderr, "busybox: ");
- vfprintf(stderr, s, p);
- fprintf(stderr, "\n");
+ fprintf(stdout, "busybox: ");
+ va_start(p, s);
+ vfprintf(stdout, s, p);
va_end(p);
- fflush(stderr);
+ fprintf(stdout, "\n");
+ fflush(stdout);
exit(FALSE);
}
#else /* _STANDALONE_ */
diff --git a/mdk-stage1/mar/Makefile b/mdk-stage1/mar/Makefile
index 631a944bd..5723bdf9d 100644
--- a/mdk-stage1/mar/Makefile
+++ b/mdk-stage1/mar/Makefile
@@ -17,27 +17,39 @@
#
#*****************************************************************************
+top_dir = ..
-all: libmar.a mar
+include $(top_dir)/Makefile.common
+
+
+all: libmar.a libmar-DIET.a mar
clean:
- rm -f *.o libmar.a mar
+ rm -f *.o libmar.a libmar-DIET.a mar
FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c
mar: mar-frontend.o mar-extract-only-standalone.o
gcc -o mar mar-frontend.o mar-extract-only-standalone.o -lz
+ $(STRIPCMD) $@
libmar.a: mar-extract-only.o
ar -cru $@ $^
ranlib $@
-mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h
- gcc $(FLAGS) mar-frontend.c
+libmar-DIET.a: mar-extract-only-DIET.o
+ ar -cru $@ $^
+ ranlib $@
mar-extract-only.o: mar-extract-only.c mar-extract-only.h mar.h
- gcc $(FLAGS) mar-extract-only.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) mar-extract-only.c
+
+mar-extract-only-DIET.o: mar-extract-only.c mar-extract-only.h mar.h
+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ mar-extract-only.c
+
+mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h
+ gcc $(FLAGS) $(GLIBC_INCLUDES) mar-frontend.c
mar-extract-only-standalone.o: mar-extract-only.c mar-extract-only.h mar.h
- gcc $(FLAGS) -o $@ -D_STANDALONE_ mar-extract-only.c
+ gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ mar-extract-only.c
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 16f9ebb06..fdfc7d097 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -89,7 +89,9 @@ void probe_that_type(enum driver_type type)
if (!fgets(buf, sizeof(buf), f)) break;
- sscanf(buf, "%x %04x%04x", &garb, &vendor, &device);
+ sscanf(buf, "%x %x", &garb, &vendor);
+ device = vendor & 0xFFFF; /* because scanf from dietlibc does not support %4f */
+ vendor = (vendor >> 16) & 0xFFFF;
for (i = 0; i < len; i++) {
if (pcidb[i].vendor == vendor && pcidb[i].device == device) {
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index 59e63b988..935d92810 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -177,7 +177,7 @@ enum return_type method_select_and_prepare(void)
}
-int main(int argc, char **argv)
+int main(int argc, char **argv, char **env)
{
enum return_type ret;
char ** argptr;
@@ -226,7 +226,7 @@ int main(int argc, char **argv)
*argptr++ = method_name;
*argptr++ = NULL;
- execv(stage2_args[0], stage2_args);
+ execve(stage2_args[0], stage2_args, env);
printf("error in exec of stage2 :-(\n");
fatal_error(strerror(errno));
diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c
index 4b0b6bd0d..9fe110ca9 100644
--- a/mdk-stage1/stdio-frontend.c
+++ b/mdk-stage1/stdio-frontend.c
@@ -53,10 +53,18 @@ static void get_any_response(void)
static int get_int_response(void)
{
- int i = 0; /* (0) tied to Cancel */
+ char s[50];
+ int j = 0, i = 0; /* (0) tied to Cancel */
fflush(stdout);
- scanf(" %d", &i);
- return i;
+ read(0, &(s[i++]), 1);
+ fcntl(0, F_SETFL, O_NONBLOCK);
+ do {
+ int v = s[i-1];
+ if (v >= '0' && v <= '9')
+ j = j*10 + (v - '0');
+ } while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s));
+ fcntl(0, F_SETFL, 0);
+ return j;
}
static char * get_string_response(void)
diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c
index 6a4b938ed..3d22d4d17 100644
--- a/mdk-stage1/tools.c
+++ b/mdk-stage1/tools.c
@@ -269,7 +269,10 @@ enum return_type load_ramdisk(void)
/* pixel's */
void * memdup(void *src, size_t size)
{
- void * r = malloc(size);
+ void * r;
+ if (size < 8)
+ size = 16;
+ r = malloc(size);
memcpy(r, src, size);
return r;
}