+Thu Sep 5 03:20:42 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ Change configuration and Makefiles to allow add-ons to have a
+ sysdeps/ directory hierachy.
+ * configure.in: Test for sysdeps/ directory in add-ons. Before
+ all test and searches in these hierachies, too.
+ * Makeconfig (full-config-subdirs): Define based on $(config-sysdirs).
+ Extend with $(..) if not absolute path.
+ Use $(full-config-subdirs) where $(config-sysdirs) was used.
+ * Makefile ($(objpfx)sysd-dirs): Use config-sysdirs.
+ * MakeTAGS: Use $(full-config-subdirs).
+ * Makerules: Change comment to libc.so link script.
+ (sysdirs): Define based on $(full-config-subdirs).
+ (sysd-Makefile): Define using config-sysdirs.
+ (sysd-rules): Likewise.
+ * sysdeps/unix/Makefile (sysd-syscalls): Define based on +sysdep-dirs.
+ * sysdeps/unix/make-syscalls.sh: Remove basedir argument.
+
+Wed Sep 4 01:32:21 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/m68k/fpu/k_cos.c: Rewritten for better accuracy.
+ * sysdeps/m68k/fpu/k_sin.c: Likewise.
+ * sysdeps/m68k/fpu/k_tan.c: Likewise.
+
+Thu Sep 5 01:06:09 1996 Richard Henderson <rth@tamu.edu>
+
+ * malloc/free.c (free): Protect by using __libc_malloc_lock.
+ * malloc/malloc-find.c (malloc_find_object_address): Likewise.
+ * malloc/malloc-size.c (malloc_usable_size): Likewise.
+ * malloc/malloc-walk.c (malloc_walk): Likewise.
+ * malloc/memalign.c (memalign): Likewise.
+ * malloc/realloc.c (realloc): Likewise.
+ * malloc/malloc.c: Define __libc_malloc_lock.
+ (_malloc_internal): Don't use `malloc'. Instead look for
+ `__malloc_hook' or call `_malloc_internal'.
+ (malloc): Protect by using `__libc_malloc_lock'.
+ * malloc/malloc.h: Declare `__libc_malloc_lock'.
+
+Mon Sep 2 22:42:59 1996 Richard Henderson <rth@tamu.edu>
+
+ * sysdeps/alpha/elf/start.S: Use weak_alias for __start
+ instead of the hard definition.
+
+ * sysdeps/alpha/dl-machine.h (RTLD_START): Add type info for
+ _start and _dl_start_user.
+
+ * sysdeps/unix/sysv/linux/alpha/init-first.h (SYSDEP_CALL_INIT):
+ Make _dl_starting_up weak. Add type info for NAME.
+
+Mon Sep 2 22:15:14 1996 Richard Henderson <rth@tamu.edu>
+
+ * Makefile (all): Add extra_solibs pass.
+ (+subdir_targets): Same.
+ * Rules (extra_solibs): New phony empty target for subdirs without
+ extra libs.
+ * extra-lib.mk: Build lib*.so* in extra_solibs not lib-noranlib.
+ * manual/Makefile: Add dummy extra_solibs target.
+
+Sun Sep 1 15:41:22 1996 Richard Henderson <rth@tamu.edu>
+
+ * Makeconfig (+link): Add $(link-extra-libs).
+ (link-extra-libs): New variable which expands to the full paths of
+ the other libraries needed by a program, as controled by LDLIBS-$(@F).
+ * db/Makefile: Use LDLIBS-makedb to link libdb not a dependency, as
+ the later attempts to install the library before linking it.
+
+ * sysdeps/unix/alpha/sysdep.S: Align errno.
+
+ * sysdeps/unix/sysv/linux/alpha/ioperm.c (struct platform): Add
+ hae_shift entry.
+ (io): Move bus_memory_base and sparse_bus_memory_base into struct.
+ (_hae_shift): New function.
+ * sysdeps/unix/sysv/linux/alpha/sys/io.h: New file. Prototypes
+ for the bus query functions.
+
+Sat Aug 31 18:14:54 1996 Richard Henderson <rth@tamu.edu>
+
+ * elf/dl-close.c (_dl_close): In static executables, map->l_prev
+ can be NULL when unloading a library.
+
+ * elf/dl-open.c (_dl_open): Pass __environ instead of __libc_envp
+ to the library .init function.
+
+ * sysdeps/alpha/dl-machine.h (elf_machine_rela): Since we omitted
+ part of the COPY reloc processing earlier, omit the rest now --
+ we'll get into less trouble later when some fool does use a COPY.
+
+ * sysdeps/unix/sysv/linux/init-first.c (init): Accept argc et al as
+ parameters. Move all argc and __libc_multiple_libcs calculation out
+ to init-first.h. Use __environ not __libc_envp.
+ * sysdeps/unix/sysv/linux/alpha/init-first.h: Rewrite.
+ * sysdeps/unix/sysv/linux/i386/init-first.h: Rewrite.
+
+Thu Aug 29 20:26:40 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/posix/profil.c (profil): Don't clobber saved timer and
+ signal settings when profiling was already turned on.
+
+ * csu/gmon-start.c (__gmon_start__) [HAVE_INITFINI]: Protect from
+ being called twice.
+
+Wed Sep 4 01:31:50 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/i386/mmap.S: Test for
+ 0 < return value < -4096 and not < 0 to decide about failure.
+ Reported by Andreas Jaeger.
+
+Tue Sep 3 19:04:05 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * stdio-common/vfscanf.c (__vfscanf): Don't count EOF char
+ in %c format.
+
+Sat Aug 31 18:10:51 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * wcsmbs/wchar.h: Define prototypes for wcstoq and wcstouq only
+ #ifdef __USE_GNU.
+
+Sat Aug 31 12:34:29 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * version.c: Add missing newline character in banner.
+
+ * sysdeps/unix/sysv/linux/alpha/Dist: Correct typo.
+ * sysdeps/unix/sysv/linux/i386/Dist: Likewise.
+
+Sat Aug 31 03:07:39 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * intl/l10nflist.c (_nl_normalize_codeset): We convert to lower
+ case, so don't prepend uppercase `ISO' for only numeric arg.
+
Tue Sep 3 11:16:07 1996 Thomas Bushnell/ n/BSG <thomas@gnu.ai.mit.edu>
* shadow/lckpwdf.c (__ulckpwdf): Don't take address of LOCK in
endif # ctype
endif # No tags_sources
-sysdep-dirs := $(addprefix $(sysdep_dir)/,$(sysdirs))
+sysdep-dirs := $(full-config-subdirs)
ifndef sysdep_dirs
# Find all sysdep directories.
sysdep_dir := $(..)sysdeps
export sysdep_dir := $(sysdep_dir)
-
# Get the values defined by options to `configure'.
include $(common-objpfx)config.make
+# Complete path to sysdep dirs.
+full-config-sysdirs := $(filter /%, $(config-sysdirs)) \
+ $(addprefix $(..), $(filter-out /%, $(config-sysdirs)))
+export full-config-sysdirs := $(full-config-sysdirs)
+
# Run config.status to update config.make and config.h. We don't show the
# dependence of config.h to Make, because it is only touched when it
# changes and so config.status would be run every time; the dependence of
# Find all the sysdeps configure fragments, to make sure we re-run
# configure when any of them changes.
$(common-objpfx)config.status: $(..)configure \
- $(foreach dir,$(config-sysdirs),\
+ $(foreach dir,$(full-config-sysdirs),\
$(wildcard \
- $(sysdep_dir)/$(dir)/Implies) \
+ $(dir)/Implies) \
$(patsubst %.in,%,\
$(firstword $(wildcard \
- $(addprefix $(sysdep_dir)/$(dir)/,configure configure.in)))))
+ $(addprefix $(dir)/,configure configure.in)))))
@cd $(@D); if test -f $(@F); then exec $(SHELL) $(@F) --recheck; else \
echo The GNU C library has not been configured. >&2; \
echo Run \`configure\' to configure it before building. >&2; \
+link = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) \
- $(filter-out $(common-objpfx)libc%,$^) $(link-libc) \
- $(+postinit)
+ $(filter-out $(common-objpfx)libc%,$^) \
+ $(link-extra-libs) $(link-libc) $(+postinit)
endif
ifndef config-LDFLAGS
ifeq (yes,$(build-shared))
link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
endif
endif
+ifndef link-extra-libs
+ifeq (yes,$(build-shared))
+link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).so$($(notdir $(lib)).so-version))
+else
+link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
+endif
+endif
ifndef gnulib
gnulib := -lgcc
endif
endif
csu-objpfx = $(common-objpfx)csu/
elf-objpfx = $(common-objpfx)elf/
+db-objpfx = $(common-objpfx)db/
ifeq (yes,$(build-shared))
# The name under which the run-time dynamic linker is installed.
# This is the default target; it makes everything except the tests.
.PHONY: all
-all: lib others
+all: lib extra_solibs others
\f
define autoconf-it
@-rm -f $@.new
# These are the targets that are made by making them in each subdirectory.
-+subdir_targets := subdir_lib objects objs others subdir_mostlyclean \
- subdir_clean subdir_distclean subdir_realclean \
- tests subdir_lint.out \
++subdir_targets := subdir_lib extra_solibs objects objs others \
+ subdir_mostlyclean subdir_clean subdir_distclean \
+ subdir_realclean tests subdir_lint.out \
subdir_distinfo \
subdir_echo-headers subdir_echo-distinfo \
- subdir_install $(addprefix install-, \
- no-libc.a bin lib \
- data headers others)
+ subdir_install \
+ $(addprefix install-, no-libc.a bin lib data headers others)
\f
headers := errno.h sys/errno.h errnos.h limits.h values.h \
features.h gnu-versions.h libc-lock.h
$(objpfx)sysd-dirs: $(+sysdir_pfx)config.make
(echo define sysdep-subdirs; \
- for dir in $(sysdirs); do \
- if [ -r $(sysdep_dir)/$$dir/Subdirs ]; then \
- sed 's/#.*$$//' $(sysdep_dir)/$$dir/Subdirs; \
+ for sysdir in $(config-sysdirs); do \
+ case $$sysdir in \
+ /*) dir=$$sysdir ;; \
+ *) dir=$(..)$$sysdir ;; \
+ esac; \
+ if [ -r $$dir/Subdirs ]; then \
+ sed 's/#.*$$//' $$dir/Subdirs; \
else true; \
fi; \
done; \
endif
# `configure' writes a definition of `config-sysdirs' in `config.make'.
-sysdirs = $(config-sysdirs)
+sysdirs = $(strip $(full-config-sysdirs))
+sysdir_pfx = $(common-objpfx)
export sysdirs := $(sysdirs)
-+sysdep_dirs := $(addprefix $(sysdep_dir)/,$(sysdirs))
++sysdep_dirs := $(full-config-sysdirs)
ifdef objdir
+sysdep_dirs := $(objdir) $(+sysdep_dirs)
endif
# appropriate and not worry about where foo.h comes from, which may be
# system dependent and not known by that Makefile.
vpath %.h $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
- $(addprefix $(sysdep_dir)/,$(sysdirs)) \
- $(..)))
+ $(+sysdep_dirs) $(..)))
# Some sysdep makefiles use this to distinguish being included here from
# being included individually by a subdir makefile (hurd/Makefile needs this).
ifndef avoid-generated
-include $(+sysdir_pfx)sysd-Makefile
-ifneq ($(sysd-Makefile-sysdirs),$(sysdirs))
+ifneq ($(sysd-Makefile-sysdirs),$(config-sysdirs))
sysd-Makefile-force = FORCE
FORCE:
endif
$(+sysdir_pfx)sysd-Makefile: $(+sysdir_pfx)config.make $(..)Makerules \
$(sysd-Makefile-force)
-@rm -f $@T
- (echo 'sysd-Makefile-sysdirs := $(sysdirs)'; \
- for dir in $(sysdirs); do \
- file=sysdeps/$$dir/Makefile; \
- if [ -f $(..)$$file ]; then \
- echo include "\$$(..)$$file"; \
+ (echo 'sysd-Makefile-sysdirs := $(config-sysdirs)'; \
+ for dir in $(config-sysdirs); do \
+ file=$$dir/Makefile; \
+ if [ -f $$file ]; then \
+ case $$dir in \
+ /*) echo include "$$file" ;; \
+ *) echo include "\$$(..)$$file" ;; \
+ esac; \
else true; fi; \
done; \
echo 'sysd-Makefile-done=t') > $@T
# contents of sysd-rules.
ifdef sysd-Makefile-done
-include $(+sysdir_pfx)sysd-rules
-ifneq ($(sysd-rules-sysdirs),$(sysdirs))
-# The value of $(sysdirs) the sysd-rules was computed for
+ifneq ($(sysd-rules-sysdirs),$(config-sysdirs))
+# The value of $(+sysdep_dirs) the sysd-rules was computed for
# differs from the one we are using now. So force a rebuild of sysd-rules.
sysd-rules-force = FORCE
FORCE:
endif
$(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \
$(wildcard $(foreach dir,$(sysdirs),\
- $(sysdep_dir)/$(dir)/Makefile))\
+ $(dir)/Makefile))\
$(sysd-rules-force)
-@rm -f $@T
- (echo 'sysd-rules-sysdirs := $(sysdirs)'; \
- for sysdir in $(sysdirs); do \
- dir="\$$(sysdep_dir)/$$sysdir"; \
+ (echo 'sysd-rules-sysdirs := $(config-sysdirs)'; \
+ for sysdir in $(config-sysdirs); do \
+ case $$sysdir in \
+ /*) dir=$$sysdir ;; \
+ *) dir="\$$(..)$$sysdir" ;; \
+ esac; \
for o in $(object-suffixes); do \
$(open-check-inhibit-asm) \
echo "\$$(objpfx)%$$o: $$dir/%.S \$$(before-compile); \
install: $(slibdir)/libc.so$(libc.so-version)
ifndef subdir
-# What we install as libc.so for programs to link against is in fact an
-# archive. It contains the various $(static-only-routines) objects, and
-# the special object libc-syms.so that contains just the dynamic symbol
-# table of the shared libc object.
+# What we install as libc.so for programs to link against is in fact a
+# link script. It contains references for the various libraries we need.
+# The libc.so object is not complete since some functions are only defined
+# in libc.a and the dynamic linker is an etra object.
install: $(libdir)/libc.so
$(libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \
$(elfobjdir)/$(rtld-installed-name) \
endif # tests
\f
.PHONY: distclean realclean subdir_distclean subdir_realclean \
- subdir_clean subdir_mostlyclean
+ subdir_clean subdir_mostlyclean extra_solibs
subdir_mostlyclean: mostlyclean
subdir_clean: clean
subdir_distclean: distclean
subdir_realclean: realclean
realclean: distclean
distclean: clean
+extra_solibs:
.PHONY: subdir_echo-headers
subdir_echo-headers: echo-headers
# Convenient target to update all the generated source files.
.PHONY: generated
-generated: $(addprefix $(objpfx),$(generated))
generated: $(addprefix $(common-objpfx),$(common-generated))
ifndef libc.so-version
subdirs="$add_ons"
+add_ons_pfx=
+if test x$add_ons != x; then
+ for f in $add_ons; do
+ add_ons_pfx="$add_ons_pfx $f/"
+ done
+fi
# Make sure we can run config.sub.
# Find what sysdep directories exist.
sysnames=
-for b in $base ''; do
- for m0 in $mach ''; do
- for v in /$vendor ''; do
- for o in /$ostry ''; do
- for m in $mach ''; do
- try="$m0$b$v$o$m"
- test -n "$enable_debug_configure" && echo "$0 DEBUG: try $try" >&2
- if test -d $sysdep_dir$try; then
- sysnames="$sysnames $try"
- { test -n "$o" || test -n "$b"; } && os_used=t
- { test -n "$m" || test -n "$m0"; } && machine_used=t
- fi
+IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+for d in $add_ons_pfx ''; do
+ for b in $base ''; do
+ for m0 in $mach ''; do
+ for v in /$vendor ''; do
+ for o in /$ostry ''; do
+ for m in $mach ''; do
+ if test "$m0$b$v$o$m"; then
+ try="${d}sysdeps$m0$b$v$o$m"
+ test -n "$enable_debug_configure" &&
+ echo "$0 DEBUG: try $try" >&2
+ case $try in
+ /*) dest=$try ;;
+ *) dest=$srcdir/$try ;;
+ esac
+ if test -d $dest; then
+ sysnames="$sysnames $try"
+ { test -n "$o" || test -n "$b"; } && os_used=t
+ { test -n "$m" || test -n "$m0"; } && machine_used=t
+ fi
+ fi
+ done
done
done
done
done
done
+IFS="$ac_save_ifs"
if test -z "$os_used" && test "$os" != none; then
{ echo "configure: error: Operating system $os is not supported." 1>&2; exit 1; }
# machine (otherwise what's the point of an ABI?).
if test "$elf" = yes; then
elf_dirs=
- for m in $mach; do
- if test -d $sysdep_dir$m/elf; then
- elf_dirs="$elf_dirs $m/elf"
- fi
+ for d in $add_ons_pfx ''; do
+ case $d in
+ /*) xsrcdir= ;;
+ *) xsrcdir=$srcdir/ ;;
+ esac
+ for m in $mach; do
+ if test -d $xsrcdir${d}sysdeps$m/elf; then
+ elf_dirs="$elf_dirs $d$m/elf"
+ fi
+ done
done
- sysnames="`echo $elf_dirs | sed -e 's,^/,,' -e 's, /,,g'` $sysnames"
+ sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
fi
# Report each name as we discover it, so there is no long pause in output.
echo $ac_n "$name $ac_c" >&6
- if test -f $sysdep_dir/$name/Implies; then
+ name_base=`echo $name | sed -e 's@\(.*sysdeps\)/.*@\1@'`
+
+ case $name in
+ /*) xsrcdir= ;;
+ *) xsrcdir=$srcdir/ ;;
+ esac
+ test -n "$enable_debug_configure" &&
+ echo "DEBUG: name/Implies $xsrcdir$name/Implies" >&2
+
+ if test -f $xsrcdir$name/Implies; then
# Collect more names from the `Implies' file (removing comments).
- implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`"
- for x in $implied; do
- test -d $sysdep_dir/$x || {
- echo "configure: warning: sysdeps/$name/Implies specifies nonexistent $x" 1>&2
- }
+ implied_candidate="`sed 's/#.*$//' < $xsrcdir$name/Implies`"
+ implied=
+ for x in $implied_candidate; do
+ if test -d $xsrcdir$name_base/$x; then
+ implied="$implied $name_base/$x";
+ else
+ echo "configure: warning: $name/Implies specifies nonexistent $x" 1>&2
+ fi
done
else
implied=
names="$names $name"
# Find the parent of NAME, using the empty string if it has none.
- parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
+ parent="`echo $name | sed -n -e 's=/[^/]*$==' -e '/sysdeps$/q' -e p`"
# Add the names implied by NAME, and NAME's parent (if it has one), to
# the list of names to be processed (the argument list). We prepend the
done
# Add the default directories.
-sysnames="$names generic stub"
+sysnames="$names sysdeps/generic sysdeps/stub"
# The other names were emitted during the scan.
-echo "$ac_t""generic stub" 1>&6
+echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6
### Locate tools.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1143 "configure"
+#line 1178 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1158 "configure"
+#line 1193 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
:
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1306 "configure"
+#line 1341 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
EOF
-if { (eval echo configure:1322: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_friendly_stddef=yes
else
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1429 "configure"
+#line 1464 "configure"
#include "confdefs.h"
int main() { return 0; }
asm (".text");
; return 0; }
EOF
-if { (eval echo configure:1439: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1474: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_have_initfini=yes
else
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1467 "configure"
+#line 1502 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() { return 0; }
glibc_foobar ();
; return 0; }
EOF
-if { (eval echo configure:1475: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
libc_cv_asm_underscores=yes
else
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive
- -o conftest conftest.c'; { (eval echo configure:1569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ -o conftest conftest.c'; { (eval echo configure:1604: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes
else
libc_cv_ld_no_whole_archive=no
EOF
if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions
- -o conftest conftest.c'; { (eval echo configure:1590: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+ -o conftest conftest.c'; { (eval echo configure:1625: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes
else
libc_cv_gcc_no_exceptions=no
# configure fragments, and looking for a uname implementation.
uname=
for dir in $sysnames; do
- if test -r $sysdep_dir/$dir/configure; then
- echo "$ac_t""running configure fragment for $dir" 1>&6
- . $sysdep_dir/$dir/configure
+ case $dir in
+ /*) dest=$dir ;;
+ *) dest=$srcdir/$dir ;;
+ esac
+ if test -r $dest/configure; then
+ echo "$ac_t""running configure fragment for $dest" 1>&6
+ . $dest/configure
fi
if test -z "$uname"; then
[add_ons=`echo "$enableval" | sed 's/,/ /g'`],
[add_ons=])
AC_CONFIG_SUBDIRS($add_ons)
+add_ons_pfx=
+if test x$add_ons != x; then
+ for f in $add_ons; do
+ add_ons_pfx="$add_ons_pfx $f/"
+ done
+fi
AC_CANONICAL_HOST
# We keep the original values in `$config_*' and never modify them, so we
# Find what sysdep directories exist.
sysnames=
-for b in $base ''; do
- for m0 in $mach ''; do
- for v in /$vendor ''; do
- for o in /$ostry ''; do
- for m in $mach ''; do
- try="$m0$b$v$o$m"
- test -n "$enable_debug_configure" && echo "$0 [DEBUG]: try $try" >&2
- if test -d $sysdep_dir$try; then
- sysnames="$sysnames $try"
- { test -n "$o" || test -n "$b"; } && os_used=t
- { test -n "$m" || test -n "$m0"; } && machine_used=t
- fi
+IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+for d in $add_ons_pfx ''; do
+ for b in $base ''; do
+ for m0 in $mach ''; do
+ for v in /$vendor ''; do
+ for o in /$ostry ''; do
+ for m in $mach ''; do
+ if test "$m0$b$v$o$m"; then
+ try="${d}sysdeps$m0$b$v$o$m"
+ test -n "$enable_debug_configure" &&
+ echo "$0 [DEBUG]: try $try" >&2
+ case $try in
+ /*) dest=$try ;;
+ *) dest=$srcdir/$try ;;
+ esac
+ if test -d $dest; then
+ sysnames="$sysnames $try"
+ { test -n "$o" || test -n "$b"; } && os_used=t
+ { test -n "$m" || test -n "$m0"; } && machine_used=t
+ fi
+ fi
+ done
done
done
done
done
done
+IFS="$ac_save_ifs"
if test -z "$os_used" && test "$os" != none; then
AC_MSG_ERROR(Operating system $os is not supported.)
# machine (otherwise what's the point of an ABI?).
if test "$elf" = yes; then
elf_dirs=
- for m in $mach; do
- if test -d $sysdep_dir$m/elf; then
- elf_dirs="$elf_dirs $m/elf"
- fi
+ for d in $add_ons_pfx ''; do
+ case $d in
+ /*) xsrcdir= ;;
+ *) xsrcdir=$srcdir/ ;;
+ esac
+ for m in $mach; do
+ if test -d $xsrcdir${d}sysdeps$m/elf; then
+ elf_dirs="$elf_dirs $d$m/elf"
+ fi
+ done
done
- sysnames="`echo $elf_dirs | sed -e 's,^/,,' -e 's, /,,g'` $sysnames"
+ sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
fi
# Report each name as we discover it, so there is no long pause in output.
echo $ac_n "$name $ac_c" >&AC_FD_MSG
- if test -f $sysdep_dir/$name/Implies; then
+ name_base=`echo $name | sed -e 's@\(.*sysdeps\)/.*@\1@'`
+
+ case $name in
+ /*) xsrcdir= ;;
+ *) xsrcdir=$srcdir/ ;;
+ esac
+ test -n "$enable_debug_configure" &&
+ echo "[DEBUG]: name/Implies $xsrcdir$name/Implies" >&2
+
+ if test -f $xsrcdir$name/Implies; then
# Collect more names from the `Implies' file (removing comments).
- implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`"
- for x in $implied; do
- test -d $sysdep_dir/$x || {
- AC_MSG_WARN(sysdeps/$name/Implies specifies nonexistent $x)
- }
+ implied_candidate="`sed 's/#.*$//' < $xsrcdir$name/Implies`"
+ implied=
+ for x in $implied_candidate; do
+ if test -d $xsrcdir$name_base/$x; then
+ implied="$implied $name_base/$x";
+ else
+ AC_MSG_WARN($name/Implies specifies nonexistent $x)
+ fi
done
else
implied=
# Find the parent of NAME, using the empty string if it has none.
changequote(,)dnl
- parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
+ parent="`echo $name | sed -n -e 's=/[^/]*$==' -e '/sysdeps$/q' -e p`"
changequote([,])dnl
# Add the names implied by NAME, and NAME's parent (if it has one), to
done
# Add the default directories.
-sysnames="$names generic stub"
+sysnames="$names sysdeps/generic sysdeps/stub"
AC_SUBST(sysnames)
# The other names were emitted during the scan.
-AC_MSG_RESULT(generic stub)
+AC_MSG_RESULT(sysdeps/generic sysdeps/stub)
### Locate tools.
# configure fragments, and looking for a uname implementation.
uname=
for dir in $sysnames; do
- if test -r $sysdep_dir/$dir/configure; then
- AC_MSG_RESULT(running configure fragment for $dir)
- . $sysdep_dir/$dir/configure
+ case $dir in
+ /*) dest=$dir ;;
+ *) dest=$srcdir/$dir ;;
+ esac
+ if test -r $dest/configure; then
+ AC_MSG_RESULT(running configure fragment for $dest)
+ . $dest/configure
fi
[
if test -z "$uname"; then
void
__gmon_start__ (void)
{
+#ifdef HAVE_INITFINI
+ /* Protect from being called more than once. Since crti.o is linked
+ into every shared library, each of their init functions will call us. */
+ static int called;
+
+ if (called++)
+ return;
+#endif
+
/* Start keeping profiling records. */
monstartup ((u_long) &_start, (u_long) &etext);
collected data. */
atexit (&_mcleanup);
}
-
# The db code outsmarts the compiler frequently.
override CFLAGS += -Wno-uninitialized
-$(objpfx)makedb: -ldb
+LDLIBS-makedb := db/libdb
}
/* Finally, unlink the data structure and free it. */
- map->l_prev->l_next = map->l_next;
+ if (map->l_prev)
+ map->l_prev->l_next = map->l_next;
if (map->l_next)
map->l_next->l_prev = map->l_prev;
if (map->l_searchlist)
extern int __libc_argc;
extern char **__libc_argv;
-extern char **__libc_envp;
+extern char **__environ;
size_t _dl_global_scope_alloc;
/* Run the initializer functions of new objects. */
while (init = _dl_init_next (new))
(*(void (*) (int, char **, char **)) init) (__libc_argc, __libc_argv,
- __libc_envp);
+ __environ);
if (dl_start_ptr == NULL)
/* We must be the static _dl_open in libc.a because ld.so.1 is not
ifeq (,$(filter $(lib),$(extra-libs-others)))
lib-noranlib: $(alltypes-$(lib))
ifeq (yes,$(build-shared))
-lib-noranlib: $(objpfx)$(lib).so$($(lib).so-version)
+extra_solibs: $(objpfx)$(lib).so$($(lib).so-version)
endif
else
others: $(alltypes-$(lib))
# The linked shared library is never a dependent of lib-noranlib,
# because linking it will depend on libc.so already being built.
ifneq (,$(filter .so,$(object-suffixes-$(lib))))
-others: $(objpfx)$(lib).so
+extra_solibs: $(objpfx)$(lib).so
endif
if (retval != NULL)
{
if (only_digit)
- wp = stpcpy (retval, "ISO");
+ wp = stpcpy (retval, "iso");
else
wp = retval;
# ../Rules defines them for code subdirectories; for us, they are no-ops.
# None of these should be `subdir_TARGET'; those targets are transformed
# by the implicit rule above into `TARGET' deps.
-glibc-targets := lib objects objs others tests lint.out \
+glibc-targets := lib extra_solibs objects objs others tests lint.out \
echo-headers echo-distinfo stubs
.PHONY: $(glibc-targets)
$(glibc-targets):
names and are written within brackets. The general form is
@display
-@t{[} ( @t{!}? @var{status} @t{=} @var{action} )+ @t{]}
+@code{[} ( @code{!}? @var{status} @code{=} @var{action} )+ @code{]}
@end display
@noindent
-/* Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
#define RTLD_START asm ("\
.text
.globl _start
- .globl _dl_start_user
+ .ent _start
_start:
- br $gp,0f
+ br $gp, 0f
0: ldgp $gp, 0($gp)
/* Pass pointer to argument block to _dl_start. */
mov $sp, $16
bsr $26, _dl_start..ng
+ .end _start
+ /* FALLTHRU */
+ .globl _dl_start_user
+ .ent _dl_start_user
_dl_start_user:
/* Save the user entry point address in s0. */
mov $0, $9
lda $0, _dl_fini
/* Jump to the user's entry point. */
mov $9, $27
- jmp ($9)");
+ jmp ($9)
+ .end _dl_start_user");
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
sym_value += reloc->r_addend;
*reloc_addr = sym_value;
}
- else if (r_info == R_ALPHA_COPY)
- memcpy (reloc_addr, (void *) sym_value, sym->st_size);
else
assert (! "unexpected dynamic reloc type");
}
#include <sysdep.h>
.text
- .globl _start /* what ELF wants */
- .globl __start /* for backwards (ECOFF) comatibility */
.align 3
- .ent __start, 0
+ .ent _start, 0
_start:
-__start:
.frame fp, 0, zero
mov zero, fp
br gp, 1f
mov a1, s1
mov a2, s2
-#ifdef HAVE_INITFINI
/* Call _init, the entry point to our own .init section. */
jsr ra, _init
ldgp gp, 0(ra)
lda a0, _fini
jsr ra, atexit
ldgp gp, 0(ra)
-#else
- /* initialize constructors: */
- jsr ra, __main
- ldgp gp, 0(ra)
-#endif
+
+ /* Call the user's main and exit with its return value. */
mov s0, a0
mov s1, a1
mov s2, a2
- /* Call the user's main and exit with its return value. */
jsr ra, main
ldgp gp, 0(ra)
/* Die very horribly if exit returns. Call_pal hlt is callable from
kernel mode only; this will result in an illegal instruction trap. */
call_pal 0
-END(__start)
+ .end _start
+
+/* For ECOFF backwards compatibility. */
+weak_alias(_start, __start)
/* Define a symbol for the first piece of initialized data. */
.data
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <math.h>
#ifndef FUNC
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y), float_type x AND float_type y)
+__CONCATX(__kernel_,FUNC) (x, y)
+ float_type x;
+ float_type y;
{
- return __CONCATX(__,FUNC) (x + y);
+ float_type sin_x, cos_x, sin_y, cos_y;
+ __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_x), "=f" (sin_x)
+ : "f" (x));
+ __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_y), "=f" (sin_y)
+ : "f" (y));
+ return cos_x * cos_y - sin_x * sin_y;
}
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <math.h>
#ifndef FUNC
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y, iy),
- float_type x AND float_type y AND int iy)
+__CONCATX(__kernel_,FUNC) (x, y, iy)
+ float_type x;
+ float_type y;
+ int iy;
{
- return __CONCATX(__,FUNC) (x + y);
+ float_type sin_x, cos_x, sin_y, cos_y;
+ if (iy == 0)
+ return __m81_u_(__CONCATX(__,FUNC)) (x);
+ __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_x), "=f" (sin_x)
+ : "f" (x));
+ __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_y), "=f" (sin_y)
+ : "f" (y));
+ return sin_x * cos_y + cos_x * sin_y;
}
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <math.h>
#ifndef FUNC
#define __CONCATX(a,b) __CONCAT(a,b)
float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y, iy),
- float_type x AND float_type y AND int iy)
+__CONCATX(__kernel_,FUNC) (x, y, iy)
+ float_type x;
+ float_type y;
+ int iy;
{
- if (iy == 1)
- return __CONCATX(__,FUNC) (x + y);
+ float_type tan_x, tan_y;
+ tan_x = __m81_u_(__CONCATX(__,FUNC)) (x);
+ tan_y = __m81_u_(__CONCATX(__,FUNC)) (y);
+ if (iy > 0)
+ return (tan_x + tan_y) / (1 - tan_x * tan_y);
else
- return ((float_type) -1.0) / __CONCATX(__,FUNC) (x + y);
+ return (tan_x * tan_y - 1) / (tan_x + tan_y);
}
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <errno.h>
#include <sys/socket.h>
#include <hurd.h>
/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */
int
-DEFUN(__send, (fd, buf, n, flags),
- int fd AND const PTR buf AND size_t n AND int flags)
+__send (fd, buf, n, flags)
+ int fd;
+ const void *buf;
+ size_t n;
+ int flags;
{
error_t err;
int wrote;
-/* Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <errno.h>
#include <sys/socket.h>
#include <hurd.h>
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
int
-DEFUN(sendto, (fd, buf, n, flags, addr, addr_len),
- int fd AND const PTR buf AND size_t n AND int flags AND
- const struct sockaddr_un *addr AND size_t addr_len)
+sendto (fd, buf, n, flags, addr, addr_len)
+ int fd;
+ const void *buf;
+ size_t n;
+ int flags;
+ const struct sockaddr_un *addr;
+ size_t addr_len;
{
addr_port_t aport;
error_t err;
return sigaction (SIGPROF, &oact, NULL);
}
+ if (samples)
+ {
+ /* Was already turned on. Restore old timer and signal handler
+ first. */
+ if (setitimer (ITIMER_PROF, &otimer, NULL) < 0
+ || sigaction (SIGPROF, &oact, NULL) < 0)
+ return -1;
+ }
+
samples = sample_buffer;
nsamples = size / sizeof *samples;
pc_offset = offset;
/* Return info on filesystem.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
$(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
$(wildcard $(+sysdep_dirs:%=%/syscalls.list))
- for dir in $$sysdirs; do \
- test -f $(..)sysdeps/$$dir/syscalls.list && \
+ for dir in $(+sysdep_dirs); do \
+ test -f $$dir/syscalls.list && \
{ $(SHELL) $(dir $<)$(notdir $<) \
- $(..)sysdeps $$dir $(object-suffixes) || exit 1; }; \
- test $$dir = unix && break; \
+ $$dir $(object-suffixes) || exit 1; }; \
+ test $$dir = sysdeps/unix && break; \
done > $@T
mv -f $@T $@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@zen.org).
The GNU C Library is free software; you can redistribute it and/or
.section .bss
.globl errno
+ .align 2
errno: .space 4
#ifdef __ELF__
.type errno, @object
# Usage: make-syscalls.sh ../sysdeps unix/common
# Expects $sysdirs in environment.
-sysbase=$1; shift
thisdir=$1; shift
# Get the list of system calls for this directory.
calls=`sed 's/#.*$//
-/^[ ]*$/d' $sysbase/$thisdir/syscalls.list`
+/^[ ]*$/d' $thisdir/syscalls.list`
# Check each sysdep dir with higher priority than this one,
# and remove from $calls all the functions found in other dirs.
# If a syscall specified a "caller", then only compile that syscall
# if the caller function is also implemented in this directory.
calls=`echo "$calls" | while read file caller rest; do
- test -f $sysbase/$dir/$file.c && continue
- test -f $sysbase/$dir/$file.S && continue
- test -f $sysbase/$dir/$file.s && continue
+ test -f $dir/$file.c && continue
+ test -f $dir/$file.S && continue
+ test -f $dir/$file.s && continue
if test x$caller != x-; then
- test -f $sysbase/$dir/$caller.c && continue
- test -f $sysbase/$dir/$caller.S && continue
- test -f $sysbase/$dir/$caller.s && continue
+ test -f $dir/$caller.c && continue
+ test -f $dir/$caller.S && continue
+ test -f $dir/$caller.s && continue
fi
echo $file $caller $rest
done`
-alpha/ptrace.halpha/regdef.h
+alpha/ptrace.h alpha/regdef.h
ieee_get_fp_control.S ieee_set_fp_control.S
ioperm.c
init-first.h
clone.S
+sys/io.h
ifeq ($(subdir), misc)
-sysdep_headers += alpha/ptrace.h alpha/regdef.h
+sysdep_headers += alpha/ptrace.h alpha/regdef.h sys/io.h
sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
sethae ioperm osf_sigprocmask fstatfs statfs llseek
-/* This fragment is invoked in the stack context of program start.
- Its job is to set up a pointer to argc as an argument, pass
- control to `INIT', and, if necessary, clean up after the call
- to leave the stack in the same condition it was found in. */
+/* The job of this fragment it to find argc and friends for INIT.
+ This is done in one of two ways: either in the stack context
+ of program start, or having dlopen pass them in. */
-#define SYSDEP_CALL_INIT(NAME, INIT) \
- asm(".globl " #NAME "\n" \
- #NAME ":\n\t" \
- "ldgp $29, 0($27)\n\t" \
- ".prologue 1\n\t" \
- "mov $30, $16\n\t" \
- "br $31, " #INIT "..ng");
+#define SYSDEP_CALL_INIT(NAME, INIT) \
+ asm(".weak _dl_starting_up\n\t" \
+ ".globl " #NAME "\n\t" \
+ ".ent " #NAME "\n" \
+ #NAME ":\n\t" \
+ "ldgp $29, 0($27)\n\t" \
+ ".prologue 1\n\t" \
+ ".set at\n\t" \
+ /* Are we a dynamic libc being loaded into a static program? */ \
+ "lda $0, _dl_starting_up\n\t" \
+ "beq $0, 1f\n\t" \
+ "ldl $0, 0($0)\n" \
+ "cmpeq $31, $0, $0\n" \
+ "1:\t" \
+ "stl $0, __libc_multiple_libcs\n\t" \
+ /* If so, argc et al are in a0-a2 already. Otherwise, load them. */ \
+ "bne $0, 2f\n\t" \
+ "ldl $16, 0($30)\n\t" \
+ "lda $17, 8($30)\n\t" \
+ "s8addq $16, $17, $18\n\t" \
+ "addq $18, 8, $18\n" \
+ "2:\t" \
+ "br $31, " #INIT "..ng\n\t" \
+ ".set noat\n\t" \
+ ".end " #NAME);
static struct platform {
const char *name;
int io_sys;
+ int hae_shift;
unsigned long bus_memory_base;
unsigned long sparse_bus_memory_base;
} platform[] = {
- {"Alcor", IOSYS_CIA, CIA_DENSE_MEM, CIA_SPARSE_MEM},
- {"Avanti", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"Cabriolet", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"EB164", IOSYS_CIA, CIA_DENSE_MEM, CIA_SPARSE_MEM},
- {"EB64+", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"EB66", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"EB66P", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"Jensen", IOSYS_JENSEN, 0, JENSEN_SPARSE_MEM},
- {"Mikasa", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"Mustang", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
- {"Noname", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"Alcor", IOSYS_CIA, 5, CIA_DENSE_MEM, CIA_SPARSE_MEM},
+ {"Avanti", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"Cabriolet", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"EB164", IOSYS_CIA, 5, CIA_DENSE_MEM, CIA_SPARSE_MEM},
+ {"EB64+", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"EB66", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"EB66P", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"Jensen", IOSYS_JENSEN, 7, 0, JENSEN_SPARSE_MEM},
+ {"Mikasa", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"Mustang", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
+ {"Noname", IOSYS_APECS, 5, APECS_DENSE_MEM, APECS_SPARSE_MEM},
};
unsigned long base;
struct ioswtch * swp;
int sys;
+ int hae_shift;
+ unsigned long bus_memory_base;
+ unsigned long sparse_bus_memory_base;
} io;
-static unsigned long bus_memory_base = -1;
-static unsigned long sparse_bus_memory_base = -1;
-
extern void __sethae (unsigned long); /* we can't use asm/io.h */
{
if (strcmp (platform[i].name, systype) == 0)
{
- bus_memory_base = platform[i].bus_memory_base;
- sparse_bus_memory_base = platform[i].sparse_bus_memory_base;
+ io.hae_shift = platform[i].hae_shift;
+ io.bus_memory_base = platform[i].bus_memory_base;
+ io.sparse_bus_memory_base = platform[i].sparse_bus_memory_base;
io.sys = platform[i].io_sys;
if (io.sys == IOSYS_JENSEN)
io.swp = &ioswtch[0];
{
if (!io.swp && init_iosys () < 0)
return -1;
- return bus_memory_base;
+ return io.bus_memory_base;
}
unsigned long
{
if (!io.swp && init_iosys () < 0)
return -1;
- return sparse_bus_memory_base;
+ return io.sparse_bus_memory_base;
+}
+
+int
+_hae_shift(void)
+{
+ if (!io.swp && init_iosys () < 0)
+ return -1;
+ return io.hae_shift;
}
weak_alias (_sethae, sethae);
weak_alias (_outl, outl);
weak_alias (_bus_base, bus_base);
weak_alias (_bus_base_sparse, bus_base_sparse);
+weak_alias (_hae_shift, hae_shift);
--- /dev/null
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _SYS_IO_H
+
+#define _SYS_IO_H 1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Get constants from kernel header files. */
+#include <asm/io.h>
+
+/* If TURN_ON is TRUE, request for permission to do direct i/o on the
+ port numbers in the range [FROM,FROM+NUM-1]. Otherwise, turn I/O
+ permission off for that range. This call requires root privileges.
+
+ Portability note: not all Linux platforms support this call. Most
+ platforms based on the PC I/O architecture probably will, however.
+ E.g., Linux/Alpha for Alpha PCs supports this. */
+extern int ioperm __P ((unsigned long int __from, unsigned long int __num,
+ int __turn_on));
+
+/* Set the I/O privilege level to LEVEL. If LEVEL>3, permission to
+ access any I/O port is granted. This call requires root
+ privileges. */
+extern int iopl __P ((int __level));
+
+/* Return the physical address of the DENSE I/O memory or NULL if none
+ is available (e.g. on a jensen). */
+extern unsigned long _bus_base __P ((void)) __attribute__ ((const));
+extern unsigned long bus_base __P ((void)) __attribute__ ((const));
+
+/* Return the physical address of the SPARSE I/O memory. */
+extern unsigned long _bus_base_sparse __P ((void)) __attribute__ ((const));
+extern unsigned long bus_base_sparse __P ((void)) __attribute__ ((const));
+
+/* Return the HAE shift used by the SPARSE I/O memory. */
+extern int _hae_shift __P ((void)) __attribute__ ((const));
+extern int hae_shift __P ((void)) __attribute__ ((const));
+
+__END_DECLS
+
+#endif /* _SYS_IO_H */
sys/perm.h sys/vm86.h
init-first.h
-close.S
+clone.S
-/* This fragment is invoked in the stack context of program start.
- Its job is to set up a pointer to argc as an argument, pass
- control to `INIT', and, if necessary, clean up after the call
- to leave the stack in the same condition it was found in. */
+/* The job of this fragment it to find argc and friends for INIT.
+ This is done in one of two ways: either in the stack context
+ of program start, or having dlopen pass them in. */
-#define SYSDEP_CALL_INIT(NAME, INIT) \
- asm(".globl " #NAME "\n\t" \
- #NAME ":\n\t" \
- "lea 4(%esp), %eax\n\t" \
- "pushl %eax\n\t" \
- "call " #INIT "\n\t" \
- "popl %eax\n\t" \
- "ret");
+#define SYSDEP_CALL_INIT(NAME, INIT) \
+void NAME (void *arg) \
+{ \
+ int argc; \
+ char **argv, **envp; \
+ \
+ __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up; \
+ \
+ if (!__libc_multiple_libcs) \
+ { \
+ argc = (int) arg; \
+ argv = (char **) &arg + 1; \
+ envp = &argv[argc+1]; \
+ } \
+ else \
+ { \
+ argc = (int) arg; \
+ argv = ((char ***) &arg)[1]; \
+ envp = ((char ***) &arg)[2]; \
+ } \
+ \
+ INIT (argc, argv, envp); \
+}
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* Restore registers. */
movl %edx, %ebx
- /* %eax is < 0 if there was an error. */
- testl %eax, %eax
- jl syscall_error
+ /* If 0 > %eax > -4096 there was an error. */
+ cmpl $-4096, %eax
+ ja syscall_error
/* Successful; return the syscall's value. */
ret
extern void __libc_global_ctors (void);
/* The function is called from assembly stubs the compiler can't see. */
-static void init (void *) __attribute__ ((unused));
+static void init (int, char **, char **) __attribute__ ((unused));
extern int _dl_starting_up;
weak_extern (_dl_starting_up)
later calls of initializers for dynamic libraries. */
int __libc_argc;
char **__libc_argv;
-char **__libc_envp;
static void
-init (void *data)
+init (int argc, char **argv, char **envp)
{
extern int __personality (int);
- __libc_multiple_libcs = &_dl_starting_up && ! _dl_starting_up;
-
-
/* We must not call `personality' twice. */
if (!__libc_multiple_libcs)
{
- /* The argument we got points to the values describing the
- command line argument etc. */
- __libc_argc = *(int *)data;
- __libc_argv = (char **)data + 1;
- __libc_envp = &__libc_argv[__libc_argc + 1];
-
/* The `personality' system call takes one argument that chooses
the "personality", i.e. the set of system calls and such. We
must make this call first thing to disable emulation of some
/* Set the FPU control word to the proper default value. */
__setfpucw (__fpu_control);
}
- else
- {
- /* The argument we got points to the values describing the
- command line argument etc. */
- __libc_argc = *((int *)data)++;
- __libc_argv = *((char ***)data)++;
- __libc_envp = *(char ***)data;
- }
- __environ = __libc_envp;
- __libc_init (__libc_argc, __libc_argv, __libc_envp);
+ /* Save the command-line arguments. */
+ __libc_argc = argc;
+ __libc_argv = argv;
+ __environ = envp;
+
+ __libc_init (argc, argv, envp);
#ifdef PIC
__libc_global_ctors ();
This is free software; see the source for copying conditions.\n\
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
PARTICULAR PURPOSE.\n\
-Report bugs to <bug-glibc@gnu.ai.mit.edu>.";
+Report bugs to <bug-glibc@gnu.ai.mit.edu>.\n";
#include <unistd.h>
extern unsigned long int __wcstoul_internal __P ((__const wchar_t *__nptr,
wchar_t **__endptr,
int __base, int __group));
-#ifdef __GNUC__
+#if defined __GNUC__ && defined __USE_GNU
extern long long int __wcstoq_internal __P ((__const wchar_t *__nptr,
wchar_t **__endptr, int __base,
int __group));
wchar_t **__endptr,
int __base,
int __group));
-#endif /* GCC */
+#endif /* GCC and use GNU. */
#if defined (__OPTIMIZE__) && __GNUC__ >= 2
extern __inline __long_double_t wcstold (__const wchar_t *__nptr,
wchar_t **__endptr)
{ return __wcstold_internal (__nptr, __endptr, 0); }
-#endif
-#ifdef __USE_BSD
+
extern __inline long long int wcstoq (__const wchar_t *__nptr,
wchar_t **__endptr, int __base)
{ return __wcstoq_internal (__nptr, __endptr, __base, 0); }
extern __inline unsigned long long int wcstouq (__const wchar_t *__nptr,
wchar_t **__endptr, int __base)
{ return __wcstouq_internal (__nptr, __endptr, __base, 0); }
-#endif
+#endif /* Use GNU. */
#endif /* Optimizing GCC >=2. */