| diff -ruB --unidirectional-new-file ../glibc-2.19/abi-tags ../glibc-2.19-akaros/abi-tags | 
 | --- glibc-2.19/abi-tags	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/abi-tags	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -28,5 +28,7 @@ | 
 |   | 
 |  .*-.*-syllable.*	5	2.0.0	# just an arbitrary value | 
 |   | 
 | +.*-.*-akaros.*		6	1.0.0	# just an arbitrary value | 
 | + | 
 |  # There is no catch-all default here because every supported OS that uses | 
 |  # ELF must have its own unique ABI tag. | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/configure ../glibc-2.19-akaros/configure | 
 | --- glibc-2.19/configure	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/configure	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -4121,6 +4121,16 @@ | 
 |    tail="$2" | 
 |  done | 
 |   | 
 | +# For akaros, we don't have a base OS, which messes things up. Change this for | 
 | +# the purpose of sysdeps detection. | 
 | +test "x$base_os" != x || case "$os" in | 
 | +akaros*) | 
 | +  base=/akaros | 
 | +  vendor= | 
 | +  ostry= | 
 | +  ;; | 
 | +esac | 
 | + | 
 |  # For sparc/sparc32, try sparc/sparc32 and then sparc. | 
 |  mach= | 
 |  tail=$machine${submachine:+/$submachine} | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/configure.ac ../glibc-2.19-akaros/configure.ac | 
 | --- glibc-2.19/configure.ac	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/configure.ac	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -722,6 +722,16 @@ | 
 |    tail="$2" | 
 |  done | 
 |   | 
 | +# For akaros, we don't have a base OS, which messes things up. Change this for | 
 | +# the purpose of sysdeps detection. | 
 | +test "x$base_os" != x || case "$os" in | 
 | +akaros*) | 
 | +  base=/akaros | 
 | +  vendor= | 
 | +  ostry= | 
 | +  ;; | 
 | +esac | 
 | + | 
 |  # For sparc/sparc32, try sparc/sparc32 and then sparc. | 
 |  mach= | 
 |  tail=$machine${submachine:+/$submachine} | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/elf/Makefile ../glibc-2.19-akaros/elf/Makefile | 
 | --- glibc-2.19/elf/Makefile	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/elf/Makefile	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -24,7 +24,7 @@ | 
 |  headers		= elf.h bits/elfclass.h link.h bits/link.h | 
 |  routines	= $(dl-routines) dl-support dl-iteratephdr \ | 
 |  		  dl-addr enbl-secure dl-profstub \ | 
 | -		  dl-origin dl-libc dl-sym dl-tsd dl-sysdep | 
 | +		  dl-origin dl-libc dl-sym dl-tsd #dl-sysdep | 
 |   | 
 |  # The core dynamic linking functions are in libc for the static and | 
 |  # profiled libraries. | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/include/alloca.h ../glibc-2.19-akaros/include/alloca.h | 
 | --- glibc-2.19/include/alloca.h	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/include/alloca.h	2016-10-05 17:05:34.571879935 -0400 | 
 | @@ -1,5 +1,7 @@ | 
 |  #ifndef _ALLOCA_H | 
 |   | 
 | +/* AKAROS: Modified the alloca cutoff */ | 
 | + | 
 |  #include <stdlib/alloca.h> | 
 |  #include <stackinfo.h> | 
 |   | 
 | @@ -16,7 +18,10 @@ | 
 |  extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const)); | 
 |  libc_hidden_proto (__libc_alloca_cutoff) | 
 |   | 
 | -#define __MAX_ALLOCA_CUTOFF	65536 | 
 | +/* AKAROS: Limit to a small amount, so 2LSs and vcore context can have small | 
 | + * stacks.  Glibc typically uses 1/4 of the stack.  Assuming our users have at | 
 | + * least 4K stacks, we can use 1k, but let's be paranoid and use 512 for now. */ | 
 | +#define __MAX_ALLOCA_CUTOFF	512 | 
 |   | 
 |  #include <allocalim.h> | 
 |   | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/include/errno.h ../glibc-2.19-akaros/include/errno.h | 
 | --- glibc-2.19/include/errno.h	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/include/errno.h	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -1,3 +1,5 @@ | 
 | +/* Modified for Akaros, removed the redefinition of errno */ | 
 | + | 
 |  #ifndef _ERRNO_H | 
 |   | 
 |  #include <stdlib/errno.h> | 
 | @@ -21,13 +23,16 @@ | 
 |   | 
 |  #  include <tls.h> | 
 |   | 
 | -#  undef  errno | 
 | -#  ifndef NOT_IN_libc | 
 | -#   define errno __libc_errno | 
 | -#  else | 
 | -#   define errno errno		/* For #ifndef errno tests.  */ | 
 | -#  endif | 
 | +/* AKAROS doesn't want the redef of errno */ | 
 | +#  ifndef __akaros__ | 
 | +#    undef  errno | 
 | +#    ifndef NOT_IN_libc | 
 | +#     define errno __libc_errno | 
 | +#    else | 
 | +#     define errno errno		/* For #ifndef errno tests.  */ | 
 | +#    endif | 
 |  extern __thread int errno attribute_tls_model_ie; | 
 | +#  endif | 
 |   | 
 |  # endif	/* !NOT_IN_libc || IN_LIB */ | 
 |   | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/include/libc-symbols.h ../glibc-2.19-akaros/include/libc-symbols.h | 
 | --- glibc-2.19/include/libc-symbols.h	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/include/libc-symbols.h	2016-02-16 11:25:16.761066328 -0500 | 
 | @@ -1,3 +1,5 @@ | 
 | +/* Modified for Akaros, removed the static_link_warning() */ | 
 | + | 
 |  /* Support macros for making weak and strong aliases for symbols, | 
 |     and for using symbol sets and linker warnings with GNU ld. | 
 |     Copyright (C) 1995-2014 Free Software Foundation, Inc. | 
 | @@ -231,6 +233,14 @@ | 
 |    link_warning (name, #name " is not implemented and will always fail") | 
 |   | 
 |  /* Warning for linking functions calling dlopen into static binaries.  */ | 
 | + | 
 | +/* AKAROS doesn't want the annoying warning, breaks -Werror. */ | 
 | +#ifdef __akaros__ | 
 | + | 
 | +#define static_link_warning(name) | 
 | + | 
 | +#else | 
 | + | 
 |  #ifdef SHARED | 
 |  #define static_link_warning(name) | 
 |  #else | 
 | @@ -241,6 +251,8 @@ | 
 |  for linking") | 
 |  #endif | 
 |   | 
 | +#endif /* __akaros__ */ | 
 | + | 
 |  /* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes | 
 |     alias to ORIGINAL, when the assembler supports such declarations | 
 |     (such as in ELF). | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/Makeconfig ../glibc-2.19-akaros/Makeconfig | 
 | --- glibc-2.19/Makeconfig	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/Makeconfig	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -493,13 +493,17 @@ | 
 |  LDFLAGS-rdynamic = -rdynamic | 
 |  LDFLAGS-Bsymbolic = -Bsymbolic | 
 |   | 
 | -# Choose the default search path for the dynamic linker based on | 
 | -# where we will install libraries. | 
 | -ifneq ($(libdir),$(slibdir)) | 
 | -default-rpath = $(slibdir):$(libdir) | 
 | -else | 
 | -default-rpath = $(libdir) | 
 | -endif | 
 | +# For akaros we want the default-rpath to be the path on our resulting | 
 | +# machine, not the path of the lib directory in our cross compiler | 
 | +default-rpath = "/lib" | 
 | + | 
 | +## Choose the default search path for the dynamic linker based on | 
 | +## where we will install libraries. | 
 | +#ifneq ($(libdir),$(slibdir)) | 
 | +#default-rpath = $(slibdir):$(libdir) | 
 | +#else | 
 | +#default-rpath = $(libdir) | 
 | +#endif | 
 |   | 
 |  ifndef link-extra-libs | 
 |  link-extra-libs = $(LDLIBS-$(@F)) | 
 | @@ -1028,10 +1032,12 @@ | 
 |  # These are the subdirectories containing the library source.  The order | 
 |  # is more or less arbitrary.  The sorting step will take care of the | 
 |  # dependencies. | 
 | +# | 
 | +# AKAROS_PORT removed gshadow.  relies on NSS, has no man interface | 
 |  all-subdirs = csu assert ctype locale intl catgets math setjmp signal	    \ | 
 |  	      stdlib stdio-common libio malloc string wcsmbs time dirent    \ | 
 |  	      grp pwd posix io termios resource misc socket sysvipc gmon    \ | 
 | -	      gnulib iconv iconvdata wctype manual shadow gshadow po argp   \ | 
 | +	      gnulib iconv iconvdata wctype manual shadow po argp   \ | 
 |  	      crypt localedata timezone rt conform debug		    \ | 
 |  	      $(add-on-subdirs) dlfcn elf | 
 |   | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/nptl/shlib-versions ../glibc-2.19-akaros/nptl/shlib-versions | 
 | --- glibc-2.19/nptl/shlib-versions	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/nptl/shlib-versions	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -3,4 +3,6 @@ | 
 |  s390x-.*-linux.*	libpthread=0		GLIBC_2.2 | 
 |  powerpc64-.*-linux.*	libpthread=0		GLIBC_2.3 | 
 |  powerpc.*le-.*-linux.*	libpthread=0		GLIBC_2.17 | 
 | +#x86_64-.*-akaros.*      libpthread=0        GLIBC_2.2.5 | 
 |  .*-.*-linux.*		libpthread=0 | 
 | +.*-.*-akaros.*		libpthread=0 | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/rt/Makefile ../glibc-2.19-akaros/rt/Makefile | 
 | --- glibc-2.19/rt/Makefile	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/rt/Makefile	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -53,7 +53,7 @@ | 
 |  	 tst-cputimer1 tst-cputimer2 tst-cputimer3 \ | 
 |  	 tst-clock2 | 
 |   | 
 | -extra-libs := librt | 
 | +extra-libs := #librt | 
 |  extra-libs-others := $(extra-libs) | 
 |   | 
 |  include ../Rules | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/scripts/config.sub ../glibc-2.19-akaros/scripts/config.sub | 
 | --- glibc-2.19/scripts/config.sub	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/scripts/config.sub	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -117,7 +117,7 @@ | 
 |  case $maybe_os in | 
 |    nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ | 
 |    linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ | 
 | -  knetbsd*-gnu* | netbsd*-gnu* | \ | 
 | +  knetbsd*-gnu* | netbsd*-gnu* | akaros*-gnu* | \ | 
 |    kopensolaris*-gnu* | \ | 
 |    storm-chaos* | os2-emx* | rtmk-nova*) | 
 |      os=-$maybe_os | 
 | @@ -1356,7 +1356,7 @@ | 
 |  	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | 
 |  	      | -sym* | -kopensolaris* | -plan9* \ | 
 |  	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | 
 | -	      | -aos* | -aros* \ | 
 | +	      | -aos* | -aros* | -akaros* \ | 
 |  	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | 
 |  	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | 
 |  	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/shlib-versions ../glibc-2.19-akaros/shlib-versions | 
 | --- glibc-2.19/shlib-versions	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/shlib-versions	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -24,6 +24,7 @@ | 
 |  s390x-.*-linux.*        DEFAULT			GLIBC_2.2 | 
 |  powerpc64-.*-linux.*	DEFAULT			GLIBC_2.3 | 
 |  powerpc.*le-.*-linux.*	DEFAULT			GLIBC_2.17 | 
 | +x86_64-.*-akaros.*      DEFAULT			GLIBC_2.2.5 | 
 |  .*-.*-gnu-gnu.*		DEFAULT			GLIBC_2.2.6 | 
 |   | 
 |  # Configuration		ABI			Identifier for ABI data files | 
 | @@ -44,6 +45,7 @@ | 
 |  sh.*-.*-linux.*		libc=6			GLIBC_2.2 | 
 |  sparc64.*-.*-linux.*	libc=6			GLIBC_2.2 | 
 |  .*-.*-linux.*		libc=6 | 
 | +.*-.*-akaros.*		libc=6 | 
 |   | 
 |  # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release. | 
 |  .*-.*-gnu-gnu.*		libmachuser=1 | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/sunrpc/netname.c ../glibc-2.19-akaros/sunrpc/netname.c | 
 | --- glibc-2.19/sunrpc/netname.c	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/sunrpc/netname.c	2015-12-17 14:58:45.065386401 -0500 | 
 | @@ -16,13 +16,13 @@ | 
 |     License along with the GNU C Library; if not, see | 
 |     <http://www.gnu.org/licenses/>.  */ | 
 |   | 
 | +/* AKAROS_PORT: removed references to nss; stubbed the funcs that used it. */ | 
 | + | 
 |  #include <stdio.h> | 
 |  #include <unistd.h> | 
 |  #include <string.h> | 
 |  #include <rpc/rpc.h> | 
 |   | 
 | -#include "nsswitch.h" | 
 | - | 
 |  #define	OPSYS_LEN 4 | 
 |  #define	MAXIPRINT (11)		/* max length of printed integer */ | 
 |  static const char OPSYS[] = "unix"; | 
 | @@ -139,56 +139,18 @@ | 
 |  /* Type of the lookup function for netname2user.  */ | 
 |  typedef int (*netname2user_function) (const char netname[MAXNETNAMELEN + 1], | 
 |  				      uid_t *, gid_t *, int *, gid_t *); | 
 | -/* The lookup function for the first entry of this service.  */ | 
 | -extern int __nss_publickey_lookup (service_user ** nip, const char *name, | 
 | -				   void **fctp) internal_function; | 
 | - | 
 |  int | 
 |  netname2user (const char netname[MAXNETNAMELEN + 1], uid_t * uidp, gid_t * gidp, | 
 |  	      int *gidlenp, gid_t * gidlist) | 
 |  { | 
 | -  static service_user *startp; | 
 | -  static netname2user_function start_fct; | 
 | -  service_user *nip; | 
 | -  union | 
 | -  { | 
 | -    netname2user_function f; | 
 | -    void *ptr; | 
 | -  } fct; | 
 | -  enum nss_status status = NSS_STATUS_UNAVAIL; | 
 | -  int no_more; | 
 | - | 
 | -  if (startp == NULL) | 
 | -    { | 
 | -      no_more = __nss_publickey_lookup (&nip, "netname2user", &fct.ptr); | 
 | -      if (no_more) | 
 | -	startp = (service_user *) - 1; | 
 | -      else | 
 | -	{ | 
 | -	  startp = nip; | 
 | -	  start_fct = fct.f; | 
 | -	} | 
 | -    } | 
 | -  else | 
 | -    { | 
 | -      fct.f = start_fct; | 
 | -      no_more = (nip = startp) == (service_user *) - 1; | 
 | -    } | 
 | - | 
 | -  while (!no_more) | 
 | -    { | 
 | -      status = (*fct.f) (netname, uidp, gidp, gidlenp, gidlist); | 
 | - | 
 | -      no_more = __nss_next2 (&nip, "netname2user", NULL, &fct.ptr, status, 0); | 
 | -    } | 
 | - | 
 | -  return status == NSS_STATUS_SUCCESS; | 
 | +  return FALSE; | 
 |  } | 
 |  #ifdef EXPORT_RPC_SYMBOLS | 
 |  libc_hidden_def (netname2user) | 
 |  #else | 
 |  libc_hidden_nolink_sunrpc (netname2user, GLIBC_2_1) | 
 |  #endif | 
 | +stub_warning(netname2user) | 
 |   | 
 |  int | 
 |  netname2host (const char netname[MAXNETNAMELEN + 1], char *hostname, | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/configure ../glibc-2.19-akaros/sysdeps/i386/configure | 
 | --- glibc-2.19/sysdeps/i386/configure	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/sysdeps/i386/configure	2015-12-17 14:58:45.077386468 -0500 | 
 | @@ -82,13 +82,13 @@ | 
 |  $as_echo "$libc_compiler_builtin_inlined" >&6; } | 
 |   | 
 |   | 
 | -ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes.  */ | 
 | -" | 
 | -if test "x$ac_cv_header_cpuid_h" = xyes; then : | 
 | - | 
 | -else | 
 | -  as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5 | 
 | -fi | 
 | +#ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes.  */ | 
 | +#" | 
 | +#if test "x$ac_cv_header_cpuid_h" = xyes; then : | 
 | +# | 
 | +#else | 
 | +#  as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5 | 
 | +#fi | 
 |   | 
 |   | 
 |   | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/configure.ac ../glibc-2.19-akaros/sysdeps/i386/configure.ac | 
 | --- glibc-2.19/sysdeps/i386/configure.ac	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/sysdeps/i386/configure.ac	2015-12-17 14:58:45.077386468 -0500 | 
 | @@ -30,9 +30,9 @@ | 
 |  *** Please use host i786, i686, i586, or i486. | 
 |  *** For example: /source/glibc/configure CFLAGS='-O2 -march=i686' ...])]) | 
 |   | 
 | -AC_CHECK_HEADER([cpuid.h], , | 
 | -  [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])], | 
 | -  [/* No default includes.  */]) | 
 | +#AC_CHECK_HEADER([cpuid.h], , | 
 | +#  [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])], | 
 | +#  [/* No default includes.  */]) | 
 |   | 
 |  dnl Check if -msse4 works. | 
 |  AC_CACHE_CHECK(for SSE4 support, libc_cv_cc_sse4, [dnl | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/i386/tlsdesc.sym ../glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym | 
 | --- glibc-2.19/sysdeps/i386/tlsdesc.sym	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym	2015-12-17 14:58:45.077386468 -0500 | 
 | @@ -8,7 +8,7 @@ | 
 |   | 
 |  -- Abuse tls.h macros to derive offsets relative to the thread register. | 
 |   | 
 | -DTV_OFFSET			offsetof(struct pthread, header.dtv) | 
 | +DTV_OFFSET			offsetof(struct rthread, header.dtv) | 
 |   | 
 |  TLSDESC_ARG			offsetof(struct tlsdesc, arg) | 
 |   | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/x86_64/tlsdesc.sym ../glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym | 
 | --- glibc-2.19/sysdeps/x86_64/tlsdesc.sym	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym	2015-12-17 14:58:45.077386468 -0500 | 
 | @@ -8,7 +8,7 @@ | 
 |   | 
 |  -- Abuse tls.h macros to derive offsets relative to the thread register. | 
 |   | 
 | -DTV_OFFSET			offsetof(struct pthread, header.dtv) | 
 | +DTV_OFFSET			offsetof(struct rthread, header.dtv) | 
 |   | 
 |  TLSDESC_ARG			offsetof(struct tlsdesc, arg) | 
 |   | 
 | --- glibc-2.19/assert/assert.c	2017-04-25 12:52:32.624619029 -0400 | 
 | +++ glibc-2.19-akaros/assert/assert.c	2017-04-25 12:53:43.872966850 -0400 | 
 | @@ -24,6 +24,7 @@ | 
 |  #include <sysdep.h> | 
 |  #include <unistd.h> | 
 |  #include <sys/mman.h> | 
 | +#include <parlib/assert.h> | 
 |   | 
 |   | 
 |  extern const char *__progname; | 
 | @@ -98,7 +99,7 @@ | 
 |  __assert_fail (const char *assertion, const char *file, unsigned int line, | 
 |  	       const char *function) | 
 |  { | 
 | -  __assert_fail_base (_("%s%s%s:%u: %s%sAssertion `%s' failed.\n%n"), | 
 | -		      assertion, file, line, function); | 
 | +  /* Calls out to parlib, and this never returns */ | 
 | +  _assert_failed(file, line, assertion); | 
 |  } | 
 |  hidden_def(__assert_fail) | 
 | --- glibc-2.19/stdlib/exit.c	2017-06-08 17:05:17.558550998 -0400 | 
 | +++ glibc-2.19-akaros/stdlib/exit.c	2017-06-08 17:04:50.574432434 -0400 | 
 | @@ -19,6 +19,7 @@ | 
 |  #include <stdlib.h> | 
 |  #include <unistd.h> | 
 |  #include <sysdep.h> | 
 | +#include <parlib/vcore.h> | 
 |  #include "exit.h" | 
 |   | 
 |  #include "set-hooks.h" | 
 | @@ -101,6 +102,8 @@ | 
 |  void | 
 |  exit (int status) | 
 |  { | 
 | +  if (in_vcore_context()) | 
 | +    _exit(status); | 
 |    __run_exit_handlers (status, &__exit_funcs, true); | 
 |  } | 
 |  libc_hidden_def (exit) | 
 | diff -ruB --unidirectional-new-file ../glibc-2.19/stdio-common/vfprintf.c ../glibc-2.19-akaros/stdio-common/vfprintf.c | 
 | --- glibc-2.19/stdio-common/vfprintf.c	2014-02-07 04:04:38.000000000 -0500 | 
 | +++ glibc-2.19-akaros/stdio-common/vfprintf.c	2017-07-31 16:49:00.835618991 -0400 | 
 | @@ -30,6 +30,38 @@ | 
 |  #include <locale/localeinfo.h> | 
 |  #include <stdio.h> | 
 |   | 
 | +#include <ros/common.h> | 
 | +#include <sys/mman.h> | 
 | +#include <parlib/vcore.h> | 
 | +#include <unistd.h> | 
 | + | 
 | +/* Modified for AKAROS, uses mmap in place of large stack allocations */ | 
 | +static const char *failmsg = "vfprintf mmap failed!"; | 
 | + | 
 | +static inline __attribute__((always_inline)) void *safe_alloc(size_t amt) | 
 | +{ | 
 | +	void *buf; | 
 | + | 
 | +	if (in_vcore_context()) { | 
 | +		buf = mmap(0, ROUNDUP(amt, PGSIZE), PROT_WRITE | PROT_READ, | 
 | +		           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | 
 | +		if (buf == MAP_FAILED) { | 
 | +			write(2, failmsg, sizeof(failmsg)); | 
 | +			exit(-1); | 
 | +		} | 
 | +		return buf; | 
 | +	} else { | 
 | +		/* This might have issues.  Might have to use macros. */ | 
 | +		return alloca(amt); | 
 | +	} | 
 | +} | 
 | + | 
 | +static inline void safe_free(void *buf, size_t amt) | 
 | +{ | 
 | +	if (in_vcore_context()) | 
 | +    	munmap(buf, ROUNDUP(amt, PGSIZE)); | 
 | +} | 
 | + | 
 |  /* This code is shared between the standard stdio implementation found | 
 |     in GNU C library and the libio implementation originally found in | 
 |     GNU libg++. | 
 | @@ -246,6 +278,8 @@ | 
 |    CHAR_T work_buffer[1000]; | 
 |    CHAR_T *workstart = NULL; | 
 |    CHAR_T *workend; | 
 | +  /* AKAROS: this might get mmaped */ | 
 | +  void *specs_buf = NULL; | 
 |   | 
 |    /* We have to save the original argument pointer.  */ | 
 |    va_list ap_save; | 
 | @@ -1678,7 +1712,13 @@ | 
 |      size_t nspecs = 0; | 
 |      /* A more or less arbitrary start value.  */ | 
 |      size_t nspecs_size = 32 * sizeof (struct printf_spec); | 
 | -    struct printf_spec *specs = alloca (nspecs_size); | 
 | + | 
 | +	/* AKAROS: specs_buf declared above and conditionally freed below */ | 
 | +    //struct printf_spec *specs = alloca (nspecs_size); | 
 | +    struct printf_spec *specs; | 
 | + | 
 | +    specs_buf = safe_alloc(nspecs_size); | 
 | +	specs = (struct printf_spec*)specs_buf; | 
 |   | 
 |      /* The number of arguments the format string requests.  This will | 
 |         determine the size of the array needed to store the argument | 
 | @@ -2049,6 +2089,8 @@ | 
 |      free (args_malloced); | 
 |    if (__glibc_unlikely (workstart != NULL)) | 
 |      free (workstart); | 
 | +  if (specs_buf) | 
 | +    safe_free(specs_buf, 32 * sizeof(struct printf_spec)); | 
 |    /* Unlock the stream.  */ | 
 |    _IO_funlockfile (s); | 
 |    _IO_cleanup_region_end (0); | 
 | @@ -2276,7 +2318,12 @@ | 
 |  buffered_vfprintf (_IO_FILE *s, const CHAR_T *format, | 
 |  		   _IO_va_list args) | 
 |  { | 
 | -  CHAR_T buf[_IO_BUFSIZ]; | 
 | +  /* AKAROS: mmap the buf.  */ | 
 | +  //CHAR_T buf[_IO_BUFSIZ]; | 
 | +  CHAR_T *buf; | 
 | + | 
 | +  buf = safe_alloc(_IO_BUFSIZ); | 
 | + | 
 |    struct helper_file helper; | 
 |    _IO_FILE *hp = (_IO_FILE *) &helper._f; | 
 |    int result, to_flush; | 
 | @@ -2338,6 +2385,7 @@ | 
 |    _IO_funlockfile (s); | 
 |    __libc_cleanup_region_end (0); | 
 |   | 
 | +  safe_free(buf, _IO_BUFSIZ); | 
 |    return result; | 
 |  } | 
 |   |