mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-25 05:35:23 +08:00
AArch64 [8/10] Fixup botched commit.
From-SVN: r192733
This commit is contained in:
parent
24034425f5
commit
d507e9a340
68
libgcc/config/aarch64/crti.S
Normal file
68
libgcc/config/aarch64/crti.S
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# Machine description for AArch64 architecture.
|
||||||
|
# Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
# Contributed by ARM Ltd.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
# later version.
|
||||||
|
#
|
||||||
|
# This file is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
# permissions described in the GCC Runtime Library Exception, version
|
||||||
|
# 3.1, as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License and
|
||||||
|
# a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
# see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
/* An executable stack is *not* required for these functions. */
|
||||||
|
#if defined(__ELF__) && defined(__linux__)
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
||||||
|
.previous
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# This file creates a stack frame for the contents of the .fini and
|
||||||
|
# .init sections. Users may put any desired instructions in those
|
||||||
|
# sections.
|
||||||
|
|
||||||
|
#ifdef __ELF__
|
||||||
|
#define TYPE(x) .type x,function
|
||||||
|
#else
|
||||||
|
#define TYPE(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# Note - this macro is complemented by the FUNC_END macro
|
||||||
|
# in crtn.S. If you change this macro you must also change
|
||||||
|
# that macro match.
|
||||||
|
.macro FUNC_START
|
||||||
|
# Create a stack frame and save any call-preserved registers
|
||||||
|
stp x29, x30, [sp, #-16]!
|
||||||
|
stp x27, x28, [sp, #-16]!
|
||||||
|
stp x25, x26, [sp, #-16]!
|
||||||
|
stp x23, x24, [sp, #-16]!
|
||||||
|
stp x21, x22, [sp, #-16]!
|
||||||
|
stp x19, x20, [sp, #-16]!
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.section ".init"
|
||||||
|
.align 2
|
||||||
|
.global _init
|
||||||
|
TYPE(_init)
|
||||||
|
_init:
|
||||||
|
FUNC_START
|
||||||
|
|
||||||
|
|
||||||
|
.section ".fini"
|
||||||
|
.align 2
|
||||||
|
.global _fini
|
||||||
|
TYPE(_fini)
|
||||||
|
_fini:
|
||||||
|
FUNC_START
|
||||||
|
|
||||||
|
# end of crti.S
|
61
libgcc/config/aarch64/crtn.S
Normal file
61
libgcc/config/aarch64/crtn.S
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# Machine description for AArch64 architecture.
|
||||||
|
# Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
# Contributed by ARM Ltd.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by the
|
||||||
|
# Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
# later version.
|
||||||
|
#
|
||||||
|
# This file is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
# permissions described in the GCC Runtime Library Exception, version
|
||||||
|
# 3.1, as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License and
|
||||||
|
# a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
# see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
/* An executable stack is *not* required for these functions. */
|
||||||
|
#if defined(__ELF__) && defined(__linux__)
|
||||||
|
.section .note.GNU-stack,"",%progbits
|
||||||
|
.previous
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# This file just makes sure that the .fini and .init sections do in
|
||||||
|
# fact return. Users may put any desired instructions in those sections.
|
||||||
|
# This file is the last thing linked into any executable.
|
||||||
|
|
||||||
|
# Note - this macro is complemented by the FUNC_START macro
|
||||||
|
# in crti.S. If you change this macro you must also change
|
||||||
|
# that macro match.
|
||||||
|
#
|
||||||
|
# Note - we do not try any fancy optimizations of the return
|
||||||
|
# sequences here, it is just not worth it. Instead keep things
|
||||||
|
# simple. Restore all the save resgisters, including the link
|
||||||
|
# register and then perform the correct function return instruction.
|
||||||
|
.macro FUNC_END
|
||||||
|
ldp x19, x20, [sp], #16
|
||||||
|
ldp x21, x22, [sp], #16
|
||||||
|
ldp x23, x24, [sp], #16
|
||||||
|
ldp x25, x26, [sp], #16
|
||||||
|
ldp x27, x28, [sp], #16
|
||||||
|
ldp x29, x30, [sp], #16
|
||||||
|
ret
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
.section ".init"
|
||||||
|
;;
|
||||||
|
FUNC_END
|
||||||
|
|
||||||
|
.section ".fini"
|
||||||
|
;;
|
||||||
|
FUNC_END
|
||||||
|
|
||||||
|
# end of crtn.S
|
143
libgcc/config/aarch64/linux-unwind.h
Normal file
143
libgcc/config/aarch64/linux-unwind.h
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/* Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
Contributed by ARM Ltd.
|
||||||
|
|
||||||
|
This file is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
later version.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
permissions described in the GCC Runtime Library Exception, version
|
||||||
|
3.1, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License and
|
||||||
|
a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef inhibit_libc
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/ucontext.h>
|
||||||
|
|
||||||
|
#define MD_FALLBACK_FRAME_STATE_FOR aarch64_fallback_frame_state
|
||||||
|
|
||||||
|
static _Unwind_Reason_Code
|
||||||
|
aarch64_fallback_frame_state (struct _Unwind_Context *context,
|
||||||
|
_Unwind_FrameState * fs)
|
||||||
|
{
|
||||||
|
/* The kernel creates an rt_sigframe on the stack immediately prior
|
||||||
|
to delivering a signal.
|
||||||
|
|
||||||
|
This structure must have the same shape as the linux kernel
|
||||||
|
equivalent. */
|
||||||
|
struct rt_sigframe
|
||||||
|
{
|
||||||
|
siginfo_t info;
|
||||||
|
struct ucontext uc;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rt_sigframe *rt_;
|
||||||
|
_Unwind_Ptr new_cfa;
|
||||||
|
unsigned *pc = context->ra;
|
||||||
|
struct sigcontext *sc;
|
||||||
|
struct _aarch64_ctx *extension_marker;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* A signal frame will have a return address pointing to
|
||||||
|
__default_sa_restorer. This code is hardwired as:
|
||||||
|
|
||||||
|
0xd2801168 movz x8, #0x8b
|
||||||
|
0xd4000001 svc 0x0
|
||||||
|
*/
|
||||||
|
if (pc[0] != 0xd2801168 || pc[1] != 0xd4000001)
|
||||||
|
{
|
||||||
|
return _URC_END_OF_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_ = context->cfa;
|
||||||
|
sc = &rt_->uc.uc_mcontext;
|
||||||
|
|
||||||
|
/* This define duplicates the definition in aarch64.md */
|
||||||
|
#define SP_REGNUM 31
|
||||||
|
|
||||||
|
new_cfa = (_Unwind_Ptr) sc;
|
||||||
|
fs->regs.cfa_how = CFA_REG_OFFSET;
|
||||||
|
fs->regs.cfa_reg = STACK_POINTER_REGNUM;
|
||||||
|
fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa;
|
||||||
|
|
||||||
|
for (i = 0; i < AARCH64_DWARF_NUMBER_R; i++)
|
||||||
|
{
|
||||||
|
fs->regs.reg[AARCH64_DWARF_R0 + i].how = REG_SAVED_OFFSET;
|
||||||
|
fs->regs.reg[AARCH64_DWARF_R0 + i].loc.offset =
|
||||||
|
(_Unwind_Ptr) & (sc->regs[i]) - new_cfa;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The core context may be extended with an arbitrary set of
|
||||||
|
additional contexts appended sequentially. Each additional
|
||||||
|
context contains a magic identifier and size in bytes. The size
|
||||||
|
field can be used to skip over unrecognized context extensions.
|
||||||
|
The end of the context sequence is marked by a context with magic
|
||||||
|
0 or size 0. */
|
||||||
|
for (extension_marker = (struct _aarch64_ctx *) &sc->__reserved;
|
||||||
|
extension_marker->magic;
|
||||||
|
extension_marker = (struct _aarch64_ctx *)
|
||||||
|
((unsigned char *) extension_marker + extension_marker->size))
|
||||||
|
{
|
||||||
|
if (extension_marker->magic == FPSIMD_MAGIC)
|
||||||
|
{
|
||||||
|
struct fpsimd_context *ctx =
|
||||||
|
(struct fpsimd_context *) extension_marker;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < AARCH64_DWARF_NUMBER_V; i++)
|
||||||
|
{
|
||||||
|
_Unwind_Sword offset;
|
||||||
|
|
||||||
|
fs->regs.reg[AARCH64_DWARF_V0 + i].how = REG_SAVED_OFFSET;
|
||||||
|
|
||||||
|
/* sigcontext contains 32 128bit registers for V0 to
|
||||||
|
V31. The kernel will have saved the contents of the
|
||||||
|
V registers. We want to unwind the callee save D
|
||||||
|
registers. Each D register comprises the least
|
||||||
|
significant half of the corresponding V register. We
|
||||||
|
need to offset into the saved V register dependent on
|
||||||
|
our endianness to find the saved D register. */
|
||||||
|
|
||||||
|
offset = (_Unwind_Ptr) & (ctx->vregs[i]) - new_cfa;
|
||||||
|
|
||||||
|
/* The endianness adjustment code below expects that a
|
||||||
|
saved V register is 16 bytes. */
|
||||||
|
gcc_assert (sizeof (ctx->vregs[0]) == 16);
|
||||||
|
#if defined (__AARCH64EB__)
|
||||||
|
offset = offset + 8;
|
||||||
|
#endif
|
||||||
|
fs->regs.reg[AARCH64_DWARF_V0 + i].loc.offset = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* There is context provided that we do not recognize! */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs->regs.reg[31].how = REG_SAVED_OFFSET;
|
||||||
|
fs->regs.reg[31].loc.offset = (_Unwind_Ptr) & (sc->sp) - new_cfa;
|
||||||
|
|
||||||
|
fs->signal_frame = 1;
|
||||||
|
|
||||||
|
fs->regs.reg[DWARF_ALT_FRAME_RETURN_COLUMN].how = REG_SAVED_VAL_OFFSET;
|
||||||
|
fs->regs.reg[DWARF_ALT_FRAME_RETURN_COLUMN].loc.offset =
|
||||||
|
(_Unwind_Ptr) (sc->pc) - new_cfa;
|
||||||
|
|
||||||
|
fs->retaddr_column = DWARF_ALT_FRAME_RETURN_COLUMN;
|
||||||
|
|
||||||
|
return _URC_NO_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
153
libgcc/config/aarch64/sfp-machine.h
Normal file
153
libgcc/config/aarch64/sfp-machine.h
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/* Machine description for AArch64 architecture.
|
||||||
|
Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
Contributed by ARM Ltd.
|
||||||
|
|
||||||
|
This file is part of GCC.
|
||||||
|
|
||||||
|
GCC is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GCC is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GCC; see the file COPYING3. If not see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#define _FP_W_TYPE_SIZE 64
|
||||||
|
#define _FP_W_TYPE unsigned long
|
||||||
|
#define _FP_WS_TYPE signed long
|
||||||
|
#define _FP_I_TYPE int
|
||||||
|
|
||||||
|
typedef int TItype __attribute__ ((mode (TI)));
|
||||||
|
typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
||||||
|
#define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype))
|
||||||
|
|
||||||
|
/* The type of the result of a floating point comparison. This must
|
||||||
|
match __libgcc_cmp_return__ in GCC for the target. */
|
||||||
|
typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
|
||||||
|
#define CMPtype __gcc_CMPtype
|
||||||
|
|
||||||
|
#define _FP_MUL_MEAT_Q(R,X,Y) \
|
||||||
|
_FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
|
||||||
|
|
||||||
|
#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
|
||||||
|
|
||||||
|
#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
|
||||||
|
#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1)
|
||||||
|
#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1
|
||||||
|
#define _FP_NANSIGN_S 0
|
||||||
|
#define _FP_NANSIGN_D 0
|
||||||
|
#define _FP_NANSIGN_Q 0
|
||||||
|
|
||||||
|
#define _FP_KEEPNANFRACP 1
|
||||||
|
|
||||||
|
/* This appears to be in line with the VFP conventions in the v7-a
|
||||||
|
ARM-ARM. Need to check with the v8 version. */
|
||||||
|
#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
|
||||||
|
do { \
|
||||||
|
if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
|
||||||
|
&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
|
||||||
|
{ \
|
||||||
|
R##_s = Y##_s; \
|
||||||
|
_FP_FRAC_COPY_##wc(R,Y); \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
R##_s = X##_s; \
|
||||||
|
_FP_FRAC_COPY_##wc(R,X); \
|
||||||
|
} \
|
||||||
|
R##_c = FP_CLS_NAN; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define FP_EX_INVALID 0x01
|
||||||
|
#define FP_EX_DIVZERO 0x02
|
||||||
|
#define FP_EX_OVERFLOW 0x04
|
||||||
|
#define FP_EX_UNDERFLOW 0x08
|
||||||
|
#define FP_EX_INEXACT 0x10
|
||||||
|
|
||||||
|
#define FP_HANDLE_EXCEPTIONS \
|
||||||
|
do { \
|
||||||
|
const float fp_max = __FLT_MAX__; \
|
||||||
|
const float fp_min = __FLT_MIN__; \
|
||||||
|
const float fp_1e32 = 1.0e32f; \
|
||||||
|
const float fp_zero = 0.0; \
|
||||||
|
const float fp_one = 1.0; \
|
||||||
|
unsigned fpsr; \
|
||||||
|
if (_fex & FP_EX_INVALID) \
|
||||||
|
{ \
|
||||||
|
__asm__ __volatile__ ("fdiv\ts0, %s0, %s0" \
|
||||||
|
: \
|
||||||
|
: "w" (fp_zero) \
|
||||||
|
: "s0"); \
|
||||||
|
__asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \
|
||||||
|
} \
|
||||||
|
if (_fex & FP_EX_DIVZERO) \
|
||||||
|
{ \
|
||||||
|
__asm__ __volatile__ ("fdiv\ts0, %s0, %s1" \
|
||||||
|
: \
|
||||||
|
: "w" (fp_one), "w" (fp_zero) \
|
||||||
|
: "s0"); \
|
||||||
|
__asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \
|
||||||
|
} \
|
||||||
|
if (_fex & FP_EX_OVERFLOW) \
|
||||||
|
{ \
|
||||||
|
__asm__ __volatile__ ("fadd\ts0, %s0, %s1" \
|
||||||
|
: \
|
||||||
|
: "w" (fp_max), "w" (fp_1e32) \
|
||||||
|
: "s0"); \
|
||||||
|
__asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \
|
||||||
|
} \
|
||||||
|
if (_fex & FP_EX_UNDERFLOW) \
|
||||||
|
{ \
|
||||||
|
__asm__ __volatile__ ("fmul\ts0, %s0, %s0" \
|
||||||
|
: \
|
||||||
|
: "w" (fp_min) \
|
||||||
|
: "s0"); \
|
||||||
|
__asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \
|
||||||
|
} \
|
||||||
|
if (_fex & FP_EX_INEXACT) \
|
||||||
|
{ \
|
||||||
|
__asm__ __volatile__ ("fsub\ts0, %s0, %s1" \
|
||||||
|
: \
|
||||||
|
: "w" (fp_max), "w" (fp_one) \
|
||||||
|
: "s0"); \
|
||||||
|
__asm__ __volatile__ ("mrs\t%0, fpsr" : "=r" (fpsr)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define FP_RND_NEAREST 0
|
||||||
|
#define FP_RND_ZERO 0xc00000
|
||||||
|
#define FP_RND_PINF 0x400000
|
||||||
|
#define FP_RND_MINF 0x800000
|
||||||
|
|
||||||
|
#define _FP_DECL_EX \
|
||||||
|
unsigned long int _fpcr __attribute__ ((unused)) = FP_RND_NEAREST
|
||||||
|
|
||||||
|
#define FP_INIT_ROUNDMODE \
|
||||||
|
do { \
|
||||||
|
__asm__ __volatile__ ("mrs %0, fpcr" \
|
||||||
|
: "=r" (_fpcr)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define FP_ROUNDMODE (_fpcr & 0xc00000)
|
||||||
|
|
||||||
|
#define __LITTLE_ENDIAN 1234
|
||||||
|
#define __BIG_ENDIAN 4321
|
||||||
|
|
||||||
|
#if defined __AARCH64EB__
|
||||||
|
# define __BYTE_ORDER __BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
# define __BYTE_ORDER __LITTLE_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Define ALIASNAME as a strong alias for NAME. */
|
||||||
|
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
|
||||||
|
# define _strong_alias(name, aliasname) \
|
||||||
|
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
57
libgcc/config/aarch64/sync-cache.c
Normal file
57
libgcc/config/aarch64/sync-cache.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* Machine description for AArch64 architecture.
|
||||||
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
Contributed by ARM Ltd.
|
||||||
|
|
||||||
|
This file is part of GCC.
|
||||||
|
|
||||||
|
GCC is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GCC is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GCC; see the file COPYING3. If not see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
void
|
||||||
|
__aarch64_sync_cache_range (const void *base, const void *end)
|
||||||
|
{
|
||||||
|
unsigned icache_lsize;
|
||||||
|
unsigned dcache_lsize;
|
||||||
|
static unsigned int cache_info = 0;
|
||||||
|
const char *address;
|
||||||
|
|
||||||
|
if (! cache_info)
|
||||||
|
/* CTR_EL0 [3:0] contains log2 of icache line size in words.
|
||||||
|
CTR_EL0 [19:16] contains log2 of dcache line size in words. */
|
||||||
|
asm volatile ("mrs\t%0, ctr_el0":"=r" (cache_info));
|
||||||
|
|
||||||
|
icache_lsize = 4 << (cache_info & 0xF);
|
||||||
|
dcache_lsize = 4 << ((cache_info >> 16) & 0xF);
|
||||||
|
|
||||||
|
/* Loop over the address range, clearing one cache line at once.
|
||||||
|
Data cache must be flushed to unification first to make sure the
|
||||||
|
instruction cache fetches the updated data. 'end' is exclusive,
|
||||||
|
as per the GNU definition of __clear_cache. */
|
||||||
|
|
||||||
|
for (address = base; address < (const char *) end; address += dcache_lsize)
|
||||||
|
asm volatile ("dc\tcvau, %0"
|
||||||
|
:
|
||||||
|
: "r" (address)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
|
asm volatile ("dsb\tish" : : : "memory");
|
||||||
|
|
||||||
|
for (address = base; address < (const char *) end; address += icache_lsize)
|
||||||
|
asm volatile ("ic\tivau, %0"
|
||||||
|
:
|
||||||
|
: "r" (address)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
|
asm volatile ("dsb\tish; isb" : : : "memory");
|
||||||
|
}
|
21
libgcc/config/aarch64/t-aarch64
Normal file
21
libgcc/config/aarch64/t-aarch64
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Machine description for AArch64 architecture.
|
||||||
|
# Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
# Contributed by ARM Ltd.
|
||||||
|
#
|
||||||
|
# This file is part of GCC.
|
||||||
|
#
|
||||||
|
# GCC is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# GCC is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with GCC; see the file COPYING3. If not see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
LIB2ADD += $(srcdir)/config/aarch64/sync-cache.c
|
7
libgcc/config/aarch64/t-softfp
Normal file
7
libgcc/config/aarch64/t-softfp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
softfp_float_modes := tf
|
||||||
|
softfp_int_modes := si di ti
|
||||||
|
softfp_extensions := sftf dftf
|
||||||
|
softfp_truncations := tfsf tfdf
|
||||||
|
softfp_exclude_libgcc2 := n
|
||||||
|
|
||||||
|
TARGET_LIBGCC2_CFLAGS += -Wno-missing-prototypes
|
Loading…
Reference in New Issue
Block a user