diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:39:52 +0000 |
commit | 8a0efa53e44919bcf5ccb1d3353618a82afdf8bc (patch) | |
tree | 68c3dbf3f2c6fd5d49777def9914d77b5cd4589d /newlib/libc/sys/go32 | |
parent | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (diff) | |
download | cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.gz cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.tar.bz2 cygnal-8a0efa53e44919bcf5ccb1d3353618a82afdf8bc.zip |
import newlib-2000-02-17 snapshot
Diffstat (limited to 'newlib/libc/sys/go32')
122 files changed, 8027 insertions, 0 deletions
diff --git a/newlib/libc/sys/go32/Makefile.am b/newlib/libc/sys/go32/Makefile.am new file mode 100644 index 000000000..4ccd669da --- /dev/null +++ b/newlib/libc/sys/go32/Makefile.am @@ -0,0 +1,105 @@ +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = cygnus + +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) + +noinst_LIBRARIES = lib.a + +lib_a_SOURCES = \ + _exit.s \ + _main.c \ + abort.c \ + access.c \ + bdos.c \ + bdosptr.c \ + brk.s \ + chdir.s \ + chmod.c \ + chown.c \ + clock.S \ + close.s \ + creat.s \ + crlf2nl.c \ + dir.c \ + dosmem.S \ + dpmi.c \ + dup.s \ + dup2.s \ + exec.c \ + fchmod.c \ + findfirs.s \ + findnext.s \ + fixpath.c \ + fstat.s \ + fsync.s \ + ftruncat.c \ + gerrno.s \ + getcwd.c \ + getdate.c \ + getdtabl.c \ + getgid.c \ + getkey.s \ + getpages.c \ + getpid.c \ + getrusag.c \ + gettime.c \ + gettimeo.c \ + getuid.c \ + getwd.s \ + go32func.c \ + infoblk.c \ + inportb.s \ + inportl.s \ + inportsb.s \ + inportsl.s \ + inportsw.s \ + inportw.s \ + int86x.s \ + intdos.c \ + intdosx.c \ + isatty.s \ + kbhit.s \ + kill.c \ + link.s \ + longjmp.S \ + lseek.s \ + lstat.s \ + mkdir.s \ + open.s \ + outportb.s \ + outportl.s \ + outportw.s \ + outprtsb.s \ + outprtsl.s \ + outprtsw.s \ + read.s \ + readv.c \ + rename.s \ + rmdir.s \ + sbrk.s \ + screen.S \ + setjmp.S \ + setmode.s \ + setstack.S \ + settimeo.s \ + sleep.c \ + stat.c \ + stat_ast.s \ + syserr.c \ + system.s \ + tell.s \ + time.c \ + truncate.c \ + turbo.s \ + umask.c \ + unlink.s \ + utime.c \ + utimes.c \ + write.s \ + writev.c + +all: crt0.o + +ACLOCAL_AMFLAGS = -I ../../.. +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host diff --git a/newlib/libc/sys/go32/Makefile.in b/newlib/libc/sys/go32/Makefile.in new file mode 100644 index 000000000..eb0fb8f29 --- /dev/null +++ b/newlib/libc/sys/go32/Makefile.in @@ -0,0 +1,402 @@ +# Makefile.in generated automatically by automake 1.3 from Makefile.am + +# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DISTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AR = @AR@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +EXEEXT = @EXEEXT@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NEWLIB_CFLAGS = @NEWLIB_CFLAGS@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +machine_dir = @machine_dir@ +newlib_basedir = @newlib_basedir@ +sys_dir = @sys_dir@ + +AUTOMAKE_OPTIONS = cygnus + +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) + +noinst_LIBRARIES = lib.a + +lib_a_SOURCES = \ + _exit.s \ + _main.c \ + abort.c \ + access.c \ + bdos.c \ + bdosptr.c \ + brk.s \ + chdir.s \ + chmod.c \ + chown.c \ + clock.S \ + close.s \ + creat.s \ + crlf2nl.c \ + dir.c \ + dosmem.S \ + dpmi.c \ + dup.s \ + dup2.s \ + exec.c \ + fchmod.c \ + findfirs.s \ + findnext.s \ + fixpath.c \ + fstat.s \ + fsync.s \ + ftruncat.c \ + gerrno.s \ + getcwd.c \ + getdate.c \ + getdtabl.c \ + getgid.c \ + getkey.s \ + getpages.c \ + getpid.c \ + getrusag.c \ + gettime.c \ + gettimeo.c \ + getuid.c \ + getwd.s \ + go32func.c \ + infoblk.c \ + inportb.s \ + inportl.s \ + inportsb.s \ + inportsl.s \ + inportsw.s \ + inportw.s \ + int86x.s \ + intdos.c \ + intdosx.c \ + isatty.s \ + kbhit.s \ + kill.c \ + link.s \ + longjmp.S \ + lseek.s \ + lstat.s \ + mkdir.s \ + open.s \ + outportb.s \ + outportl.s \ + outportw.s \ + outprtsb.s \ + outprtsl.s \ + outprtsw.s \ + read.s \ + readv.c \ + rename.s \ + rmdir.s \ + sbrk.s \ + screen.S \ + setjmp.S \ + setmode.s \ + setstack.S \ + settimeo.s \ + sleep.c \ + stat.c \ + stat_ast.s \ + syserr.c \ + system.s \ + tell.s \ + time.c \ + truncate.c \ + turbo.s \ + umask.c \ + unlink.s \ + utime.c \ + utimes.c \ + write.s \ + writev.c + +ACLOCAL_AMFLAGS = -I ../../.. +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/../../../../mkinstalldirs +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +lib_a_LIBADD = +lib_a_OBJECTS = _exit.o _main.o abort.o access.o bdos.o bdosptr.o brk.o \ +chdir.o chmod.o chown.o clock.o close.o creat.o crlf2nl.o dir.o \ +dosmem.o dpmi.o dup.o dup2.o exec.o fchmod.o findfirs.o findnext.o \ +fixpath.o fstat.o fsync.o ftruncat.o gerrno.o getcwd.o getdate.o \ +getdtabl.o getgid.o getkey.o getpages.o getpid.o getrusag.o gettime.o \ +gettimeo.o getuid.o getwd.o go32func.o infoblk.o inportb.o inportl.o \ +inportsb.o inportsl.o inportsw.o inportw.o int86x.o intdos.o intdosx.o \ +isatty.o kbhit.o kill.o link.o longjmp.o lseek.o lstat.o mkdir.o open.o \ +outportb.o outportl.o outportw.o outprtsb.o outprtsl.o outprtsw.o \ +read.o readv.o rename.o rmdir.o sbrk.o screen.o setjmp.o setmode.o \ +setstack.o settimeo.o sleep.o stat.o stat_ast.o syserr.o system.o \ +tell.o time.o truncate.o turbo.o umask.o unlink.o utime.o utimes.o \ +write.o writev.o +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) +LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in aclocal.m4 configure configure.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP = --best +SOURCES = $(lib_a_SOURCES) +OBJECTS = $(lib_a_OBJECTS) + +all: Makefile $(LIBRARIES) + +.SUFFIXES: +.SUFFIXES: .S .c .o .s +$(srcdir)/Makefile.in: @MAINT@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): @MAINT@ configure.in ../../../acinclude.m4 \ + ../../../aclocal.m4 + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: @MAINT@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES) + -rm -f lib.a + $(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD) + $(RANLIB) lib.a + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @echo "========================"; \ + echo "$(distdir).tar.gz is ready for distribution"; \ + echo "========================" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file; \ + done +info: +dvi: +check: + $(MAKE) $(AM_MAKEFLAGS) +installcheck: +install-info: +install-exec: + @$(NORMAL_INSTALL) + +install-data: + @$(NORMAL_INSTALL) + +install: install-exec install-data all + @: + +uninstall: + +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install +installdirs: + + +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(DISTCLEANFILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +clean: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ + mostlyclean + +distclean: distclean-noinstLIBRARIES distclean-compile distclean-tags \ + distclean-generic clean + -rm -f config.status + +maintainer-clean: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + -rm -f config.status + +.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info dvi installcheck \ +install-info install-exec install-data install uninstall all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +all: crt0.o + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/newlib/libc/sys/go32/_exit.s b/newlib/libc/sys/go32/_exit.s new file mode 100644 index 000000000..8c135976e --- /dev/null +++ b/newlib/libc/sys/go32/_exit.s @@ -0,0 +1,20 @@ +# /* This is file _EXIT.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl __exit +__exit: + movb 4(%esp),%al + movb $0x4c,%ah + int $0x21 diff --git a/newlib/libc/sys/go32/_main.c b/newlib/libc/sys/go32/_main.c new file mode 100644 index 000000000..c8c6136f7 --- /dev/null +++ b/newlib/libc/sys/go32/_main.c @@ -0,0 +1,3 @@ +__main() +{ +} diff --git a/newlib/libc/sys/go32/abort.c b/newlib/libc/sys/go32/abort.c new file mode 100644 index 000000000..f2466c84c --- /dev/null +++ b/newlib/libc/sys/go32/abort.c @@ -0,0 +1,8 @@ + +void +abort() +{ + + exit(1); + +} diff --git a/newlib/libc/sys/go32/access.c b/newlib/libc/sys/go32/access.c new file mode 100644 index 000000000..ad368caa1 --- /dev/null +++ b/newlib/libc/sys/go32/access.c @@ -0,0 +1,34 @@ +/* This is file ACCESS.C */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <fcntl.h> +#include <sys/stat.h> +#include <unistd.h> + +int access(const char *fn, int flags) +{ + struct stat s; + if (stat(fn, &s)) + return -1; + if (s.st_mode & S_IFDIR) + return 0; + if (flags & W_OK) + { + if (s.st_mode & S_IWRITE) + return 0; + return -1; + } + return 0; +} + diff --git a/newlib/libc/sys/go32/aclocal.m4 b/newlib/libc/sys/go32/aclocal.m4 new file mode 100644 index 000000000..70d481020 --- /dev/null +++ b/newlib/libc/sys/go32/aclocal.m4 @@ -0,0 +1,282 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +dnl This provides configure definitions used by all the newlib +dnl configure.in files. + +dnl Basic newlib configury. This calls basic introductory stuff, +dnl including AM_INIT_AUTOMAKE and AC_CANONICAL_HOST. It also runs +dnl configure.host. The only argument is the relative path to the top +dnl newlib directory. + +AC_DEFUN(NEWLIB_CONFIGURE, +[ +dnl Default to --enable-multilib +AC_ARG_ENABLE(multilib, +[ --enable-multilib build many library versions (default)], +[case "${enableval}" in + yes) multilib=yes ;; + no) multilib=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; + esac], [multilib=yes])dnl + +dnl Support --enable-target-optspace +AC_ARG_ENABLE(target-optspace, +[ --enable-target-optspace optimize for space], +[case "${enableval}" in + yes) target_optspace=yes ;; + no) target_optspace=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for target-optspace option) ;; + esac], [target_optspace=])dnl + +dnl Support --enable-newlib-mb +AC_ARG_ENABLE(newlib-mb, +[ --enable-newlib-mb enable multibyte support], +[case "${enableval}" in + yes) newlib_mb=yes ;; + no) newlib_mb=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for newlib-mb option) ;; + esac], [newlib_mb=no])dnl + +dnl We may get other options which we don't document: +dnl --with-target-subdir, --with-multisrctop, --with-multisubdir + +test -z "[$]{with_target_subdir}" && with_target_subdir=. + +if test "[$]{srcdir}" = "."; then + if test "[$]{with_target_subdir}" != "."; then + newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" + else + newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" + fi +else + newlib_basedir="[$]{srcdir}/$1" +fi +AC_SUBST(newlib_basedir) + +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE(newlib, 1.8.1) + +# FIXME: We temporarily define our own version of AC_PROG_CC. This is +# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We +# are probably using a cross compiler, which will not be able to fully +# link an executable. This should really be fixed in autoconf +# itself. + +AC_DEFUN(LIB_AC_PROG_CC, +[AC_BEFORE([$0], [AC_PROG_CPP])dnl +AC_CHECK_PROG(CC, gcc, gcc) +if test -z "$CC"; then + AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) + test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) +fi + +AC_PROG_CC_GNU + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +dnl Check whether -g works, even if CFLAGS is set, in case the package +dnl plays around with CFLAGS (such as to build both debugging and +dnl normal versions of a library), tasteless as that idea is. + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + AC_PROG_CC_G + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-O2" + fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" +fi +]) + +LIB_AC_PROG_CC + +# AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't +# run it explicitly here, it will be run implicitly before +# NEWLIB_CONFIGURE, which doesn't work because that means that it will +# be run before AC_CANONICAL_HOST. +AC_CANONICAL_BUILD + +AC_CHECK_TOOL(AS, as) +AC_CHECK_TOOL(AR, ar) +AC_CHECK_TOOL(RANLIB, ranlib, :) + +AC_PROG_INSTALL + +AM_MAINTAINER_MODE + +# We need AC_EXEEXT to keep automake happy in cygnus mode. However, +# at least currently, we never actually build a program, so we never +# need to use $(EXEEXT). Moreover, the test for EXEEXT normally +# fails, because we are probably configuring with a cross compiler +# which can't create executables. So we include AC_EXEEXT to keep +# automake happy, but we don't execute it, since we don't care about +# the result. +if false; then + AC_EXEEXT +fi + +. [$]{newlib_basedir}/configure.host + +case [$]{newlib_basedir} in +/* | [A-Za-z]:[/\\]*) newlib_flagbasedir=[$]{newlib_basedir} ;; +*) newlib_flagbasedir='[$](top_builddir)/'[$]{newlib_basedir} ;; +esac + +newlib_cflags="[$]{newlib_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{newlib_flagbasedir}/libc/include" +case "${host}" in + *-*-cygwin*) + newlib_cflags="[$]{newlib_cflags} -I[$]{newlib_flagbasedir}/../winsup/cygwin/include -I[$]{newlib_flagbasedir}/../winsup/w32api/include" + ;; +esac + +newlib_cflags="[$]{newlib_cflags} -fno-builtin" + +NEWLIB_CFLAGS=${newlib_cflags} +AC_SUBST(NEWLIB_CFLAGS) + +AC_SUBST(machine_dir) +AC_SUBST(sys_dir) +]) + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# serial 1 + +AC_DEFUN(AM_MAINTAINER_MODE, +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT($USE_MAINTAINER_MODE) + AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +# Define a conditional. + +AC_DEFUN(AM_CONDITIONAL, +[AC_SUBST($1_TRUE) +AC_SUBST($1_FALSE) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + diff --git a/newlib/libc/sys/go32/bdos.c b/newlib/libc/sys/go32/bdos.c new file mode 100644 index 000000000..523f73aa6 --- /dev/null +++ b/newlib/libc/sys/go32/bdos.c @@ -0,0 +1,12 @@ +#include <errno.h> +#include "dos.h" + +bdos(int func, unsigned dx, unsigned al) +{ + union REGS r; + r.x.dx = dx; + r.h.ah = func; + r.h.al = al; + int86(0x21, &r, &r); + return r.x.ax; +} diff --git a/newlib/libc/sys/go32/bdosptr.c b/newlib/libc/sys/go32/bdosptr.c new file mode 100644 index 000000000..214d40baf --- /dev/null +++ b/newlib/libc/sys/go32/bdosptr.c @@ -0,0 +1,12 @@ +#include <errno.h> +#include "dos.h" + +bdosptr(int func, void *dx, unsigned al) +{ + union REGS r; + r.x.dx = dx; + r.h.ah = func; + r.h.al = al; + int86(0x21, &r, &r); + return r.x.ax; +} diff --git a/newlib/libc/sys/go32/brk.s b/newlib/libc/sys/go32/brk.s new file mode 100644 index 000000000..c9d8db0e9 --- /dev/null +++ b/newlib/libc/sys/go32/brk.s @@ -0,0 +1,27 @@ +# /* This is file BRK.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _brk +_brk: + pushl %ebx + pushl %esi + pushl %edi + movw $0x4a00,%ax + movl 16(%esp),%ebx + int $0x21 + popl %edi + popl %esi + popl %ebx + ret diff --git a/newlib/libc/sys/go32/chdir.s b/newlib/libc/sys/go32/chdir.s new file mode 100644 index 000000000..a494408e7 --- /dev/null +++ b/newlib/libc/sys/go32/chdir.s @@ -0,0 +1,27 @@ +# /* This is file CHDIR.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _chdir +_chdir: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movb $0x3b,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/chmod.c b/newlib/libc/sys/go32/chmod.c new file mode 100644 index 000000000..72f5f5716 --- /dev/null +++ b/newlib/libc/sys/go32/chmod.c @@ -0,0 +1,15 @@ +/* This is file CHMOD.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +chmod(){} diff --git a/newlib/libc/sys/go32/chown.c b/newlib/libc/sys/go32/chown.c new file mode 100644 index 000000000..a780510ed --- /dev/null +++ b/newlib/libc/sys/go32/chown.c @@ -0,0 +1,15 @@ +/* This is file CHOWN.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +chown(){} diff --git a/newlib/libc/sys/go32/clock.S b/newlib/libc/sys/go32/clock.S new file mode 100644 index 000000000..e6ac06ed2 --- /dev/null +++ b/newlib/libc/sys/go32/clock.S @@ -0,0 +1,45 @@ +/* This is file CLOCK.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +** +** Modified by C. Sandmann for DPMI support (sandmann@clio.rice.edu) +*/ + .data +clock_init: + .long 0 + + .text + .globl _clock +_clock: + call _rawclock + imull $54931,%eax,%eax + ret + + .align 4,0x90 + .globl _rawclock +_rawclock: + movzwl __core_select,%eax + testl %eax,%eax + je old_clock /* Image run with pre-DPMI extender */ + movw %ax,%gs + movl %gs:0x46c(,1),%eax + jmp check_initted +old_clock: + movl 0xe000046c,%eax +check_initted: + cmp $0,clock_init + jne clock_initted + movl %eax,clock_init +clock_initted: + subl clock_init,%eax + ret + diff --git a/newlib/libc/sys/go32/close.s b/newlib/libc/sys/go32/close.s new file mode 100644 index 000000000..3b0797ddf --- /dev/null +++ b/newlib/libc/sys/go32/close.s @@ -0,0 +1,27 @@ +# /* This is file CLOSE.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _close +_close: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movb $0x3e,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/configure b/newlib/libc/sys/go32/configure new file mode 100755 index 000000000..398652cb7 --- /dev/null +++ b/newlib/libc/sys/go32/configure @@ -0,0 +1,1687 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --enable-multilib build many library versions (default)" +ac_help="$ac_help + --enable-target-optspace optimize for space" +ac_help="$ac_help + --enable-newlib-mb enable multibyte support" +ac_help="$ac_help + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +sitefile= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --site-file=FILE use FILE as the site file + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -site-file | --site-file | --site-fil | --site-fi | --site-f) + ac_prev=sitefile ;; + -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) + sitefile="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=djtime.h + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$sitefile"; then + if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi + fi +else + CONFIG_SITE="$sitefile" +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +ac_aux_dir= +for ac_dir in ../../../.. $srcdir/../../../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in ../../../.. $srcdir/../../../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:578: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:631: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:688: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +if test $host != $build; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 +echo "configure:721: checking for Cygwin environment" >&5 +if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 726 "configure" +#include "confdefs.h" + +int main() { + +#ifndef __CYGWIN__ +#define __CYGWIN__ __CYGWIN32__ +#endif +return __CYGWIN__; +; return 0; } +EOF +if { (eval echo configure:737: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_cygwin=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_cygwin=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_cygwin" 1>&6 +CYGWIN= +test "$ac_cv_cygwin" = yes && CYGWIN=yes +echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 +echo "configure:754: checking for mingw32 environment" >&5 +if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 759 "configure" +#include "confdefs.h" + +int main() { +return __MINGW32__; +; return 0; } +EOF +if { (eval echo configure:766: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_mingw32=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_mingw32=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_mingw32" 1>&6 +MINGW32= +test "$ac_cv_mingw32" = yes && MINGW32=yes + +# Check whether --enable-multilib or --disable-multilib was given. +if test "${enable_multilib+set}" = set; then + enableval="$enable_multilib" + case "${enableval}" in + yes) multilib=yes ;; + no) multilib=no ;; + *) { echo "configure: error: bad value ${enableval} for multilib option" 1>&2; exit 1; } ;; + esac +else + multilib=yes +fi + +# Check whether --enable-target-optspace or --disable-target-optspace was given. +if test "${enable_target_optspace+set}" = set; then + enableval="$enable_target_optspace" + case "${enableval}" in + yes) target_optspace=yes ;; + no) target_optspace=no ;; + *) { echo "configure: error: bad value ${enableval} for target-optspace option" 1>&2; exit 1; } ;; + esac +else + target_optspace= +fi + +# Check whether --enable-newlib-mb or --disable-newlib-mb was given. +if test "${enable_newlib_mb+set}" = set; then + enableval="$enable_newlib_mb" + case "${enableval}" in + yes) newlib_mb=yes ;; + no) newlib_mb=no ;; + *) { echo "configure: error: bad value ${enableval} for newlib-mb option" 1>&2; exit 1; } ;; + esac +else + newlib_mb=no +fi + + +test -z "${with_target_subdir}" && with_target_subdir=. + +if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then + newlib_basedir="${srcdir}/${with_multisrctop}../../../.." + else + newlib_basedir="${srcdir}/${with_multisrctop}../../.." + fi +else + newlib_basedir="${srcdir}/../../.." +fi + + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:840: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + + + +PACKAGE=newlib + +VERSION=1.8.1 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi +cat >> confdefs.h <<EOF +#define PACKAGE "$PACKAGE" +EOF + +cat >> confdefs.h <<EOF +#define VERSION "$VERSION" +EOF + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +echo "configure:881: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:894: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:907: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:920: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:933: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + +# FIXME: We temporarily define our own version of AC_PROG_CC. This is +# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We +# are probably using a cross compiler, which will not be able to fully +# link an executable. This should really be fixed in autoconf +# itself. + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:958: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:988: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1037: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1046: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1061: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-O2" + fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" +fi + + +# AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't +# run it explicitly here, it will be run implicitly before +# NEWLIB_CONFIGURE, which doesn't work because that means that it will +# be run before AC_CANONICAL_HOST. +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:1094: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + + +# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1115: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_AS="${ac_tool_prefix}as" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as" +fi +fi +AS="$ac_cv_prog_AS" +if test -n "$AS"; then + echo "$ac_t""$AS" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + +# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1147: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" +fi +fi +AR="$ac_cv_prog_AR" +if test -n "$AR"; then + echo "$ac_t""$AR" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + +# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1179: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +if test -z "$ac_cv_prog_RANLIB"; then +if test -n "$ac_tool_prefix"; then + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1211: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +else + RANLIB=":" +fi +fi + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:1256: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 +echo "configure:1310: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + MAINT=$MAINTAINER_MODE_TRUE + + + +# We need AC_EXEEXT to keep automake happy in cygnus mode. However, +# at least currently, we never actually build a program, so we never +# need to use $(EXEEXT). Moreover, the test for EXEEXT normally +# fails, because we are probably configuring with a cross compiler +# which can't create executables. So we include AC_EXEEXT to keep +# automake happy, but we don't execute it, since we don't care about +# the result. +if false; then + + +echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +echo "configure:1344: checking for executable suffix" >&5 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$CYGWIN" = yes || test "$MINGW32" = yes; then + ac_cv_exeext=.exe +else + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= + if { (eval echo configure:1354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; + esac + done + else + { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } + fi + rm -f conftest* + test x"${ac_cv_exeext}" = x && ac_cv_exeext=no +fi +fi + +EXEEXT="" +test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} +echo "$ac_t""${ac_cv_exeext}" 1>&6 +ac_exeext=$EXEEXT + +fi + +. ${newlib_basedir}/configure.host + +case ${newlib_basedir} in +/* | A-Za-z:/\\*) newlib_flagbasedir=${newlib_basedir} ;; +*) newlib_flagbasedir='$(top_builddir)/'${newlib_basedir} ;; +esac + +newlib_cflags="${newlib_cflags} -I"'$(top_builddir)'"/../../../targ-include -I${newlib_flagbasedir}/libc/include" +case "${host}" in + *-*-cygwin*) + newlib_cflags="${newlib_cflags} -I${newlib_flagbasedir}/../winsup/cygwin/include -I${newlib_flagbasedir}/../winsup/w32api/include" + ;; +esac + +newlib_cflags="${newlib_cflags} -fno-builtin" + +NEWLIB_CFLAGS=${newlib_cflags} + + + + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@newlib_basedir@%$newlib_basedir%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@CC@%$CC%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g +s%@AS@%$AS%g +s%@AR@%$AR%g +s%@RANLIB@%$RANLIB%g +s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g +s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g +s%@MAINT@%$MAINT%g +s%@EXEEXT@%$EXEEXT%g +s%@NEWLIB_CFLAGS@%$NEWLIB_CFLAGS%g +s%@machine_dir@%$machine_dir%g +s%@sys_dir@%$sys_dir%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"Makefile"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <<EOF + +EOF +cat >> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/newlib/libc/sys/go32/configure.in b/newlib/libc/sys/go32/configure.in new file mode 100644 index 000000000..5706733f0 --- /dev/null +++ b/newlib/libc/sys/go32/configure.in @@ -0,0 +1,12 @@ +dnl This is the newlib/libc/sys/go32 configure.in file. +dnl Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.5) +AC_INIT(djtime.h) + +dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake. +AC_CONFIG_AUX_DIR(../../../..) + +NEWLIB_CONFIGURE(../../..) + +AC_OUTPUT(Makefile) diff --git a/newlib/libc/sys/go32/copying.dj b/newlib/libc/sys/go32/copying.dj new file mode 100644 index 000000000..79b4f700b --- /dev/null +++ b/newlib/libc/sys/go32/copying.dj @@ -0,0 +1,63 @@ +This is the file "copying.dj". + + Copyright Information for sources and executables that are marked + Copyright (C) DJ Delorie + 24 Kirsten Ave + Rochester NH 03867-2954 + +This document is Copyright (C) DJ Delorie and may be distributed +verbatim, but changing it is not allowed. + +Source code copyright DJ Delorie is distributed under the terms of the +GNU General Public Licence, with the following exceptions: + + +* Source code copyright DJ Delorie is distributed under the terms of the + GNU General Public Licence, with the following exceptions: + ("go32.exe" refers to go32.exe and debug32.exe) + + * There are no conditions on distributing copies of stub.exe as + it is originally distributed in this software package, prepended + onto a binary or otherwise. This is the recommended distribution + mechanism for applications. + + * Binaries of emu387 may be distributed with no restrictions. + + * If a user creates an application, prepends a copy of go32.exe onto + the beginning of it, and distributes it free of charge, then the + user is under no obligations to distribute source or pay royalties. + Note that the copyright terms of the FSF and/or UCB must be + obeyed regardless of this. + + * If a user creates an application, prepends a copy of go32.exe onto + the beginning of it, and charges a fee for the software, then a + royalty of $5 or 5% of the selling price per copy sold must be paid + to DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954. Note that + shareware programs are not considered "sold" until payment is rendered + for them. + + * For all other cases, source code for go32.exe must be distributed + with any distributed copies of go32.exe. + + * Software that requires go32.exe to run, but is not distributed with + a copy of go32.exe, incurs no obligations with regards to the + above sections. + + * Contact me for special terms if none of the above are suitable. + + * Donations are always appreciated. + + The intent of this copyright is this: If you make money by using the + programs I wrote, I get some of it. If you use your sources to + teach others how to write programs, I'll support you. + +Changes to source code copyright BSD or FSF are copyright DJ Delorie, but +fall under the terms of the original copyright. + +A copy of the file "COPYING" is included with this document. If you did not +receive a copy of "COPYING", you may obtain one from whence this document +was obtained, or by writing: + Free Software Foundation + 675 Mass Ave + Cambridge, MA 02139 + USA diff --git a/newlib/libc/sys/go32/creat.s b/newlib/libc/sys/go32/creat.s new file mode 100644 index 000000000..4c02e72f4 --- /dev/null +++ b/newlib/libc/sys/go32/creat.s @@ -0,0 +1,19 @@ +# /* This is file CREAT.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _creat +_creat: + movb $1,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/crlf2nl.c b/newlib/libc/sys/go32/crlf2nl.c new file mode 100644 index 000000000..18b7061cc --- /dev/null +++ b/newlib/libc/sys/go32/crlf2nl.c @@ -0,0 +1,69 @@ +/* This is file CRLF2NL.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +unsigned crlf2nl(char *buf, unsigned len) +{ + char *bp = buf; + int i=0; + while (len--) + { + if (*bp != 13) + { + *buf++ = *bp; + i++; + } + bp++; + } + return i; +} + +unsigned readcr(int fd, char *buf, unsigned len) +{ + unsigned i; + i = read(fd, buf, len); + if (i <= 0) + return i; + return crlf2nl(buf, i); +} + +static char *sbuf = 0; +#define BUFSIZE 4096 + +unsigned writecr(int fd, char *buf, unsigned len) +{ + unsigned bufp=0, sbufp=0, crcnt=0, rlen=0; + int rv; + if (sbuf == 0) + sbuf = (char *)malloc(BUFSIZE+1); + while (len--) + { + if (buf[bufp] == 10) + { + crcnt++; + sbuf[sbufp++] = 13; + } + sbuf[sbufp++] = buf[bufp++]; + if ((sbufp >= BUFSIZE) || (len == 0)) + { + rv = write(fd, sbuf, sbufp); + if (rv < 0) + return rv; + rlen += rv - crcnt; + crcnt = 0; + sbufp = 0; + } + } + return rlen; +} + diff --git a/newlib/libc/sys/go32/crt0.S b/newlib/libc/sys/go32/crt0.S new file mode 100644 index 000000000..5fc6cf77c --- /dev/null +++ b/newlib/libc/sys/go32/crt0.S @@ -0,0 +1,233 @@ + +/* +** Called as start(argc, argv, envp) +*/ + +/* gs:edx points to prog_info structure. All other registers are OBSOLETE +** but included for backwards compatibility +*/ + +/* These symbols are for global constructors and destructors */ +#if 0 + .section .ctor + .globl ___go32_first_ctor +___go32_first_ctor: + .section .dtor + .globl ___go32_last_ctor +___go32_last_ctor: + .globl ___go32_first_dtor +___go32_first_dtor: + .data + .globl ___go32_last_dtor +___go32_last_dtor: +#endif + .text + .globl _start +_start: + .globl start +start: +#ifdef EMU387 + pusha + push %gs +#endif + movl %eax,__hard_master + movl %esi,___pid + movl %edi,___transfer_buffer + movl %ebx,_ScreenPrimary + movl %ebp,_ScreenSecondary + + cmpl $0, %edx + je Lcopy_none + movw %gs,%cx + movw %ds,%ax + cmpw %cx,%ax + je Lcopy_none + + movl %gs:(%edx), %ecx + cmpl __go32_info_block, %ecx + jbe Lcopy_less + movl __go32_info_block, %ecx +Lcopy_less: + movl $__go32_info_block, %edi + addl $3, %ecx + andl $0xfffffffc, %ecx + movl %ecx, (%edi) + addl $4, %edi + addl $4, %edx + subl $4, %ecx +Lcopy_more: + movl %gs:(%edx), %eax + movl %eax, (%edi) + addl $4, %edx + addl $4, %edi + subl $4, %ecx + jnz Lcopy_more + + movl __go32_info_block+4, %eax + movl %eax, _ScreenPrimary + movl __go32_info_block+8, %eax + movl %eax, _ScreenSecondary +/* Backward compatibility - do not copy this one! +** movl __go32_info_block+12, %eax +** movl %eax, ___transfer_buffer +*/ + movl __go32_info_block+20, %eax + movl %eax, ___pid + movl __go32_info_block+24, %eax + movl %eax, __hard_master + + jmp Lcopy_done + +Lcopy_none: + movl %ebx,__go32_info_block+4 + movl %ebp,__go32_info_block+8 + movl %edi,__go32_info_block+12 + movl $4096,__go32_info_block+16 + movl %esi,__go32_info_block+20 + movl %eax,__go32_info_block+24 + movl $28, __go32_info_block +Lcopy_done: + +#ifndef EMU387 + call __setstack +#endif + xorl %esi,%esi + xorl %edi,%edi + xorl %ebp,%ebp + xorl %ebx,%ebx + + movl %esp,%ebx +#ifdef MAKE_GCRT0 + call mcount_init /* initialize the profiler */ +#endif + movl 8(%ebx),%eax + pushl %eax + movl %eax,_environ + pushl 4(%ebx) + pushl (%ebx) + call ___main + call _main + addl $12,%esp +#ifdef EMU387 + pop %gs + popa +#else + pushl %eax + call _exit + +exit_again: + movl $0x4c00,%eax + int $0x21 + jmp exit_again +#endif + + ret + + +#ifdef MAKE_GCRT0 + .globl __exit +__exit: + call mcount_write /* make sure we dump the output */ +exit_again2: + movb 4(%esp),%al + movb $0x4c,%ah + int $0x21 + jmp exit_again2 + +/* Here is where we initialize the timer interrupt - specific to go32 */ +/* In this case, the timer calls mcount_isr */ + .globl mcount_isr_init +mcount_isr_init: + movw __go32_info_block+36, %ax /* run mode */ + cmp $1,%ax + jb skip_mcount + cmp $3,%ax + ja skip_mcount + + movw $16,%ax + movw %ax,%gs + + movzbl __hard_master,%eax /* timer is on irq 0 */ + shll $3,%eax /* times 8 bpv */ +/* movl $960,%eax vector 0x78 * 8 bpv */ + movw %gs:(%eax),%cx + movw %cx,mc_chain + movw %gs:6(%eax),%cx + movw %cx,mc_chain_hi + movw %gs:2(%eax),%cx + movw %cx,mc_chain_sel + + movl $mcount_isr,%ecx + movw %cx,%gs:(%eax) + movw $0xd8,%gs:2(%eax) /* selector 27 == 32-bit code */ + movw $0x8f00,%gs:4(%eax) + rorl $16,%ecx + movw %cx,%gs:6(%eax) + movw %ds,%ax + movw %ax,%gs +skip_mcount: + movl mcount_histogram,%eax + movl $1,(%eax) + ret + +/* Obtain the PC where we interrupted, and bump the histogram. We should */ +/* do error checking here, but we don't. This routine is specific to go32 */ +/* in some spots */ +mcount_isr: + pushl %eax + cmpl $1,mcount_skip + je L0 + movl 4(%esp),%eax /* get the PC */ + subl $0x1020,%eax /* to fit in low..high */ + andl $0xfffffffc,%eax + shrl $1,%eax /* now points to one 4-byte entry */ + addl mcount_histogram,%eax + incw (%eax) +L0: + popl %eax + ljmp mc_chain /* chain to the next timer vector */ + iret +#endif + + .data + + .globl _environ +_environ: + .long 0 + + .globl ___pid +___pid: + .long 42 + + .globl ___transfer_buffer +___transfer_buffer: + .long 0 + + .globl _ScreenPrimary +_ScreenPrimary: + .long 0 + + .globl _ScreenSecondary +_ScreenSecondary: + .long 0 + + .globl __hard_master + .globl __hard_slave + .globl __core_select +__hard_master: + .byte 0 +__hard_slave: + .byte 0 +__core_select: + .short 0 + +#ifdef MAKE_GCRT0 +mc_chain: + .short 0 +mc_chain_hi: + .short 0 +mc_chain_sel: + .short 0 +#endif + + diff --git a/newlib/libc/sys/go32/dir.c b/newlib/libc/sys/go32/dir.c new file mode 100644 index 000000000..ba3831a82 --- /dev/null +++ b/newlib/libc/sys/go32/dir.c @@ -0,0 +1,95 @@ +#include <string.h> + +#include "sys/dir.h" +#include "sys/dirent.h" +#include <errno.h> + +DIR *opendir(char *name) +{ + int length; + DIR *dir = (DIR *)malloc(sizeof(DIR)); + dir->num_read = 0; + dir->name = (char *)malloc(strlen(name)+6); + strcpy(dir->name, name); + + /* Append a "." if we got only the device name */ + if (dir->name[1] == ':' && strlen(dir->name) == 2) + strcat(dir->name, "."); + + /* Strip trailing slashes, so we can append "/*.*" */ + while (1) + { + length = strlen(dir->name); + if (length == 0) break; + if (dir->name[length - 1] == '/' || + dir->name[length - 1] == '\\') + dir->name[length - 1] = '\0'; + else + break; + } + + strcat(dir->name, "/*.*"); + return dir; +} + + + +static char *strlwr(char *s) +{ + char *p = s; + while (*s) + { + if ((*s >= 'A') && (*s <= 'Z')) + *s += 'a'-'A'; + s++; + } + return p; +} + +struct dirent *readdir(DIR *dir) +{ + int done; + int oerrno = errno; + if (dir->num_read) + done = findnext(&dir->ff); + else + done = findfirst(dir->name, &dir->ff, + FA_ARCH|FA_RDONLY|FA_DIREC|FA_HIDDEN|FA_SYSTEM); + if (done) + { + if (errno == ENMFILE) + errno = oerrno; + return 0; + } + dir->num_read ++; + dir->de.d_namlen = strlen(dir->ff.ff_name); + strcpy(dir->de.d_name,dir->ff.ff_name); + strlwr(dir->de.d_name); + return &dir->de; +} + +long telldir(DIR *dir) +{ + return dir->num_read; +} + +void seekdir(DIR *dir, long loc) +{ + int i; + rewinddir(dir); + for (i=0; i<loc; i++) + readdir(dir); +} + +void rewinddir(DIR *dir) +{ + dir->num_read = 0; +} + +int closedir(DIR *dir) +{ + free(dir->name); + free(dir); + return 0; +} + diff --git a/newlib/libc/sys/go32/dir.h b/newlib/libc/sys/go32/dir.h new file mode 100644 index 000000000..826c4604d --- /dev/null +++ b/newlib/libc/sys/go32/dir.h @@ -0,0 +1,53 @@ +#ifndef _DIR_H_
+#define _DIR_H_
+
+struct ffblk {
+ char ff_reserved[21];
+ char ff_attrib;
+ short ff_ftime;
+ short ff_fdate;
+ short ff_filler;
+ long ff_fsize;
+ char ff_name[16];
+};
+
+#define FA_RDONLY 1
+#define FA_HIDDEN 2
+#define FA_SYSTEM 4
+#define FA_LABEL 8
+#define FA_DIREC 16
+#define FA_ARCH 32
+
+/* for fnmerge/fnsplit */
+#define MAXPATH 80
+#define MAXDRIVE 3
+#define MAXDIR 66
+#define MAXFILE 9
+#define MAXEXT 5
+
+#define WILDCARDS 0x01
+#define EXTENSION 0x02
+#define FILENAME 0x04
+#define DIRECTORY 0x08
+#define DRIVE 0x10
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int findfirst(const char *pathname, struct ffblk *ffblk, int attrib);
+int findnext(struct ffblk *ffblk);
+
+void fnmerge (char *path, const char *drive, const char *dir,
+ const char *name, const char *ext);
+int fnsplit (const char *path, char *drive, char *dir,
+ char *name, char *ext);
+
+int getdisk(void);
+int setdisk(int drive);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/djtime.h b/newlib/libc/sys/go32/djtime.h new file mode 100644 index 000000000..db28dbe7e --- /dev/null +++ b/newlib/libc/sys/go32/djtime.h @@ -0,0 +1,42 @@ +/* This is file TIME.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +#include <time.h> + +struct timeval { + long tv_sec; + long tv_usec; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int gettimeofday(struct timeval *tp, struct timezone *tzp); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/newlib/libc/sys/go32/dos.h b/newlib/libc/sys/go32/dos.h new file mode 100644 index 000000000..8b42562d2 --- /dev/null +++ b/newlib/libc/sys/go32/dos.h @@ -0,0 +1,107 @@ +#ifndef _DOS_H_ +#define _DOS_H_ + +#include "pc.h" + +union REGS { + struct { + unsigned long ax; + unsigned long bx; + unsigned long cx; + unsigned long dx; + unsigned long si; + unsigned long di; + unsigned long cflag; + unsigned long flags; + } x; + struct { + unsigned char al; + unsigned char ah; + unsigned short upper_ax; + unsigned char bl; + unsigned char bh; + unsigned short upper_bx; + unsigned char cl; + unsigned char ch; + unsigned short upper_cx; + unsigned char dl; + unsigned char dh; + unsigned short upper_dx; + } h; +}; + +struct SREGS { + unsigned short cs; + unsigned short ds; + unsigned short es; + unsigned short fs; + unsigned short gs; + unsigned short ss; +}; + +struct ftime { + unsigned ft_tsec:5; /* 0-29, double to get real seconds */ + unsigned ft_min:6; /* 0-59 */ + unsigned ft_hour:5; /* 0-23 */ + unsigned ft_day:5; /* 1-31 */ + unsigned ft_month:4; /* 1-12 */ + unsigned ft_year:7; /* since 1980 */ +}; + +struct date { + short da_year; + char da_day; + char da_mon; +}; + +struct time { + unsigned char ti_min; + unsigned char ti_hour; + unsigned char ti_hund; + unsigned char ti_sec; +}; + +struct dfree { + unsigned df_avail; + unsigned df_total; + unsigned df_bsec; + unsigned df_sclus; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int bdos(int func, unsigned dx, unsigned al); +int bdosptr(int func, void *dx, unsigned al); +int int86(int ivec, union REGS *in, union REGS *out); +int int86x(int ivec, union REGS *in, union REGS *out, struct SREGS *seg); +int intdos(union REGS *in, union REGS *out); +int intdosx(union REGS *in, union REGS *out, struct SREGS *seg); + +int enable(void); +int disable(void); + +int getftime(int handle, struct ftime *ftimep); +int setftime(int handle, struct ftime *ftimep); + +int getcbrk(void); +int setcbrk(int new_value); + +void getdate(struct date *); +void gettime(struct time *); +void setdate(struct date *); +void settime(struct time *); + +void getdfree(unsigned char drive, struct dfree *ptr); + +void delay(unsigned msec); +int _get_default_drive(void); +void _fixpath(const char *, char *); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/newlib/libc/sys/go32/dosmem.S b/newlib/libc/sys/go32/dosmem.S new file mode 100644 index 000000000..c1956f767 --- /dev/null +++ b/newlib/libc/sys/go32/dosmem.S @@ -0,0 +1,120 @@ +/* DOSMEM.S */ +/* +** Copyright (C) 1993 C.W. Sandmann +** +** This file may be freely distributed as long as the author's name remains. +** Extender environment independent way to set up Real area 1Mb access. +** Procedure takes a single argument %eax which contains the real area offset. +** After call, access may be made with "%gs:(%eax)" +*/ + .text + .align 2 + .globl dosmemsetup +dosmemsetup: /* no params, expected ASM call only */ + pushl %eax + movzwl __core_select,%eax + testl %eax,%eax + je old_go32 /* Image run with pre-DPMI extender */ + movw %ax,%gs /* Use real area selector */ + popl %eax /* Plus real offset */ + andl $0x0fffffff,%eax /* Clear any linear access bits */ + ret + .align 2,0x90 +old_go32: + push %ds + pop %gs /* Use arena selector */ + popl %eax + orl $0xe0000000,%eax /* Plus linear access area */ + ret + + .align 2 + .globl _dosmemget +_dosmemget: /* long offset, long len, long *buf */ + push %gs + movl 8(%esp),%eax /* offset */ + call dosmemsetup + movl 12(%esp),%ecx /* length */ + movl 16(%esp),%edx /* arena offset */ + pushl %esi + pushl %edi + movl %eax,%esi + movl %edx,%edi + push %ds + push %es + push %ds + pop %es + push %gs + pop %ds + cld + rep + movsb /* move ECX bytes from Real area */ + pop %es + pop %ds + popl %edi + popl %esi + pop %gs + ret + + .align 2 + .globl _dosmemput +_dosmemput: /* long *buf, long len, long offset */ + push %gs + movl 16(%esp),%eax /* offset */ + call dosmemsetup + movl 12(%esp),%ecx /* length */ + movl 8(%esp),%edx /* arena offset */ + pushl %esi + pushl %edi + movl %eax,%edi + movl %edx,%esi + push %es + push %gs + pop %es + cld + rep + movsb /* move ECX bytes to Real area */ + pop %es + popl %edi + popl %esi + pop %gs + ret + + .align 2 /* 8(bp) 12(bp) 16(bp) 20(bp) 24(bp) */ + .globl _movedata /* src_sel, src_ofs, dest_sel, dest_ofs, len */ +_movedata: + pushl %ebp + movl %esp,%ebp + pushw %ds + pushw %es + pushl %esi + pushl %edi + + movl 8(%ebp),%eax + movw %ax,%ds + movl 12(%ebp),%esi + + movl 16(%ebp),%eax + movw %ax,%es + movl 20(%ebp),%edi + + movl 24(%ebp),%ecx + pushl %ecx + shrl $2,%ecx + jcxz no_big_move + rep + movsl +no_big_move: + popl %ecx + andl $3,%ecx + jcxz no_little_move + rep + movsb +no_little_move: + + popl %edi + popl %esi + popw %es + popw %ds + leave + ret + diff --git a/newlib/libc/sys/go32/dpmi.c b/newlib/libc/sys/go32/dpmi.c new file mode 100644 index 000000000..5215065e1 --- /dev/null +++ b/newlib/libc/sys/go32/dpmi.c @@ -0,0 +1,413 @@ +#include <stdlib.h> +#include "dos.h" +#include "go32.h" +#include <sys/types.h> +#include "dpmi.h" + +static union REGS r; +static struct SREGS s; + +int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0100; + r.x.bx = info->size; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + info->size = r.x.bx; + return r.x.ax; + } + else + { + info->rm_segment = r.x.ax; + info->pm_selector = r.x.dx; + return 0; + } +} + +int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0101; + r.x.dx = info->pm_selector; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0102; + r.x.bx = info->size; + r.x.dx = info->pm_selector; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + info->size = r.x.bx; + return r.x.ax; + } + else + { + return 0; + } +} + +int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0200; + r.h.bl = vector; + int86(0x31, &r, &r); + info->rm_segment = r.x.cx; + info->rm_offset = r.x.dx; + return 0; +} + +int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0201; + r.h.bl = vector; + r.x.cx = info->rm_segment; + r.x.dx = info->rm_offset; + int86(0x31, &r, &r); + return 0; +} + +int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0204; + r.h.bl = vector; + int86(0x31, &r, &r); + info->pm_selector = r.x.cx; + info->pm_offset = r.x.dx; + return 0; +} + +int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) +{ + r.x.ax = 0x0205; + r.h.bl = vector; + r.x.cx = info->pm_selector; + r.x.dx = info->pm_offset; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +/* In real DPMI, we enter with only CS known, and SS on a locked 4K stack which + is *NOT* our SS. We must set up everthing, including a stack swap, then + restore it the way we found it. C. Sandmann 4-93 */ + +static unsigned char wrapper_intcommon[] = { +0x1e, /* push ds */ +0x06, /* push es */ +0x0f, 0xa0, /* push fs */ +0x0f, 0xa8, /* push gs */ +0x60, /* pusha */ +0x66, 0xb8, 0x34, 0x12, /* mov ax,0x1234 */ +0x8e, 0xd8, /* mov ds,ax */ +0x8e, 0xc0, /* mov es,ax */ +0x8e, 0xe0, /* mov fs,ax */ +0x8e, 0xe8, /* mov gs,ax */ +0xbb, 0x00, 0x00, 0x00, 0x00, /* mov ebx,_local_stack */ +0xfc, /* cld */ +0x89, 0xe1, /* mov ecx,esp */ +0x8c, 0xd2, /* mov dx,ss */ +0x8e, 0xd0, /* mov ss,ax */ +0x89, 0xdc, /* mov esp,ebx */ +0x52, /* push edx */ +0x51, /* push ecx */ +0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmih */ +0x58, /* pop eax */ +0x5b, /* pop ebx */ +0x8e, 0xd3, /* mov ss,bx */ +0x89, 0xc4, /* mov esp,eax */ +0x61, /* popa */ +0x0f, 0xa9, /* pop gs */ +0x0f, 0xa1, /* pop fs */ +0x07, /* pop es */ +0x1f /* pop ds */ +}; + +static unsigned char wrapper_intiret[] = { +0xcf /* iret */ +}; + +static unsigned char wrapper_intchain[] = { +0x2e, 0xff, 0x2d, 0x00, 0x00, 0x00, 0x00, /* jmp cs:[_old_int+39] */ +0xcf, /* iret */ +0x78, 0x56, 0x34, 0x12, +0xcd, 0xab +}; + +/* _interrupt_stack_size can be changed globally before calling this routine if + needed. Don't change it between calls or you will mess up the malloc chain ! */ + +unsigned _interrupt_stack_size = 32256; + +int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) +{ + char *mystack; + unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intchain)); + if (wrapper == 0) + return 0x8015; + mystack = (char *)malloc(_interrupt_stack_size); + if (mystack == 0) + return 0x8015; + + r.x.ax = 0x0204; + r.h.bl = vector; + int86(0x31, &r, &r); + + memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); + memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intchain, sizeof(wrapper_intchain)); + *(short *)(wrapper+9) = _go32_my_ds(); + *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; + *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; + *(long *)(wrapper+sizeof(wrapper_intcommon)+3) = (long)wrapper+sizeof(wrapper_intcommon)+8; + *(long *)(wrapper+sizeof(wrapper_intcommon)+8) = r.x.dx; + *(short *)(wrapper+sizeof(wrapper_intcommon)+12) = r.x.cx; + + r.x.ax = 0x0205; + r.h.bl = vector; + r.x.cx = _go32_my_cs(); + r.x.dx = (int)wrapper; + int86(0x31, &r, &r); + return 0; +} + +int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info) +{ + char *mystack; + unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intiret)); + if (wrapper == 0) + return 0x8015; + mystack = (char *)malloc(_interrupt_stack_size); + if (mystack == 0) + return 0x8015; + + memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); + memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intiret, sizeof(wrapper_intiret)); + *(short *)(wrapper+9) = _go32_my_ds(); + *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; + *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; + + info->pm_offset = (int)wrapper; + return 0; +} + +int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info) +{ + char *mystack; + char *wrapper = (char *)info->pm_offset; + mystack = (char *)(*(long *)(wrapper+20) - _interrupt_stack_size); + free(mystack); + free(wrapper); + return 0; +} + +int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs) +{ + r.h.bl = vector; + r.h.bh = 0; + r.x.cx = 0; + r.x.di = (int)regs; + if (vector == 0x21 && regs->x.ax == 0x4b00) + { + r.x.ax = 0xff0a; + int86(0x21, &r, &r); + } + else + { + r.x.ax = 0x0300; + int86(0x31, &r, &r); + } + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs) +{ + r.x.ax = 0x0301; + r.h.bh = 0; + r.x.cx = 0; + r.x.di = (int)regs; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs) +{ + r.x.ax = 0x0302; + r.h.bh = 0; + r.x.cx = 0; + r.x.di = (int)regs; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +/* Bug here; this needs to be fixed like above with SS & CLD */ + +static unsigned char wrapper_common[] = { +0x66, 0x06, /* push es */ +0x66, 0x1e, /* push ds */ +0x66, 0x06, /* push es */ +0x66, 0x1f, /* pop ds */ +0x56, /* push esi */ +0x57, /* push edi */ +0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmcb */ +0x5f, /* pop edi */ +0x5e, /* pop esi */ +0x66, 0x1f, /* pop ds */ +0x66, 0x07, /* pop es */ +0xfc, /* cld */ +0x66, 0x8b, 0x06, /* mov ax,[esi] */ +0x66, 0x26, 0x89, 0x47, 0x2a, /* mov es:[edi+42],ax */ +0x66, 0x8b, 0x46, 0x02, /* mov ax,[esi+2] */ +0x66, 0x26, 0x89, 0x47, 0x2c, /* mov es:[edi+44],ax */ +}; + +static unsigned char wrapper_retf[] = { +0x66, 0x26, 0x83, 0x47, 0x2e, 0x04, /* add es:[edi+46],0x4 */ +0xcf /* iret */ +}; + +static unsigned char wrapper_iret[] = { +0x66, 0x8b, 0x46, 0x04, /* mov ax,[esi+4] */ +0x66, 0x26, 0x89, 0x47, 0x20, /* mov es:[edi+32],ax */ +0x66, 0x26, 0x83, 0x47, 0x2e, 0x06, /* add es:[edi+46],0x6 */ +0xcf /* iret */ +}; + +int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs) +{ + unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_retf)); + if (wrapper == 0) + return 0x8015; + + memcpy(wrapper, wrapper_common, sizeof(wrapper_common)); + memcpy(wrapper+sizeof(wrapper_common), wrapper_retf, sizeof(wrapper_retf)); + *(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15; + info->size = (int)wrapper; + + r.x.ax = 0x0303; + r.x.si = (int)wrapper; + r.x.di = (int)regs; + s.ds = _go32_my_cs(); + s.es = _go32_my_ds(); + s.fs = 0; + s.gs = 0; + int86x(0x31, &r, &r, &s); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + info->rm_segment = r.x.cx; + info->rm_offset = r.x.dx; + return 0; + } +} + +int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs) +{ + unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_iret)); + if (wrapper == 0) + return 0x8015; + + memcpy(wrapper, wrapper_common, sizeof(wrapper_common)); + memcpy(wrapper+sizeof(wrapper_common), wrapper_iret, sizeof(wrapper_iret)); + *(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15; + info->size = (int)wrapper; + + r.x.ax = 0x0303; + r.x.si = (int)wrapper; + r.x.di = (int)regs; + s.ds = _go32_my_cs(); + s.es = _go32_my_ds(); + s.fs = 0; + s.gs = 0; + int86x(0x31, &r, &r, &s); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + info->rm_segment = r.x.cx; + info->rm_offset = r.x.dx; + return 0; + } +} + +int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info) +{ + free((char *)info->size); + r.x.ax = 0x0304; + r.x.cx = info->rm_segment; + r.x.dx = info->rm_offset; + int86(0x31, &r, &r); + if (r.x.flags & 1) + { + return r.x.ax; + } + else + { + return 0; + } +} + +int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info) +{ + r.x.ax = 0x0500; + r.x.di = (int)info; + int86(0x31, &r, &r); + return 0; +} + +u_long _go32_dpmi_remaining_physical_memory() +{ + _go32_dpmi_meminfo info; + _go32_dpmi_get_free_memory_information(&info); + if (info.available_physical_pages) + return info.available_physical_pages * 4096; + return info.available_memory; +} + +u_long _go32_dpmi_remaining_virtual_memory() +{ + _go32_dpmi_meminfo info; + _go32_dpmi_get_free_memory_information(&info); + return info.available_memory; +} diff --git a/newlib/libc/sys/go32/dpmi.h b/newlib/libc/sys/go32/dpmi.h new file mode 100644 index 000000000..7a2cb13af --- /dev/null +++ b/newlib/libc/sys/go32/dpmi.h @@ -0,0 +1,151 @@ +/* This is file dpmi.h */
+/*
+** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef _DPMI_H_
+#define _DPMI_H_
+
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef union {
+ struct {
+ u_long edi;
+ u_long esi;
+ u_long ebp;
+ u_long res;
+ u_long ebx;
+ u_long edx;
+ u_long ecx;
+ u_long eax;
+ } d;
+ struct {
+ u_short di, di_hi;
+ u_short si, si_hi;
+ u_short bp, bp_hi;
+ u_short res, res_hi;
+ u_short bx, bx_hi;
+ u_short dx, dx_hi;
+ u_short cx, cx_hi;
+ u_short ax, ax_hi;
+ u_short flags;
+ u_short es;
+ u_short ds;
+ u_short fs;
+ u_short gs;
+ u_short ip;
+ u_short cs;
+ u_short sp;
+ u_short ss;
+ } x;
+ struct {
+ u_char edi[4];
+ u_char esi[4];
+ u_char ebp[4];
+ u_char res[4];
+ u_char bl, bh, ebx_b2, ebx_b3;
+ u_char dl, dh, edx_b2, edx_b3;
+ u_char cl, ch, ecx_b2, ecx_b3;
+ u_char al, ah, eax_b2, eax_b3;
+ } h;
+} _go32_dpmi_registers;
+
+typedef struct {
+ u_long size;
+ u_long pm_offset;
+ u_short pm_selector;
+ u_short rm_offset;
+ u_short rm_segment;
+} _go32_dpmi_seginfo;
+
+typedef struct {
+ u_long available_memory;
+ u_long available_pages;
+ u_long available_lockable_pages;
+ u_long linear_space;
+ u_long unlocked_pages;
+ u_long available_physical_pages;
+ u_long total_physical_pages;
+ u_long free_linear_space;
+ u_long max_pages_in_paging_file;
+ u_long reserved[3];
+} _go32_dpmi_meminfo;
+
+/* returns zero if success, else dpmi error and info->size is max size */
+int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info);
+ /* set size to bytes/16, call, use rm_segment. Do not
+ change anthing but size until the memory is freed.
+ If error, max size is returned in size as bytes/16. */
+int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info);
+ /* set new size to bytes/16, call. If error, max size
+ is returned in size as bytes/16 */
+int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info);
+ /* uses pm_selector to free memory */
+
+/* These both use the rm_segment:rm_offset fields only */
+int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+
+/* These do NOT wrap the function in pm_offset in an iret handler.
+ You must provide an assembler interface yourself, or alloc one below.
+ You may NOT longjmp out of an interrupt handler. */
+int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* puts vector in pm_selector:pm_offset. */
+int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* sets vector from pm_offset and pm_selector */
+int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* sets up wrapper that calls function in pm_offset, chaining to old
+ handler when it returns */
+
+/* These can be used to generate assember IRET-style wrappers for functions */
+int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info);
+ /* Put function ptr in pm_offset, call, returns wrapper entry in pm_offset. */
+int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info);
+ /* assumes pm_offset points to wrapper, frees it */
+
+/* simulate real mode calls. CS:IP from regs for non-interrupt */
+int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs);
+int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs);
+int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs);
+
+/* These automatically handle the tasks of restructuring the
+ real-mode stack for the proper return type. The callback
+ (info->pm_offset) is called as (*pmcb)(_go32_dpmi_registers *regs); */
+int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
+ /* points callback at pm_offset, returns seg:ofs of callback addr
+ in rm_segment:rm_offset. Do not change any fields until freed.
+ Interface is added to simulate far return */
+int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
+ /* same, but simulates iret */
+int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info);
+ /* frees callback */
+
+/* Only available_memory is guaranteed to be valid. Try
+ available_physical_pages for phys mem left */
+int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info);
+
+/* Convenience functions. These use the above memory info call.
+ The return value is *bytes* */
+u_long _go32_dpmi_remaining_physical_memory(void);
+u_long _go32_dpmi_remaining_virtual_memory(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/dup.s b/newlib/libc/sys/go32/dup.s new file mode 100644 index 000000000..e093baffd --- /dev/null +++ b/newlib/libc/sys/go32/dup.s @@ -0,0 +1,28 @@ +# /* This is file DUP.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _dup +_dup: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movb $0x45,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + ret diff --git a/newlib/libc/sys/go32/dup2.s b/newlib/libc/sys/go32/dup2.s new file mode 100644 index 000000000..e26b48fa1 --- /dev/null +++ b/newlib/libc/sys/go32/dup2.s @@ -0,0 +1,28 @@ +# /* This is file DUP2.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _dup2 +_dup2: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl 20(%esp),%ecx + movb $0x46,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/exec.c b/newlib/libc/sys/go32/exec.c new file mode 100644 index 000000000..004666c71 --- /dev/null +++ b/newlib/libc/sys/go32/exec.c @@ -0,0 +1,509 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> +#include "go32.h" +#include "dpmi.h" +/*#include "process.h"*/ +#if 1 +#define P_WAIT 1
+#define P_NOWAIT 2 /* always generates error */
+#define P_OVERLAY 3
+#endif +extern const char **environ; +#define environ ((const char **)environ) + +#define scan_ptr() \ + char const **ptr; \ + for (ptr = &argv0; *ptr; ptr++); \ + ptr = (char const **)(*++ptr); + +int execl(const char *path, const char *argv0, ...) +{ + return spawnve(P_OVERLAY, path, &argv0, environ); +} + +int execle(const char *path, const char *argv0, ... /*, const char **envp */) +{ + scan_ptr(); + return spawnve(P_OVERLAY, path, &argv0, ptr); +} + +int execlp(const char *path, const char *argv0, ...) +{ + return spawnvpe(P_OVERLAY, path, &argv0, environ); +} + +int execlpe(const char *path, const char *argv0, ... /*, const char **envp */) +{ + scan_ptr(); + return spawnvpe(P_OVERLAY, path, &argv0, ptr); +} + +/*-------------------------------------------------*/ + +int execv(const char *path, const char **argv) +{ + return spawnve(P_OVERLAY, path, argv, environ); +} + +int execve(const char *path, const char **argv, const char **envp) +{ + return spawnve(P_OVERLAY, path, argv, envp); +} + +int execvp(const char *path, const char **argv) +{ + return spawnvpe(P_OVERLAY, path, argv, environ); +} + +int execvpe(const char *path, const char **argv, const char **envp) +{ + return spawnvpe(P_OVERLAY, path, argv, envp); +} + +/*-------------------------------------------------*/ + +int spawnl(int mode, const char *path, const char *argv0, ...) +{ + return spawnve(mode, path, &argv0, environ); +} + +int spawnle(int mode, const char *path, const char *argv0, ... /*, const char **envp */) +{ + scan_ptr(); + return spawnve(mode, path, &argv0, ptr); +} + +int spawnlp(int mode, const char *path, const char *argv0, ...) +{ + return spawnvpe(mode, path, &argv0, environ); +} + +int spawnlpe(int mode, const char *path, const char *argv0, ... /*, const char **envp */) +{ + scan_ptr(); + return spawnvpe(mode, path, &argv0, ptr); +} + +/*-------------------------------------------------*/ + +typedef struct { + u_short eseg; + u_short argoff; + u_short argseg; + u_short fcb1_off; + u_short fcb1_seg; + u_short fcb2_off; + u_short fcb2_seg; +} Execp; + +static Execp parm; + +static u_long tbuf; + +static u_long talloc(size_t amt) +{ + u_long rv = tbuf; + tbuf += amt; + return rv; +} + +static int direct_exec_tail(const char *program, const char *args, const char **envp) +{ + _go32_dpmi_registers r; + u_long program_la; + u_long arg_la; + u_long parm_la; + u_long env_la, env_e_la; + char arg_header[3]; + int i; + + program_la = talloc(strlen(program)+1); + arg_la = talloc(strlen(args)+3); + parm_la = talloc(sizeof(Execp)); + + dosmemput(program, strlen(program)+1, program_la); + + arg_header[0] = strlen(args); + arg_header[1] = '\r'; + dosmemput(arg_header, 1, arg_la); + dosmemput(args, strlen(args), arg_la+1); + dosmemput(arg_header+1, 1, arg_la+1+strlen(args)); + + do { + env_la = talloc(1); + } while (env_la & 15); + talloc(-1); + for (i=0; envp[i]; i++) + { + env_e_la = talloc(strlen(envp[i])+1); + dosmemput(envp[i], strlen(envp[i])+1, env_e_la); + } + arg_header[0] = 0; + arg_header[1] = 1; + arg_header[2] = 0; + dosmemput(arg_header, 3, talloc(3)); + env_e_la = talloc(strlen(program)+1); + dosmemput(program, strlen(program)+1, env_e_la); + + parm.eseg = env_la / 16; + parm.argseg = arg_la / 16; + parm.argoff = arg_la & 15; + dosmemput(&parm, sizeof(parm), parm_la); + + memset(&r, 0, sizeof(r)); + r.x.ax = 0x4b00; + r.x.ds = program_la / 16; + r.x.dx = program_la & 15; + r.x.es = parm_la / 16; + r.x.bx = parm_la & 15; + _go32_dpmi_simulate_int(0x21, &r); + if (r.x.flags & 1) + { + errno = r.x.ax; + return -1; + } + + memset(&r, 0, sizeof(r)); + r.h.ah = 0x4d; + _go32_dpmi_simulate_int(0x21, &r); + + if (r.x.flags & 1) + { + errno = r.x.ax; + return -1; + } + return r.x.ax; +} + +static int direct_exec(const char *program, const char **argv, const char **envp) +{ + int i, arglen; + char *args, *argp; + + tbuf = _go32_info_block.linear_address_of_transfer_buffer; + + arglen = 0; + for (i=1; argv[i]; i++) + arglen += strlen(argv[i]) + 1; + args = (char *)malloc(arglen+1); + argp = args; + for (i=1; argv[i]; i++) + { + const char *p = argv[i]; + if (argp - args > 125) + break; + *argp++ = ' '; + while (*p) + { + if (argp - args > 125) + break; + *argp++ = *p++; + } + } + *argp = 0; + + return direct_exec_tail(program, args, envp); +} + +typedef struct { + char magic[16]; + int struct_length; + char go32[16]; +} StubInfo; +#define STUB_INFO_MAGIC "StubInfoMagic!!" + +static int go32_exec(const char *program, const char **argv, const char **envp) +{ + int is_stubbed = 0; + int found_si = 0; + StubInfo si; + unsigned short header[3]; + int pf, has_dot, i; + char *go32, *sip; + const char *pp, *pe; + char rpath[80], *rp; + int stub_offset, argc; + + int si_la, rm_la, rm_seg; + short *rm_argv; + char cmdline[34]; + + pf = open(program, O_RDONLY|O_BINARY); + + read(pf, header, sizeof(header)); + if (header[0] == 0x010b || header[0] == 0x014c) + { + is_stubbed = 1; + } + else if (header[0] == 0x5a4d) + { + int header_offset = (long)header[2]*512L; + if (header[1]) + header_offset += (long)header[1] - 512L; + lseek(pf, header_offset - 4, 0); + read(pf, &stub_offset, 4); + header[0] = 0; + read(pf, header, sizeof(header)); + if (header[0] == 0x010b) + is_stubbed = 1; + if (header[0] == 0x014c) + is_stubbed = 1; + lseek(pf, stub_offset, 0); + read(pf, &si, sizeof(si)); + if (memcmp(STUB_INFO_MAGIC, si.magic, 16) == 0) + found_si = 1; + } + if (!is_stubbed) + { + close(pf); + return direct_exec(program, argv, envp); + } + + if (found_si) + go32 = si.go32; + else + go32 = "go32.exe"; + has_dot = 0; + for (i=0; go32[i]; i++) + if (go32[i] == '.') + has_dot = 1; + if (!has_dot) + strcpy(go32+i, ".exe"); + for (i=0; envp[i]; i++) + if (strncmp(envp[i], "PATH=", 5) == 0) + pp = envp[i]+5; + strcpy(rpath, go32); + while (access(rpath, 0)) + { + char *ptr; + rp = rpath; + for (pe=pp; *pe && *pe != ';'; pe++) + *rp++ = *pe; + pp = pe+1; + if (rp > rpath && rp[-1] != '/' && rp[-1] != '\\' && rp[-1] != ':') + *rp++ = '/'; + for (ptr = go32; *ptr; ptr++) + *rp++ = *ptr; + *rp = 0; + if (access(rpath, 0) == 0) + break; + if (*pe == 0) + return direct_exec(program, argv, envp); /* give up and just run it */ + } + + if (found_si) + { + lseek(pf, stub_offset, 0); + sip = (char *)malloc(si.struct_length); + read(pf, sip, si.struct_length); + } + close(pf); + + argv[0] = program; /* since that's where we really found it */ + + tbuf = _go32_info_block.linear_address_of_transfer_buffer; + + if (found_si) + { + si_la = talloc(si.struct_length); + dosmemput(sip, si.struct_length, si_la); + free(sip); + } + + for (argc=0; argv[argc]; argc++); + rm_la = talloc(2*(argc+1)); + rm_seg = (_go32_info_block.linear_address_of_transfer_buffer >> 4) & 0xffff; + rm_argv = (short *)malloc((argc+1) * sizeof(short)); + for (i=0; i<argc; i++) + { + int sl = strlen(argv[i]) + 1; + int q = talloc(sl); + dosmemput(argv[i], sl, q); + rm_argv[i] = (q - (rm_seg<<4)) & 0xffff; + } + rm_argv[i] = 0; + dosmemput(rm_argv, 2*(argc+1), rm_la); + + sprintf(cmdline, " !proxy %04x %04x %04x %04x %04x", + argc, rm_seg, (rm_la - (rm_seg<<4))&0xffff, + rm_seg, (si_la - (rm_seg<<4))&0xffff); + if (!found_si) + cmdline[22] = 0; /* remove stub information */ + + return direct_exec_tail(rpath, cmdline, envp); +} + +static int command_exec(const char *program, const char **argv, const char **envp) +{ + const char *comspec=0; + char *cmdline; + char *newargs[3]; + int cmdlen; + int i; + + cmdlen = strlen(program) + 4; + for (i=0; argv[i]; i++) + cmdlen += strlen(argv[i]) + 1; + cmdline = (char *)malloc(cmdlen); + + strcpy(cmdline, "/c "); + for (i=0; program[i]; i++) + { + if (program[i] == '/') + cmdline[i+3] = '\\'; + else + cmdline[i+3] = program[i]; + } + cmdline[i+3] = 0; + for (i=1; argv[i]; i++) + { + strcat(cmdline, " "); + strcat(cmdline, argv[i]); + } + for (i=0; envp[i]; i++) + if (strncmp(envp[i], "COMSPEC=", 8) == 0) + comspec = envp[i]+8; + if (!comspec) + for (i=0; environ[i]; i++) + if (strncmp(environ[i], "COMSPEC=", 8) == 0) + comspec = environ[i]+8; + if (!comspec) + comspec = "c:/command.com"; + newargs[0] = comspec; + newargs[1] = cmdline; + newargs[2] = 0; + i = direct_exec(comspec, (const char **)newargs, envp); + free(cmdline); + return i; +} + +static int script_exec(const char *program, const char **argv, const char **envp) +{ + return go32_exec(program, argv, envp); +} + +static struct { + char *extension; + int (*interp)(const char *, const char **, const char **); +} interpreters[] = { + { ".com", direct_exec }, + { ".exe", go32_exec }, + { ".bat", command_exec }, + { 0, script_exec } +}; +#define INTERP_NO_EXT 3 + +int spawnv(int mode, const char *path, const char **argv) +{ + return spawnve(mode, path, argv, environ); +} + +int spawnve(int mode, const char *path, const char **argv, const char **envp) +{ + /* This is the one that does the work! */ + int i = -1; + char rpath[80], *rp, *rd=0; + fflush(stdout); /* just in case */ + for (rp=rpath; *path; *rp++ = *path++) + { + if (*path == '.') + rd = rp; + if (*path == '\\' || *path == '/') + rd = 0; + } + *rp = 0; + if (rd) + { + for (i=0; interpreters[i].extension; i++) + if (strcasecmp(rd, interpreters[i].extension) == 0) + break; + } + while (access(rpath, 0)) + { + i++; + if (interpreters[i].extension == 0 || rd) + { + errno = ENOENT; + return -1; + } + strcpy(rp, interpreters[i].extension); + } + if (i == -1) + i = INTERP_NO_EXT; + i = interpreters[i].interp(rpath, argv, envp); + if (mode == P_OVERLAY) + exit(i); + return i; +} + +int spawnvp(int mode, const char *path, const char **argv) +{ + return spawnvpe(mode, path, argv, environ); +} + +int spawnvpe(int mode, const char *path, const char **argv, const char **envp) +{ + const char *pp, *pe, *ptr; + char rpath[80], *rp, *rd; + int hasdot = 0, i, tried_dot = 0; + + for (ptr=path; *ptr; ptr++) + { + if (*ptr == '.') + hasdot = 1; + if (*ptr == '/' || *ptr == '\\' || *ptr == ':') + return spawnve(mode, path, argv, envp); + } + + pp = 0; + for (i=0; envp[i]; i++) + if (strncmp(envp[i], "PATH=", 5) == 0) + pp = envp[i] + 5; + if (pp == 0) + return spawnve(mode, path, argv, envp); + + while (1) + { + if (!tried_dot) + { + rp = rpath; + pe = pp; + tried_dot = 1; + } + else + { + rp = rpath; + for (pe = pp; *pe && *pe != ';'; pe++) + *rp++ = *pe; + pp = pe+1; + if (rp > rpath && rp[-1] != '/' && rp[-1] != '\\' && rp[-1] != ':') + *rp++ = '/'; + } + for (ptr = path; *ptr; ptr++) + *rp++ = *ptr; + *rp = 0; + + if (hasdot) + { + if (access(rpath, 0) == 0) + return spawnve(mode, rpath, argv, envp); + } + else + { + for (i=0; interpreters[i].extension; i++) + { + strcpy(rp, interpreters[i].extension); + if (access(rpath, 0) == 0) + return spawnve(mode, rpath, argv, envp); + } + } + if (*pe == 0) + { + errno = ENOENT; + return -1; + } + } +} diff --git a/newlib/libc/sys/go32/fchmod.c b/newlib/libc/sys/go32/fchmod.c new file mode 100644 index 000000000..a161dfcfa --- /dev/null +++ b/newlib/libc/sys/go32/fchmod.c @@ -0,0 +1,18 @@ +/* This is file FCHMOD.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +fchmod() +{ + write(2, "Warning: fchmod() unimplemented\n", 32); +} diff --git a/newlib/libc/sys/go32/findfirs.s b/newlib/libc/sys/go32/findfirs.s new file mode 100644 index 000000000..fa3f24768 --- /dev/null +++ b/newlib/libc/sys/go32/findfirs.s @@ -0,0 +1,18 @@ + .globl _findfirst +_findfirst: + pushl %ebx + pushl %esi + pushl %edi + movl 20(%esp),%edx + movb $0x1a,%ah + int $0x21 + + movl 16(%esp),%edx + movl 24(%esp),%ecx + movb $0x4e,%ah + int $0x21 + + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/findnext.s b/newlib/libc/sys/go32/findnext.s new file mode 100644 index 000000000..4e6518ffd --- /dev/null +++ b/newlib/libc/sys/go32/findnext.s @@ -0,0 +1,16 @@ + .globl _findnext +_findnext: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movb $0x1a,%ah + int $0x21 + + movb $0x4f,%ah + int $0x21 + + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/fixpath.c b/newlib/libc/sys/go32/fixpath.c new file mode 100644 index 000000000..e7d61fddd --- /dev/null +++ b/newlib/libc/sys/go32/fixpath.c @@ -0,0 +1,155 @@ +/* + (c) Copyright 1992 Eric Backus + + This software may be used freely so long as this copyright notice is + left intact. There is no warrantee on this software. +*/ + +#include "dos.h" /* For intdos() */ +#include <errno.h> /* For errno */ +#include <string.h> /* For strlen() */ + +int +_get_default_drive(void) +{ + union REGS regs; + + regs.h.ah = 0x19; /* DOS Get Default Drive call */ + regs.h.al = 0; + (void) intdos(®s, ®s); + return regs.h.al; +} + +static char * +get_current_directory(char *out, int drive_number) +{ + union REGS regs; + + regs.h.ah = 0x47; + regs.h.dl = drive_number + 1; + regs.x.si = (unsigned long) (out + 1); + (void) intdos(®s, ®s); + if (regs.x.cflag != 0) + { + errno = regs.x.ax; + return out; + } + else + { + /* Root path, don't insert "/", it'll be added later */ + if (*(out + 1) != '\0') + *out = '/'; + else + *out = '\0'; + return out + strlen(out); + } +} + +static int +is_slash(int c) +{ + return c == '/' || c == '\\'; +} + +static int +is_term(int c) +{ + return c == '/' || c == '\\' || c == '\0'; +} + +/* Takes as input an arbitrary path. Fixes up the path by: + 1. Removing consecutive slashes + 2. Removing trailing slashes + 3. Making the path absolute if it wasn't already + 4. Removing "." in the path + 5. Removing ".." entries in the path (and the directory above them) + 6. Adding a drive specification if one wasn't there + 7. Converting all slashes to '/' + */ +void +_fixpath(const char *in, char *out) +{ + int drive_number; + const char *ip = in; + char *op = out; + + /* Add drive specification to output string */ + if (*(ip + 1) == ':' && ((*ip >= 'a' && *ip <= 'z') || + (*ip >= 'A' && *ip <= 'Z'))) + { + if (*ip >= 'a' && *ip <= 'z') + drive_number = *ip - 'a'; + else + drive_number = *ip - 'A'; + *op++ = *ip++; + *op++ = *ip++; + } + else + { + drive_number = _get_default_drive(); + *op++ = drive_number + 'a'; + *op++ = ':'; + } + + /* Convert relative path to absolute */ + if (!is_slash(*ip)) + op = get_current_directory(op, drive_number); + + /* Step through the input path */ + while (*ip) + { + /* Skip input slashes */ + if (is_slash(*ip)) + { + ip++; + continue; + } + + /* Skip "." and output nothing */ + if (*ip == '.' && is_term(*(ip + 1))) + { + ip++; + continue; + } + + /* Skip ".." and remove previous output directory */ + if (*ip == '.' && *(ip + 1) == '.' && is_term(*(ip + 2))) + { + ip += 2; + /* Don't back up over drive spec */ + if (op > out + 2) + /* This requires "/" to follow drive spec */ + while (!is_slash(*--op)); + continue; + } + + /* Copy path component from in to out */ + *op++ = '/'; + while (!is_term(*ip)) *op++ = *ip++; + } + + /* If root directory, insert trailing slash */ + if (op == out + 2) *op++ = '/'; + + /* Null terminate the output */ + *op = '\0'; +} + +#ifdef TEST +#include <stdio.h> + +int +main(int argc, char **argv) +{ + char path[90]; + int i; + + for (i = 1; i < argc; i++) + { + _fixpath(argv[i], path); + (void) printf("'%s' -> '%s'\n", argv[i], path); + } + + return 0; +} +#endif diff --git a/newlib/libc/sys/go32/fstat.s b/newlib/libc/sys/go32/fstat.s new file mode 100644 index 000000000..5414eaf38 --- /dev/null +++ b/newlib/libc/sys/go32/fstat.s @@ -0,0 +1,19 @@ +# /* This is file FSTAT.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _fstat +_fstat: + movb $3,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/fsync.s b/newlib/libc/sys/go32/fsync.s new file mode 100644 index 000000000..5f246f057 --- /dev/null +++ b/newlib/libc/sys/go32/fsync.s @@ -0,0 +1,27 @@ +# /* This is file FSYNC.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _fsync +_fsync: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movb $0x68,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + ret diff --git a/newlib/libc/sys/go32/ftruncat.c b/newlib/libc/sys/go32/ftruncat.c new file mode 100644 index 000000000..1e2544f25 --- /dev/null +++ b/newlib/libc/sys/go32/ftruncat.c @@ -0,0 +1,25 @@ +/* This is file FTRUNCAT.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <fcntl.h> + +/* +** Note: this only works right if you close the file right after truncating! +*/ + +ftruncate(int fd, unsigned long where) +{ + lseek(fd, where, 0); + write(fd, 0, 0); +} diff --git a/newlib/libc/sys/go32/gerrno.s b/newlib/libc/sys/go32/gerrno.s new file mode 100644 index 000000000..ff6b6da93 --- /dev/null +++ b/newlib/libc/sys/go32/gerrno.s @@ -0,0 +1,33 @@ +# /* This is file GERRNO.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + +# Modified to use newlib's reent mechanism, 960414, dje. +# Reentrancy isn't really supported of course, the purpose is to +# record `errno' in the normal place. + + .text + .globl syscall_error +syscall_error: + pushl %eax + call ___errno + popl %edx + mov %edx,(%eax) + mov $-1,%eax + ret + + .globl syscall_check +syscall_check: + jb syscall_error + mov $0,%eax + ret diff --git a/newlib/libc/sys/go32/getcwd.c b/newlib/libc/sys/go32/getcwd.c new file mode 100644 index 000000000..1dd4dcbcd --- /dev/null +++ b/newlib/libc/sys/go32/getcwd.c @@ -0,0 +1,37 @@ +/* This is file GETCWD.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <errno.h> + +char *getcwd(char *buf, int n) +{ + char tmp[90]; + getwd(tmp); + if (strlen(tmp)+1 > n) + { + errno = ERANGE; + return 0; + } + if (buf == 0) + { + buf = malloc(n); + if (buf == 0) + { + errno = ENOMEM; + return 0; + } + } + strcpy(buf, tmp); + return buf; +} diff --git a/newlib/libc/sys/go32/getdate.c b/newlib/libc/sys/go32/getdate.c new file mode 100644 index 000000000..7593b0af0 --- /dev/null +++ b/newlib/libc/sys/go32/getdate.c @@ -0,0 +1,11 @@ +#include "dos.h" + +void getdate( struct date *dateblk) +{ + union REGS regs; + regs.h.ah = 0x2a; + intdos( ®s, ®s); + dateblk-> da_year = regs.x.cx; + dateblk-> da_mon = regs.h.dh; + dateblk-> da_day = regs.h.dl; +} diff --git a/newlib/libc/sys/go32/getdtabl.c b/newlib/libc/sys/go32/getdtabl.c new file mode 100644 index 000000000..b266c23b9 --- /dev/null +++ b/newlib/libc/sys/go32/getdtabl.c @@ -0,0 +1,18 @@ +/* This is file GETDTABL.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +getdtablesize() +{ + return 50; /* really depends on FILES= in config.sys */ +} diff --git a/newlib/libc/sys/go32/getgid.c b/newlib/libc/sys/go32/getgid.c new file mode 100644 index 000000000..a0cd7b988 --- /dev/null +++ b/newlib/libc/sys/go32/getgid.c @@ -0,0 +1,9 @@ + +#include <sys/types.h> + +getgid() +{ + + return 20; + +} diff --git a/newlib/libc/sys/go32/getkey.s b/newlib/libc/sys/go32/getkey.s new file mode 100644 index 000000000..876483ea9 --- /dev/null +++ b/newlib/libc/sys/go32/getkey.s @@ -0,0 +1,59 @@ +/* This is file GETKEY.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005 + +Changed handling of characters starting with 0xE0: + Now calls interrupt 16, function 10 + if leading byte was 0x00, ah = 0x01 + if leading byte was 0xE0, ah = 0x02 + + The main function is now called getxkey()... + getkey is provided to maintain compatibility with + already written software +*/ + + .globl _getxkey +_getxkey: + pushl %ebx + pushl %esi + pushl %edi + movb $0x10,%ah + int $0x16 + mov $1,%bl + cmpb $0,%al + je L0 + cmpb $0xE0,%al + jne L1 + inc %bl +L0: + movb %ah,%al + movb %bl,%ah + jmp L2 +L1: + movb $0,%ah +L2: + andl $0xffff,%eax + popl %edi + popl %esi + popl %ebx + ret + + .globl _getkey +_getkey: + call _getxkey + testb $0x02,%ah + jz L3 + movb $0x01,%ah +L3: + ret diff --git a/newlib/libc/sys/go32/getpages.c b/newlib/libc/sys/go32/getpages.c new file mode 100644 index 000000000..8218b154e --- /dev/null +++ b/newlib/libc/sys/go32/getpages.c @@ -0,0 +1,18 @@ +/* This is file GETPAGES.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +getpagesize() +{ + return 4096; +} diff --git a/newlib/libc/sys/go32/getpid.c b/newlib/libc/sys/go32/getpid.c new file mode 100644 index 000000000..60f6e6d66 --- /dev/null +++ b/newlib/libc/sys/go32/getpid.c @@ -0,0 +1,18 @@ +/* This is file GETPID.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +getpid() +{ + return 42; /* Why not? */ +} diff --git a/newlib/libc/sys/go32/getrusag.c b/newlib/libc/sys/go32/getrusag.c new file mode 100644 index 000000000..15722c5dd --- /dev/null +++ b/newlib/libc/sys/go32/getrusag.c @@ -0,0 +1,35 @@ +/* This is file GETRUSAG.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <sys/time.h> +#include <sys/resource.h> + +static struct timeval old_time = {0,0}; + +int getrusage(int who, struct rusage *rusage) +{ + struct timeval now; + bzero(rusage, sizeof(struct rusage)); + if (old_time.tv_sec == 0) + gettimeofday(&old_time, 0); + gettimeofday(&now, 0); + rusage->ru_utime.tv_usec = now.tv_usec - old_time.tv_usec; + rusage->ru_utime.tv_sec = now.tv_sec - old_time.tv_sec; + if (rusage->ru_utime.tv_usec < 0) + { + rusage->ru_utime.tv_usec += 1000000; + rusage->ru_utime.tv_sec -= 1; + } + return 0; +} diff --git a/newlib/libc/sys/go32/gettime.c b/newlib/libc/sys/go32/gettime.c new file mode 100644 index 000000000..ba8116119 --- /dev/null +++ b/newlib/libc/sys/go32/gettime.c @@ -0,0 +1,12 @@ +#include "dos.h" + +void gettime( struct time *tp) +{ + union REGS regs; + regs.h.ah = 0x2c; + intdos( ®s, ®s); + tp->ti_hour = regs.h.ch; + tp->ti_min = regs.h.cl; + tp->ti_sec = regs.h.dh; + tp->ti_hund = regs.h.dl; +} diff --git a/newlib/libc/sys/go32/gettimeo.c b/newlib/libc/sys/go32/gettimeo.c new file mode 100644 index 000000000..7f4f7c874 --- /dev/null +++ b/newlib/libc/sys/go32/gettimeo.c @@ -0,0 +1,61 @@ +/* + (c) Copyright 1992 Eric Backus + + This software may be used freely so long as this copyright notice is + left intact. There is no warrantee on this software. +*/ + +#include <time.h> +#include <sys/time.h> +#include "dos.h" + +static int daylight, gmtoffset; + +int +gettimeofday (struct timeval *tp, struct timezone *tzp) +{ + + if (tp) + { + struct time t; + struct date d; + struct tm tmrec; + + gettime (&t); + getdate (&d); + tmrec.tm_year = d.da_year - 1900; + tmrec.tm_mon = d.da_mon - 1; + tmrec.tm_mday = d.da_day; + tmrec.tm_hour = t.ti_hour; + tmrec.tm_min = t.ti_min; + tmrec.tm_sec = t.ti_sec; +/* tmrec.tm_gmtoff = gmtoffset;*/ + tmrec.tm_isdst = daylight; + tp->tv_sec = mktime (&tmrec); + tp->tv_usec = t.ti_hund * (1000000 / 100); + } + if (tzp) + { + tzp->tz_minuteswest = gmtoffset; + tzp->tz_dsttime = daylight; + } + + return 0; +} + +void +__gettimeofday_init () +{ + time_t ltm, gtm; + struct tm *lstm; + + daylight = 0; + gmtoffset = 0; + ltm = gtm = time (NULL); + ltm = mktime (lstm = localtime (<m)); + gtm = mktime (gmtime (>m)); + daylight = lstm->tm_isdst; + gmtoffset = (int)(gtm - ltm) / 60; + +} + diff --git a/newlib/libc/sys/go32/gettimeo.s b/newlib/libc/sys/go32/gettimeo.s new file mode 100644 index 000000000..7e85adf1f --- /dev/null +++ b/newlib/libc/sys/go32/gettimeo.s @@ -0,0 +1,19 @@ +# /* This is file GETTIMEO.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _gettimeofday +_gettimeofday: + movb $4,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/getuid.c b/newlib/libc/sys/go32/getuid.c new file mode 100644 index 000000000..4ce9a46c1 --- /dev/null +++ b/newlib/libc/sys/go32/getuid.c @@ -0,0 +1,9 @@ + +#include <sys/types.h> + +getuid() +{ + + return 10; + +} diff --git a/newlib/libc/sys/go32/getwd.s b/newlib/libc/sys/go32/getwd.s new file mode 100644 index 000000000..15d856ef8 --- /dev/null +++ b/newlib/libc/sys/go32/getwd.s @@ -0,0 +1,31 @@ +# /* This is file GETWD.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _getwd +_getwd: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%esi + movb $47,(%esi) + incl %esi + movb $0,%dl + movb $0x47,%ah + int $0x21 + movl 16(%esp),%eax + popl %edi + popl %esi + popl %ebx + ret diff --git a/newlib/libc/sys/go32/go32.h b/newlib/libc/sys/go32/go32.h new file mode 100644 index 000000000..32afc0ebe --- /dev/null +++ b/newlib/libc/sys/go32/go32.h @@ -0,0 +1,70 @@ +/* This is file go32.h */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _GO32_H_ +#define _GO32_H_ + +#include <sys/types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* This must match go32/proginfo.h */ + +typedef struct { + u_long size_of_this_structure_in_bytes; + u_long linear_address_of_primary_screen; + u_long linear_address_of_secondary_screen; + u_long linear_address_of_transfer_buffer; + u_long size_of_transfer_buffer; /* >= 4k */ + u_long pid; + u_char master_interrupt_controller_base; + u_char slave_interrupt_controller_base; + u_short selector_for_linear_memory; + u_long linear_address_of_stub_info_structure; + u_long linear_address_of_original_psp; + u_short run_mode; + u_short run_mode_info; +} Go32_Info_Block; + +extern Go32_Info_Block _go32_info_block; + +#define _GO32_RUN_MODE_UNDEF 0 +#define _GO32_RUN_MODE_RAW 1 +#define _GO32_RUN_MODE_XMS 2 +#define _GO32_RUN_MODE_VCPI 3 +#define _GO32_RUN_MODE_DPMI 4 + +void dosmemget(int offset, int length, void *buffer); +void dosmemput(const void *buffer, int length, int offset); +void movedata(unsigned source_selector, unsigned source_offset, + unsigned dest_selector, unsigned dest_offset, + size_t length); + +/* returns number of times hit since last call. (zero first time) */ +u_long _go32_was_ctrl_break_hit(); +void _go32_want_ctrl_break(int yes); /* auto-yes if call above function */ + +u_short _go32_my_cs(); +u_short _go32_my_ds(); +u_short _go32_my_ss(); +u_short _go32_conventional_mem_selector(); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/newlib/libc/sys/go32/go32func.c b/newlib/libc/sys/go32/go32func.c new file mode 100644 index 000000000..ec3853ba1 --- /dev/null +++ b/newlib/libc/sys/go32/go32func.c @@ -0,0 +1,69 @@ +#include <sys/types.h> +#include "go32.h" +#include "dpmi.h" +#include "dos.h" + +u_short _go32_my_cs() +{ + asm("movw %cs,%ax"); +} + +u_short _go32_my_ds() +{ + asm("movw %ds,%ax"); +} + +u_short _go32_my_ss() +{ + asm("movw %ss,%ax"); +} + +u_short _go32_conventional_mem_selector() +{ + return _go32_info_block.selector_for_linear_memory; +} + +static _go32_dpmi_registers regs; +static volatile u_long ctrl_break_count = 0; +static int ctrl_break_hooked = 0; +static _go32_dpmi_seginfo old_vector; +static _go32_dpmi_seginfo new_vector; + +static ctrl_break_isr(_go32_dpmi_registers *regs) +{ + ctrl_break_count ++; +} + +u_long _go32_was_ctrl_break_hit() +{ + u_long cnt; + _go32_want_ctrl_break(1); + cnt = ctrl_break_count; + ctrl_break_count = 0; + return cnt; +} + +void _go32_want_ctrl_break(int yes) +{ + if (yes) + { + if (ctrl_break_hooked) + return; + _go32_dpmi_get_real_mode_interrupt_vector(0x1b, &old_vector); + + new_vector.pm_offset = (int)ctrl_break_isr; + _go32_dpmi_allocate_real_mode_callback_iret(&new_vector, ®s); + _go32_dpmi_set_real_mode_interrupt_vector(0x1b, &new_vector); + ctrl_break_count = 0; + ctrl_break_hooked = 1; + } + else + { + if (!ctrl_break_hooked) + return; + _go32_dpmi_set_real_mode_interrupt_vector(0x1b, &old_vector); + _go32_dpmi_free_real_mode_callback(&new_vector); + ctrl_break_count = 0; + ctrl_break_hooked = 0; + } +} diff --git a/newlib/libc/sys/go32/infoblk.c b/newlib/libc/sys/go32/infoblk.c new file mode 100644 index 000000000..0a54b6b18 --- /dev/null +++ b/newlib/libc/sys/go32/infoblk.c @@ -0,0 +1,4 @@ +#include "go32.h" + +Go32_Info_Block _go32_info_block = { sizeof(Go32_Info_Block) }; + diff --git a/newlib/libc/sys/go32/inportb.s b/newlib/libc/sys/go32/inportb.s new file mode 100644 index 000000000..d2425fc55 --- /dev/null +++ b/newlib/libc/sys/go32/inportb.s @@ -0,0 +1,21 @@ +#/* This is file INPORTB.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportb +_inportb: + movl 4(%esp),%edx +# inb %dx,%al + .byte 0xec + movzb %al,%eax + ret diff --git a/newlib/libc/sys/go32/inportl.s b/newlib/libc/sys/go32/inportl.s new file mode 100644 index 000000000..477dec19d --- /dev/null +++ b/newlib/libc/sys/go32/inportl.s @@ -0,0 +1,19 @@ +#/* This is file INPORTL.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportl +_inportl: + movl 4(%esp),%edx + inl %dx,%eax + ret diff --git a/newlib/libc/sys/go32/inportsb.s b/newlib/libc/sys/go32/inportsb.s new file mode 100644 index 000000000..db7dc37f8 --- /dev/null +++ b/newlib/libc/sys/go32/inportsb.s @@ -0,0 +1,25 @@ +#/* This is file INPORTSB.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportsb +_inportsb: + pushl %edi + movl 8(%esp),%edx + movl 12(%esp),%edi + movl 16(%esp),%ecx + rep + insb + popl %edi + ret + diff --git a/newlib/libc/sys/go32/inportsl.s b/newlib/libc/sys/go32/inportsl.s new file mode 100644 index 000000000..d4a8d5507 --- /dev/null +++ b/newlib/libc/sys/go32/inportsl.s @@ -0,0 +1,24 @@ +#/* This is file INPORTSL.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportsl +_inportsl: + pushl %edi + movl 8(%esp),%edx + movl 12(%esp),%edi + movl 16(%esp),%ecx + rep + insl + popl %edi + ret diff --git a/newlib/libc/sys/go32/inportsw.s b/newlib/libc/sys/go32/inportsw.s new file mode 100644 index 000000000..31880d717 --- /dev/null +++ b/newlib/libc/sys/go32/inportsw.s @@ -0,0 +1,24 @@ +#/* This is file INPORTSW.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportsw +_inportsw: + pushl %edi + movl 8(%esp),%edx + movl 12(%esp),%edi + movl 16(%esp),%ecx + rep + insw + popl %edi + ret diff --git a/newlib/libc/sys/go32/inportw.s b/newlib/libc/sys/go32/inportw.s new file mode 100644 index 000000000..fdb58aa26 --- /dev/null +++ b/newlib/libc/sys/go32/inportw.s @@ -0,0 +1,21 @@ +#/* This is file INPORTW.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _inportw +_inportw: + movl 4(%esp),%edx +# inw (%dx),%ax + .byte 0x66, 0xed + movzwl %ax,%eax + ret diff --git a/newlib/libc/sys/go32/int86x.s b/newlib/libc/sys/go32/int86x.s new file mode 100644 index 000000000..7b49bcd12 --- /dev/null +++ b/newlib/libc/sys/go32/int86x.s @@ -0,0 +1,103 @@ + .data +ds: + .word 0 +es: + .word 0 +fs: + .word 0 +gs: + .word 0 + + .globl int86 +int86: + .byte 0x2e + push ds + pop %ds + .byte 0x2e + push es + pop %es + .byte 0x2e + push fs + pop %fs + .byte 0x2e + push gs + pop %gs + + .byte 0xcd +int86_vec: + .byte 0x03 + ret + + .text + .globl _int86x +_int86x: + movl 16(%esp), %eax + + movw 2(%eax), %cx + movw %cx, ds + movw 4(%eax), %cx + movw %cx, es + movw 6(%eax), %cx + movw %cx, fs + movw 8(%eax), %cx + movw %cx, gs + + jmp int86_common + + .globl _int86 +_int86: + movw %ds, %ax + movw %ax, ds + movw %ax, es + movw %ax, fs + movw %ax, gs + jmp int86_common + +int86_common: + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %esi + pushl %edi + pushf + + movl 8(%ebp),%eax + movb %al,int86_vec + + movl 12(%ebp),%eax + movl 4(%eax),%ebx + movl 8(%eax),%ecx + movl 12(%eax),%edx + movl 16(%eax),%esi + movl 20(%eax),%edi + movl (%eax),%eax + + push %ds + push %es + call int86 + pop %es + pop %ds + + pushf + pushl %eax + movl %esp,%ebp + addl $24,%ebp + movl 16(%ebp),%eax + popl (%eax) + movl %ebx,4(%eax) + movl %ecx,8(%eax) + movl %edx,12(%eax) + movl %esi,16(%eax) + movl %edi,20(%eax) + popl %ebx /* flags */ + movl %ebx,28(%eax) + andl $1,%ebx + movl %ebx,24(%eax) + movl (%eax),%eax + + popf + popl %edi + popl %esi + popl %ebx + popl %ebp + ret diff --git a/newlib/libc/sys/go32/intdos.c b/newlib/libc/sys/go32/intdos.c new file mode 100644 index 000000000..a13f38ec8 --- /dev/null +++ b/newlib/libc/sys/go32/intdos.c @@ -0,0 +1,7 @@ +#include <sys/dos.h> + +int +intdos(union REGS *in, union REGS *out) +{ + return int86(0x21, in, out); +} diff --git a/newlib/libc/sys/go32/intdosx.c b/newlib/libc/sys/go32/intdosx.c new file mode 100644 index 000000000..ec3e9fbc2 --- /dev/null +++ b/newlib/libc/sys/go32/intdosx.c @@ -0,0 +1,6 @@ +#include <sys/dos.h> + +intdosx(union REGS *in, union REGS *out, struct SREGS *seg) +{ + return int86x(0x21, in, out, seg); +} diff --git a/newlib/libc/sys/go32/isatty.s b/newlib/libc/sys/go32/isatty.s new file mode 100644 index 000000000..9086b073c --- /dev/null +++ b/newlib/libc/sys/go32/isatty.s @@ -0,0 +1,33 @@ +# /* This is file ISATTY.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _isatty +_isatty: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movw $0x4400,%ax + int $0x21 + popl %edi + popl %esi + popl %ebx + movl $0,%eax + jb tf + testl $0x80,%edx + jz tf + movl $1,%eax +tf: + ret diff --git a/newlib/libc/sys/go32/kbhit.s b/newlib/libc/sys/go32/kbhit.s new file mode 100644 index 000000000..0f34e1b76 --- /dev/null +++ b/newlib/libc/sys/go32/kbhit.s @@ -0,0 +1,51 @@ +/* This is file KBHIT.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + + .globl _kbhit +_kbhit: + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %esi + pushl %edi + +try_again: + movl $0x41a,%eax + call dosmemsetup + movzwl %gs:(%eax),%ebx + movzwl %gs:2(%eax),%ecx + cmp %ebx,%ecx + je key_not_hit + + movb $0x11,%ah + int $0x16 + jz key_not_hit + cmp $0,%eax + jne key_hit + movb $0x10,%ah + int $0x16 + jmp try_again + +key_not_hit: + movl $0,%eax + jmp L1 + +key_hit: + movl $1,%eax +L1: + popl %edi + popl %esi + popl %ebx + leave + ret diff --git a/newlib/libc/sys/go32/kill.c b/newlib/libc/sys/go32/kill.c new file mode 100644 index 000000000..3335f1a56 --- /dev/null +++ b/newlib/libc/sys/go32/kill.c @@ -0,0 +1,6 @@ +kill() +{ + + +} + diff --git a/newlib/libc/sys/go32/link.s b/newlib/libc/sys/go32/link.s new file mode 100644 index 000000000..f1cc133a0 --- /dev/null +++ b/newlib/libc/sys/go32/link.s @@ -0,0 +1,28 @@ +# /* This is file LINK.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _link +_link: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movl 20(%esp),%edi + movb $0x56,%ah + int $0x21 + pop %edi + pop %esi + pop %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/longjmp.S b/newlib/libc/sys/go32/longjmp.S new file mode 100644 index 000000000..d29eebbee --- /dev/null +++ b/newlib/libc/sys/go32/longjmp.S @@ -0,0 +1,65 @@ +/* This is file LONGJMP.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +/* +** jmp_buf: +** eax ebx ecx edx esi edi ebp esp eip es fs gs ss +** 0 4 8 12 16 20 24 28 32 36 38 40 42 +*/ + + .globl _longjmp /* jmp_buf, int */ +_longjmp: + pushl %ebp + movl %esp,%ebp + + movl 8(%ebp),%edi /* get jmp_buf */ + movl 12(%ebp),%eax /* store retval in j->eax */ + testl %eax,%eax + jne 0f + incl %eax +0: + movl %eax,0(%edi) + + movl 24(%edi),%ebp + + pushfl /* get flags so will only re-enable */ + popl %ebx /* interrupts if they were previously */ + /* enabled */ + + cli + movw 42(%edi),%ax + movw %ax,%ss + movl 28(%edi),%esp + + pushl 32(%edi) /* for a ret! */ + + pushl %ebx /* save flags that contain previous */ + /* interrupt state */ + + movw 36(%edi),%ax + movw %ax,%es + movw 38(%edi),%ax + movw %ax,%fs + movw 40(%edi),%ax + movw %ax,%gs + movl 0(%edi),%eax + movl 4(%edi),%ebx + movl 8(%edi),%ecx + movl 12(%edi),%edx + movl 16(%edi),%esi + movl 20(%edi),%edi + + popfl /* restore previous interrupt state */ + + ret /* actually jump to new eip */ diff --git a/newlib/libc/sys/go32/lseek.s b/newlib/libc/sys/go32/lseek.s new file mode 100644 index 000000000..34609d088 --- /dev/null +++ b/newlib/libc/sys/go32/lseek.s @@ -0,0 +1,36 @@ +# /* This is file LSEEK.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _lseek +_lseek: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl 20(%esp),%ecx + shrl $16,%ecx + movl 20(%esp),%edx + andl $0xffff,%edx + movb 24(%esp),%al + movb $0x42,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + shll $16,%edx + andl $0xffff,%eax + orl %edx,%eax + ret diff --git a/newlib/libc/sys/go32/lstat.s b/newlib/libc/sys/go32/lstat.s new file mode 100644 index 000000000..2585b354f --- /dev/null +++ b/newlib/libc/sys/go32/lstat.s @@ -0,0 +1,19 @@ +# /* This is file LSTAT.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _lstat +_lstat: + movb $6,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/mkdir.s b/newlib/libc/sys/go32/mkdir.s new file mode 100644 index 000000000..e8fe19447 --- /dev/null +++ b/newlib/libc/sys/go32/mkdir.s @@ -0,0 +1,27 @@ +# /* This is file MKDIR.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _mkdir +_mkdir: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movb $0x39,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/open.s b/newlib/libc/sys/go32/open.s new file mode 100644 index 000000000..5fd8a04b0 --- /dev/null +++ b/newlib/libc/sys/go32/open.s @@ -0,0 +1,31 @@ +# /* This is file OPEN.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .data + .globl __fmode +__fmode: + .long 0x4000 + + .text + .globl _open +_open: + testl $0xc000,8(%esp) + jnz L0 + andl $0xc000,__fmode + movl __fmode,%eax + orl %eax,8(%esp) +L0: + movb $2,%al + jmp turbo_assist + diff --git a/newlib/libc/sys/go32/outportb.s b/newlib/libc/sys/go32/outportb.s new file mode 100644 index 000000000..10c4342f8 --- /dev/null +++ b/newlib/libc/sys/go32/outportb.s @@ -0,0 +1,21 @@ +#/* This is file OUTPORTB.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _outportb +_outportb: + movl 4(%esp),%edx + movl 8(%esp),%eax +# outb %al,%dx + .byte 0xee + ret diff --git a/newlib/libc/sys/go32/outportl.s b/newlib/libc/sys/go32/outportl.s new file mode 100644 index 000000000..61204b4bc --- /dev/null +++ b/newlib/libc/sys/go32/outportl.s @@ -0,0 +1,20 @@ +#/* This is file OUTPORTL.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _outportl +_outportl: + movl 4(%esp),%edx + movl 8(%esp),%eax + outl %eax,%dx + ret diff --git a/newlib/libc/sys/go32/outportw.s b/newlib/libc/sys/go32/outportw.s new file mode 100644 index 000000000..cde464843 --- /dev/null +++ b/newlib/libc/sys/go32/outportw.s @@ -0,0 +1,22 @@ +#/* This is file OUTPORTW.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _outportw +_outportw: + movl 4(%esp),%edx + movl 8(%esp),%eax +# outw %ax,%dx + .byte 0x66, 0xef + ret + diff --git a/newlib/libc/sys/go32/outprtsb.s b/newlib/libc/sys/go32/outprtsb.s new file mode 100644 index 000000000..f9ed4a1d5 --- /dev/null +++ b/newlib/libc/sys/go32/outprtsb.s @@ -0,0 +1,25 @@ + +#/* This is file OUTPRTSB.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _outportsb +_outportsb: + pushl %esi + movl 8(%esp),%edx + movl 12(%esp),%esi + movl 16(%esp),%ecx + rep + outsb + popl %esi + ret diff --git a/newlib/libc/sys/go32/outprtsl.s b/newlib/libc/sys/go32/outprtsl.s new file mode 100644 index 000000000..2f3e1c7cc --- /dev/null +++ b/newlib/libc/sys/go32/outprtsl.s @@ -0,0 +1,25 @@ +#/* This is file OUTPRTSL.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ + + .globl _outportsl +_outportsl: + pushl %esi + movl 8(%esp),%edx + movl 12(%esp),%esi + movl 16(%esp),%ecx + rep + outsl + popl %esi + ret + diff --git a/newlib/libc/sys/go32/outprtsw.s b/newlib/libc/sys/go32/outprtsw.s new file mode 100644 index 000000000..6045f196f --- /dev/null +++ b/newlib/libc/sys/go32/outprtsw.s @@ -0,0 +1,25 @@ +#/* This is file OUTPRTSW.S */ +#/* +#** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +#** +#** This file is distributed under the terms listed in the document +#** "copying.dj", available from DJ Delorie at the address above. +#** A copy of "copying.dj" should accompany this file; if not, a copy +#** should be available from where this file was obtained. This file +#** may not be distributed without a verbatim copy of "copying.dj". +#** +#** This file is distributed WITHOUT ANY WARRANTY; without even the implied +#** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#*/ +# + .globl _outportsw +_outportsw: + pushl %esi + movl 8(%esp),%edx + movl 12(%esp),%esi + movl 16(%esp),%ecx + rep + outsw + popl %esi + ret + diff --git a/newlib/libc/sys/go32/pc.h b/newlib/libc/sys/go32/pc.h new file mode 100644 index 000000000..8851d749e --- /dev/null +++ b/newlib/libc/sys/go32/pc.h @@ -0,0 +1,71 @@ +/*
+** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
+**
+** added getxkey(), which can read extended keystrokes that start with
+** 0xE0, as well as those which start with 0x00
+**
+** added global char ScreenAttrib, the attribute used by ScreenClear():
+** it defaults to 0x07 so as not to break existing code.
+**
+** added ScreenMode(), to return the current video mode
+*/
+
+#ifndef _PC_H_
+#define _PC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned char inportb(unsigned short port);
+unsigned short inportw(unsigned short port);
+unsigned long inportl(unsigned short port);
+unsigned char inportsb(unsigned short port, unsigned char *buf, unsigned len);
+unsigned short inportsw(unsigned short port, unsigned short *buf, unsigned len);
+unsigned long inportsl(unsigned short port, unsigned long *buf, unsigned len);
+void outportb(unsigned short port, unsigned char data);
+void outportw(unsigned short port, unsigned short data);
+void outportl(unsigned short port, unsigned long data);
+void outportsb(unsigned short port, unsigned char *buf, unsigned len);
+void outportsw(unsigned short port, unsigned short *buf, unsigned len);
+void outportsl(unsigned short port, unsigned long *buf, unsigned len);
+
+int kbhit(void);
+int getkey(void); /* ALT's have 0x100 set */
+int getxkey(void); /* ALT's have 0x100 set, 0xe0 sets 0x200 */
+
+void sound(int frequency);
+#define nosound() sound(0)
+
+extern unsigned char ScreenAttrib;
+extern short *ScreenPrimary;
+extern short *ScreenSecondary;
+
+/* For the primary screen: */
+int ScreenMode(void);
+int ScreenRows(void);
+int ScreenCols(void);
+void ScreenPutChar(int ch, int attr, int x, int y);
+void ScreenSetCursor(int row, int col);
+void ScreenGetCursor(int *row, int *col);
+void ScreenClear(void);
+void ScreenUpdate(void *virtual_screen);
+void ScreenUpdateLine(void *virtual_screen_line, int row);
+void ScreenRetrieve(void *virtual_screen);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/read.s b/newlib/libc/sys/go32/read.s new file mode 100644 index 000000000..c989241ee --- /dev/null +++ b/newlib/libc/sys/go32/read.s @@ -0,0 +1,30 @@ +# /* This is file READ.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _read +_read: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl 20(%esp),%edx + movl 24(%esp),%ecx + movb $0x3f,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + ret diff --git a/newlib/libc/sys/go32/readv.c b/newlib/libc/sys/go32/readv.c new file mode 100644 index 000000000..c50ef32fc --- /dev/null +++ b/newlib/libc/sys/go32/readv.c @@ -0,0 +1,31 @@ +/* This is file READV.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <sys/types.h> +#include <sys/uio.h> + +readv(int handle, struct iovec *iov, int count) +{ + unsigned long r, t=0; + while (count) + { + r = read(handle, iov->iov_base, iov->iov_len); + if (r < 0) + return r; + t += r; + iov++; + count--; + } + return t; +} diff --git a/newlib/libc/sys/go32/rename.s b/newlib/libc/sys/go32/rename.s new file mode 100644 index 000000000..549dcb82d --- /dev/null +++ b/newlib/libc/sys/go32/rename.s @@ -0,0 +1,31 @@ +# /* This is file RENAME.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _rename +_rename: + pushl %ebx + pushl %esi + pushl %edi + movl 20(%esp),%edx + movb $0x41,%ah + int $0x21 # remove "to" + movl 16(%esp),%edx + movl 20(%esp),%edi + movb $0x56,%ah + int $0x21 # move "from" to "to" + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/rmdir.s b/newlib/libc/sys/go32/rmdir.s new file mode 100644 index 000000000..b4668797f --- /dev/null +++ b/newlib/libc/sys/go32/rmdir.s @@ -0,0 +1,27 @@ +# /* This is file RMDIR.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _rmdir +_rmdir: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movb $0x3a,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/sbrk.s b/newlib/libc/sys/go32/sbrk.s new file mode 100644 index 000000000..190396c8c --- /dev/null +++ b/newlib/libc/sys/go32/sbrk.s @@ -0,0 +1,27 @@ +# /* This is file SBRK.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _sbrk +_sbrk: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movw $0x4a01,%ax + int $0x21 + popl %edi + popl %esi + popl %ebx + ret diff --git a/newlib/libc/sys/go32/screen.S b/newlib/libc/sys/go32/screen.S new file mode 100644 index 000000000..4786f7ffe --- /dev/null +++ b/newlib/libc/sys/go32/screen.S @@ -0,0 +1,256 @@ +/* This is file SCREEN.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +** +** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005 +** +** added global char ScreenAttrib -- this is the attribute +** used by ScreenClear(): it defaults to 0x07 so as not to +** break existing code. +** +** Modified by C. Sandmann (sandmann@clio.rice.edu) for DPMI support +** Combined SCREEN2.S and SCREEN.C into SCREEN.S +*/ + + .data + + .globl _ScreenAttrib +_ScreenAttrib: + .byte 0x07 + + .text + + .align 2 + .globl _ScreenSetCursor + /* row, col */ +_ScreenSetCursor: + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %esi + pushl %edi + movb $0x02,%ah + movb $0,%bh + movb 8(%ebp),%dh + movb 12(%ebp),%dl + int $0x10 + popl %edi + popl %esi + popl %ebx + popl %ebp + ret + + .align 2 + .globl _ScreenGetCursor + /* &row, &col */ +_ScreenGetCursor: + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %esi + pushl %edi + movb $0x03,%ah + movb $0,%bh + pushl %ebp + int $0x10 + popl %ebp + movl 8(%ebp),%esi + movzbl %dh,%eax + movl %eax,(%esi) + movl 12(%ebp),%esi + movzbl %dl,%eax + movl %eax,(%esi) + popl %edi + popl %esi + popl %ebx + popl %ebp + ret + + .align 2 + .globl _ScreenClear +_ScreenClear: + pushl %edi + call _ScreenCols + movl %eax,%ecx + call _ScreenRows + /* ECX is total words to store */ + imull %eax,%ecx + movl _ScreenPrimary,%eax + call dosmemsetup + movl %eax,%edi + push %es + push %gs + pop %es + movb $0x20,%al + movb _ScreenAttrib,%ah + rep + stosw + pop %es + popl %edi + ret + + .align 2 + .globl _ScreenRows +_ScreenRows: + movl $0x484,%eax + call dosmemsetup + movzbl %gs:(%eax),%eax + incl %eax + ret + + .align 2 + .globl _ScreenCols +_ScreenCols: + movl $0x44a,%eax + call dosmemsetup + movzwl %gs:(%eax),%eax + ret + + .align 2 + .globl _ScreenMode +_ScreenMode: + movl $0x449,%eax + call dosmemsetup + movzbl %gs:(%eax),%eax + ret + + .align 2 + .globl _ScreenPutChar +_ScreenPutChar: + /* int ch, int attr, unsigned x, unsigned y */ +/* + if ( (x >= ScreenCols()) || (y >= ScreenRows())) return; + ch &= 0xff; + attr = (attr & 0xff) << 8; + *(unsigned short *)(ScreenPrimary+x+y*ScreenCols()) = ch | attr; +*/ + call _ScreenRows + cmpl %eax,16(%esp) + jae L1 + call _ScreenCols + cmpl %eax,12(%esp) + jae L1 + /* Out of range */ + movl %eax,%edx + imull 16(%esp),%edx + addl 12(%esp),%edx + /* EDX = x + y*ScreenCols */ + + movb 4(%esp),%cl + movb 8(%esp),%ch + + movl _ScreenPrimary,%eax + call dosmemsetup + movw %cx,%gs:(%eax,%edx,2) +L1: + ret + +/* A quick way to update the screen from a logical video buffer, used + primarily for DPMI full screen management */ + .align 2 + .globl _ScreenUpdate + /* (void *)screenbuf */ +_ScreenUpdate: + call _ScreenRows + movl %eax,%ecx + call _ScreenCols + imull %eax,%ecx + sarl $1,%ecx + /* Number of long words in screen */ + + movl _ScreenPrimary,%eax + call dosmemsetup + movl 4(%esp),%edx + /* screenbuf */ + + pushl %esi + pushl %edi + movl %eax,%edi + movl %edx,%esi + push %es + push %gs + pop %es + rep + movsl + /* move ECX bytes to Real area */ + pop %es + popl %edi + popl %esi + ret + +/* A quick way to update a screen line from a logical video buffer, used + primarily for DPMI full screen management */ + .align 2 + .globl _ScreenUpdateLine + /* (void *)screenline, int row */ +_ScreenUpdateLine: + call _ScreenCols + movl %eax,%ecx + sarl $1,%ecx + /* Number of long words in screen line */ + shll $1,%eax + imull 8(%esp),%eax + addl _ScreenPrimary,%eax + call dosmemsetup + movl 4(%esp),%edx + /* screenbuf */ + + pushl %esi + pushl %edi + movl %eax,%edi + movl %edx,%esi + push %es + push %gs + pop %es + rep + movsl + /* move ECX bytes to Real area */ + pop %es + popl %edi + popl %esi + ret + + +/* A quick way to update the screen from a logical video buffer, used + primarily for DPMI full screen management */ + .align 2 + .globl _ScreenRetrieve + /* (void *)screenbuf */ +_ScreenRetrieve: + call _ScreenRows + movl %eax,%ecx + call _ScreenCols + imull %eax,%ecx + sarl $1,%ecx + /* Number of long words in screen */ + + movl _ScreenPrimary,%eax + call dosmemsetup + movl 4(%esp),%edx + /* screenbuf */ + + pushl %esi + pushl %edi + movl %eax,%esi + movl %edx,%edi + push %ds + push %gs + pop %ds + rep + movsl + /* move ECX bytes to Real area */ + pop %ds + popl %edi + popl %esi + ret + + diff --git a/newlib/libc/sys/go32/setjmp.S b/newlib/libc/sys/go32/setjmp.S new file mode 100644 index 000000000..ef9a258e1 --- /dev/null +++ b/newlib/libc/sys/go32/setjmp.S @@ -0,0 +1,61 @@ +/* This is file SETJMP.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +/* +** jmp_buf: +** eax ebx ecx edx esi edi ebp esp eip es fs gs ss +** 0 4 8 12 16 20 24 28 32 36 38 40 42 +*/ + + .globl _setjmp /* jmp_buf */ +_setjmp: + pushl %ebp + movl %esp,%ebp + + pushl %edi + movl 8(%ebp),%edi + + movl %eax,0(%edi) + movl %ebx,4(%edi) + movl %ecx,8(%edi) + movl %edx,12(%edi) + movl %esi,16(%edi) + + movl -4(%ebp),%eax + movl %eax,20(%edi) + + movl 0(%ebp),%eax + movl %eax,24(%edi) + + movl %esp,%eax + addl $12,%eax + movl %eax,28(%edi) + + movl 4(%ebp),%eax + movl %eax,32(%edi) + + movw %es, %ax + movw %ax, 36(%edi) + movw %fs, %ax + movw %ax, 38(%edi) + movw %gs, %ax + movw %ax, 40(%edi) + movw %ss, %ax + movw %ax, 42(%edi) + + popl %edi + movl $0,%eax + leave + ret + diff --git a/newlib/libc/sys/go32/setmode.s b/newlib/libc/sys/go32/setmode.s new file mode 100644 index 000000000..071e31636 --- /dev/null +++ b/newlib/libc/sys/go32/setmode.s @@ -0,0 +1,19 @@ +# /* This is file SETMODE.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _setmode +_setmode: + movb $8,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/setstack.S b/newlib/libc/sys/go32/setstack.S new file mode 100644 index 000000000..dcd3ac0b2 --- /dev/null +++ b/newlib/libc/sys/go32/setstack.S @@ -0,0 +1,70 @@ +/* This routine potentially increases the stack size at runtime based on + the _stklen variable. Only used by DPMI code. + Copyright (c) 1993 C. Sandmann + Environment: called by crt0.s (and gcrt0.s) + EAX, EBX, EBP, EDI, ESI disposable (cleared on return) */ + + .text + .globl __setstack +__setstack: + movl %esp,%eax + andl $0xc0000000,%eax /* clear all except upper bits */ + jne ok_stack /* obviously not DPMI! */ + movw %ss,%ax + lsll %eax,%ebx /* stack segment limit */ + movl %esp,%eax /* current location */ + subl %ebx,%eax /* Free stack */ + cmpl %eax,__stklen + jb ok_stack + +/* Not enough stack. Call sbrk() to get a new area. Copy current ESP + 20 + to end of new area (3 args + our stack). Change ESP to new area. Set new + limit to start of new area using DPMI services. */ + + pushl __stklen + call _sbrk /* eax = got memory base */ + popl %ebx /* remove _stklen */ + cmpl $0xffffffff,%eax /* if eax = -1 failure */ + je badstack + addl %eax,%ebx /* ebx now is end of new stack area */ + andl $0xfffffff0,%ebx /* 16 byte alignment */ + addl $0xfff,%eax /* make stack base page aligned */ + andl $0xfffff000,%eax /* 4096 byte alignment */ + +/* Now copy old stack to new stack. We only need our part + 4 words, 3 for + the parameters to pass to main, one for our return EIP (4 extra safety) */ + movl %esp, %esi /* Source is current stack */ + subl $0x20, %ebx /* 8 longwords */ + movl %ebx, %edi /* Destination is new stack */ + movl $8,%ecx + rep + movsl + +/* New stack in place. Change ESP to point to it. Assumes new stack is + higher in memory so we don't get caught by limit. Change limit using + DPMI services. */ + + movl %ebx,%esp /* Switch to new stack */ + subl $1,%eax /* Low 12 bits all 1s */ + pushl %eax /* Easiest way to move long to words */ + popw %dx + popw %cx + movl $8,%eax /* DPMI function Set Segment Limit */ + movw %ss,%bx /* Selector */ + int $0x31 /* Do service */ + + xor %ecx,%ecx /* Clean up */ + xor %edx,%edx /* Clean up */ + +ok_stack: + ret /* What we have is already bigger */ + +badstack: + movl $0x4c01,%eax + int $0x21 + jmp badstack + + .data + .globl __stklen + .comm __stklen,4 + diff --git a/newlib/libc/sys/go32/settimeo.s b/newlib/libc/sys/go32/settimeo.s new file mode 100644 index 000000000..f9325cc9e --- /dev/null +++ b/newlib/libc/sys/go32/settimeo.s @@ -0,0 +1,19 @@ +# /* This is file SETTIMEO.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _settimeofday +_settimeofday: + movb $5,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/sleep.c b/newlib/libc/sys/go32/sleep.c new file mode 100644 index 000000000..96e547ddc --- /dev/null +++ b/newlib/libc/sys/go32/sleep.c @@ -0,0 +1,27 @@ +/* This is file sleep.c */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + + +sleep(unsigned int seconds) +{ + long tnow, tthen; + time(&tnow); + tthen = tnow + seconds; + while (1) + { + time(&tnow); + if (tnow >= tthen) + return; + } +} diff --git a/newlib/libc/sys/go32/stat.c b/newlib/libc/sys/go32/stat.c new file mode 100644 index 000000000..e64e5b80c --- /dev/null +++ b/newlib/libc/sys/go32/stat.c @@ -0,0 +1,151 @@ +/* + (c) Copyright 1992 Eric Backus + + This software may be used freely so long as this copyright notice is + left intact. There is no warrantee on this software. +*/ + +#include <sys/stat.h> +#include <string.h> +#include <stdlib.h> + +#include "dos.h" +#include <errno.h> +#include <stdio.h> + +extern int _stat_assist(const char *, struct stat *); +extern void _fixpath(const char *, char *); + +struct path_list +{ + struct path_list *next; + char *path; + int inode; +}; + +static int +fixinode(const char *path, struct stat *buf) +{ + static struct path_list *path_list[1256]; + /* Start the inode count at three, since root path should be two */ + static int inode_count = 3; + + struct path_list *path_ptr, *prev_ptr; + const char *p; + int hash; + + /* Skip over device and leading '/' */ + if (path[1] == ':' && path[2] == '/') path += 3; + + /* We could probably use a better hash than this */ + p = path; + hash = 0; + while (*p != '\0') hash += *p++; + hash = hash & 0xff; + + /* Have we seen this string? */ + path_ptr = path_list[hash]; + prev_ptr = path_ptr; + while (path_ptr) + { + if (strcmp(path, path_ptr->path) == 0) break; + prev_ptr = path_ptr; + path_ptr = path_ptr->next; + } + + if (path_ptr) + /* Same string, so same inode */ + buf->st_ino = path_ptr->inode; + else + { + /* New string with same hash code */ + path_ptr = malloc(sizeof *path_ptr); + if (path_ptr == NULL) + { + errno = ENOMEM; + return -1; + } + path_ptr->next = NULL; + path_ptr->path = strdup(path); + if (path_ptr->path == NULL) + { + errno = ENOMEM; + return -1; + } + path_ptr->inode = inode_count; + if (prev_ptr) + prev_ptr->next = path_ptr; + else + path_list[hash] = path_ptr; + buf->st_ino = inode_count; + inode_count++; + } + return 0; +} + +int +stat(const char *path, struct stat *buf) +{ + static int stat_called_before = 0; + char p[1090]; /* Should be p[PATH_MAX+1] */ + int status; + + /* Normalize the path */ + _fixpath(path, p); + + /* Work around strange bug with stat and time */ + if (!stat_called_before) + { + stat_called_before = 1; + (void) time((time_t *) 0); + } + + /* Check for root path */ + if (strcmp(p, "/") == 0 || strcmp(p + 1, ":/") == 0) + { + /* Handle root path as special case, stat_assist doesn't like + the root directory. */ + if (p[1] == ':') + { + if (p[0] >= 'a' && p[0] <= 'z') + buf->st_dev = p[0] - 'a'; + else + buf->st_dev = p[0] - 'A'; + } + else + buf->st_dev = -1; /* No device? */ + buf->st_ino = 2; /* Root path always inode 2 */ + buf->st_mode = S_IFDIR | S_IREAD | S_IWRITE | S_IEXEC; + buf->st_nlink = 1; + buf->st_uid = getuid(); + buf->st_gid = getgid(); + buf->st_rdev = buf->st_dev; + buf->st_size = 0; + buf->st_atime = 0; + buf->st_mtime = 0; + buf->st_ctime = 0; + buf->st_blksize = 512; /* Not always correct? */ + status = 0; + } + else + { + status = _stat_assist(p, buf); + + /* Make inode numbers unique */ + if (status == 0) status = fixinode(p, buf); + + /* The stat_assist does something weird with st_dev, but sets + st_rdev to the drive number. Fix st_dev. */ + buf->st_dev = buf->st_rdev; + + /* Make all files owned by ourself. */ + buf->st_uid = getuid(); + buf->st_gid = getgid(); + + /* Make all directories writable. They always are in DOS, but + stat_assist doesn't think so. */ + if (S_ISDIR(buf->st_mode)) buf->st_mode |= S_IWRITE; + } + + return status; +} diff --git a/newlib/libc/sys/go32/stat.s b/newlib/libc/sys/go32/stat.s new file mode 100644 index 000000000..045725f32 --- /dev/null +++ b/newlib/libc/sys/go32/stat.s @@ -0,0 +1,19 @@ +# /* This is file STAT.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _stat +_stat: + movb $6,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/stat_ast.s b/newlib/libc/sys/go32/stat_ast.s new file mode 100644 index 000000000..3574f8279 --- /dev/null +++ b/newlib/libc/sys/go32/stat_ast.s @@ -0,0 +1,21 @@ +/* This is file STAT_AST.S */ +/* +** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +** +** Modified very slightly by Eric Backus. +*/ + + .text + .globl __stat_assist +__stat_assist: + movb $6,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/sys/dir.h b/newlib/libc/sys/go32/sys/dir.h new file mode 100644 index 000000000..6ac830f27 --- /dev/null +++ b/newlib/libc/sys/go32/sys/dir.h @@ -0,0 +1,33 @@ +#ifndef _DIR_H_ +#define _DIR_H_ + +struct ffblk { + char ff_reserved[21]; + char ff_attrib; + short ff_ftime; + short ff_fdate; + short ff_filler; + long ff_fsize; + char ff_name[16]; +}; + +#define FA_RDONLY 1 +#define FA_HIDDEN 2 +#define FA_SYSTEM 4 +#define FA_LABEL 8 +#define FA_DIREC 16 +#define FA_ARCH 32 + +#ifdef __cplusplus +extern "C" { +#endif + +int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); +int findnext(struct ffblk *ffblk); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/newlib/libc/sys/go32/sys/dirent.h b/newlib/libc/sys/go32/sys/dirent.h new file mode 100644 index 000000000..50ae799d8 --- /dev/null +++ b/newlib/libc/sys/go32/sys/dirent.h @@ -0,0 +1,39 @@ +/* This is file DIRENT.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _dirent_h_ +#define _dirent_h_ + +#include <sys/dir.h> + +struct dirent { + unsigned short d_namlen; + char d_name[14]; +}; + +typedef struct { + int num_read; + char *name; + struct ffblk ff; + struct dirent de; +} DIR; + +DIR *opendir(char *name); +struct dirent *readdir(DIR *dir); +long telldir(DIR *dir); +void seekdir(DIR *dir, long loc); +void rewinddir(DIR *dir); +int closedir(DIR *dir); + +#endif diff --git a/newlib/libc/sys/go32/sys/dos.h b/newlib/libc/sys/go32/sys/dos.h new file mode 100644 index 000000000..ff3103f93 --- /dev/null +++ b/newlib/libc/sys/go32/sys/dos.h @@ -0,0 +1,57 @@ +#ifndef _DOS_H_ +#define _DOS_H_ + +union REGS { + struct { + unsigned long ax; + unsigned long bx; + unsigned long cx; + unsigned long dx; + unsigned long si; + unsigned long di; + unsigned long cflag; + unsigned long flags; + } x; + struct { + unsigned char al; + unsigned char ah; + unsigned short upper_ax; + unsigned char bl; + unsigned char bh; + unsigned short upper_bx; + unsigned char cl; + unsigned char ch; + unsigned short upper_cx; + unsigned char dl; + unsigned char dh; + unsigned short upper_dx; + } h; +}; + +struct SREGS { + unsigned short cs; + unsigned short ds; + unsigned short es; + unsigned short fs; + unsigned short gs; + unsigned short ss; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int bdos(int func, unsigned dx, unsigned al); +int bdosptr(int func, void *dx, unsigned al); +int int86(int ivec, union REGS *in, union REGS *out); +int int86x(int ivec, union REGS *in, union REGS *out, struct SREGS *seg); +int intdos(union REGS *in, union REGS *out); +int intdosx(union REGS *in, union REGS *out, struct SREGS *seg); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/newlib/libc/sys/go32/sys/dpmi.h b/newlib/libc/sys/go32/sys/dpmi.h new file mode 100644 index 000000000..7a2cb13af --- /dev/null +++ b/newlib/libc/sys/go32/sys/dpmi.h @@ -0,0 +1,151 @@ +/* This is file dpmi.h */
+/*
+** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef _DPMI_H_
+#define _DPMI_H_
+
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef union {
+ struct {
+ u_long edi;
+ u_long esi;
+ u_long ebp;
+ u_long res;
+ u_long ebx;
+ u_long edx;
+ u_long ecx;
+ u_long eax;
+ } d;
+ struct {
+ u_short di, di_hi;
+ u_short si, si_hi;
+ u_short bp, bp_hi;
+ u_short res, res_hi;
+ u_short bx, bx_hi;
+ u_short dx, dx_hi;
+ u_short cx, cx_hi;
+ u_short ax, ax_hi;
+ u_short flags;
+ u_short es;
+ u_short ds;
+ u_short fs;
+ u_short gs;
+ u_short ip;
+ u_short cs;
+ u_short sp;
+ u_short ss;
+ } x;
+ struct {
+ u_char edi[4];
+ u_char esi[4];
+ u_char ebp[4];
+ u_char res[4];
+ u_char bl, bh, ebx_b2, ebx_b3;
+ u_char dl, dh, edx_b2, edx_b3;
+ u_char cl, ch, ecx_b2, ecx_b3;
+ u_char al, ah, eax_b2, eax_b3;
+ } h;
+} _go32_dpmi_registers;
+
+typedef struct {
+ u_long size;
+ u_long pm_offset;
+ u_short pm_selector;
+ u_short rm_offset;
+ u_short rm_segment;
+} _go32_dpmi_seginfo;
+
+typedef struct {
+ u_long available_memory;
+ u_long available_pages;
+ u_long available_lockable_pages;
+ u_long linear_space;
+ u_long unlocked_pages;
+ u_long available_physical_pages;
+ u_long total_physical_pages;
+ u_long free_linear_space;
+ u_long max_pages_in_paging_file;
+ u_long reserved[3];
+} _go32_dpmi_meminfo;
+
+/* returns zero if success, else dpmi error and info->size is max size */
+int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info);
+ /* set size to bytes/16, call, use rm_segment. Do not
+ change anthing but size until the memory is freed.
+ If error, max size is returned in size as bytes/16. */
+int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info);
+ /* set new size to bytes/16, call. If error, max size
+ is returned in size as bytes/16 */
+int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info);
+ /* uses pm_selector to free memory */
+
+/* These both use the rm_segment:rm_offset fields only */
+int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+
+/* These do NOT wrap the function in pm_offset in an iret handler.
+ You must provide an assembler interface yourself, or alloc one below.
+ You may NOT longjmp out of an interrupt handler. */
+int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* puts vector in pm_selector:pm_offset. */
+int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* sets vector from pm_offset and pm_selector */
+int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
+ /* sets up wrapper that calls function in pm_offset, chaining to old
+ handler when it returns */
+
+/* These can be used to generate assember IRET-style wrappers for functions */
+int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info);
+ /* Put function ptr in pm_offset, call, returns wrapper entry in pm_offset. */
+int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info);
+ /* assumes pm_offset points to wrapper, frees it */
+
+/* simulate real mode calls. CS:IP from regs for non-interrupt */
+int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs);
+int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs);
+int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs);
+
+/* These automatically handle the tasks of restructuring the
+ real-mode stack for the proper return type. The callback
+ (info->pm_offset) is called as (*pmcb)(_go32_dpmi_registers *regs); */
+int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
+ /* points callback at pm_offset, returns seg:ofs of callback addr
+ in rm_segment:rm_offset. Do not change any fields until freed.
+ Interface is added to simulate far return */
+int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
+ /* same, but simulates iret */
+int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info);
+ /* frees callback */
+
+/* Only available_memory is guaranteed to be valid. Try
+ available_physical_pages for phys mem left */
+int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info);
+
+/* Convenience functions. These use the above memory info call.
+ The return value is *bytes* */
+u_long _go32_dpmi_remaining_physical_memory(void);
+u_long _go32_dpmi_remaining_virtual_memory(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/sys/errno.h b/newlib/libc/sys/go32/sys/errno.h new file mode 100644 index 000000000..44852aee3 --- /dev/null +++ b/newlib/libc/sys/go32/sys/errno.h @@ -0,0 +1,73 @@ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +/* ??? This file has been modified to work with newlib's way of storing + `errno'. Arguably there's no need and arguably we shouldn't diverge + from go32 sources. If you feel strongly about it, please change it. + The interface between newlib and system's version of errno is via + __errno, so there's no problem in storing errno in a different place + (any changes can be dealt with inside __errno). */ + +#ifndef _SYS_ERRNO_H_ +#define _SYS_ERRNO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/reent.h> + +#ifndef _REENT_ONLY +#define errno (*__errno()) +extern int *__errno _PARAMS ((void)); +#endif + +#define __errno_r(ptr) ((ptr)->_errno) + +#define ENOENT 2 /* No such file or directory */ +#define ENOTDIR 3 /* No path */ +#define EMFILE 4 /* Too many open files */ +#define EACCES 5 /* Permission denied */ +#define EBADF 6 /* Bad file number */ +#define EARENA 7 /* Arena trashed */ +#define ENOMEM 8 /* Not enough core */ +#define ESEGV 9 /* invalid memory address */ +#define EBADENV 10 /* invalid environment */ +#define ENODEV 15 /* No such device */ +#define ENMFILE 18 /* No more files */ +#define EINVAL 19 /* Invalid argument */ +#define E2BIG EBADENV /* Arg list too long */ +#define ENOEXEC 21 /* Exec format error */ +#define EXDEV 17 /* Cross-device link */ +#define EPIPE 32 /* POHC */ +#define EDOM 33 /* Math argument */ +#define ERANGE 34 /* Result too large */ +#if 0 /* readline.c assumes that if this is defined, so is O_NDELAY. + Newlib doesn't use it, so comment it out. */ +#define EWOULDBLOCK 35 /* POHC */ +#endif +#define EEXIST 36 /* File already exists */ +#define EINTR 100 /* Interrupted system call */ +#define EIO 101 /* I/O or bounds error */ +#define ENOSPC 102 /* No space left on drive */ +#define EAGAIN 103 /* No more processes */ +#define ECHILD 200 /* child exited (porting only) */ +#define EFAULT 201 /* bad address */ +#define ENXIO ENODEV +#define EPERM EACCES + +/* New values required by newlib and the Cygnus toolchain. */ +#define ENOSYS 230 /* Function not implemented */ +#define ESPIPE 231 /* Illegal seek */ + +#endif diff --git a/newlib/libc/sys/go32/sys/fcntl.h b/newlib/libc/sys/go32/sys/fcntl.h new file mode 100644 index 000000000..792c0673d --- /dev/null +++ b/newlib/libc/sys/go32/sys/fcntl.h @@ -0,0 +1,12 @@ +#define O_RDONLY 0x0001 +#define O_WRONLY 0x0002 +#define O_RDWR 0x0004 +#define O_CREAT 0x0100 +#define O_TRUNC 0x0200 +#define O_EXCL 0x0400 +#define O_APPEND 0x0800 +#define O_TEXT 0x4000 +#define O_BINARY 0x8000 + + + diff --git a/newlib/libc/sys/go32/sys/file.h b/newlib/libc/sys/go32/sys/file.h new file mode 100644 index 000000000..79f5f65f5 --- /dev/null +++ b/newlib/libc/sys/go32/sys/file.h @@ -0,0 +1,31 @@ +/* This is file FILE.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _FILE_H_ +#define _FILE_H_ + +#include <fcntl.h> + +#define L_SET 0 +#define L_CURR 1 +#define L_INCR 1 +#define L_XTND 2 + + +#define F_OK 0 /* does file exist */ +#define X_OK 1 /* is it executable by caller */ +#define W_OK 2 /* is it writable by caller */ +#define R_OK 4 /* is it readable by caller */ + +#endif diff --git a/newlib/libc/sys/go32/sys/go32.h b/newlib/libc/sys/go32/sys/go32.h new file mode 100644 index 000000000..4b6adefe1 --- /dev/null +++ b/newlib/libc/sys/go32/sys/go32.h @@ -0,0 +1,69 @@ +/* This is file go32.h */
+/*
+** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef _GO32_H_
+#define _GO32_H_
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This must match go32/proginfo.h */
+
+typedef struct {
+ u_long size_of_this_structure_in_bytes;
+ u_long linear_address_of_primary_screen;
+ u_long linear_address_of_secondary_screen;
+ u_long linear_address_of_transfer_buffer;
+ u_long size_of_transfer_buffer; /* >= 4k */
+ u_long pid;
+ u_char master_interrupt_controller_base;
+ u_char slave_interrupt_controller_base;
+ u_short selector_for_linear_memory;
+ u_long linear_address_of_stub_info_structure;
+ u_long linear_address_of_original_psp;
+ u_short run_mode;
+ u_short run_mode_info;
+} Go32_Info_Block;
+
+extern Go32_Info_Block _go32_info_block;
+
+#define _GO32_RUN_MODE_UNDEF 0
+#define _GO32_RUN_MODE_RAW 1
+#define _GO32_RUN_MODE_XMS 2
+#define _GO32_RUN_MODE_VCPI 3
+#define _GO32_RUN_MODE_DPMI 4
+
+void dosmemget(int offset, int length, void *buffer);
+void dosmemput(const void *buffer, int length, int offset);
+void movedata(unsigned source_selector, unsigned source_offset,
+ unsigned dest_selector, unsigned dest_offset,
+ size_t length);
+
+/* returns number of times hit since last call. (zero first time) */
+u_long _go32_was_ctrl_break_hit(void);
+void _go32_want_ctrl_break(int yes); /* auto-yes if call above function */
+
+u_short _go32_my_cs(void);
+u_short _go32_my_ds(void);
+u_short _go32_my_ss(void);
+u_short _go32_conventional_mem_selector(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/sys/param.h b/newlib/libc/sys/go32/sys/param.h new file mode 100644 index 000000000..c912b4082 --- /dev/null +++ b/newlib/libc/sys/go32/sys/param.h @@ -0,0 +1,22 @@ +/* This is file PARAM.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _PARAM_H_ +#define _PARAM_H_ + +#define MAXPATHLEN 80 +/* 100, according to the real go32 sys/times.h */ +#define HZ (100) + +#endif diff --git a/newlib/libc/sys/go32/sys/pc.h b/newlib/libc/sys/go32/sys/pc.h new file mode 100644 index 000000000..4bce557d1 --- /dev/null +++ b/newlib/libc/sys/go32/sys/pc.h @@ -0,0 +1,56 @@ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _PC_H_ +#define _PC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned char inportb(unsigned short port); +unsigned short inportw(unsigned short port); +unsigned long inportl(unsigned short port); +unsigned char inportsb(unsigned short port, unsigned char *buf, unsigned len); +unsigned short inportsw(unsigned short port, unsigned short *buf, unsigned len); +unsigned long inportsl(unsigned short port, unsigned long *buf, unsigned len); +void outportb(unsigned short port, unsigned char data); +void outportw(unsigned short port, unsigned short data); +void outportl(unsigned short port, unsigned long data); +void outportsb(unsigned short port, unsigned char *buf, unsigned len); +void outportsw(unsigned short port, unsigned short *buf, unsigned len); +void outportsl(unsigned short port, unsigned long *buf, unsigned len); + +int kbhit(void); +int getkey(void); + +void sound(int frequency); + +extern short ScreenPrimary[]; +extern short ScreenSecondary[]; + +/* For the primary screen: */ +int ScreenRows(); +int ScreenCols(); +void ScreenPutChar(int ch, int attr, int x, int y); +void ScreenSetCursor(int row, int col); +void ScreenGetCursor(int *row, int *col); +void ScreenClear(); + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/newlib/libc/sys/go32/sys/register.h b/newlib/libc/sys/go32/sys/register.h new file mode 100644 index 000000000..56fb737dd --- /dev/null +++ b/newlib/libc/sys/go32/sys/register.h @@ -0,0 +1,28 @@ +/* This is file REGISTER.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned ax, bx, cx, dx, si, di, bp, f; + } REGISTERS; + +#define FLAGS_C 1 + +#ifdef __cplusplus +} +#endif + diff --git a/newlib/libc/sys/go32/sys/resource.h b/newlib/libc/sys/go32/sys/resource.h new file mode 100644 index 000000000..afdf39217 --- /dev/null +++ b/newlib/libc/sys/go32/sys/resource.h @@ -0,0 +1,50 @@ +/* This is file RESOURCE.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +#include <sys/time.h> + +#define RUSAGE_SELF 0 /* calling process */ +#define RUSAGE_CHILDREN -1 /* terminated child processes */ + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* integral max resident set size */ + long ru_ixrss; /* integral shared text memory size */ + long ru_idrss; /* integral unshared data size */ + long ru_isrss; /* integral unshared stack size */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary context switches */ +}; + + +#ifdef __cplusplus +extern "C" int getrusage(int who, struct rusage *rusage); +#else +extern int getrusage(int who, struct rusage *rusage); +#endif + +#endif + diff --git a/newlib/libc/sys/go32/sys/setjmp.h b/newlib/libc/sys/go32/sys/setjmp.h new file mode 100644 index 000000000..59e30c43e --- /dev/null +++ b/newlib/libc/sys/go32/sys/setjmp.h @@ -0,0 +1,44 @@ +/*
+** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef _SETJMP_H_
+#define _SETJMP_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ unsigned long eax;
+ unsigned long ebx;
+ unsigned long ecx;
+ unsigned long edx;
+ unsigned long esi;
+ unsigned long edi;
+ unsigned long ebp;
+ unsigned long esp;
+ unsigned long eip;
+ unsigned short es;
+ unsigned short fs;
+ unsigned short gs;
+ unsigned short ss;
+} jmp_buf[1];
+
+extern int setjmp(jmp_buf);
+extern void longjmp(jmp_buf, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/newlib/libc/sys/go32/sys/stdc.h b/newlib/libc/sys/go32/sys/stdc.h new file mode 100644 index 000000000..b2e5bc19b --- /dev/null +++ b/newlib/libc/sys/go32/sys/stdc.h @@ -0,0 +1,15 @@ +/* This is file STDC.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <sys/types.h> diff --git a/newlib/libc/sys/go32/sys/uio.h b/newlib/libc/sys/go32/sys/uio.h new file mode 100644 index 000000000..d09fa5061 --- /dev/null +++ b/newlib/libc/sys/go32/sys/uio.h @@ -0,0 +1,23 @@ +/* This is file UIO.H */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#ifndef _SYS_UIO_H_ +#define _SYS_UIO_H_ + +struct iovec { + void *iov_base; + unsigned long iov_len; +}; + +#endif diff --git a/newlib/libc/sys/go32/syserr.c b/newlib/libc/sys/go32/syserr.c new file mode 100644 index 000000000..1fe4ca4cf --- /dev/null +++ b/newlib/libc/sys/go32/syserr.c @@ -0,0 +1,38 @@ + +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +char *sys_errlist[] = { + "no error", + "invalid function", + "file not found", + "path not found", + "too many open files", + "access denied", + "invalid file handle", + "arena trashed", + "not enough memory", + "invalid block", + "no environment", + "no format", + "invalid access code", + "invalid data", + "undefined", + "invalid drive", + "attempt to remove current directory", + "not same device", + "no more files" +}; + +int sys_nerr= sizeof(sys_errlist) / sizeof(char *); + diff --git a/newlib/libc/sys/go32/system.s b/newlib/libc/sys/go32/system.s new file mode 100644 index 000000000..9b12bbee8 --- /dev/null +++ b/newlib/libc/sys/go32/system.s @@ -0,0 +1,19 @@ +# /* This is file SYSTEM.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _system +_system: + movb $7,%al + jmp turbo_assist diff --git a/newlib/libc/sys/go32/tell.s b/newlib/libc/sys/go32/tell.s new file mode 100644 index 000000000..5427cbe3f --- /dev/null +++ b/newlib/libc/sys/go32/tell.s @@ -0,0 +1,33 @@ +# /* This is file TELL.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _tell +_tell: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl $0,%ecx + movl $0,%edx + movw $0x4201,%ax + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + shll $16,%edx + andl $0xffff,%eax + orl %edx,%eax + ret diff --git a/newlib/libc/sys/go32/time.c b/newlib/libc/sys/go32/time.c new file mode 100644 index 000000000..f8ab6f47e --- /dev/null +++ b/newlib/libc/sys/go32/time.c @@ -0,0 +1,53 @@ +/* +FUNCTION +<<time>>---get current calendar time (as single number) + +INDEX + time + +ANSI_SYNOPSIS + #include <time.h> + time_t time(time_t *<[t]>); + +TRAD_SYNOPSIS + #include <time.h> + time_t time(<[t]>) + time_t *<[t]>; + +DESCRIPTION +<<time>> looks up the best available representation of the current +time and returns it, encoded as a <<time_t>>. It stores the same +value at <[t]> unless the argument is <<NULL>>. + +RETURNS +A <<-1>> result means the current time is not available; otherwise the +result represents the current time. + +PORTABILITY +ANSI C requires <<time>>. +This function is a wrapper for <<gettimeofday>>; this pollutes the +namespace, and should be dealt with in the future. +*/ + +#include <_ansi.h> +#include <sys/types.h> +#include <sys/time.h> + +time_t +_DEFUN(time,(t), + time_t *t) +{ + struct timeval now; + + if (gettimeofday(&now, (struct timezone *)0) >= 0) + { + if (t) + { + *t = now.tv_sec; + } + + return now.tv_sec; + + } + return -1 ; +} diff --git a/newlib/libc/sys/go32/truncate.c b/newlib/libc/sys/go32/truncate.c new file mode 100644 index 000000000..8c64ee5a5 --- /dev/null +++ b/newlib/libc/sys/go32/truncate.c @@ -0,0 +1,25 @@ +/* This is file TRUNCATE.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <fcntl.h> + +truncate(const char *fn, unsigned long where) +{ + int fd = open(fn, O_WRONLY); + if (fd < 0) + return -1; + lseek(fd, where, 0); + write(fd, 0, 0); + close(fd); +} diff --git a/newlib/libc/sys/go32/turbo.s b/newlib/libc/sys/go32/turbo.s new file mode 100644 index 000000000..4bf2253e9 --- /dev/null +++ b/newlib/libc/sys/go32/turbo.s @@ -0,0 +1,30 @@ +# /* This is file TURBO.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl turbo_assist +turbo_assist: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl 20(%esp),%ecx + movl 24(%esp),%edx + movb $0xff,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + ret diff --git a/newlib/libc/sys/go32/umask.c b/newlib/libc/sys/go32/umask.c new file mode 100644 index 000000000..4fabe640b --- /dev/null +++ b/newlib/libc/sys/go32/umask.c @@ -0,0 +1,4 @@ +umask() +{ + return 0644; +} diff --git a/newlib/libc/sys/go32/unlink.s b/newlib/libc/sys/go32/unlink.s new file mode 100644 index 000000000..afc9fe8f9 --- /dev/null +++ b/newlib/libc/sys/go32/unlink.s @@ -0,0 +1,27 @@ +# /* This is file UNLINK.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _unlink +_unlink: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%edx + movb $0x41,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jmp syscall_check diff --git a/newlib/libc/sys/go32/utime.c b/newlib/libc/sys/go32/utime.c new file mode 100644 index 000000000..555a79c3f --- /dev/null +++ b/newlib/libc/sys/go32/utime.c @@ -0,0 +1,15 @@ +/* This is file UTIME.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +utime(){} diff --git a/newlib/libc/sys/go32/utimes.c b/newlib/libc/sys/go32/utimes.c new file mode 100644 index 000000000..46b530ba2 --- /dev/null +++ b/newlib/libc/sys/go32/utimes.c @@ -0,0 +1,15 @@ +/* This is file UTIMES.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +utimes(){} diff --git a/newlib/libc/sys/go32/write.s b/newlib/libc/sys/go32/write.s new file mode 100644 index 000000000..4c2d34806 --- /dev/null +++ b/newlib/libc/sys/go32/write.s @@ -0,0 +1,30 @@ +# /* This is file WRITE.S */ +# /* +# ** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +# ** +# ** This file is distributed under the terms listed in the document +# ** "copying.dj", available from DJ Delorie at the address above. +# ** A copy of "copying.dj" should accompany this file; if not, a copy +# ** should be available from where this file was obtained. This file +# ** may not be distributed without a verbatim copy of "copying.dj". +# ** +# ** This file is distributed WITHOUT ANY WARRANTY; without even the implied +# ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# */ + + .text + .globl _write +_write: + pushl %ebx + pushl %esi + pushl %edi + movl 16(%esp),%ebx + movl 20(%esp),%edx + movl 24(%esp),%ecx + movb $0x40,%ah + int $0x21 + popl %edi + popl %esi + popl %ebx + jb syscall_error + ret diff --git a/newlib/libc/sys/go32/writestub.c b/newlib/libc/sys/go32/writestub.c new file mode 100644 index 000000000..ae1b99359 --- /dev/null +++ b/newlib/libc/sys/go32/writestub.c @@ -0,0 +1,6 @@ + +sswrite(a,b,c) +{ + /*write(1,"writing\n",9);*/ + return write_real(a,b,c); +} diff --git a/newlib/libc/sys/go32/writev.c b/newlib/libc/sys/go32/writev.c new file mode 100644 index 000000000..86f9b1e41 --- /dev/null +++ b/newlib/libc/sys/go32/writev.c @@ -0,0 +1,31 @@ +/* This is file WRITEV.C */ +/* +** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 +** +** This file is distributed under the terms listed in the document +** "copying.dj", available from DJ Delorie at the address above. +** A copy of "copying.dj" should accompany this file; if not, a copy +** should be available from where this file was obtained. This file +** may not be distributed without a verbatim copy of "copying.dj". +** +** This file is distributed WITHOUT ANY WARRANTY; without even the implied +** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include <sys/types.h> +#include <sys/uio.h> + +writev(int handle, struct iovec *iov, int count) +{ + unsigned long r, t=0; + while (count) + { + r = write(handle, iov->iov_base, iov->iov_len); + if (r < 0) + return r; + t += r; + iov++; + count--; + } + return t; +} |