[oe] [meta-initramfs][PATCH 1/2] klibc 2.0.2: add support for Aarch64

Fathi Boudra fathi.boudra at linaro.org
Tue Dec 10 11:14:02 UTC 2013


Hi,

If you upgrade to latest 2.0.3 release (from last week), you don't
have to patch.

On 10 December 2013 12:41, Koen Kooi <koen at dominion.thruhere.net> wrote:
> Signed-off-by: Koen Kooi <koen.kooi at linaro.org>
> ---
>  .../0001-syscalls-Fixup-some-syscalls.patch        | 111 ++++
>  ...002-syscalls-Add-syscalls-needed-by-arm64.patch | 621 +++++++++++++++++++++
>  .../0003-arm64-Introduce-arm64-support.patch       | 431 ++++++++++++++
>  .../recipes-devtools/klibc/klibc_2.0.2.bb          |   6 +
>  4 files changed, 1169 insertions(+)
>  create mode 100644 meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0001-syscalls-Fixup-some-syscalls.patch
>  create mode 100644 meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0002-syscalls-Add-syscalls-needed-by-arm64.patch
>  create mode 100644 meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0003-arm64-Introduce-arm64-support.patch
>
> diff --git a/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0001-syscalls-Fixup-some-syscalls.patch b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0001-syscalls-Fixup-some-syscalls.patch
> new file mode 100644
> index 0000000..c80b171
> --- /dev/null
> +++ b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0001-syscalls-Fixup-some-syscalls.patch
> @@ -0,0 +1,111 @@
> +From 131489114132a4199b6b1240c67439ba584fb8fa Mon Sep 17 00:00:00 2001
> +From: Steve Capper <steve.capper at linaro.org>
> +Date: Wed, 6 Nov 2013 16:37:08 +0000
> +Subject: [PATCH 1/3] syscalls: Fixup some syscalls
> +
> +mknodat and mkdirat contain a spurious repeated parameter, linkat
> +is missing the final int flags parameter, symlinkat has the first
> +two parameters transposed, and fchmodat is missing the flags
> +parameter and is declared in the wrong header.
> +
> +Also declarations are missing for utimensat and fchownat.
> +
> +This patch fixes up these syscall declarations.
> +
> +Originally-by: Neil Williams <codehelp at debian.org>
> +Originally-by: Anil Singhar <anil.singhar at linaro.org>
> +Signed-off-by: Steve Capper <steve.capper at linaro.org>
> +
> +Upstream-status: Submitted
> +
> +---
> + usr/include/sys/stat.h | 4 +++-
> + usr/include/unistd.h   | 8 ++++----
> + usr/klibc/SYSCALLS.def | 8 ++++----
> + 3 files changed, 11 insertions(+), 9 deletions(-)
> +
> +diff --git a/usr/include/sys/stat.h b/usr/include/sys/stat.h
> +index 4850429..c4b378e 100644
> +--- a/usr/include/sys/stat.h
> ++++ b/usr/include/sys/stat.h
> +@@ -69,8 +69,10 @@ __extern int fstatat(int, const char *, struct stat *, int);
> + __extern int lstat(const char *, struct stat *);
> + __extern mode_t umask(mode_t);
> + __extern int mknod(const char *, mode_t, dev_t);
> +-__extern int mknodat(int, const char *, const char *, mode_t, dev_t);
> ++__extern int mknodat(int, const char *, mode_t, dev_t);
> + __extern int mkfifo(const char *, mode_t);
> ++__extern int utimensat(int, const char *, const struct timespec *, int);
> ++__extern int fchmodat(int, const char *, mode_t, int);
> +
> + __extern_inline int mkfifo(const char *__p, mode_t __m)
> + {
> +diff --git a/usr/include/unistd.h b/usr/include/unistd.h
> +index f0e19c2..6c08d4e 100644
> +--- a/usr/include/unistd.h
> ++++ b/usr/include/unistd.h
> +@@ -61,28 +61,28 @@ __extern int setfsuid(uid_t);
> + __extern int access(const char *, int);
> + __extern int faccessat(int, const char *, int, int);
> + __extern int link(const char *, const char *);
> +-__extern int linkat(int, const char *, int, const char *);
> ++__extern int linkat(int, const char *, int, const char *, int);
> + __extern int unlink(const char *);
> + __extern int unlinkat(int, const char *, int);
> + __extern int chdir(const char *);
> + __extern int fchdir(int);
> + __extern int chmod(const char *, mode_t);
> + __extern int fchmod(int, mode_t);
> +-__extern int fchmodat(int, const char *, mode_t);
> + __extern int mkdir(const char *, mode_t);
> +-__extern int mkdirat(int, const char *, const char *, mode_t);
> ++__extern int mkdirat(int, const char *, mode_t);
> + __extern int rmdir(const char *);
> + __extern int pipe(int *);
> + __extern int pipe2(int *, int);
> + __extern int chroot(const char *);
> + __extern int symlink(const char *, const char *);
> +-__extern int symlinkat(int, const char *, const char *);
> ++__extern int symlinkat(const char *, int, const char *);
> + __extern int readlink(const char *, char *, size_t);
> + __extern int readlinkat(int, const char *, char *, size_t);
> + __extern int chown(const char *, uid_t, gid_t);
> + __extern int fchown(int, uid_t, gid_t);
> + __extern int lchown(const char *, uid_t, gid_t);
> + __extern char *getcwd(char *, size_t);
> ++__extern int fchownat(int, const char *, uid_t, gid_t, int);
> +
> + /* Also in <fcntl.h> */
> + #ifndef _KLIBC_IN_OPEN_C
> +diff --git a/usr/klibc/SYSCALLS.def b/usr/klibc/SYSCALLS.def
> +index 9b07aa2..55d8e36 100644
> +--- a/usr/klibc/SYSCALLS.def
> ++++ b/usr/klibc/SYSCALLS.def
> +@@ -109,7 +109,7 @@ int swapoff(const char *);
> + int access(const char *, int);
> + int faccessat(int, const char *, int, int);
> + int link(const char *, const char *);
> +-<?> int linkat(int, const char *, int, const char *);
> ++<?> int linkat(int, const char *, int, const char *, int);
> + int unlink(const char *);
> + <?> int unlinkat(int, const char *, int);
> + int chdir(const char *);
> +@@ -117,12 +117,12 @@ int fchdir(int);
> + int rename(const char *, const char *);
> + <?> int renameat(int, const char *, int, const char *);
> + int mknod(const char *, mode_t, dev_t);
> +-<?> int mknodat(int, const char *, const char *, mode_t, dev_t);
> ++<?> int mknodat(int, const char *, mode_t, dev_t);
> + int chmod(const char *, mode_t);
> + int fchmod(int, mode_t);
> +-<?> int fchmodat(int, const char *, mode_t);
> ++<?> int fchmodat(int, const char *, mode_t, int);
> + int mkdir(const char *, mode_t);
> +-<?> int mkdirat(int, const char *, const char *, mode_t);
> ++<?> int mkdirat(int, const char *, mode_t);
> + int rmdir(const char *);
> + <!alpha,ia64,mips,mips64,sh,sparc,sparc64> int pipe(int *);
> + int pipe2(int *, int);
> +--
> +1.8.4.2
> +
> diff --git a/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0002-syscalls-Add-syscalls-needed-by-arm64.patch b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0002-syscalls-Add-syscalls-needed-by-arm64.patch
> new file mode 100644
> index 0000000..3a0b0fe
> --- /dev/null
> +++ b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0002-syscalls-Add-syscalls-needed-by-arm64.patch
> @@ -0,0 +1,621 @@
> +From f7acda1b953dd185e756f614aa858127cf6992ec Mon Sep 17 00:00:00 2001
> +From: Steve Capper <steve.capper at linaro.org>
> +Date: Wed, 6 Nov 2013 16:07:33 +0000
> +Subject: [PATCH 2/3] syscalls: Add syscalls needed by arm64
> +
> +arm64 uses generic syscalls, and does not include the "noat",
> +"noflags", and "deprecated" syscalls.
> +i.e. __ARCH_WANT_SYSCALL_{NO_AT|NO_FLAGS|DEPRECATED}
> +
> +This patch adds the syscalls needed for klibc to run on arm64.
> +
> +Originally-by: Neil Williams <codehelp at debian.org>
> +Originally-by: Anil Singhar <anil.singhar at linaro.org>
> +Signed-off-by: Steve Capper <steve.capper at linaro.org>
> +
> +Upstream-status: Submitted
> +
> +---
> + usr/klibc/Kbuild       |  3 +++
> + usr/klibc/SYSCALLS.def | 39 ++++++++++++++++++++-------------------
> + usr/klibc/access.c     | 12 ++++++++++++
> + usr/klibc/chmod.c      | 13 +++++++++++++
> + usr/klibc/chown.c      | 12 ++++++++++++
> + usr/klibc/dup2.c       | 11 +++++++++++
> + usr/klibc/lchown.c     | 12 ++++++++++++
> + usr/klibc/link.c       | 12 ++++++++++++
> + usr/klibc/lstat.c      | 14 ++++++++++++++
> + usr/klibc/mkdir.c      | 14 ++++++++++++++
> + usr/klibc/mknod.c      | 14 ++++++++++++++
> + usr/klibc/open.c       | 29 +++++++++++++++++++++++++++--
> + usr/klibc/pipe.c       | 11 +++++++++++
> + usr/klibc/poll.c       | 21 +++++++++++++++++++++
> + usr/klibc/readlink.c   | 12 ++++++++++++
> + usr/klibc/rename.c     | 11 +++++++++++
> + usr/klibc/rmdir.c      | 12 ++++++++++++
> + usr/klibc/select.c     | 34 ++++++++++++++++++++++++++++++++++
> + usr/klibc/stat.c       | 14 ++++++++++++++
> + usr/klibc/symlink.c    | 12 ++++++++++++
> + usr/klibc/unlink.c     | 12 ++++++++++++
> + usr/klibc/utimes.c     | 20 ++++++++++++++++++++
> + 22 files changed, 323 insertions(+), 21 deletions(-)
> + create mode 100644 usr/klibc/access.c
> + create mode 100644 usr/klibc/chmod.c
> + create mode 100644 usr/klibc/chown.c
> + create mode 100644 usr/klibc/dup2.c
> + create mode 100644 usr/klibc/lchown.c
> + create mode 100644 usr/klibc/link.c
> + create mode 100644 usr/klibc/lstat.c
> + create mode 100644 usr/klibc/mkdir.c
> + create mode 100644 usr/klibc/mknod.c
> + create mode 100644 usr/klibc/pipe.c
> + create mode 100644 usr/klibc/poll.c
> + create mode 100644 usr/klibc/readlink.c
> + create mode 100644 usr/klibc/rename.c
> + create mode 100644 usr/klibc/rmdir.c
> + create mode 100644 usr/klibc/select.c
> + create mode 100644 usr/klibc/stat.c
> + create mode 100644 usr/klibc/symlink.c
> + create mode 100644 usr/klibc/unlink.c
> + create mode 100644 usr/klibc/utimes.c
> +
> +diff --git a/usr/klibc/Kbuild b/usr/klibc/Kbuild
> +index 2bef9ca..40d43c7 100644
> +--- a/usr/klibc/Kbuild
> ++++ b/usr/klibc/Kbuild
> +@@ -58,6 +58,9 @@ klib-y += vsnprintf.o snprintf.o vsprintf.o sprintf.o \
> +         inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o \
> +         inet/inet_ntop.o inet/inet_pton.o inet/bindresvport.o \
> +         send.o recv.o \
> ++        access.o chmod.o chown.o dup2.o mknod.o poll.o rename.o stat.o \
> ++        lchown.o link.o rmdir.o unlink.o utimes.o lstat.o mkdir.o \
> ++        readlink.o select.o symlink.o pipe.o \
> +         ctype/isalnum.o ctype/isalpha.o ctype/isascii.o \
> +         ctype/isblank.o ctype/iscntrl.o ctype/isdigit.o \
> +         ctype/isgraph.o ctype/islower.o ctype/isprint.o \
> +diff --git a/usr/klibc/SYSCALLS.def b/usr/klibc/SYSCALLS.def
> +index 55d8e36..12f57ac 100644
> +--- a/usr/klibc/SYSCALLS.def
> ++++ b/usr/klibc/SYSCALLS.def
> +@@ -106,34 +106,34 @@ int swapoff(const char *);
> + /*
> +  * Inode-related system calls
> +  */
> +-int access(const char *, int);
> ++<?> int access(const char *, int);
> + int faccessat(int, const char *, int, int);
> +-int link(const char *, const char *);
> ++<?> int link(const char *, const char *);
> + <?> int linkat(int, const char *, int, const char *, int);
> +-int unlink(const char *);
> ++<?> int unlink(const char *);
> + <?> int unlinkat(int, const char *, int);
> + int chdir(const char *);
> + int fchdir(int);
> +-int rename(const char *, const char *);
> ++<?> int rename(const char *, const char *);
> + <?> int renameat(int, const char *, int, const char *);
> +-int mknod(const char *, mode_t, dev_t);
> ++<?> int mknod(const char *, mode_t, dev_t);
> + <?> int mknodat(int, const char *, mode_t, dev_t);
> +-int chmod(const char *, mode_t);
> ++<?> int chmod(const char *, mode_t);
> + int fchmod(int, mode_t);
> + <?> int fchmodat(int, const char *, mode_t, int);
> +-int mkdir(const char *, mode_t);
> ++<?> int mkdir(const char *, mode_t);
> + <?> int mkdirat(int, const char *, mode_t);
> +-int rmdir(const char *);
> +-<!alpha,ia64,mips,mips64,sh,sparc,sparc64> int pipe(int *);
> ++<?> int rmdir(const char *);
> ++<?!alpha,ia64,mips,mips64,sh,sparc,sparc64> int pipe(int *);
> + int pipe2(int *, int);
> + mode_t umask(mode_t);
> + int chroot(const char *);
> +-int symlink(const char *, const char *);
> ++<?> int symlink(const char *, const char *);
> + <?> int symlinkat(const char *, int, const char *);
> +-int readlink(const char *, char *, size_t);
> ++<?> int readlink(const char *, char *, size_t);
> + <?> int readlinkat(int, const char *, char *, int);
> +-<!ppc64> int stat64,stat::stat(const char *, struct stat *);
> +-<!ppc64> int lstat64,lstat::lstat(const char *, struct stat *);
> ++<?!ppc64> int stat64,stat::stat(const char *, struct stat *);
> ++<?!ppc64> int lstat64,lstat::lstat(const char *, struct stat *);
> + <!ppc64> int fstat64,fstat::fstat(int, struct stat *);
> + <ppc64> int stat::stat(const char *, struct stat *);
> + <ppc64> int lstat::lstat(const char *, struct stat *);
> +@@ -141,14 +141,15 @@ int readlink(const char *, char *, size_t);
> + /* XXX: Is this right?! */
> + <?> int fstatat64,newfstatat,fstatat::fstatat(int, const char *, struct stat *, int);
> + int getdents64,getdents::getdents(unsigned int, struct dirent *, unsigned int);
> +-int chown32,chown::chown(const char *, uid_t, gid_t);
> ++<?> int chown32,chown::chown(const char *, uid_t, gid_t);
> + int fchown32,fchown::fchown(int, uid_t, gid_t);
> + <?> int fchownat(int, const char *, uid_t, gid_t, int);
> +-int lchown32,lchown::lchown(const char *, uid_t, gid_t);
> ++<?> int lchown32,lchown::lchown(const char *, uid_t, gid_t);
> + int getcwd::__getcwd(char *, size_t);
> + <?> int utime(const char *, const struct utimbuf *);
> + <?> int utimes(const char *, const struct timeval *);
> + <?> int futimesat(int, const char *, const struct timeval *);
> ++<?> int utimensat(int, const char *, const struct timespec *, int);
> + <?> int inotify_init();
> + <?> int inotify_add_watch(int, const char *, __u32);
> + <?> int inotify_rm_watch(int, __u32);
> +@@ -158,7 +159,7 @@ int getcwd::__getcwd(char *, size_t);
> +  */
> + <!i386,m68k,64> int open::__open(const char *, int, mode_t);
> + <?!i386,m68k,64> int openat::__openat(int, const char *, int, mode_t);
> +-<64> int open(const char *, int, mode_t);
> ++<?64> int open(const char *, int, mode_t);
> + <64> int openat(int, const char *, int, mode_t);
> + ssize_t read(int, void *, size_t);
> + ssize_t write(int, const void *, size_t);
> +@@ -166,14 +167,14 @@ int close(int);
> + <64> off_t lseek(int, off_t, int);
> + <32> int _llseek::__llseek(int, unsigned long, unsigned long, off_t *, int);
> + int dup(int);
> +-int dup2(int, int);
> ++<?> int dup2(int, int);
> + int dup3(int, int, int);
> + <i386> int fcntl64 at varadic::fcntl(int, int, unsigned long);
> + <ppc64> int fcntl(int, int, unsigned long);
> + <!i386,ppc64> int fcntl64,fcntl::fcntl(int, int, unsigned long);
> + int ioctl(int, int, void *);
> + int flock(int, int);
> +-int _newselect,select::select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
> ++<?> int _newselect,select::select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
> + #if defined(__NR_pselect) && !_KLIBC_USE_RT_SIG
> + int pselect(int, fd_set *, fd_set *, fd_set *, const struct timespec *, const sigset_t *);
> + #elif defined(__NR_pselect7)
> +@@ -181,7 +182,7 @@ int pselect7::__pselect7(int, fd_set *, fd_set *, fd_set *, struct timespec *, c
> + #elif defined(__NR_pselect6)
> + int pselect6::__pselect6(int, fd_set *, fd_set *, fd_set *, struct timespec *, const struct __pselect6 *);
> + #endif
> +-int poll(struct pollfd *, nfds_t, long);
> ++<?> int poll(struct pollfd *, nfds_t, long);
> + <?> int ppoll::__ppoll(struct pollfd *, nfds_t, struct timespec *, const sigset_t *, size_t);
> + int fsync(int);
> + int fdatasync,fsync::fdatasync(int);
> +diff --git a/usr/klibc/access.c b/usr/klibc/access.c
> +new file mode 100644
> +index 0000000..0f24856
> +--- /dev/null
> ++++ b/usr/klibc/access.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_access
> ++
> ++int access(const char *pathname, int mode)
> ++{
> ++      return faccessat(AT_FDCWD, pathname, mode, 0);
> ++}
> ++
> ++#endif  /* __NR_access */
> +diff --git a/usr/klibc/chmod.c b/usr/klibc/chmod.c
> +new file mode 100644
> +index 0000000..b5129e6
> +--- /dev/null
> ++++ b/usr/klibc/chmod.c
> +@@ -0,0 +1,13 @@
> ++#include <fcntl.h>
> ++#include <sys/types.h>
> ++#include <sys/stat.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_chmod
> ++
> ++int chmod(const char *path, mode_t mode)
> ++{
> ++      return fchmodat(AT_FDCWD, path, mode, 0);
> ++}
> ++
> ++#endif  /* __NR_chmod */
> +diff --git a/usr/klibc/chown.c b/usr/klibc/chown.c
> +new file mode 100644
> +index 0000000..089cfc5
> +--- /dev/null
> ++++ b/usr/klibc/chown.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_chown
> ++
> ++int chown(const char *path, uid_t owner, gid_t group)
> ++{
> ++      return fchownat(AT_FDCWD, path, owner, group, 0);
> ++}
> ++
> ++#endif  /* __NR_chown  */
> +diff --git a/usr/klibc/dup2.c b/usr/klibc/dup2.c
> +new file mode 100644
> +index 0000000..67e2171
> +--- /dev/null
> ++++ b/usr/klibc/dup2.c
> +@@ -0,0 +1,11 @@
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_dup2
> ++
> ++int dup2(int fd, int fd2)
> ++{
> ++      return dup3(fd, fd2, 0);
> ++}
> ++
> ++#endif /* __NR_dup2 */
> +diff --git a/usr/klibc/lchown.c b/usr/klibc/lchown.c
> +new file mode 100644
> +index 0000000..9a9e1e1
> +--- /dev/null
> ++++ b/usr/klibc/lchown.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_lchown
> ++
> ++int lchown(const char *path, uid_t owner, gid_t group)
> ++{
> ++      return fchownat(AT_FDCWD, path, owner, group, AT_SYMLINK_NOFOLLOW);
> ++}
> ++
> ++#endif /* __NR_lchown */
> +diff --git a/usr/klibc/link.c b/usr/klibc/link.c
> +new file mode 100644
> +index 0000000..1d4b70e
> +--- /dev/null
> ++++ b/usr/klibc/link.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_link
> ++
> ++int link(const char *oldpath, const char *newpath)
> ++{
> ++      return linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);
> ++}
> ++
> ++#endif  /* __NR_link */
> +diff --git a/usr/klibc/lstat.c b/usr/klibc/lstat.c
> +new file mode 100644
> +index 0000000..3288a33
> +--- /dev/null
> ++++ b/usr/klibc/lstat.c
> +@@ -0,0 +1,14 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/types.h>
> ++#include <sys/stat.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_lstat
> ++
> ++int lstat(const char *path, struct stat *buf)
> ++{
> ++      return fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
> ++}
> ++
> ++#endif  /* __NR_lstat  */
> +diff --git a/usr/klibc/mkdir.c b/usr/klibc/mkdir.c
> +new file mode 100644
> +index 0000000..27673e3
> +--- /dev/null
> ++++ b/usr/klibc/mkdir.c
> +@@ -0,0 +1,14 @@
> ++#include <fcntl.h>
> ++#include <sys/stat.h>
> ++#include <sys/types.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_mkdir
> ++
> ++int mkdir(const char *pathname, mode_t mode)
> ++{
> ++      return mkdirat(AT_FDCWD, pathname, mode);
> ++}
> ++
> ++#endif /* __NR_mkdir */
> +diff --git a/usr/klibc/mknod.c b/usr/klibc/mknod.c
> +new file mode 100644
> +index 0000000..727505f
> +--- /dev/null
> ++++ b/usr/klibc/mknod.c
> +@@ -0,0 +1,14 @@
> ++#include <sys/types.h>
> ++#include <sys/stat.h>
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_mknod
> ++
> ++int mknod(const char *pathname, mode_t mode, dev_t dev)
> ++{
> ++      return mknodat(AT_FDCWD, pathname, mode, dev);
> ++}
> ++
> ++#endif  /* __NR_mknod  */
> +diff --git a/usr/klibc/open.c b/usr/klibc/open.c
> +index 126f6db..5305c3d 100644
> +--- a/usr/klibc/open.c
> ++++ b/usr/klibc/open.c
> +@@ -3,14 +3,39 @@
> +  *
> +  * On 32-bit platforms we need to pass O_LARGEFILE to the open()
> +  * system call, to indicate that we're 64-bit safe.
> ++ *
> ++ * For 64 bit systems without the open syscall, pass straight
> ++ * through into openat.
> +  */
> +
> + #define _KLIBC_IN_OPEN_C
> + #include <unistd.h>
> + #include <fcntl.h>
> + #include <bitsize.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_open
> ++#if _BITSIZE == 32
> ++
> ++extern int __openat(int, const char *, int, mode_t);
> ++
> ++int open(const char *pathname, int flags, mode_t mode)
> ++{
> ++      return __openat(AT_FDCWD, pathname, flags | O_LARGEFILE, mode);
> ++}
> ++
> ++#else
> ++
> ++__extern int openat(int, const char *, int, ...);
> ++
> ++int open(const char *pathname, int flags, mode_t mode)
> ++{
> ++      return openat(AT_FDCWD, pathname, flags, mode);
> ++}
> ++
> ++#endif /* _BITSIZE == 32 */
> +
> +-#if _BITSIZE == 32 && !defined(__i386__) && !defined(__m68k__)
> ++#elif _BITSIZE == 32 && !defined(__i386__) && !defined(__m68k__)
> +
> + extern int __open(const char *, int, mode_t);
> +
> +@@ -19,4 +44,4 @@ int open(const char *pathname, int flags, mode_t mode)
> +       return __open(pathname, flags | O_LARGEFILE, mode);
> + }
> +
> +-#endif
> ++#endif /* __NR_open */
> +diff --git a/usr/klibc/pipe.c b/usr/klibc/pipe.c
> +new file mode 100644
> +index 0000000..dfaed9e
> +--- /dev/null
> ++++ b/usr/klibc/pipe.c
> +@@ -0,0 +1,11 @@
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_pipe
> ++
> ++int pipe(int pipefd[2])
> ++{
> ++      return pipe2(pipefd, 0);
> ++}
> ++
> ++#endif  /* __NR_pipe */
> +diff --git a/usr/klibc/poll.c b/usr/klibc/poll.c
> +new file mode 100644
> +index 0000000..69da693
> +--- /dev/null
> ++++ b/usr/klibc/poll.c
> +@@ -0,0 +1,21 @@
> ++#include <errno.h>
> ++#include <sys/poll.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_poll
> ++
> ++int poll (struct pollfd *fds, nfds_t nfds, long timeout)
> ++{
> ++      struct timespec timeout_ts;
> ++      struct timespec *timeout_ts_p = NULL;
> ++
> ++      if (timeout >= 0) {
> ++              timeout_ts.tv_sec = timeout / 1000;
> ++              timeout_ts.tv_nsec = (timeout % 1000) * 1000000;
> ++              timeout_ts_p = &timeout_ts;
> ++      }
> ++
> ++      return ppoll(fds, nfds, timeout_ts_p, 0);
> ++}
> ++
> ++#endif /* __NR_poll */
> +diff --git a/usr/klibc/readlink.c b/usr/klibc/readlink.c
> +new file mode 100644
> +index 0000000..0e67442
> +--- /dev/null
> ++++ b/usr/klibc/readlink.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_readlink
> ++
> ++int readlink(const char *path, char *buf, size_t bufsiz)
> ++{
> ++      return readlinkat(AT_FDCWD, path, buf, bufsiz);
> ++}
> ++
> ++#endif /* __NR_readlink */
> +diff --git a/usr/klibc/rename.c b/usr/klibc/rename.c
> +new file mode 100644
> +index 0000000..587c26f
> +--- /dev/null
> ++++ b/usr/klibc/rename.c
> +@@ -0,0 +1,11 @@
> ++#include <fcntl.h>
> ++#include <stdio.h>
> ++
> ++#ifndef __NR_rename
> ++
> ++int rename(const char *oldpath, const char *newpath)
> ++{
> ++      return renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath);
> ++}
> ++
> ++#endif /* __NR_rename */
> +diff --git a/usr/klibc/rmdir.c b/usr/klibc/rmdir.c
> +new file mode 100644
> +index 0000000..94ae5f2
> +--- /dev/null
> ++++ b/usr/klibc/rmdir.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_rmdir
> ++
> ++int rmdir(const char *pathname)
> ++{
> ++      return unlinkat(AT_FDCWD, pathname, AT_REMOVEDIR);
> ++}
> ++
> ++#endif /* __NR_rmdir */
> +diff --git a/usr/klibc/select.c b/usr/klibc/select.c
> +new file mode 100644
> +index 0000000..e416794
> +--- /dev/null
> ++++ b/usr/klibc/select.c
> +@@ -0,0 +1,34 @@
> ++#include <sys/time.h>
> ++#include <sys/types.h>
> ++#include <sys/select.h>
> ++#include <errno.h>
> ++#include <sys/syscall.h>
> ++
> ++#if !defined(__NR_select) && !defined(__NR__newselect)
> ++
> ++struct __pselect6;
> ++__extern int __pselect6(int, fd_set *, fd_set *, fd_set *,
> ++                        const struct timespec *, const struct __pselect6 *);
> ++
> ++int select(int nfds, fd_set *readfds, fd_set *writefds,
> ++                      fd_set *exceptfds, struct timeval *timeout)
> ++{
> ++      int result;
> ++      struct timespec ts;
> ++
> ++      if (timeout) {
> ++              ts.tv_sec = timeout->tv_sec;
> ++              ts.tv_nsec = timeout->tv_usec * 1000;
> ++      }
> ++
> ++      result = __pselect6(nfds, readfds, writefds, exceptfds, &ts, NULL);
> ++
> ++      if (timeout) {
> ++              timeout->tv_sec = ts.tv_sec;
> ++              timeout->tv_usec = ts.tv_nsec / 1000;
> ++      }
> ++
> ++      return result;
> ++}
> ++
> ++#endif
> +diff --git a/usr/klibc/stat.c b/usr/klibc/stat.c
> +new file mode 100644
> +index 0000000..65063b0
> +--- /dev/null
> ++++ b/usr/klibc/stat.c
> +@@ -0,0 +1,14 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/types.h>
> ++#include <sys/stat.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_stat
> ++
> ++int stat(const char *path, struct stat *buf)
> ++{
> ++      return fstatat(AT_FDCWD, path, buf, 0);
> ++}
> ++
> ++#endif /* __NR_stat */
> +diff --git a/usr/klibc/symlink.c b/usr/klibc/symlink.c
> +new file mode 100644
> +index 0000000..080394f
> +--- /dev/null
> ++++ b/usr/klibc/symlink.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_symlink
> ++
> ++int symlink(const char *oldpath, const char *newpath)
> ++{
> ++      return symlinkat(oldpath, AT_FDCWD, newpath);
> ++}
> ++
> ++#endif /* __NR_symlink */
> +diff --git a/usr/klibc/unlink.c b/usr/klibc/unlink.c
> +new file mode 100644
> +index 0000000..6dfe66c
> +--- /dev/null
> ++++ b/usr/klibc/unlink.c
> +@@ -0,0 +1,12 @@
> ++#include <fcntl.h>
> ++#include <unistd.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_unlink
> ++
> ++int unlink(const char *pathname)
> ++{
> ++      return unlinkat(AT_FDCWD, pathname, 0);
> ++}
> ++
> ++#endif  /* __NR_unlink */
> +diff --git a/usr/klibc/utimes.c b/usr/klibc/utimes.c
> +new file mode 100644
> +index 0000000..fd378a6
> +--- /dev/null
> ++++ b/usr/klibc/utimes.c
> +@@ -0,0 +1,20 @@
> ++#include <fcntl.h>
> ++#include <sys/time.h>
> ++#include <sys/stat.h>
> ++#include <sys/syscall.h>
> ++
> ++#ifndef __NR_utimes
> ++
> ++int utimes(const char *file, const struct timeval tvp[2])
> ++{
> ++      struct timespec ts[2];
> ++
> ++      if (tvp) {
> ++              ts->tv_sec = tvp->tv_sec;
> ++              ts->tv_nsec = tvp->tv_usec * 1000;
> ++      }
> ++
> ++      return utimensat(AT_FDCWD, file, &ts[0], 0);
> ++}
> ++
> ++#endif /* __NR_utimes */
> +--
> +1.8.4.2
> +
> diff --git a/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0003-arm64-Introduce-arm64-support.patch b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0003-arm64-Introduce-arm64-support.patch
> new file mode 100644
> index 0000000..f0426c8
> --- /dev/null
> +++ b/meta-initramfs/recipes-devtools/klibc/klibc-2.0.2/0003-arm64-Introduce-arm64-support.patch
> @@ -0,0 +1,431 @@
> +From 7a4ccb45e823e465e5e8a3787bc6269fa9538d3c Mon Sep 17 00:00:00 2001
> +From: Steve Capper <steve.capper at linaro.org>
> +Date: Wed, 6 Nov 2013 16:30:27 +0000
> +Subject: [PATCH 3/3] arm64: Introduce arm64 support
> +
> +Based on work by Neil Williams (codehelp at debian.org) and Anil Singhar
> +(anil.singhar at linaro.org), this patch introduces arm64 support.
> +
> +Originally-by: Neil Williams <codehelp at debian.org>
> +Originally-by: Anil Singhar <anil.singhar at linaro.org>
> +Signed-off-by: Steve Capper <steve.capper at linaro.org>
> +
> +Upstream-status: Submitted
> +
> +---
> + Makefile                                  |  3 +-
> + usr/include/arch/arm64/klibc/archconfig.h | 17 +++++++++++
> + usr/include/arch/arm64/klibc/archsetjmp.h | 22 +++++++++++++++
> + usr/include/arch/arm64/klibc/archsignal.h | 14 +++++++++
> + usr/include/arch/arm64/klibc/archstat.h   | 29 +++++++++++++++++++
> + usr/include/arch/arm64/klibc/asmmacros.h  | 11 ++++++++
> + usr/klibc/README.klibc                    |  1 +
> + usr/klibc/SYSCALLS.def                    |  2 +-
> + usr/klibc/arch/arm64/Kbuild               |  7 +++++
> + usr/klibc/arch/arm64/MCONFIG              | 23 +++++++++++++++
> + usr/klibc/arch/arm64/crt0.S               | 19 +++++++++++++
> + usr/klibc/arch/arm64/setjmp.S             | 47 +++++++++++++++++++++++++++++++
> + usr/klibc/arch/arm64/syscall.S            | 25 ++++++++++++++++
> + usr/klibc/arch/arm64/sysstub.ph           | 25 ++++++++++++++++
> + usr/klibc/arch/arm64/vfork.S              | 34 ++++++++++++++++++++++
> + 15 files changed, 277 insertions(+), 2 deletions(-)
> + create mode 100644 usr/include/arch/arm64/klibc/archconfig.h
> + create mode 100644 usr/include/arch/arm64/klibc/archsetjmp.h
> + create mode 100644 usr/include/arch/arm64/klibc/archsignal.h
> + create mode 100644 usr/include/arch/arm64/klibc/archstat.h
> + create mode 100644 usr/include/arch/arm64/klibc/asmmacros.h
> + create mode 100644 usr/klibc/arch/arm64/Kbuild
> + create mode 100644 usr/klibc/arch/arm64/MCONFIG
> + create mode 100644 usr/klibc/arch/arm64/crt0.S
> + create mode 100644 usr/klibc/arch/arm64/setjmp.S
> + create mode 100644 usr/klibc/arch/arm64/syscall.S
> + create mode 100644 usr/klibc/arch/arm64/sysstub.ph
> + create mode 100644 usr/klibc/arch/arm64/vfork.S
> +
> +diff --git a/Makefile b/Makefile
> +index 0a3ee69..a7da622 100644
> +--- a/Makefile
> ++++ b/Makefile
> +@@ -30,7 +30,8 @@ export OBJDUMP  := $(KLIBCROSS)objdump
> +
> + NOSTDINC_FLAGS := -nostdlib -nostdinc -isystem $(shell $(CC) -print-file-name=include)
> +
> +-ARCH            := $(shell uname -m | sed -e s/i.86/i386/ -e s/parisc64/parisc/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/sh.*/sh/)
> ++ARCH            := $(shell uname -m | sed -e s/i.86/i386/ -e s/parisc64/parisc/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ \
> ++                      -e s/aarch64.*/arm64/ -e s/sh.*/sh/)
> + export KLIBCARCH  ?= $(ARCH)
> + export KLIBCARCHDIR := $(shell echo $(KLIBCARCH) | sed -e s/s390x/s390/)
> +
> +diff --git a/usr/include/arch/arm64/klibc/archconfig.h b/usr/include/arch/arm64/klibc/archconfig.h
> +new file mode 100644
> +index 0000000..5e2004b
> +--- /dev/null
> ++++ b/usr/include/arch/arm64/klibc/archconfig.h
> +@@ -0,0 +1,17 @@
> ++/*
> ++ * include/arch/arm64/klibc/archconfig.h
> ++ *
> ++ * See include/klibc/sysconfig.h for the options that can be set in
> ++ * this file.
> ++ *
> ++ */
> ++
> ++#ifndef _KLIBC_ARCHCONFIG_H
> ++#define _KLIBC_ARCHCONFIG_H
> ++
> ++/* Use rt_* signals */
> ++#define _KLIBC_USE_RT_SIG 1
> ++#define _KLIBC_NO_MMU 0
> ++#define _KLIBC_REAL_VFORK 1
> ++
> ++#endif                                /* _KLIBC_ARCHCONFIG_H */
> +diff --git a/usr/include/arch/arm64/klibc/archsetjmp.h b/usr/include/arch/arm64/klibc/archsetjmp.h
> +new file mode 100644
> +index 0000000..edc3312
> +--- /dev/null
> ++++ b/usr/include/arch/arm64/klibc/archsetjmp.h
> +@@ -0,0 +1,22 @@
> ++/*
> ++ * arch/arm64/include/klibc/archsetjmp.h
> ++ */
> ++
> ++#ifndef _KLIBC_ARCHSETJMP_H
> ++#define _KLIBC_ARCHSETJMP_H
> ++
> ++/*
> ++ * x19-x28 are callee saved, also save fp, lr, sp.
> ++ * d8-d15 are unused as we specify -mgeneral-regs-only as a build flag.
> ++ */
> ++
> ++struct __jmp_buf {
> ++      uint64_t __x19, __x20, __x21, __x22;
> ++      uint64_t __x23, __x24, __x25, __x26;
> ++      uint64_t __x27, __x28, __x29, __x30;
> ++      uint64_t __sp;
> ++};
> ++
> ++typedef struct __jmp_buf jmp_buf[1];
> ++
> ++#endif                                /* _SETJMP_H */
> +diff --git a/usr/include/arch/arm64/klibc/archsignal.h b/usr/include/arch/arm64/klibc/archsignal.h
> +new file mode 100644
> +index 0000000..94e6bc8
> +--- /dev/null
> ++++ b/usr/include/arch/arm64/klibc/archsignal.h
> +@@ -0,0 +1,14 @@
> ++/*
> ++ * arch/arm64/include/klibc/archsignal.h
> ++ *
> ++ * Architecture-specific signal definitions
> ++ *
> ++ */
> ++
> ++#ifndef _KLIBC_ARCHSIGNAL_H
> ++#define _KLIBC_ARCHSIGNAL_H
> ++
> ++#include <asm/signal.h>
> ++/* No special stuff for this architecture */
> ++
> ++#endif
> +diff --git a/usr/include/arch/arm64/klibc/archstat.h b/usr/include/arch/arm64/klibc/archstat.h
> +new file mode 100644
> +index 0000000..a1a3e79
> +--- /dev/null
> ++++ b/usr/include/arch/arm64/klibc/archstat.h
> +@@ -0,0 +1,29 @@
> ++#ifndef _KLIBC_ARCHSTAT_H
> ++#define _KLIBC_ARCHSTAT_H
> ++
> ++#include <klibc/stathelp.h>
> ++
> ++struct stat {
> ++          unsigned long   st_dev;         /* Device.  */
> ++          unsigned long   st_ino;         /* File serial number.  */
> ++          unsigned int    st_mode;        /* File mode.  */
> ++          unsigned int    st_nlink;       /* Link count.  */
> ++          unsigned int    st_uid;         /* User ID of the file's owner.  */
> ++          unsigned int    st_gid;         /* Group ID of the file's group. */
> ++          unsigned long   st_rdev;        /* Device number, if device.  */
> ++          unsigned long   __pad1;
> ++          long            st_size;        /* Size of file, in bytes.  */
> ++          int             st_blksize;     /* Optimal block size for I/O.  */
> ++          int             __pad2;
> ++          long            st_blocks;      /* Number 512-byte blocks allocated. */
> ++          long            st_atime;       /* Time of last access.  */
> ++          unsigned long   st_atime_nsec;
> ++          long            st_mtime;       /* Time of last modification.  */
> ++          unsigned long   st_mtime_nsec;
> ++          long            st_ctime;       /* Time of last status change.  */
> ++          unsigned long   st_ctime_nsec;
> ++          unsigned int    __unused4;
> ++          unsigned int    __unused5;
> ++  };
> ++
> ++#endif
> +diff --git a/usr/include/arch/arm64/klibc/asmmacros.h b/usr/include/arch/arm64/klibc/asmmacros.h
> +new file mode 100644
> +index 0000000..c298f66
> +--- /dev/null
> ++++ b/usr/include/arch/arm64/klibc/asmmacros.h
> +@@ -0,0 +1,11 @@
> ++/*
> ++ * usr/include/arch/arm64/klibc/asmmacros.h
> ++ *
> ++ * Assembly macros used by arm64 system call stubs
> ++ */
> ++
> ++#ifndef _KLIBC_ASMMACROS_H
> ++#define _KLIBC_ASMMACROS_H
> ++
> ++
> ++#endif /* _KLIBC_ASMMACROS_H */
> +diff --git a/usr/klibc/README.klibc b/usr/klibc/README.klibc
> +index 7de5fea..c72ae47 100644
> +--- a/usr/klibc/README.klibc
> ++++ b/usr/klibc/README.klibc
> +@@ -36,6 +36,7 @@ b) If you're cross-compiling, you need to set KLIBCARCH to the
> +    arm-thumb:  Untested
> +    arm:                Working
> +    arm26:      Not yet ported
> ++   arm64:      Working
> +    avr32:      Not yet ported
> +    cris:       Working
> +    h8300:      Not yet ported
> +diff --git a/usr/klibc/SYSCALLS.def b/usr/klibc/SYSCALLS.def
> +index 12f57ac..41cfa17 100644
> +--- a/usr/klibc/SYSCALLS.def
> ++++ b/usr/klibc/SYSCALLS.def
> +@@ -21,7 +21,7 @@ void _exit,exit::_exit(int);
> + <?!ia64> pid_t clone::__clone(unsigned long, void *);
> + <?ia64> pid_t clone::__clone2(unsigned long, void *, void *);
> + # if ! _KLIBC_NO_MMU
> +-<!sparc,sparc64,ia64> pid_t fork();
> ++<!sparc,sparc64,ia64,arm64> pid_t fork();
> + <sparc,sparc64> pid_t fork at forkish();
> + #endif
> + #if _KLIBC_REAL_VFORK
> +diff --git a/usr/klibc/arch/arm64/Kbuild b/usr/klibc/arch/arm64/Kbuild
> +new file mode 100644
> +index 0000000..f8643b5
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/Kbuild
> +@@ -0,0 +1,7 @@
> ++
> ++# klibc files for arm64
> ++#
> ++
> ++klib-y := setjmp.o syscall.o vfork.o
> ++always  := crt0.o
> ++targets := crt0.o
> +diff --git a/usr/klibc/arch/arm64/MCONFIG b/usr/klibc/arch/arm64/MCONFIG
> +new file mode 100644
> +index 0000000..82664a7
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/MCONFIG
> +@@ -0,0 +1,23 @@
> ++# -*- makefile -*-
> ++#
> ++# arch/arm64/MCONFIG
> ++#
> ++# Special rules for this architecture.  Note that this is actually
> ++# included from the main Makefile, and that pathnames should be
> ++# accordingly.
> ++#
> ++
> ++CPU_ARCH ?= armv8-a
> ++CPU_TUNE ?= generic
> ++
> ++KLIBCOPTFLAGS += -g -Os -march=$(CPU_ARCH) -mtune=$(CPU_TUNE)
> ++KLIBCBITSIZE  = 64
> ++KLIBCREQFLAGS += -fno-exceptions -mgeneral-regs-only
> ++
> ++# Extra linkflags when building the shared version of the library
> ++# This address needs to be reachable using normal inter-module
> ++# calls, and work on the memory models for this architecture
> ++
> ++# On arm64, binaries are normally loaded at 4MB. Place klibc.so
> ++# a little before that at 2MB to prevent overlap.
> ++KLIBCSHAREDFLAGS = -Ttext 0x0200000
> +diff --git a/usr/klibc/arch/arm64/crt0.S b/usr/klibc/arch/arm64/crt0.S
> +new file mode 100644
> +index 0000000..0b2dd32
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/crt0.S
> +@@ -0,0 +1,19 @@
> ++#
> ++# arch/arm64/crt0.S
> ++#
> ++# void _start(void)
> ++# {
> ++#    __libc_init(elf_structure, atexit_ptr);
> ++# }
> ++#
> ++
> ++      .text
> ++      .balign 8
> ++      .type _start,#function
> ++      .globl _start
> ++
> ++_start:
> ++      mov     x0, sp
> ++      mov     x1, #0
> ++      bl      __libc_init
> ++      .size _start,.-_start
> +diff --git a/usr/klibc/arch/arm64/setjmp.S b/usr/klibc/arch/arm64/setjmp.S
> +new file mode 100644
> +index 0000000..13ab99d
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/setjmp.S
> +@@ -0,0 +1,47 @@
> ++#
> ++# arch/arm64/setjmp.S
> ++#
> ++# setjmp/longjmp for arm64
> ++#
> ++
> ++#include <klibc/asmmacros.h>
> ++
> ++# we specify -mgeneral-regs-only as a build flag thus do not need to
> ++# save d8-d15
> ++
> ++      .text
> ++      .balign 8
> ++      .globl setjmp
> ++      .type setjmp, #function
> ++setjmp:
> ++      mov     x1, sp
> ++      stp     x19, x20, [x0, #0]
> ++      stp     x21, x22, [x0, #16]
> ++      stp     x23, x24, [x0, #32]
> ++      stp     x25, x26, [x0, #48]
> ++      stp     x27, x28, [x0, #64]
> ++      stp     x29, x30, [x0, #80]
> ++      str     x1,       [x0, #96]
> ++      mov     x0, #0                  /* set the return value of setjmp */
> ++      br      x30
> ++      .size setjmp,.-setjmp
> ++
> ++      .text
> ++      .balign 8
> ++      .globl longjmp
> ++      .type longjmp, #function
> ++longjmp:
> ++      ldp     x19, x20, [x0, #0]
> ++      ldp     x21, x22, [x0, #16]
> ++      ldp     x23, x24, [x0, #32]
> ++      ldp     x25, x26, [x0, #48]
> ++      ldp     x27, x28, [x0, #64]
> ++      ldp     x29, x30, [x0, #80]
> ++      ldr     x2,       [x0, #96]
> ++      mov     sp, x2
> ++      mov     x0, x1
> ++      cbnz    x1, 1f
> ++      mov     x0, #1
> ++1:
> ++      br      x30
> ++      .size longjmp,.-longjmp
> +diff --git a/usr/klibc/arch/arm64/syscall.S b/usr/klibc/arch/arm64/syscall.S
> +new file mode 100644
> +index 0000000..3ce91fb
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/syscall.S
> +@@ -0,0 +1,25 @@
> ++/*
> ++ * arch/arm64/syscall.S
> ++ *
> ++ * System call common handling - if the return
> ++ * value from the system call is negative, then
> ++ * extract the magnitude and return it as errno and
> ++ * return -1, if the return value is 0 that is
> ++ * success case.
> ++ */
> ++
> ++      .type   __syscall_common,#function
> ++      .globl  __syscall_common
> ++      .balign 8
> ++
> ++__syscall_common:
> ++      cmp     x0, #0x0
> ++      b.ge    2f
> ++      neg     x0, x0
> ++      ldr     x8, 1f
> ++      str     x0, [x8]
> ++      mov     x0, #-1
> ++2:
> ++      ret
> ++1:
> ++      .dword  errno
> +diff --git a/usr/klibc/arch/arm64/sysstub.ph b/usr/klibc/arch/arm64/sysstub.ph
> +new file mode 100644
> +index 0000000..47cbfd9
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/sysstub.ph
> +@@ -0,0 +1,25 @@
> ++# -*- perl -*-
> ++#
> ++# arch/arm64/sysstub.ph
> ++#
> ++# Script to generate system call stubs
> ++#
> ++
> ++sub make_sysstub($$$$$@) {
> ++    my($outputdir, $fname, $type, $sname, $stype, @args) = @_;
> ++
> ++    open(OUT, '>', "${outputdir}/${fname}.S");
> ++    print  OUT "#include <asm/unistd.h>\n";
> ++    print  OUT "#include <klibc/asmmacros.h>\n";
> ++    print  OUT "      .text\n";
> ++    print  OUT "      .type   ${fname}, #function\n";
> ++    print  OUT "      .globl  ${fname}\n";
> ++    print  OUT "      .balign 8\n";
> ++    print  OUT "${fname}:\n";
> ++    print  OUT "      mov w8,__NR_${sname}\n";
> ++    print  OUT "      svc     0\n";
> ++    print  OUT "      b       __syscall_common\n";
> ++    print  OUT "      .size   ${fname},.-${fname}\n";
> ++}
> ++
> ++1;
> +diff --git a/usr/klibc/arch/arm64/vfork.S b/usr/klibc/arch/arm64/vfork.S
> +new file mode 100644
> +index 0000000..494326c
> +--- /dev/null
> ++++ b/usr/klibc/arch/arm64/vfork.S
> +@@ -0,0 +1,34 @@
> ++/*
> ++ * arch/arm64/vfork.S
> ++ *
> ++ * vfork - a system call which must not use the stack.
> ++ */
> ++
> ++#include <klibc/asmmacros.h>
> ++#include <asm/unistd.h>
> ++
> ++      .type   vfork,#function
> ++      .globl  vfork
> ++      .balign 8
> ++
> ++vfork:
> ++      /* Prepare for the system call */
> ++        /* 1. Push the function pointer and argument location
> ++              on to the child process stack */
> ++        /* 2. Gather the Flags */
> ++        /* New sp is already in x1.  */
> ++        mov     x0, #0x4111     /* CLONE_VM | CLONE_VFORK | SIGCHLD */
> ++        mov     x1, sp
> ++        mov     w8,__NR_clone
> ++        svc     0
> ++        cmp     x0, #0x0
> ++        b.ge    2f
> ++        neg     x0, x0
> ++        ldr     x8, 1f
> ++        str     x0, [x8]
> ++        mov     x0, #-1
> ++2:
> ++        ret
> ++1:
> ++        .dword   errno
> ++        .size   vfork,.-vfork
> +--
> +1.8.4.2
> +
> diff --git a/meta-initramfs/recipes-devtools/klibc/klibc_2.0.2.bb b/meta-initramfs/recipes-devtools/klibc/klibc_2.0.2.bb
> index 4244cf2..7d1eabe 100644
> --- a/meta-initramfs/recipes-devtools/klibc/klibc_2.0.2.bb
> +++ b/meta-initramfs/recipes-devtools/klibc/klibc_2.0.2.bb
> @@ -22,4 +22,10 @@ FILES_libklibc-dev = "${libdir}/klibc.so \
>                        ${libdir}/klibc/include/* \
>  "
>  require klibc.inc
> +
> +SRC_URI += "file://0001-syscalls-Fixup-some-syscalls.patch \
> +            file://0002-syscalls-Add-syscalls-needed-by-arm64.patch \
> +            file://0003-arm64-Introduce-arm64-support.patch \
> +           "
> +
>  SUMMARY = "klibc, a small C library for use with initramfs"
> --
> 1.8.4.2
>
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel


Cheers,
-- 
Fathi Boudra



More information about the Openembedded-devel mailing list