diff --git a/Makefile b/Makefile
index e1b0b8f..544af73 100644
--- a/Makefile
+++ b/Makefile
@@ -93,10 +93,12 @@
 				-Idrivers/arm/interconnect/cci-400/		\
 				-Idrivers/arm/peripherals/pl011/ 		\
 				-Iplat/fvp -Idrivers/power			\
-				-Iarch/system/gic -Icommon/psci
+				-Iarch/system/gic -Icommon/psci			\
+				-Iinclude/stdlib -Iinclude/stdlib/sys
 
-ASFLAGS			+= 	-Wa,--fatal-warnings -D__ASSEMBLY__ ${INCLUDES}
-CFLAGS			:= 	-Wall -Werror -std=c99 -c -Os -DDEBUG=${DEBUG} ${INCLUDES} ${CFLAGS}
+ASFLAGS			+= 	-nostdinc -Wa,--fatal-warnings -D__ASSEMBLY__ ${INCLUDES}
+CFLAGS			:= 	-nostdinc -Wall -Werror -std=c99 -c -Os \
+				-DDEBUG=${DEBUG} ${INCLUDES} ${CFLAGS}
 
 LDFLAGS			+=	--fatal-warnings -O1
 BL1_LDFLAGS		:=	-Map=${BL1_MAPFILE} --script ${BL1_LINKERFILE} --entry=${BL1_ENTRY_POINT}
diff --git a/bl1/bl1.mk b/bl1/bl1.mk
index 7623377..c3f8fbd 100644
--- a/bl1/bl1.mk
+++ b/bl1/bl1.mk
@@ -29,8 +29,8 @@
 #
 
 vpath			%.c	drivers/arm/interconnect/cci-400/ plat/fvp			\
-				plat/fvp/${ARCH} drivers/arm/peripherals/pl011 common/ lib/ \
-				lib/semihosting	arch/aarch64/ lib/non-semihosting
+				plat/fvp/${ARCH} drivers/arm/peripherals/pl011 common/ lib/	\
+				lib/semihosting arch/aarch64/ lib/stdlib
 
 vpath			%.S	arch/${ARCH}/cpu plat/common/aarch64				\
 				plat/fvp/${ARCH} lib/semihosting/aarch64			\
diff --git a/bl2/bl2.mk b/bl2/bl2.mk
index f36b7bb..beed80c 100644
--- a/bl2/bl2.mk
+++ b/bl2/bl2.mk
@@ -31,7 +31,7 @@
 vpath			%.c	common/ drivers/arm/interconnect/cci-400/		\
 				drivers/arm/peripherals/pl011 common/ lib/ 		\
 				plat/fvp plat/fvp/${ARCH} lib/semihosting arch/aarch64/	\
-				lib/non-semihosting
+				lib/stdlib
 
 vpath			%.S	lib/arch/aarch64					\
 				lib/semihosting/aarch64					\
diff --git a/bl31/bl31.mk b/bl31/bl31.mk
index 4e307e2..fec09b8 100644
--- a/bl31/bl31.mk
+++ b/bl31/bl31.mk
@@ -30,9 +30,8 @@
 
 vpath			%.c	drivers/arm/interconnect/cci-400/ common/ lib/			\
 				drivers/arm/peripherals/pl011 plat/fvp common/psci		\
-				lib/semihosting arch/aarch64/ lib/non-semihosting		\
-				lib/sync/locks/bakery/ drivers/power/ arch/system/gic/		\
-				plat/fvp/aarch64/
+				lib/semihosting arch/aarch64/ lib/stdlib lib/sync/locks/bakery/	\
+				drivers/power/ arch/system/gic/ plat/fvp/aarch64/
 
 vpath			%.S	lib/arch/aarch64 common/psci					\
 				lib/semihosting/aarch64 include/ plat/fvp/${ARCH}		\
diff --git a/lib/non-semihosting/ctype.h b/include/stdlib/sys/ctype.h
similarity index 98%
rename from lib/non-semihosting/ctype.h
rename to include/stdlib/sys/ctype.h
index 52870b4..8e1ab6e 100644
--- a/lib/non-semihosting/ctype.h
+++ b/include/stdlib/sys/ctype.h
@@ -35,7 +35,8 @@
  */
 
 /*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
+ * Portions copyright (c) 2009-2013, ARM Limited and Contributors.
+ * All rights reserved.
  */
 
 #ifndef _SYS_CTYPE_H_
diff --git a/lib/non-semihosting/std.c b/lib/non-semihosting/std.c
deleted file mode 100644
index 1c1c807..0000000
--- a/lib/non-semihosting/std.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2013, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <console.h>
-
-#if defined (__GNUC__)
-
-#include <stdio.h>
-#include <stddef.h> /* size_t */
-#include <stdarg.h> /* va_list */
-
-// Code from VTB.
-#include "mem.c"
-
-// Make mem functions that will operate on DEV mem. "memset_io"?
-
-
-//Code from VTB
-#include "strlen.c"
-
-int puts(const char *s)
-{
-	int count = 0;
-	while(*s)
-	{
-		if (console_putc(*s++)) {
-			count++;
-		} else {
-			count = EOF; // -1 in stdio.h
-			break;
-		}
-	}
-	return count;
-}
-
-// From VTB
-#include "ctype.h"
-#include "subr_prf.c"
-
- // Choose max of 128 chars for now.
-#define PRINT_BUFFER_SIZE 128
-int printf(const char *fmt, ...)
-{
-	va_list args;
-	va_start(args, fmt);
-	char buf[PRINT_BUFFER_SIZE];
-	vsnprintf(buf, sizeof(buf) - 1, fmt, args);
-	buf[PRINT_BUFFER_SIZE - 1] = '\0';
-	return puts(buf);
-}
-
-
-// I just made this up. Probably make it beter.
-void __assert_func (const char *file, int l, const char *func, const char *error)
-{
-	printf("ASSERT: %s <%d> : %s\n\r", func, l, error);
-	while(1);
-}
-
-extern void __assert_fail (const char *assertion, const char *file,
-			   unsigned int line, const char *function)
-{
-	printf("ASSERT: %s <%d> : %s\n\r", function, line, assertion);
-	while(1);
-}
-
-
-// I just made this up. Probably make it beter.
-void abort (void)
-{
-	printf("ABORT\n\r");
-	while(1);
-}
-
-
-#else
-#error "No standard library binding defined."
-#endif
diff --git a/lib/non-semihosting/strcmp.c b/lib/non-semihosting/strcmp.c
deleted file mode 100644
index 21c248e..0000000
--- a/lib/non-semihosting/strcmp.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-/*
- * Compare strings.
- */
-int
-strcmp(const char *s1, const char *s2)
-{
-	while (*s1 == *s2++)
-		if (*s1++ == '\0')
-			return (0);
-	return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
-}
diff --git a/lib/non-semihosting/string.c b/lib/non-semihosting/string.c
deleted file mode 100644
index 01ffdc7..0000000
--- a/lib/non-semihosting/string.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2013, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "ctype.h"
-
-/* Return pointer to the first non-space character */
-const char *skip_spaces(const char *str)
-{
-	while (isspace(*str))
-		++str;
-	return str;
-}
diff --git a/lib/non-semihosting/strncmp.c b/lib/non-semihosting/strncmp.c
deleted file mode 100644
index beb90ec..0000000
--- a/lib/non-semihosting/strncmp.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-#include "types.h"
-
-int
-strncmp(const char *s1, const char *s2, size_t n)
-{
-
-	if (n == 0)
-		return (0);
-	do {
-		if (*s1 != *s2++)
-			return (*(const unsigned char *)s1 -
-				*(const unsigned char *)(s2 - 1));
-		if (*s1++ == '\0')
-			break;
-	} while (--n != 0);
-	return (0);
-}
diff --git a/lib/non-semihosting/strncpy.c b/lib/non-semihosting/strncpy.c
deleted file mode 100644
index 31a4332..0000000
--- a/lib/non-semihosting/strncpy.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-#include "types.h"
-
-/*
- * Copy src to dst, truncating or null-padding to always copy n bytes.
- * Return dst.
- */
-char *
-strncpy(char *dst, const char *src, size_t n)
-{
-	if (n != 0) {
-		char *d = dst;
-		const char *s = src;
-
-		do {
-			if ((*d++ = *s++) == '\0') {
-				/* NUL pad the remaining n-1 bytes */
-				while (--n != 0)
-					*d++ = '\0';
-				break;
-			}
-		} while (--n != 0);
-	}
-	return (dst);
-}
diff --git a/lib/non-semihosting/strsep.c b/lib/non-semihosting/strsep.c
deleted file mode 100644
index 555a478..0000000
--- a/lib/non-semihosting/strsep.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-#include "types.h"
-
-/*
- * Get next token from string *stringp, where tokens are possibly-empty
- * strings separated by characters from delim.
- *
- * Writes NULs into the string at *stringp to end tokens.
- * delim need not remain constant from call to call.
- * On return, *stringp points past the last NUL written (if there might
- * be further tokens), or is NULL (if there are definitely no more tokens).
- *
- * If *stringp is NULL, strsep returns NULL.
- */
-char *
-strsep(char **stringp, const char *delim)
-{
-	char *s;
-	const char *spanp;
-	int c, sc;
-	char *tok;
-
-	if ((s = *stringp) == NULL)
-		return (NULL);
-	for (tok = s;;) {
-		c = *s++;
-		spanp = delim;
-		do {
-			if ((sc = *spanp++) == c) {
-				if (c == 0)
-					s = NULL;
-				else
-					s[-1] = 0;
-				*stringp = s;
-				return (tok);
-			}
-		} while (sc != 0);
-	}
-	/* NOTREACHED */
-}
diff --git a/lib/non-semihosting/strtol.c b/lib/non-semihosting/strtol.c
deleted file mode 100644
index f743c41..0000000
--- a/lib/non-semihosting/strtol.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * From: @(#)strtol.c	8.1 (Berkeley) 6/4/93
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-#include "types.h"
-#include "ctype.h"
-#include "limits.h"
-
-/*
- * Convert a string to a long integer.
- *
- * Ignores `locale' stuff.  Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-static long
-bsd_strtol(nptr, endptr, base)
-	const char *nptr;
-	char **endptr;
-	int base;
-{
-	const char *s = nptr;
-	unsigned long acc;
-	unsigned char c;
-	unsigned long cutoff;
-	int neg = 0, any, cutlim;
-
-	/*
-	 * Skip white space and pick up leading +/- sign if any.
-	 * If base is 0, allow 0x for hex and 0 for octal, else
-	 * assume decimal; if base is already 16, allow 0x.
-	 */
-	do {
-		c = *s++;
-	} while (isspace(c));
-	if (c == '-') {
-		neg = 1;
-		c = *s++;
-	} else if (c == '+')
-		c = *s++;
-	if ((base == 0 || base == 16) &&
-	    c == '0' && (*s == 'x' || *s == 'X')) {
-		c = s[1];
-		s += 2;
-		base = 16;
-	}
-	if (base == 0)
-		base = c == '0' ? 8 : 10;
-
-	/*
-	 * Compute the cutoff value between legal numbers and illegal
-	 * numbers.  That is the largest legal value, divided by the
-	 * base.  An input number that is greater than this value, if
-	 * followed by a legal input character, is too big.  One that
-	 * is equal to this value may be valid or not; the limit
-	 * between valid and invalid numbers is then based on the last
-	 * digit.  For instance, if the range for longs is
-	 * [-2147483648..2147483647] and the input base is 10,
-	 * cutoff will be set to 214748364 and cutlim to either
-	 * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
-	 * a value > 214748364, or equal but the next digit is > 7 (or 8),
-	 * the number is too big, and we will return a range error.
-	 *
-	 * Set any if any `digits' consumed; make it negative to indicate
-	 * overflow.
-	 */
-	cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
-	cutlim = cutoff % (unsigned long)base;
-	cutoff /= (unsigned long)base;
-	for (acc = 0, any = 0;; c = *s++) {
-		if (!isascii(c))
-			break;
-		if (isdigit(c))
-			c -= '0';
-		else if (isalpha(c))
-			c -= isupper(c) ? 'A' - 10 : 'a' - 10;
-		else
-			break;
-		if (c >= base)
-			break;
-		if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
-			any = -1;
-		else {
-			any = 1;
-			acc *= base;
-			acc += c;
-		}
-	}
-	if (any < 0) {
-		acc = neg ? LONG_MIN : LONG_MAX;
-	} else if (neg)
-		acc = -acc;
-	if (endptr != 0)
-		*((const char **)endptr) = any ? s - 1 : nptr;
-	return (acc);
-}
-
-int strict_strtol(const char *str, unsigned int base, long *result)
-{
-	if (*str == '-')
-		*result = 0 - bsd_strtol(str + 1, NULL, base);
-	else
-		*result = bsd_strtol(str, NULL, base);
-	return 0;
-}
-
-int strict_strtoul(const char *str, unsigned int base, unsigned long *result)
-{
-	*result = bsd_strtol(str, NULL, base);
-	return 0;
-}
diff --git a/lib/non-semihosting/strtoull.c b/lib/non-semihosting/strtoull.c
deleted file mode 100644
index 61b41f3..0000000
--- a/lib/non-semihosting/strtoull.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
- */
-
-#include "types.h"
-#include "ctype.h"
-#include "limits.h"
-
-/*
- * Convert a string to an unsigned long long integer.
- *
- * Assumes that the upper and lower case
- * alphabets and digits are each contiguous.
- */
-static unsigned long long
-bsd_strtoull(const char *nptr, char **endptr, int base)
-{
-	const char *s;
-	unsigned long long acc;
-	char c;
-	unsigned long long cutoff;
-	int neg, any, cutlim;
-
-	/*
-	 * See strtoq for comments as to the logic used.
-	 */
-	s = nptr;
-	do {
-		c = *s++;
-	} while (isspace((unsigned char)c));
-	if (c == '-') {
-		neg = 1;
-		c = *s++;
-	} else {
-		neg = 0;
-		if (c == '+')
-			c = *s++;
-	}
-	if ((base == 0 || base == 16) &&
-	    c == '0' && (*s == 'x' || *s == 'X') &&
-	    ((s[1] >= '0' && s[1] <= '9') ||
-	    (s[1] >= 'A' && s[1] <= 'F') ||
-	    (s[1] >= 'a' && s[1] <= 'f'))) {
-		c = s[1];
-		s += 2;
-		base = 16;
-	}
-	if (base == 0)
-		base = c == '0' ? 8 : 10;
-	acc = any = 0;
-
-	cutoff = ULLONG_MAX / base;
-	cutlim = ULLONG_MAX % base;
-	for ( ; ; c = *s++) {
-		if (c >= '0' && c <= '9')
-			c -= '0';
-		else if (c >= 'A' && c <= 'Z')
-			c -= 'A' - 10;
-		else if (c >= 'a' && c <= 'z')
-			c -= 'a' - 10;
-		else
-			break;
-		if (c >= base)
-			break;
-		if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
-			any = -1;
-		else {
-			any = 1;
-			acc *= base;
-			acc += c;
-		}
-	}
-	if (any < 0) {
-		acc = ULLONG_MAX;
-	} else if (neg)
-		acc = -acc;
-	if (endptr != NULL)
-		*endptr = (char *)(any ? s - 1 : nptr);
-	return (acc);
-}
-
-int strict_strtoull(const char *str, unsigned int base, long long *result)
-{
-	*result = bsd_strtoull(str, NULL, base);
-	return 0;
-}
diff --git a/lib/semihosting/semihosting.c b/lib/semihosting/semihosting.c
index 528db17..1cf895e 100644
--- a/lib/semihosting/semihosting.c
+++ b/lib/semihosting/semihosting.c
@@ -29,7 +29,6 @@
  */
 
 #include <assert.h>
-#include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <semihosting.h>
diff --git a/lib/non-semihosting/mem.c b/lib/stdlib/mem.c
similarity index 100%
rename from lib/non-semihosting/mem.c
rename to lib/stdlib/mem.c
diff --git a/lib/non-semihosting/strlen.c b/lib/stdlib/strlen.c
similarity index 100%
rename from lib/non-semihosting/strlen.c
rename to lib/stdlib/strlen.c
diff --git a/lib/non-semihosting/subr_prf.c b/lib/stdlib/subr_prf.c
similarity index 97%
rename from lib/non-semihosting/subr_prf.c
rename to lib/stdlib/subr_prf.c
index 0056c81..6c11e25 100644
--- a/lib/non-semihosting/subr_prf.c
+++ b/lib/stdlib/subr_prf.c
@@ -35,24 +35,17 @@
  */
 
 /*
- * Portions copyright (c) 2009-2013, ARM Limited and Contributors. All rights reserved.
+ * Portions copyright (c) 2009-2013, ARM Limited and Contributors.
+ * All rights reserved.
  */
 
-/*
-#include "types.h"
-#include "varargs.h"
-#include "ctype.h"
-#include "string.h"
-*/
-#include <stddef.h>
-#include <sys/types.h>  /* For ssize_t */
+#include <stdio.h>
 #include <stdint.h>
+#include <stdarg.h>
+#include <stddef.h>
 #include <string.h>
+#include <ctype.h>
 
-#include "ctype.h"
-
-typedef uint64_t uintmax_t;
-typedef int64_t intmax_t;
 typedef unsigned char u_char;
 typedef unsigned int u_int;
 typedef int64_t quad_t;
