meta-zephyr: newlib support

This patch adds newlib libraries for cortex-m3, x86, IAMCU and ARC toolchains.

[YOCTO#10662]

Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
This commit is contained in:
Juro Bystricky
2017-01-18 15:45:42 -08:00
parent 56fbee01e8
commit c28b4eacf9
9 changed files with 574 additions and 7 deletions

View File

@@ -11,3 +11,4 @@ TCLIBCAPPEND = ""
TEST_TARGET = "QemuTargetZephyr"
TEST_SUITES = "zephyr"
TOOLCHAIN_TARGET_TASK += " newlib"

View File

@@ -0,0 +1,23 @@
Fix unresolved external "fiprintf".
When newlib is configured with:
--enable-newlib-nano-formatted-io
"fiprintf" should be an alias of "fprintf". However the alias does
not seem to work properly, as we encounter unresolved external
error if we uses "assert" in code. So we patch the code directly.
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
--- a/newlib/libc/stdlib/assert.c 2016-11-08 08:04:45.669248139 -0800
+++ b/newlib/libc/stdlib/assert.c 2016-11-08 08:05:47.357554034 -0800
@@ -56,7 +56,7 @@
const char *func _AND
const char *failedexpr)
{
- fiprintf(stderr,
+ fprintf(stderr,
"assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
failedexpr, file, line,
func ? ", function: " : "", func ? func : "");

View File

@@ -0,0 +1,20 @@
newlib-2.4.0 regression.
Export the prototype of gettimeofday
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
--- a/newlib/libc/include/sys/time.h 2016-03-29 14:33:42.000000000 -0700
+++ b/newlib/libc/include/sys/time.h 2016-10-12 09:48:03.873642589 -0700
@@ -429,9 +429,10 @@
int _EXFUN(getitimer, (int __which, struct itimerval *__value));
int _EXFUN(setitimer, (int __which, const struct itimerval *__restrict __value,
struct itimerval *__restrict __ovalue));
+#endif
+
int _EXFUN(gettimeofday, (struct timeval *__restrict __p,
void *__restrict __tz));
-#endif
#if __GNU_VISIBLE
int _EXFUN(futimesat, (int, const char *, const struct timeval [2]));

View File

@@ -0,0 +1,399 @@
From 5d3ad3b123b7c121d7a6eac27fb13016171e27bc Mon Sep 17 00:00:00 2001
From: Igor Venevtsev <igor.venevtsev@gmail.com>
Date: Thu, 31 Mar 2016 12:12:00 +0300
Subject: Add Intel MCU target
Intel MCU System V ABI are incompartible with i386 System V ABI:
o Minimum instruction set is Intel Pentium ISA minus x87 instructions
o No x87 or vector registers
o First three args are passed in %eax, %edx and %ecx
o Full specification available here:
https://github.com/hjl-tools/x86-psABI/wiki/iamcu-psABI-0.7.pdf
newlib/
* configure.host: Add new ix86-*-elfiamcu target
newlib/libc/include/
* setjmp.h: Change _JBLEN for Intel MCU target
newlib/libc/machine/i386/
* memchr.S: (memchr) Target-specific size-optimized version
* memcmp.S: (memcmp) Likewise
* memcpy.S: (memcpy) Likewise
* memmove.S: (memmove) Likewise
* memset.S: (memset) Likewise
* setjmp.S: (setjmp) Likewise
* strchr.S: (strchr) Likewise
* strlen.S: (strlen) Likewise
newlib/libc/stdlib/
* srtold.c: (__flt_rounds) Disable for Intel MCU
diff --git a/newlib/configure.host b/newlib/configure.host
index 8b0846e..bb163ec 100644
--- a/newlib/configure.host
+++ b/newlib/configure.host
@@ -696,6 +696,15 @@ case "${host}" in
i[34567]86-*-netware*)
newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES -DNO_EXEC -DABORT_PROVIDED -DCLOCK_PROVIDED -DMALLOC_PROVIDED -DHAVE_FCNTL"
;;
+ i[3-7]86-*-elfiamcu)
+ newlib_cflags="${newlib_cflags} -Os -DPREFER_SIZE_OVER_SPEED -ffunction-sections -fomit-frame-pointer -DREENTRANT_SYSCALL_PROVIDED"
+ if [ "${newlib_multithread}" = "no" ] ; then
+ newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES"
+ else
+ syscall_dir=syscalls
+ newlib_cflags="${newlib_cflags} -D__DYNAMIC_REENT__"
+ fi
+ ;;
iq2000*)
syscall_dir=syscalls
default_newlib_io_long_long="yes"
diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h
index c08e682..2b4dd8b 100644
--- a/newlib/libc/include/machine/setjmp.h
+++ b/newlib/libc/include/machine/setjmp.h
@@ -92,6 +92,9 @@ _BEGIN_STD_C
# define _JBLEN (13 * 4)
# elif defined(__unix__) || defined(__rtems__)
# define _JBLEN 9
+# elif defined(__iamcu__)
+/* Intel MCU jmp_buf only covers callee-saved registers. */
+# define _JBLEN 6
# else
# include "setjmp-dj.h"
# endif
diff --git a/newlib/libc/machine/i386/memchr.S b/newlib/libc/machine/i386/memchr.S
index 7639685..d9b0bf2 100644
--- a/newlib/libc/machine/i386/memchr.S
+++ b/newlib/libc/machine/i386/memchr.S
@@ -14,13 +14,33 @@
SOTYPE_FUNCTION(memchr)
SYM (memchr):
+#ifdef __iamcu__
+ pushl edi
+ movl eax,edi
+ movl edx,eax
+ xorl edx,edx
+ testl ecx,ecx
+ jz L20
+
+ repnz
+ scasb
+
+ setnz dl
+ decl edi
+
+ decl edx
+ andl edi,edx
+L20:
+ movl edx,eax
+
+ popl edi
+#else
pushl ebp
movl esp,ebp
pushl edi
movzbl 12(ebp),eax
movl 16(ebp),ecx
movl 8(ebp),edi
-
xorl edx,edx
testl ecx,ecx
jz L20
@@ -111,4 +131,5 @@ L20:
leal -4(ebp),esp
popl edi
leave
+#endif
ret
diff --git a/newlib/libc/machine/i386/memcmp.S b/newlib/libc/machine/i386/memcmp.S
index 26b8ef1..4a01b82 100644
--- a/newlib/libc/machine/i386/memcmp.S
+++ b/newlib/libc/machine/i386/memcmp.S
@@ -15,6 +15,33 @@
SYM (memcmp):
+#ifdef __iamcu__
+ pushl edi
+ pushl esi
+ movl eax,edi
+ movl edx,esi
+ cld
+
+/* check if length is zero in which case just return 0 */
+
+ xorl eax,eax
+ testl ecx,ecx
+ jz L4
+
+/* compare any unaligned bytes or remainder bytes */
+ repz
+ cmpsb
+
+/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
+ xorl edx,edx
+ movb -1(esi),dl
+ movb -1(edi),al
+ subl edx,eax
+
+L4:
+ popl esi
+ popl edi
+#else
pushl ebp
movl esp,ebp
subl $16,esp
@@ -73,4 +100,5 @@ L4:
popl edi
popl ebx
leave
+#endif
ret
diff --git a/newlib/libc/machine/i386/memcpy.S b/newlib/libc/machine/i386/memcpy.S
index b53e2a1..a14aa2a 100644
--- a/newlib/libc/machine/i386/memcpy.S
+++ b/newlib/libc/machine/i386/memcpy.S
@@ -15,6 +15,17 @@
SYM (memcpy):
+#ifdef __iamcu__
+ pushl esi
+ pushl edi
+ movl eax,edi
+ movl edx,esi
+
+ rep movsb
+
+ popl edi
+ popl esi
+#else
pushl ebp
movl esp,ebp
pushl esi
@@ -71,4 +82,5 @@ SYM (memcpy):
popl edi
popl esi
leave
+#endif
ret
diff --git a/newlib/libc/machine/i386/memmove.S b/newlib/libc/machine/i386/memmove.S
index 1ea2f6d..1026582 100644
--- a/newlib/libc/machine/i386/memmove.S
+++ b/newlib/libc/machine/i386/memmove.S
@@ -15,6 +15,32 @@
SYM (memmove):
+#ifdef __iamcu__
+ pushl esi
+ pushl edi
+ movl eax,edi
+ movl edx,esi
+ cmp esi,edi
+ ja .Lcopy_backward
+ je .Lbwd_write_0bytes
+
+ rep movsb
+
+ popl edi
+ popl esi
+ ret
+
+.Lcopy_backward:
+ lea -1(edi,ecx),edi
+ lea -1(esi,ecx),esi
+ std
+ rep movsb
+ cld
+
+.Lbwd_write_0bytes:
+ popl edi
+ popl esi
+#else
pushl ebp
movl esp,ebp
pushl esi
@@ -143,4 +169,5 @@ SYM (memmove):
popl edi
popl esi
leave
+#endif
ret
diff --git a/newlib/libc/machine/i386/memset.S b/newlib/libc/machine/i386/memset.S
index 6eb2cd6..83b2556 100644
--- a/newlib/libc/machine/i386/memset.S
+++ b/newlib/libc/machine/i386/memset.S
@@ -15,6 +15,15 @@
SYM (memset):
+#ifdef __iamcu__
+ pushl edi
+ movl eax,edi
+ movzbl dl,eax
+ mov edi,edx
+ rep stosb
+ mov edx,eax
+ popl edi
+#else
pushl ebp
movl esp,ebp
pushl edi
@@ -96,4 +105,5 @@ SYM (memset):
leal -4(ebp),esp
popl edi
leave
+#endif
ret
diff --git a/newlib/libc/machine/i386/setjmp.S b/newlib/libc/machine/i386/setjmp.S
index fd746e4..45c689f 100644
--- a/newlib/libc/machine/i386/setjmp.S
+++ b/newlib/libc/machine/i386/setjmp.S
@@ -20,6 +20,10 @@
** jmp_buf:
** eax ebx ecx edx esi edi ebp esp eip
** 0 4 8 12 16 20 24 28 32
+ **
+ ** Intel MCU jmp_buf:
+ ** ebx esi edi ebp esp eip
+ ** 0 4 8 12 16 20
*/
#include "i386mach.h"
@@ -31,6 +35,23 @@
SYM (setjmp):
+#ifdef __iamcu__
+ /* Store EIP. */
+ movl 0(esp),ecx
+ movl ecx,20(eax)
+
+ movl ebx,0 (eax)
+ movl esi,4 (eax)
+ movl edi,8 (eax)
+ movl ebp,12(eax)
+
+ /* Skip return address, which will be pushed onto stack in
+ longjmp, and store SP. */
+ leal 4(esp),ecx
+ movl ecx,16(eax)
+
+ xorl eax,eax
+#else
pushl ebp
movl esp,ebp
@@ -59,9 +80,28 @@ SYM (setjmp):
popl edi
movl $0,eax
leave
+#endif
ret
SYM (longjmp):
+#ifdef __iamcu__
+ /* Check retval. */
+ testl edx,edx
+ jne 0f
+ incl edx
+0:
+ /* Restore stack first. */
+ movl 16(eax),esp
+
+ /* Put return address on stack. */
+ pushl 20(eax)
+
+ movl 0(eax),ebx
+ movl 4(eax),esi
+ movl 8(eax),edi
+ movl 12(eax),ebp
+ movl edx,eax
+#else
pushl ebp
movl esp,ebp
@@ -87,5 +127,6 @@ SYM (longjmp):
movl 16(edi),esi
movl 20(edi),edi
__STI
+#endif
ret
diff --git a/newlib/libc/machine/i386/strchr.S b/newlib/libc/machine/i386/strchr.S
index 1d98b81..43ee0fb 100644
--- a/newlib/libc/machine/i386/strchr.S
+++ b/newlib/libc/machine/i386/strchr.S
@@ -15,6 +15,29 @@
SYM (strchr):
+#ifdef __iamcu__
+ xorl ecx,ecx
+ movb dl,cl
+
+/* loop while (*s && *s++ != c) */
+ leal -1(eax),eax
+L15:
+ incl eax
+ movb (eax),dl
+ testb dl,dl
+ je L14
+ cmpb cl,dl
+ jne L15
+
+L14:
+/* if (*s == c) return address otherwise return NULL */
+ cmpb cl,(eax)
+ je L19
+ xorl eax,eax
+
+L19:
+ ret
+#else
pushl ebp
movl esp,ebp
pushl edi
@@ -170,3 +193,5 @@ L27:
jmp L9
#endif /* !__OPTIMIZE_SIZE__ */
+
+#endif /* __iamcu__ */
diff --git a/newlib/libc/machine/i386/strlen.S b/newlib/libc/machine/i386/strlen.S
index 0e3cb64..373ea0f 100644
--- a/newlib/libc/machine/i386/strlen.S
+++ b/newlib/libc/machine/i386/strlen.S
@@ -18,9 +18,13 @@ SYM (strlen):
pushl ebp
movl esp,ebp
pushl edi
+#ifdef __iamcu__
+ movl eax,edx
+#else
movl 8(ebp),edx
+#endif
-#ifdef __OPTIMIZE_SIZE__
+#if defined __OPTIMIZE_SIZE__ || defined __iamcu__
cld
movl edx,edi
movl $4294967295,ecx
diff --git a/newlib/libc/stdlib/strtold.c b/newlib/libc/stdlib/strtold.c
index a6d415d..1128b74 100644
--- a/newlib/libc/stdlib/strtold.c
+++ b/newlib/libc/stdlib/strtold.c
@@ -35,7 +35,8 @@ POSSIBILITY OF SUCH DAMAGE.
#ifdef _HAVE_LONG_DOUBLE
-#if defined (__x86_64__) || defined (__i386__)
+/* Intel MCU has no x87 floating point unit */
+#if (defined (__x86_64__) || defined (__i386__)) && !defined (__iamcu__)
static const int map[] = {
1, /* round to nearest */
3, /* round to zero */

View File

@@ -0,0 +1,83 @@
HOMEPAGE = "https://sourceware.org/newlib/"
SUMMARY = "C library for embedded systems"
DESCRIPTION = "Newlib is a conglomeration of several library parts, all under free software licenses that make them easily usable on embedded products."
PV = "2.4.0"
LICENSE = "GPLv2 & LGPLv3 & GPLv3 & LGPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
file://COPYING3.LIB;md5=6a6a8e020838b23406c81b19c1d46df6 \
file://COPYING3;md5=d32239bcb673463ab874e80d47fae504 \
file://COPYING.LIBGLOSS;md5=73f5c98779aea7dba4a6c94a74ab0ae2 \
file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1 \
file://COPYING.NEWLIB;md5=fced02ba02d66f274d4847d27e80af74 \
file://newlib/libc/posix/COPYRIGHT;md5=103468ff1982be840fdf4ee9f8b51bbf \
file://newlib/libc/sys/linux/linuxthreads/LICENSE;md5=73640207fbc79b198c7ffd4ad4d97aa0"
SRC_URI = "ftp://sourceware.org/pub/newlib/newlib-${PV}.tar.gz"
SRC_URI[md5sum] = "37c07a65c6effdb4822fb6f83067f37e"
SRC_URI[sha256sum] = "545b3d235e350d2c61491df8b9f775b1b972f191380db8f52ec0b1c829c52706"
SRC_URI += "file://gettimeofday-header-fix.patch"
SRC_URI += "file://assert-fiprintf.patch"
SRC_URI += "file://iamcu-commit-5d3ad3b.patch"
S = "${WORKDIR}/newlib-${PV}"
DEPENDS = "flex-native bison-native m4-native"
DEPENDS_remove = "virtual/libc virtual/${TARGET_PREFIX}compilerlibs"
PACKAGES = "${PN}"
# This will determine the name of the folder with libc as well.
NEWLIB_HOST = "${TARGET_SYS}"
TUNE_CCARGS += " -nostdlib "
CFLAGS += " -DMISSING_SYSCALL_NAMES "
# Specify any options you want to pass to the configure script using EXTRA_OECONF:
EXTRA_OECONF = " --enable-languages=c \
--host=${NEWLIB_HOST} \
--with-newlib --with-gnu-as --with-gnu-ld -v \
--disable-newlib-supplied-syscalls \
--disable-newlib-wide-orient \
--disable-newlib-fseek-optimization \
--enable-newlib-nano-formatted-io \
--enable-newlib-nano-malloc \
--disable-newlib-fvwrite-in-streamio \
--disable-newlib-unbuf-stream-opt --enable-lite-exit \
--enable-newlib-global-atexit \
--disable-multilib \
"
do_configure () {
# If we're being rebuilt due to a dependency change, we need to make sure
# everything is clean before we configure and build -- if we haven't previously
# built this will fail and be ignored.
make distclean || :
export CC_FOR_TARGET="${CC}"
${S}/configure ${EXTRA_OECONF}
}
do_install () {
oe_runmake 'DESTDIR=${D}' install
# Delete standards.info, configure.info
rm -rf ${D}/usr/share/
# Place the libraries where gcc can find them
# usr/${NEWLIB_HOST}/lib -> usr/lib
# usr/${NEWLIB_HOST}/include ->usr/include
mv -v ${D}/usr/local/${NEWLIB_HOST}/lib* ${D}/usr/lib
mv -v ${D}/usr/local/${NEWLIB_HOST}/include* ${D}/usr/include
rm -rf ${D}/usr/local/${NEWLIB_HOST}
rm -rf ${D}/usr/local
}
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"
FILES_${PN} = "/usr/lib /usr/include"
INSANE_SKIP_${PN} += " staticdev"
INSANE_SKIP_${PN}-dev += " staticdev"

View File

@@ -0,0 +1,23 @@
########################################################################
#
# ARC specific
#
########################################################################
LIC_FILES_CHKSUM_arc = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
file://COPYING3.LIB;md5=6a6a8e020838b23406c81b19c1d46df6 \
file://COPYING3;md5=d32239bcb673463ab874e80d47fae504 \
file://COPYING.LIB;md5=9f604d8a4f8e74f4f5140845a21b6674 \
file://COPYING.NEWLIB;md5=fced02ba02d66f274d4847d27e80af74 \
file://newlib/libc/posix/COPYRIGHT;md5=103468ff1982be840fdf4ee9f8b51bbf \
file://newlib/libc/sys/linux/linuxthreads/LICENSE;md5=73640207fbc79b198c7ffd4ad4d97aa0"
#Tag arc-2016.03
SRCREV_arc = "e4da0f88abe8dd2a0b947bcf7cb8b3736ab94f33"
SRC_URI_arc = "git://github.com/foss-for-synopsys-dwc-arc-processors/newlib.git;branch=arc-2.3"
SRC_URI_arc += "file://assert-fiprintf.patch"
S_arc = "${WORKDIR}/git"
# ERROR: QA Issue: Architecture did not match (195 to 93)
INSANE_SKIP_${PN}_arc += " arch "

View File

@@ -0,0 +1,3 @@
EXTRA_OECONF_remove = "--enable_multilib"
EXTRA_OECONF_append = " --disable-multilib"

View File

@@ -1,8 +1,17 @@
$(info ZEPHYR_SYSROOT:${ZEPHYR_SYSROOT})
LIBGCC_DIR = $(shell dirname `$(CC) -print-libgcc-file-name`)
$(info LIBGCCDIR:${LIBGCC_DIR} )
#NEWLIB_DIR = $(shell `$(CC) -print-multi-directory`)
#$(info NEWLIB_DIR:${NEWLIB_DIR})
LIB_INCLUDE_DIR += -L $(LIBGCC_DIR) -L $(ZEPHYR_SYSROOT)/usr/lib/$(NEWLIB_DIR)
$(info LIB_INCLUDE_DIR:${LIB_INCLUDE_DIR})
TOOLCHAIN_CFLAGS = -I$(ZEPHYR_SYSROOT)/usr/include
$(info TOOLCHAIN_CFLAGS:${TOOLCHAIN_CFLAGS})
LIBGCC_DIR = $(shell dirname `$(CC)gcc -print-libgcc-file-name`)
LIB_INCLUDE_DIR += -L $(LIBGCC_DIR)
#TOOLCHAIN_CFLAGS = -I $(SYSROOT)/usr/include
TOOLCHAIN_LIBS = gcc
export LIB_INCLUDE_DIR CROSS_COMPILE TOOLCHAIN_LIBS
#export TOOLCHAIN_CFLAGS
export LIB_INCLUDE_DIR CROSS_COMPILE TOOLCHAIN_LIBS TOOLCHAIN_CFLAGS

View File

@@ -6,11 +6,14 @@ inherit zephyr
# filesystem.
IMAGE_NO_MANIFEST = "1"
ZEPHYR_MAKE_ARGS = " V=1 BOARD=${BOARD} CROSS_COMPILE=${CROSS_COMPILE} ZEPHYR_GCC_VARIANT="yocto" ZEPHYR_BASE=${ZEPHYR_BASE} SYSROOT=${STAGING_DIR_TARGET}"
ZEPHYR_GCC_VARIANT="yocto"
ZEPHYR_SYSROOT="${STAGING_DIR_TARGET}"
ZEPHYR_MAKE_ARGS = " V=1 BOARD=${BOARD} CROSS_COMPILE=${CROSS_COMPILE} ZEPHYR_GCC_VARIANT=${ZEPHYR_GCC_VARIANT} ZEPHYR_BASE=${ZEPHYR_BASE} ZEPHYR_SYSROOT=${ZEPHYR_SYSROOT}"
# We always need a toolchain to cross-compile.
INHIBIT_DEFAULT_DEPS = "1"
DEPENDS += "gcc-cross-${TARGET_ARCH} libgcc"
DEPENDS += "gcc-cross-${TARGET_ARCH} libgcc ${TOOLCHAIN_TARGET_TASK}"
CROSS_COMPILE = "${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}"
do_configure[noexec] = "1"
@@ -25,7 +28,10 @@ python () {
d.delVar('CXXFLAGS')
d.delVar('LDFLAGS')
}
OE_TERMINAL_EXPORTS += "CROSS_COMPILE"
OE_TERMINAL_EXPORTS += "BOARD"
OE_TERMINAL_EXPORTS += "ZEPHYR_SRC_DIR"
OE_TERMINAL_EXPORTS += "ZEPHYR_BASE"
OE_TERMINAL_EXPORTS += "ZEPHYR_SYSROOT"
OE_TERMINAL_EXPORTS += "ZEPHYR_GCC_VARIANT"