diff options
Diffstat (limited to 'mdk-stage1')
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; } |