From e210488e0d4082b9a0c55195c22191f29ed56bf8 Mon Sep 17 00:00:00 2001 From: Serban Constantinescu Date: Thu, 26 Sep 2013 11:37:10 +0100 Subject: [PATCH] AArch64: Add initial support for AArch64 This is the first patch out of a series of patches that add support for AArch64, the new 64bit execution state of the ARMv8 Architecture. The patches add support for LP64 programming model. The patch adds: * "arch-aarch64" to the architecture directories. * "arch-aarch64/include" - headers used by libc * "arch-aarch64/bionic": - crtbegin, crtend support; - aarch64 specific syscall stubs; - setjmp, clone, vfork assembly files. Change-Id: If72b859f81928d03ad05d4ccfcb54c2f5dbf99a5 Signed-off-by: Serban Constantinescu --- libc/Android.mk | 45 ++++- libc/arch-aarch64/aarch64.mk | 14 ++ libc/arch-aarch64/bionic/__bionic_clone.S | 63 ++++++ libc/arch-aarch64/bionic/__get_sp.S | 34 ++++ libc/arch-aarch64/bionic/__rt_sigreturn.S | 35 ++++ libc/arch-aarch64/bionic/__set_tls.c | 31 +++ .../bionic/_exit_with_stack_teardown.S | 43 ++++ libc/arch-aarch64/bionic/_setjmp.S | 111 ++++++++++ libc/arch-aarch64/bionic/bzero_aarch64.c | 33 +++ libc/arch-aarch64/bionic/cacheflush_aarch64.c | 33 +++ libc/arch-aarch64/bionic/crtbegin.c | 69 +++++++ libc/arch-aarch64/bionic/futex_aarch64.S | 129 ++++++++++++ libc/arch-aarch64/bionic/setjmp.S | 123 +++++++++++ libc/arch-aarch64/bionic/sigsetjmp.S | 51 +++++ libc/arch-aarch64/bionic/syscall.S | 61 ++++++ libc/arch-aarch64/bionic/vfork.S | 52 +++++ libc/arch-aarch64/include/machine/_types.h | 111 ++++++++++ libc/arch-aarch64/include/machine/asm.h | 128 ++++++++++++ .../include/machine/elf_machdep.h | 105 ++++++++++ libc/arch-aarch64/include/machine/endian.h | 58 ++++++ libc/arch-aarch64/include/machine/exec.h | 50 +++++ libc/arch-aarch64/include/machine/ieee.h | 191 ++++++++++++++++++ libc/arch-aarch64/include/machine/kernel.h | 44 ++++ libc/arch-aarch64/include/machine/limits.h | 62 ++++++ libc/arch-aarch64/include/machine/setjmp.h | 73 +++++++ libc/arch-common/bionic/__dso_handle.h | 4 + libc/arch-common/bionic/__dso_handle_so.h | 4 + libc/private/__get_tls.h | 19 +- 28 files changed, 1761 insertions(+), 15 deletions(-) create mode 100644 libc/arch-aarch64/aarch64.mk create mode 100644 libc/arch-aarch64/bionic/__bionic_clone.S create mode 100644 libc/arch-aarch64/bionic/__get_sp.S create mode 100644 libc/arch-aarch64/bionic/__rt_sigreturn.S create mode 100644 libc/arch-aarch64/bionic/__set_tls.c create mode 100644 libc/arch-aarch64/bionic/_exit_with_stack_teardown.S create mode 100644 libc/arch-aarch64/bionic/_setjmp.S create mode 100644 libc/arch-aarch64/bionic/bzero_aarch64.c create mode 100644 libc/arch-aarch64/bionic/cacheflush_aarch64.c create mode 100644 libc/arch-aarch64/bionic/crtbegin.c create mode 100644 libc/arch-aarch64/bionic/futex_aarch64.S create mode 100644 libc/arch-aarch64/bionic/setjmp.S create mode 100644 libc/arch-aarch64/bionic/sigsetjmp.S create mode 100644 libc/arch-aarch64/bionic/syscall.S create mode 100644 libc/arch-aarch64/bionic/vfork.S create mode 100644 libc/arch-aarch64/include/machine/_types.h create mode 100644 libc/arch-aarch64/include/machine/asm.h create mode 100644 libc/arch-aarch64/include/machine/elf_machdep.h create mode 100644 libc/arch-aarch64/include/machine/endian.h create mode 100644 libc/arch-aarch64/include/machine/exec.h create mode 100644 libc/arch-aarch64/include/machine/ieee.h create mode 100644 libc/arch-aarch64/include/machine/kernel.h create mode 100644 libc/arch-aarch64/include/machine/limits.h create mode 100644 libc/arch-aarch64/include/machine/setjmp.h diff --git a/libc/Android.mk b/libc/Android.mk index 962365e39..94664d13b 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -1,4 +1,4 @@ -LOCAL_PATH:= $(call my-dir) +LOCAL_PATH := $(call my-dir) include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk @@ -506,6 +506,40 @@ libc_common_src_files += \ endif # x86_64 +ifeq ($(TARGET_ARCH), aarch64) +#TODO: Replace C stubs with optimised assembly +libc_common_src_files += \ + bionic/memchr.c \ + bionic/memcmp.c \ + bionic/memcpy.c \ + bionic/memmove.c \ + bionic/memrchr.c \ + bionic/memset.c \ + bionic/strchr.cpp \ + bionic/strnlen.c \ + string/bcopy.c \ + string/index.c \ + string/memcmp16.c \ + string/strcat.c \ + string/strcmp.c \ + string/strcpy.c \ + string/strlcat.c \ + string/strlcpy.c \ + string/strlen.c \ + string/strncat.c \ + string/strncmp.c \ + string/strncpy.c \ + string/strrchr.c \ + upstream-freebsd/lib/libc/string/wcscat.c \ + upstream-freebsd/lib/libc/string/wcschr.c \ + upstream-freebsd/lib/libc/string/wcscmp.c \ + upstream-freebsd/lib/libc/string/wcscpy.c \ + upstream-freebsd/lib/libc/string/wcslen.c \ + upstream-freebsd/lib/libc/string/wcsrchr.c \ + upstream-freebsd/lib/libc/string/wmemcmp.c \ + +endif # aarch64 + ifeq ($(TARGET_ARCH),arm) ifeq ($(strip $(TARGET_CPU_VARIANT)),) $(warning TARGET_ARCH is arm, but TARGET_CPU_VARIANT is not defined) @@ -628,7 +662,7 @@ libc_common_c_includes := \ # which are needed to build all other objects (shared/static libs and # executables) # ========================================================================== -# ARM, MIPS, and x86 all need crtbegin_so/crtend_so. +# AArch64, ARM, MIPS, and x86 all need crtbegin_so/crtend_so. # # For x86, the .init section must point to a function that calls all # entries in the .ctors section. (on ARM this is done through the @@ -641,6 +675,10 @@ libc_common_c_includes := \ libc_crt_target_crtbegin_file := $(LOCAL_PATH)/arch-common/bionic/crtbegin.c libc_crt_target_crtbegin_so_file := $(LOCAL_PATH)/arch-common/bionic/crtbegin_so.c +ifeq ($(TARGET_ARCH),aarch64) + libc_crt_target_so_cflags := + libc_crt_target_crtbegin_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.c +endif ifeq ($(TARGET_ARCH),arm) libc_crt_target_so_cflags := endif @@ -1065,6 +1103,8 @@ include $(BUILD_SHARED_LIBRARY) # ======================================================== # libc_malloc_debug_qemu.so # ======================================================== +#TODO: We do not build this library for now +ifneq ($(TARGET_ARCH),aarch64) include $(CLEAR_VARS) LOCAL_CFLAGS := \ @@ -1090,6 +1130,7 @@ LOCAL_MODULE_TAGS := eng debug include $(BUILD_SHARED_LIBRARY) +endif #!aarch64 endif #!user diff --git a/libc/arch-aarch64/aarch64.mk b/libc/arch-aarch64/aarch64.mk new file mode 100644 index 000000000..847db989b --- /dev/null +++ b/libc/arch-aarch64/aarch64.mk @@ -0,0 +1,14 @@ +_LIBC_ARCH_COMMON_SRC_FILES := \ + arch-aarch64/bionic/__bionic_clone.S \ + arch-aarch64/bionic/bzero_aarch64.c \ + arch-aarch64/bionic/cacheflush_aarch64.c \ + arch-aarch64/bionic/_exit_with_stack_teardown.S \ + arch-aarch64/bionic/futex_aarch64.S \ + arch-aarch64/bionic/__get_sp.S \ + arch-aarch64/bionic/__rt_sigreturn.S \ + arch-aarch64/bionic/_setjmp.S \ + arch-aarch64/bionic/setjmp.S \ + arch-aarch64/bionic/__set_tls.c \ + arch-aarch64/bionic/sigsetjmp.S \ + arch-aarch64/bionic/syscall.S \ + arch-aarch64/bionic/vfork.S \ diff --git a/libc/arch-aarch64/bionic/__bionic_clone.S b/libc/arch-aarch64/bionic/__bionic_clone.S new file mode 100644 index 000000000..3f160f502 --- /dev/null +++ b/libc/arch-aarch64/bionic/__bionic_clone.S @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 + +// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg); + +ENTRY(__bionic_clone) + stp x29, x30, [sp, #-16]! + mov x29, sp + str x8, [sp, #-16]! + + /* store thread pointer & args in child stack */ + stp x5, x6, [x1, #-16] + + /* sys_clone */ + uxtw x0, w0 + mov x8, __NR_clone + svc #0 + + /* check for child/parent */ + cbz x0,1f + + ldr x8, [sp], #16 + ldp x29, x30, [sp], #16 + + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret + + /* thread initialization - set the end of the frame record chain */ +1: + mov x29, xzr + ldp x0, x1, [sp, #-16] + b __bionic_clone_entry +END(__bionic_clone) diff --git a/libc/arch-aarch64/bionic/__get_sp.S b/libc/arch-aarch64/bionic/__get_sp.S new file mode 100644 index 000000000..66a0ff172 --- /dev/null +++ b/libc/arch-aarch64/bionic/__get_sp.S @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 + +ENTRY(__get_sp) + mov x0, sp + ret +END(__get_sp) diff --git a/libc/arch-aarch64/bionic/__rt_sigreturn.S b/libc/arch-aarch64/bionic/__rt_sigreturn.S new file mode 100644 index 000000000..be5d1fa7b --- /dev/null +++ b/libc/arch-aarch64/bionic/__rt_sigreturn.S @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +ENTRY_PRIVATE(__rt_sigreturn) + mov x8, __NR_rt_sigreturn + svc #0 +END(__rt_sigreturn) diff --git a/libc/arch-aarch64/bionic/__set_tls.c b/libc/arch-aarch64/bionic/__set_tls.c new file mode 100644 index 000000000..16d23570f --- /dev/null +++ b/libc/arch-aarch64/bionic/__set_tls.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +void __set_tls(void* tls) { + asm("msr tpidr_el0, %0" : : "r" (tls)); +} diff --git a/libc/arch-aarch64/bionic/_exit_with_stack_teardown.S b/libc/arch-aarch64/bionic/_exit_with_stack_teardown.S new file mode 100644 index 000000000..083bcb699 --- /dev/null +++ b/libc/arch-aarch64/bionic/_exit_with_stack_teardown.S @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +// void _exit_with_stack_teardown(void* stackBase, size_t stackSize, int status) +ENTRY(_exit_with_stack_teardown) + mov w28, w2 + mov w8, __NR_munmap + svc #0 + // If munmap failed, we ignore the failure and exit anyway. + + sxtw x0, w28 + mov w8, __NR_exit + svc #0 + // The exit syscall does not return. +END(_exit_with_stack_teardown) diff --git a/libc/arch-aarch64/bionic/_setjmp.S b/libc/arch-aarch64/bionic/_setjmp.S new file mode 100644 index 000000000..ba089402e --- /dev/null +++ b/libc/arch-aarch64/bionic/_setjmp.S @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +/* + * C library - _setjmp, _longjmp + * + * _longjmp(jmp_buf state, int value) + * will generate a "return(v)" from the last call to _setjmp(state) by restoring + * registers from the stack. The previous signal state is NOT restored. + * + * NOTE: x0 return value + * x9-x15 temporary registers + */ + +ENTRY(_setjmp) + /* store magic number */ + ldr w9, .L_setjmp_magic + str w9, [x0, #(_JB_MAGIC * 4)] + + /* store core registers */ + mov x10, sp + stp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)] + stp x28, x29, [x0, #(_JB_CORE_BASE * 4 + 16 * 1)] + stp x26, x27, [x0, #(_JB_CORE_BASE * 4 + 16 * 2)] + stp x24, x25, [x0, #(_JB_CORE_BASE * 4 + 16 * 3)] + stp x22, x23, [x0, #(_JB_CORE_BASE * 4 + 16 * 4)] + stp x20, x21, [x0, #(_JB_CORE_BASE * 4 + 16 * 5)] + str x19, [x0, #(_JB_CORE_BASE * 4 + 16 * 6)] + + /* store floating point registers */ + stp d14, d15, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 0)] + stp d12, d13, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 1)] + stp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)] + stp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)] + + mov w0, wzr + ret +END(_setjmp) + +.L_setjmp_magic: + .word _JB_MAGIC__SETJMP + +ENTRY(_longjmp) + /* check magic */ + ldr w9, .L_setjmp_magic + ldr w10, [x0, #(_JB_MAGIC * 4)] + cmp w9, w10 + b.ne botch + + /* restore core registers */ + ldp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)] + mov sp, x10 + ldp x28, x29, [x0, #(_JB_CORE_BASE * 4 + 16 * 1)] + ldp x26, x27, [x0, #(_JB_CORE_BASE * 4 + 16 * 2)] + ldp x24, x25, [x0, #(_JB_CORE_BASE * 4 + 16 * 3)] + ldp x22, x23, [x0, #(_JB_CORE_BASE * 4 + 16 * 4)] + ldp x20, x21, [x0, #(_JB_CORE_BASE * 4 + 16 * 5)] + ldr x19, [x0, #(_JB_CORE_BASE * 4 + 16 * 6)] + + /* restore floating point registers */ + ldp d14, d15, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 0)] + ldp d12, d13, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 1)] + ldp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)] + ldp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)] + + /* validate sp (sp mod 16 = 0) and lr (lr mod 4 = 0) */ + tst x30, #3 + b.ne botch + mov x10, sp + tst x10, #15 + b.ne botch + + /* set return value */ + cmp w1, wzr + csinc w0, w1, wzr, ne + ret + + /* validation failed, die die die */ +botch: + bl PIC_SYM(_C_LABEL(longjmperror), PLT) + bl PIC_SYM(_C_LABEL(abort), PLT) + b . - 8 /* Cannot get here */ +END(_longjmp) diff --git a/libc/arch-aarch64/bionic/bzero_aarch64.c b/libc/arch-aarch64/bionic/bzero_aarch64.c new file mode 100644 index 000000000..d403d0c83 --- /dev/null +++ b/libc/arch-aarch64/bionic/bzero_aarch64.c @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 + +void bzero(void* s, size_t n) { + memset(s, '\0', n); +} diff --git a/libc/arch-aarch64/bionic/cacheflush_aarch64.c b/libc/arch-aarch64/bionic/cacheflush_aarch64.c new file mode 100644 index 000000000..fbbd788d2 --- /dev/null +++ b/libc/arch-aarch64/bionic/cacheflush_aarch64.c @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +/* TODO: We can implement a specialised cacheflush() */ +int cacheflush (long start, long end, long flags __attribute__((unused))) { + __builtin___clear_cache((char*) start, (char*) end); + return 0; +} diff --git a/libc/arch-aarch64/bionic/crtbegin.c b/libc/arch-aarch64/bionic/crtbegin.c new file mode 100644 index 000000000..73d20103d --- /dev/null +++ b/libc/arch-aarch64/bionic/crtbegin.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 "../../bionic/libc_init_common.h" +#include +#include + +__attribute__ ((section (".preinit_array"))) +void (*__PREINIT_ARRAY__)(void) = (void (*)(void)) -1; + +__attribute__ ((section (".init_array"))) +void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1; + +__attribute__ ((section (".fini_array"))) +void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1; + + +__LIBC_HIDDEN__ void do_aarch64_start(void* raw_args) { + structors_array_t array; + array.preinit_array = &__PREINIT_ARRAY__; + array.init_array = &__INIT_ARRAY__; + array.fini_array = &__FINI_ARRAY__; + __libc_init(raw_args, NULL, &main, &array); +} + +/* + * Put the value of sp in x0 and call do_aarch64_init(). The latter will then + * then be able to access the stack as prepared by the kernel's execve system + * call (via the first argument). + */ +__asm__ ( +" .text \n" +" .align 2 \n" +" .global _start \n" +" .hidden _start \n" +" .type _start, %function \n" +"_start: \n" +" add x0, sp, xzr \n" +" b do_aarch64_start \n" +" .size _start, .-_start \n" +); + +#include "../../arch-common/bionic/__dso_handle.h" +#include "../../arch-common/bionic/atexit.h" diff --git a/libc/arch-aarch64/bionic/futex_aarch64.S b/libc/arch-aarch64/bionic/futex_aarch64.S new file mode 100644 index 000000000..c25d2ddd0 --- /dev/null +++ b/libc/arch-aarch64/bionic/futex_aarch64.S @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include +#include + +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 + +/* + * Syscall interface for fast userspace locks + * + * int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout); + * int __futex_wake(volatile void *ftx, int count); + * int __futex_syscall3(volatile void *ftx, int op, int val); + * int __futex_syscall4(volatile void *ftx, int op, int val, const struct timespec *timeout); + */ + +ENTRY(__futex_syscall4) + /* create AArch64 PCS frame pointer */ + stp x29, x30, [sp, #-16]! + mov x29, sp + + /* store x8 */ + str x8, [sp, #-16]! + + /* syscall No. in x8 */ + mov x8, __NR_futex + svc #0 + + /* restore x8 */ + ldr x8, [sp], #16 + ldp x29, x30, [sp], #16 + + /* check if syscall returned successfully */ + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret +END(__futex_syscall4) + +ENTRY(__futex_syscall3) + /* __futex_syscall4 but with fewer arguments */ + b __futex_syscall4 +END(__futex_syscall3) + +ENTRY(__futex_wait) + /* create AArch64 PCS frame pointer */ + stp x29, x30, [sp, #-16]! + mov x29, sp + + /* store x8 */ + str x8, [sp, #-16]! + + /* arange arguments as expected in the kernel side */ + mov x3, x2 + mov w2, w1 + mov w1, #FUTEX_WAIT + + /* syscall No. in X8 */ + mov x8, __NR_futex + svc #0 + + /* restore x8 */ + ldr x8, [sp], #16 + ldp x29, x30, [sp], #16 + + /* check if syscall returned successfully */ + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret +END(__futex_wait) + +ENTRY(__futex_wake) + /* create AArch64 PCS frame pointer */ + stp x29, x30, [sp, #-16]! + mov x29, sp + + /* store x8 */ + str x8, [sp, #-16]! + + /* arange arguments as expected in the kernel side */ + mov w2, w1 + mov w1, #FUTEX_WAIT + + /* syscall No. in X8 */ + mov x8, __NR_futex + svc #0 + + /* restore x8 */ + ldr x8, [sp], #16 + ldp x29, x30, [sp], #16 + + /* check if syscall returned successfully */ + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret +END(__futex_wake) diff --git a/libc/arch-aarch64/bionic/setjmp.S b/libc/arch-aarch64/bionic/setjmp.S new file mode 100644 index 000000000..faa854f77 --- /dev/null +++ b/libc/arch-aarch64/bionic/setjmp.S @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +/* + * C library - _setjmp, _longjmp + * + * _longjmp(jmp_buf state, int value) + * will generate a "return(v)" from the last call to _setjmp(state) by restoring + * registers from the stack. The previous signal state is NOT restored. + * + * NOTE: x0 return value + * x9-x15 temporary registers + */ + +ENTRY(setjmp) + /* block all signals an retrieve signal mask */ + stp x0, x30, [sp, #-16]! + + mov x0, xzr + bl PIC_SYM(_C_LABEL(sigblock), PLT) + mov w1, w0 + + ldp x0, x30, [sp], #16 + + /* store signal mask */ + str w1, [x0, #(_JB_SIGMASK *4)] + + /* store magic number */ + ldr w9, .L_setjmp_magic + str w9, [x0, #(_JB_MAGIC * 4)] + + /* store core registers */ + mov x10, sp + stp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)] + stp x28, x29, [x0, #(_JB_CORE_BASE * 4 + 16 * 1)] + stp x26, x27, [x0, #(_JB_CORE_BASE * 4 + 16 * 2)] + stp x24, x25, [x0, #(_JB_CORE_BASE * 4 + 16 * 3)] + stp x22, x23, [x0, #(_JB_CORE_BASE * 4 + 16 * 4)] + stp x20, x21, [x0, #(_JB_CORE_BASE * 4 + 16 * 5)] + str x19, [x0, #(_JB_CORE_BASE * 4 + 16 * 6)] + + /* store floating point registers */ + stp d14, d15, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 0)] + stp d12, d13, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 1)] + stp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)] + stp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)] + + mov w0, wzr + ret +END(setjmp) + +.L_setjmp_magic: + .word _JB_MAGIC__SETJMP + +ENTRY(longjmp) + /* check magic */ + ldr w9, .L_setjmp_magic + ldr w10, [x0, #(_JB_MAGIC * 4)] + cmp w9, w10 + b.ne botch + + /* restore core registers */ + ldp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)] + mov sp, x10 + ldp x28, x29, [x0, #(_JB_CORE_BASE * 4 + 16 * 1)] + ldp x26, x27, [x0, #(_JB_CORE_BASE * 4 + 16 * 2)] + ldp x24, x25, [x0, #(_JB_CORE_BASE * 4 + 16 * 3)] + ldp x22, x23, [x0, #(_JB_CORE_BASE * 4 + 16 * 4)] + ldp x20, x21, [x0, #(_JB_CORE_BASE * 4 + 16 * 5)] + ldr x19, [x0, #(_JB_CORE_BASE * 4 + 16 * 6)] + + /* restore floating point registers */ + ldp d14, d15, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 0)] + ldp d12, d13, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 1)] + ldp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)] + ldp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)] + + /* validate sp (sp mod 16 = 0) and lr (lr mod 4 = 0) */ + tst x30, #3 + b.ne botch + mov x10, sp + tst x10, #15 + b.ne botch + + /* set return value */ + cmp w1, wzr + csinc w0, w1, wzr, ne + ret + + /* validation failed, die die die */ +botch: + bl PIC_SYM(_C_LABEL(longjmperror), PLT) + bl PIC_SYM(_C_LABEL(abort), PLT) + b . - 8 /* Cannot get here */ +END(longjmp) diff --git a/libc/arch-aarch64/bionic/sigsetjmp.S b/libc/arch-aarch64/bionic/sigsetjmp.S new file mode 100644 index 000000000..ffc8984f2 --- /dev/null +++ b/libc/arch-aarch64/bionic/sigsetjmp.S @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +/* + * int sigsetjmp(sigjmp_buf env, int savesigs); + * void siglongjmp(sigjmp_buf env, int val); + */ + +ENTRY(sigsetjmp) + cbz w1, PIC_SYM(_C_LABEL(_setjmp), PLT) + b PIC_SYM(_C_LABEL(setjmp), PLT) +END(sigsetjmp) + +.L_setjmp_magic: + .word _JB_MAGIC__SETJMP + +ENTRY(siglongjmp) + ldr w2, .L_setjmp_magic + ldr w3, [x0] + cmp w2, w3 + b.eq PIC_SYM(_C_LABEL(_longjmp), PLT) + b PIC_SYM(_C_LABEL(longjmp), PLT) +END(siglongjmp) diff --git a/libc/arch-aarch64/bionic/syscall.S b/libc/arch-aarch64/bionic/syscall.S new file mode 100644 index 000000000..f7ce010a8 --- /dev/null +++ b/libc/arch-aarch64/bionic/syscall.S @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include + +ENTRY(syscall) + /* create AAPCS frame pointer */ + stp x29, x30, [sp, #-16]! + mov x29, sp + + /* store x8 */ + str x8, [sp, #-16]! + + /* Move syscall No. from x0 to x8 */ + mov x8, x0 + /* Move syscall parameters from x1 thru x6 to x0 thru x5 */ + mov x0, x1 + mov x1, x2 + mov x2, x3 + mov x3, x4 + mov x4, x5 + mov x5, x6 + svc #0 + + /* restore x8 */ + ldr x8, [sp], #16 + ldp x29, x30, [sp], #16 + + /* check if syscall returned successfully */ + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret +END(syscall) diff --git a/libc/arch-aarch64/bionic/vfork.S b/libc/arch-aarch64/bionic/vfork.S new file mode 100644 index 000000000..964f38d0c --- /dev/null +++ b/libc/arch-aarch64/bionic/vfork.S @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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 +#include +#include + +ENTRY(vfork) + mov x0, #0x4111 /* CLONE_VM | CLONE_VFORK | SIGCHLD */ + mov x1, xzr + mov x2, xzr + mov x3, xzr + mov x4, xzr + + str x8, [sp, #-16]! + mov x8, __NR_clone + + svc #0 + ldr x8, [sp], #16 + + /* check if syscall returned successfully */ + cmn x0, #(MAX_ERRNO + 1) + cneg x0, x0, hi + b.hi __set_errno + + ret +END(vfork) diff --git a/libc/arch-aarch64/include/machine/_types.h b/libc/arch-aarch64/include/machine/_types.h new file mode 100644 index 000000000..0a462aba0 --- /dev/null +++ b/libc/arch-aarch64/include/machine/_types.h @@ -0,0 +1,111 @@ +/* $OpenBSD: _types.h,v 1.3 2006/02/14 18:12:58 miod Exp $ */ + +/*- + * 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. + * 3. 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. + * + * @(#)types.h 8.3 (Berkeley) 1/5/94 + * @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _AARCH64__TYPES_H_ +#define _AARCH64__TYPES_H_ + +/* 7.18.1.1 Exact-width integer types */ +typedef __signed char __int8_t; +typedef unsigned char __uint8_t; +typedef short __int16_t; +typedef unsigned short __uint16_t; +typedef int __int32_t; +typedef unsigned int __uint32_t; +typedef long __int64_t; +typedef unsigned long __uint64_t; + +/* 7.18.1.2 Minimum-width integer types */ +typedef __int8_t __int_least8_t; +typedef __uint8_t __uint_least8_t; +typedef __int16_t __int_least16_t; +typedef __uint16_t __uint_least16_t; +typedef __int32_t __int_least32_t; +typedef __uint32_t __uint_least32_t; +typedef __int64_t __int_least64_t; +typedef __uint64_t __uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ +typedef __int32_t __int_fast8_t; +typedef __uint32_t __uint_fast8_t; +typedef __int32_t __int_fast16_t; +typedef __uint32_t __uint_fast16_t; +typedef __int32_t __int_fast32_t; +typedef __uint32_t __uint_fast32_t; +typedef __int64_t __int_fast64_t; +typedef __uint64_t __uint_fast64_t; + +/* 7.18.1.4 Integer types capable of holding object pointers */ +typedef int __intptr_t; +typedef unsigned int __uintptr_t; + +/* 7.18.1.5 Greatest-width integer types */ +typedef __int64_t __intmax_t; +typedef __uint64_t __uintmax_t; + +/* Register size */ +typedef __int64_t __register_t; + +/* VM system types */ +typedef unsigned long __vaddr_t; +typedef unsigned long __paddr_t; +typedef unsigned long __vsize_t; +typedef unsigned long __psize_t; + +/* Standard system types */ +typedef long __clock_t; +typedef int __clockid_t; +typedef double __double_t; +typedef float __float_t; +typedef long __ptrdiff_t; +typedef long __time_t; +typedef int __timer_t; +#if defined(__GNUC__) && __GNUC__ >= 3 +typedef __builtin_va_list __va_list; +#else +typedef char * __va_list; +#endif + +/* Wide character support types */ +#ifndef __cplusplus +typedef int __wchar_t; +#endif +typedef int __wint_t; +typedef int __rune_t; +typedef void * __wctrans_t; +typedef void * __wctype_t; + +#define _BYTE_ORDER _LITTLE_ENDIAN + +#endif /* _AARCH64__TYPES_H_ */ + diff --git a/libc/arch-aarch64/include/machine/asm.h b/libc/arch-aarch64/include/machine/asm.h new file mode 100644 index 000000000..3f8b908c6 --- /dev/null +++ b/libc/arch-aarch64/include/machine/asm.h @@ -0,0 +1,128 @@ +/* $OpenBSD: asm.h,v 1.1 2004/02/01 05:09:49 drahn Exp $ */ +/* $NetBSD: asm.h,v 1.4 2001/07/16 05:43:32 matt Exp $ */ + +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * 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. + * 3. 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: @(#)asm.h 5.5 (Berkeley) 5/7/91 + */ + +#ifndef _AARCH64_ASM_H_ +#define _AARCH64_ASM_H_ + +/* TODO: Add cfi directives for creating/restoring FP */ +#ifdef __ELF__ +# define _C_LABEL(x) x +#else +# ifdef __STDC__ +# define _C_LABEL(x) _ ## x +# else +# define _C_LABEL(x) _/**/x +# endif +#endif +#define _ASM_LABEL(x) x + +#ifdef __STDC__ +# define __CONCAT(x,y) x ## y +# define __STRING(x) #x +#else +# define __CONCAT(x,y) x/**/y +# define __STRING(x) "x" +#endif + +#ifndef _ALIGN_TEXT +# define _ALIGN_TEXT .align 0 +#endif + +#define _ASM_TYPE_FUNCTION %function +#define _ASM_TYPE_OBJECT %object +#define _ENTRY(x) \ + .text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x: .cfi_startproc + +#define _ASM_SIZE(x) .size x, .-x; + +#define _END(x) \ + .cfi_endproc; \ + _ASM_SIZE(x) + +#define ENTRY(y) _ENTRY(_C_LABEL(y)); +#define ENTRY_NP(y) _ENTRY(_C_LABEL(y)) +#define END(y) _END(_C_LABEL(y)) +#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE +#define ASENTRY_NP(y) _ENTRY(_ASM_LABEL(y)) +#define ASEND(y) _END(_ASM_LABEL(y)) + +#ifdef __ELF__ +#define ENTRY_PRIVATE(y) ENTRY(y); .hidden _C_LABEL(y) +#else +#define ENTRY_PRIVATE(y) ENTRY(y) +#endif + +#define ASMSTR .asciz + +#if defined(__ELF__) && defined(PIC) +#ifdef __STDC__ +#define PIC_SYM(x,y) x ## ( ## y ## ) +#else +#define PIC_SYM(x,y) x/**/(/**/y/**/) +#endif +#else +#define PIC_SYM(x,y) x +#endif + +#ifdef __ELF__ +#define RCSID(x) .section ".ident"; .asciz x +#else +#define RCSID(x) .text; .asciz x +#endif + +#ifdef __ELF__ +#define WEAK_ALIAS(alias,sym) \ + .weak alias; \ + alias = sym +#endif + +#ifdef __STDC__ +#define WARN_REFERENCES(sym,msg) \ + .stabs msg ## ,30,0,0,0 ; \ + .stabs __STRING(_C_LABEL(sym)) ## ,1,0,0,0 +#elif defined(__ELF__) +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(sym),1,0,0,0 +#else +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(_/**/sym),1,0,0,0 +#endif /* __STDC__ */ + +#endif /* _AARCH64_ASM_H_ */ + diff --git a/libc/arch-aarch64/include/machine/elf_machdep.h b/libc/arch-aarch64/include/machine/elf_machdep.h new file mode 100644 index 000000000..2bf818920 --- /dev/null +++ b/libc/arch-aarch64/include/machine/elf_machdep.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +#ifndef _AARCH64_ELF_MACHDEP_H_ +#define _AARCH64_ELF_MACHDEP_H_ + +#if defined(__AARCH64EB__) +#define ELF64_MACHDEP_ENDIANNESS ELFDATA2MSB +#else +#define ELF64_MACHDEP_ENDIANNESS ELFDATA2LSB +#endif + +#define ELF64_MACHDEP_ID_CASES \ + case EM_AARCH64: \ + break; + +#define ELF64_MACHDEP_ID EM_AARCH64 + +#define ARCH_ELFSIZE 64 /* MD native binary size */ + +/* Null relocations */ +#define R_ARM_NONE 0 +#define R_AARCH64_NONE 256 + +/* Static Data relocations */ +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 + +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 + +/* PC-relative addresses */ +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 + +/* Control-flow relocations */ +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 + +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 + +/* Dynamic relocations */ +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */ +#define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */ +#define R_AARCH64_RELATIVE 1027 /* Adjust by program base. */ +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLS_DTPREL32 1031 + +#define R_TYPE(name) __CONCAT(R_AARCH64_,name) + +#endif /* _AARCH64_ELF_MACHDEP_H_ */ diff --git a/libc/arch-aarch64/include/machine/endian.h b/libc/arch-aarch64/include/machine/endian.h new file mode 100644 index 000000000..87a038d0e --- /dev/null +++ b/libc/arch-aarch64/include/machine/endian.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +#ifndef _AARCH64_ENDIAN_H_ +#define _AARCH64_ENDIAN_H_ + +#include +#include + +#ifdef __GNUC__ + +#define __swap16md(x) ({ \ + register u_int16_t _x = (x); \ + __asm volatile ("rev16 %0, %0" : "+r" (_x)); \ + _x; \ +}) + +/* Use GCC builtins */ +#define __swap32md(x) __builtin_bswap32(x) +#define __swap64md(x) __builtin_bswap64(x) + +/* Tell sys/endian.h we have MD variants of the swap macros. */ +#define MD_SWAP + +#endif /* __GNUC__ */ + +#if defined(__AARCH64EB__) +#define _BYTE_ORDER _BIG_ENDIAN +#else +#define _BYTE_ORDER _LITTLE_ENDIAN +#endif + +#endif /* _AARCH64_ENDIAN_H_ */ diff --git a/libc/arch-aarch64/include/machine/exec.h b/libc/arch-aarch64/include/machine/exec.h new file mode 100644 index 000000000..743762645 --- /dev/null +++ b/libc/arch-aarch64/include/machine/exec.h @@ -0,0 +1,50 @@ +/* $OpenBSD: exec.h,v 1.9 2003/04/17 03:42:14 drahn Exp $ */ +/* $NetBSD: exec.h,v 1.6 1994/10/27 04:16:05 cgd Exp $ */ + +/* + * Copyright (c) 1993 Christopher G. Demetriou + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + +#ifndef _AARCH64_EXEC_H_ +#define _AARCH64_EXEC_H_ + +#define __LDPGSZ 4096 + +#define NATIVE_EXEC_ELF + +#define ARCH_ELFSIZE 64 + +#define ELF_TARG_CLASS ELFCLASS64 /* 64-bit objects */ +#define ELF_TARG_DATA ELFDATA2LSB +#define ELF_TARG_MACH EM_AARCH64 + +#define _NLIST_DO_AOUT +#define _NLIST_DO_ELF + +#define _KERN_DO_AOUT +#define _KERN_DO_ELF64 + +#endif /* _AARCH64_EXEC_H_ */ diff --git a/libc/arch-aarch64/include/machine/ieee.h b/libc/arch-aarch64/include/machine/ieee.h new file mode 100644 index 000000000..cf2c1fc5e --- /dev/null +++ b/libc/arch-aarch64/include/machine/ieee.h @@ -0,0 +1,191 @@ +/* $OpenBSD: ieee.h,v 1.1 2004/02/01 05:09:49 drahn Exp $ */ +/* $NetBSD: ieee.h,v 1.2 2001/02/21 17:43:50 bjh21 Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 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. + * + * @(#)ieee.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * ieee.h defines the machine-dependent layout of the machine's IEEE + * floating point. + */ + +/* + * Define the number of bits in each fraction and exponent. + * + * k k+1 + * Note that 1.0 x 2 == 0.1 x 2 and that denorms are represented + * + * (-exp_bias+1) + * as fractions that look like 0.fffff x 2 . This means that + * + * -126 + * the number 0.10000 x 2 , for instance, is the same as the normalized + * + * -127 -128 + * float 1.0 x 2 . Thus, to represent 2 , we need one leading zero + * + * -129 + * in the fraction; to represent 2 , we need two, and so on. This + * + * (-exp_bias-fracbits+1) + * implies that the smallest denormalized number is 2 + * + * for whichever format we are talking about: for single precision, for + * + * -126 -149 + * instance, we get .00000000000000000000001 x 2 , or 1.0 x 2 , and + * + * -149 == -127 - 23 + 1. + */ + +/* + * The ARM has two sets of FP data formats. The FPA supports 32-bit, 64-bit + * and 96-bit IEEE formats, with the words in big-endian order. VFP supports + * 32-bin and 64-bit IEEE formats with the words in the CPU's native byte + * order. + * + * The FPA also has two packed decimal formats, but we ignore them here. + */ + +#define SNG_EXPBITS 8 +#define SNG_FRACBITS 23 + +#define DBL_EXPBITS 11 +#define DBL_FRACBITS 52 + +#ifndef __VFP_FP__ +#define E80_EXPBITS 15 +#define E80_FRACBITS 64 + +#define EXT_EXPBITS 15 +#define EXT_FRACBITS 112 +#endif + +struct ieee_single { + u_int sng_frac:23; + u_int sng_exponent:8; + u_int sng_sign:1; +}; + +#ifdef __VFP_FP__ +struct ieee_double { +#ifdef __AARCH64EB__ + u_int dbl_sign:1; + u_int dbl_exp:11; + u_int dbl_frach:20; + u_int dbl_fracl; +#else /* !__AARCH64EB__ */ + u_int dbl_fracl; + u_int dbl_frach:20; + u_int dbl_exp:11; + u_int dbl_sign:1; +#endif /* !__AARCH64EB__ */ +}; +#else /* !__VFP_FP__ */ +struct ieee_double { + u_int dbl_frach:20; + u_int dbl_exp:11; + u_int dbl_sign:1; + u_int dbl_fracl; +}; + +union ieee_double_u { + double dblu_d; + struct ieee_double dblu_dbl; +}; + + +struct ieee_e80 { + u_int e80_exp:15; + u_int e80_zero:16; + u_int e80_sign:1; + u_int e80_frach:31; + u_int e80_j:1; + u_int e80_fracl; +}; + +struct ieee_ext { + u_int ext_frach:16; + u_int ext_exp:15; + u_int ext_sign:1; + u_int ext_frachm; + u_int ext_fraclm; + u_int ext_fracl; +}; +#endif /* !__VFP_FP__ */ + +/* + * Floats whose exponent is in [1..INFNAN) (of whatever type) are + * `normal'. Floats whose exponent is INFNAN are either Inf or NaN. + * Floats whose exponent is zero are either zero (iff all fraction + * bits are zero) or subnormal values. + * + * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its + * high fraction; if the bit is set, it is a `quiet NaN'. + */ +#define SNG_EXP_INFNAN 255 +#define DBL_EXP_INFNAN 2047 +#ifndef __VFP_FP__ +#define E80_EXP_INFNAN 32767 +#define EXT_EXP_INFNAN 32767 +#endif /* !__VFP_FP__ */ + +#if 0 +#define SNG_QUIETNAN (1 << 22) +#define DBL_QUIETNAN (1 << 19) +#ifndef __VFP_FP__ +#define E80_QUIETNAN (1 << 15) +#define EXT_QUIETNAN (1 << 15) +#endif /* !__VFP_FP__ */ +#endif + +/* + * Exponent biases. + */ +#define SNG_EXP_BIAS 127 +#define DBL_EXP_BIAS 1023 +#ifndef __VFP_FP__ +#define E80_EXP_BIAS 16383 +#define EXT_EXP_BIAS 16383 +#endif /* !__VFP_FP__ */ diff --git a/libc/arch-aarch64/include/machine/kernel.h b/libc/arch-aarch64/include/machine/kernel.h new file mode 100644 index 000000000..070e704ed --- /dev/null +++ b/libc/arch-aarch64/include/machine/kernel.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +#ifndef _ARCH_AARCH64_KERNEL_H +#define _ARCH_AARCH64_KERNEL_H + +/* this file contains kernel-specific definitions that were optimized out of + our processed kernel headers, but still useful nonetheless... */ + +typedef unsigned long __kernel_blkcnt_t; +typedef unsigned long __kernel_blksize_t; + +/* these aren't really defined by the kernel headers though... */ +typedef unsigned long __kernel_fsblkcnt_t; +typedef unsigned long __kernel_fsfilcnt_t; +typedef unsigned int __kernel_id_t; + +#endif /* _ARCH_ARM_KERNEL_H */ + diff --git a/libc/arch-aarch64/include/machine/limits.h b/libc/arch-aarch64/include/machine/limits.h new file mode 100644 index 000000000..ecddb01f4 --- /dev/null +++ b/libc/arch-aarch64/include/machine/limits.h @@ -0,0 +1,62 @@ +/* $OpenBSD: limits.h,v 1.3 2006/01/06 22:48:46 millert Exp $ */ +/* $NetBSD: limits.h,v 1.4 2003/04/28 23:16:18 bjh21 Exp $ */ + +/* + * Copyright (c) 1988 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. + * 3. 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: @(#)limits.h 7.2 (Berkeley) 6/28/90 + */ + +#ifndef _AARCH64_LIMITS_H_ +#define _AARCH64_LIMITS_H_ + +#include + +#define MB_LEN_MAX 1 /* no multibyte characters */ + +#define LONGLONG_BIT 64 +#define LONGLONG_MIN (-9223372036854775807LL-1) +#define LONGLONG_MAX 9223372036854775807LL +#define ULONGLONG_MAX 18446744073709551615ULL + +#ifndef SIZE_MAX +#define SIZE_MAX ULONGLONG_MAX /* max value for a size_t */ +#endif +#ifndef SSIZE_MAX +#define SSIZE_MAX LONGLONG_MAX /* max value for a ssize_t */ +#endif + +#if __BSD_VISIBLE +#define SIZE_T_MAX ULONG_MAX /* max value for a size_t (historic) */ + +#define UQUAD_MAX 0xffffffffffffffffULL /* max unsigned quad */ +#define QUAD_MAX 0x7fffffffffffffffLL /* max signed quad */ +#define QUAD_MIN (-0x7fffffffffffffffLL-1) /* min signed quad */ + +#endif /* __BSD_VISIBLE */ +#endif /* _AARCH64_LIMITS_H_ */ diff --git a/libc/arch-aarch64/include/machine/setjmp.h b/libc/arch-aarch64/include/machine/setjmp.h new file mode 100644 index 000000000..1c237da56 --- /dev/null +++ b/libc/arch-aarch64/include/machine/setjmp.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * 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. + * + * 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 OWNER 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. + */ + +/* + * machine/setjmp.h: machine dependent setjmp-related information. + */ + +/* _JBLEN is the size of a jmp_buf in longs(64bit on AArch64) */ +#define _JBLEN 32 + +/* According to AARCH64 PCS document we need to save the following + * registers: + * + * Core x19 - x30, sp (see section 5.1.1) + * VFP d8 - d15 (see section 5.1.2) + * + * NOTE: All the registers saved here will have 64bit vales (except FPSR). + * AAPCS mandates that the higher part of q registers does not need to + * be saveved by the callee. + */ + +/* The structure of jmp_buf for AArch64: + * + * NOTE: _JBLEN is the size of jmp_buf in longs(64bit on AArch64)! The table + * below computes the offsets in words(32bit). + * + * word name description + * 0 magic magic number + * 1 sigmask signal mask (not used with _setjmp / _longjmp) + * 2 core_base base of core registers (x19-x30, sp) + * 28 float_base base of float registers (d8-d15) + * 44 reserved reserved entries (room to grow) + * 64 + * + * + * NOTE: The instructions that load/store core/vfp registers expect 8-byte + * alignment. Contrary to the previous setjmp header for ARM we do not + * need to save status/control registers for VFP (it is not a + * requirement for setjmp). + */ + +#define _JB_MAGIC 0 +#define _JB_SIGMASK (_JB_MAGIC+1) +#define _JB_CORE_BASE (_JB_SIGMASK+1) +#define _JB_FLOAT_BASE (_JB_CORE_BASE + (31-19+1)*2) + +#define _JB_MAGIC__SETJMP 0x53657200 +#define _JB_MAGIC_SETJMP 0x53657201 diff --git a/libc/arch-common/bionic/__dso_handle.h b/libc/arch-common/bionic/__dso_handle.h index e67ce7c70..d4bff7780 100644 --- a/libc/arch-common/bionic/__dso_handle.h +++ b/libc/arch-common/bionic/__dso_handle.h @@ -30,5 +30,9 @@ #ifndef CRT_LEGACY_WORKAROUND __attribute__ ((visibility ("hidden"))) #endif +#ifdef __aarch64__ +__attribute__ ((section (".data"))) +#else __attribute__ ((section (".bss"))) +#endif void *__dso_handle = (void *) 0; diff --git a/libc/arch-common/bionic/__dso_handle_so.h b/libc/arch-common/bionic/__dso_handle_so.h index 732799bf3..fab328a1c 100644 --- a/libc/arch-common/bionic/__dso_handle_so.h +++ b/libc/arch-common/bionic/__dso_handle_so.h @@ -29,4 +29,8 @@ __attribute__ ((visibility ("hidden"))) __attribute__ ((section (".data"))) +#ifdef __aarch64__ +void *__dso_handle = (void *) 0; +#else void *__dso_handle = &__dso_handle; +#endif diff --git a/libc/private/__get_tls.h b/libc/private/__get_tls.h index 5f9451d28..04c5fdbbf 100644 --- a/libc/private/__get_tls.h +++ b/libc/private/__get_tls.h @@ -29,11 +29,10 @@ #ifndef __BIONIC_PRIVATE_GET_TLS_H_ #define __BIONIC_PRIVATE_GET_TLS_H_ -#if defined(__arm__) -# define __get_tls() \ - ({ void** __val; \ - __asm__("mrc p15, 0, %0, c13, c0, 3" : "=r"(__val)); \ - __val; }) +#if defined(__aarch64__) +# define __get_tls() ({ void** __val; __asm__("mrs %0, tpidr_el0" : "=r"(__val)); __val; }) +#elif defined(__arm__) +# define __get_tls() ({ void** __val; __asm__("mrc p15, 0, %0, c13, c0, 3" : "=r"(__val)); __val; }) #elif defined(__mips__) # define __get_tls() \ /* On mips32r1, this goes via a kernel illegal instruction trap that's optimized for v1. */ \ @@ -44,15 +43,9 @@ ".set pop\n" : "=r"(__val)); \ __val; }) #elif defined(__i386__) -# define __get_tls() \ - ({ void** __val; \ - __asm__("movl %%gs:0, %0" : "=r"(__val)); \ - __val; }) +# define __get_tls() ({ void** __val; __asm__("movl %%gs:0, %0" : "=r"(__val)); __val; }) #elif defined(__x86_64__) -# define __get_tls() \ - ({ void** __val; \ - __asm__("mov %%fs:0, %0" : "=r"(__val)); \ - __val; }) +# define __get_tls() ({ void** __val; __asm__("mov %%fs:0, %0" : "=r"(__val)); __val; }) #else #error unsupported architecture #endif