yann@1625: http://yann.poupet.free.fr/ep93xx/ yann@1625: Add support for the Maverick Crunch FPU on Cirrus EP93XX processor series yann@1625: yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/bits/endian.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/bits/endian.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/bits/endian.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/bits/endian.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -12,7 +12,7 @@ yann@1625: /* FPA floating point units are always big-endian, irrespective of the yann@1625: CPU endianness. VFP floating point units use the same endianness yann@1625: as the rest of the system. */ yann@1625: -#ifdef __VFP_FP__ yann@1625: +#if defined __VFP_FP__ || defined __MAVERICK__ yann@1625: #define __FLOAT_WORD_ORDER __BYTE_ORDER yann@1625: #else yann@1625: #define __FLOAT_WORD_ORDER __BIG_ENDIAN yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/__longjmp.S glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/__longjmp.S yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/__longjmp.S 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/__longjmp.S 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -30,7 +30,33 @@ yann@1625: movs r0, r1 /* get the return value in place */ yann@1625: moveq r0, #1 /* can't let setjmp() return zero! */ yann@1625: yann@1625: +#ifdef __MAVERICK__ yann@1625: + cfldrd mvd4, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd5, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd6, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd7, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd8, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd9, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd10, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd11, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd12, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd13, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd14, [ip], #8 yann@1625: + nop yann@1625: + cfldrd mvd15, [ip], #8 yann@1625: +#else yann@1625: lfmfd f4, 4, [ip] ! /* load the floating point regs */ yann@1625: +#endif yann@1625: yann@1625: LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc}) yann@1625: END (__longjmp) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/fenv.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/fenv.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/fenv.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/fenv.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -20,6 +20,45 @@ yann@1625: # error "Never use directly; include instead." yann@1625: #endif yann@1625: yann@1625: +#if defined(__MAVERICK__) yann@1625: + yann@1625: +/* Define bits representing exceptions in the FPU status word. */ yann@1625: +enum yann@1625: + { yann@1625: + FE_INVALID = 1, yann@1625: +#define FE_INVALID FE_INVALID yann@1625: + FE_OVERFLOW = 4, yann@1625: +#define FE_OVERFLOW FE_OVERFLOW yann@1625: + FE_UNDERFLOW = 8, yann@1625: +#define FE_UNDERFLOW FE_UNDERFLOW yann@1625: + FE_INEXACT = 16, yann@1625: +#define FE_INEXACT FE_INEXACT yann@1625: + }; yann@1625: + yann@1625: +/* Amount to shift by to convert an exception to a mask bit. */ yann@1625: +#define FE_EXCEPT_SHIFT 5 yann@1625: + yann@1625: +/* All supported exceptions. */ yann@1625: +#define FE_ALL_EXCEPT \ yann@1625: + (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) yann@1625: + yann@1625: +/* IEEE rounding modes. */ yann@1625: +enum yann@1625: + { yann@1625: + FE_TONEAREST = 0, yann@1625: +#define FE_TONEAREST FE_TONEAREST yann@1625: + FE_TOWARDZERO = 0x400, yann@1625: +#define FE_TOWARDZERO FE_TOWARDZERO yann@1625: + FE_DOWNWARD = 0x800, yann@1625: +#define FE_DOWNWARD FE_DOWNWARD yann@1625: + FE_UPWARD = 0xc00, yann@1625: +#define FE_UPWARD FE_UPWARD yann@1625: + }; yann@1625: + yann@1625: +#define FE_ROUND_MASK (FE_UPWARD) yann@1625: + yann@1625: +#else /* FPA */ yann@1625: + yann@1625: /* Define bits representing exceptions in the FPU status word. */ yann@1625: enum yann@1625: { yann@1625: @@ -44,6 +83,8 @@ yann@1625: modes exist, but you have to encode them in the actual instruction. */ yann@1625: #define FE_TONEAREST 0 yann@1625: yann@1625: +#endif yann@1625: + yann@1625: /* Type representing exception flags. */ yann@1625: typedef unsigned long int fexcept_t; yann@1625: yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/setjmp.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/setjmp.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/setjmp.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/bits/setjmp.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -28,7 +28,11 @@ yann@1625: #ifndef _ASM yann@1625: /* Jump buffer contains v1-v6, sl, fp, sp and pc. Other registers are not yann@1625: saved. */ yann@1625: +#ifdef __MAVERICK__ yann@1625: +typedef int __jmp_buf[34]; yann@1625: +#else yann@1625: typedef int __jmp_buf[22]; yann@1625: #endif yann@1625: +#endif yann@1625: yann@1625: #endif yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fegetround.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fegetround.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fegetround.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fegetround.c 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -18,9 +18,21 @@ yann@1625: 02111-1307 USA. */ yann@1625: yann@1625: #include yann@1625: +#include yann@1625: yann@1625: int yann@1625: fegetround (void) yann@1625: { yann@1625: +#if defined(__MAVERICK__) yann@1625: + yann@1625: + unsigned long temp; yann@1625: + yann@1625: + _FPU_GETCW (temp); yann@1625: + return temp & FE_ROUND_MASK; yann@1625: + yann@1625: +#else /* FPA */ yann@1625: + yann@1625: return FE_TONEAREST; /* Easy. :-) */ yann@1625: + yann@1625: +#endif yann@1625: } yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fesetround.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fesetround.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fesetround.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fesetround.c 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -18,12 +18,28 @@ yann@1625: 02111-1307 USA. */ yann@1625: yann@1625: #include yann@1625: +#include yann@1625: yann@1625: int yann@1625: fesetround (int round) yann@1625: { yann@1625: +#if defined(__MAVERICK__) yann@1625: + unsigned long temp; yann@1625: + yann@1625: + if (round & ~FE_ROUND_MASK) yann@1625: + return 1; yann@1625: + yann@1625: + _FPU_GETCW (temp); yann@1625: + temp = (temp & ~FE_ROUND_MASK) | round; yann@1625: + _FPU_SETCW (temp); yann@1625: + return 0; yann@1625: + yann@1625: +#else /* FPA */ yann@1625: + yann@1625: /* We only support FE_TONEAREST, so there is no need for any work. */ yann@1625: return (round == FE_TONEAREST)?0:1; yann@1625: + yann@1625: +#endif yann@1625: } yann@1625: yann@1625: libm_hidden_def (fesetround) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fpu_control.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fpu_control.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/fpu_control.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/fpu_control.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -1,5 +1,6 @@ yann@1625: /* FPU control word definitions. ARM version. yann@1625: - Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. yann@1625: + Copyright (C) 1996, 1997, 1998, 2000, 2005 yann@1625: + Free Software Foundation, Inc. yann@1625: This file is part of the GNU C Library. yann@1625: yann@1625: The GNU C Library is free software; you can redistribute it and/or yann@1625: @@ -20,6 +21,79 @@ yann@1625: #ifndef _FPU_CONTROL_H yann@1625: #define _FPU_CONTROL_H yann@1625: yann@1625: +#if defined(__MAVERICK__) yann@1625: + yann@1625: +/* DSPSC register: (from EP9312 User's Guide) yann@1625: + * yann@1625: + * bits 31..29 - DAID yann@1625: + * bits 28..26 - HVID yann@1625: + * bits 25..24 - RSVD yann@1625: + * bit 23 - ISAT yann@1625: + * bit 22 - UI yann@1625: + * bit 21 - INT yann@1625: + * bit 20 - AEXC yann@1625: + * bits 19..18 - SAT yann@1625: + * bits 17..16 - FCC yann@1625: + * bit 15 - V yann@1625: + * bit 14 - FWDEN yann@1625: + * bit 13 - Invalid yann@1625: + * bit 12 - Denorm yann@1625: + * bits 11..10 - RM yann@1625: + * bits 9..5 - IXE, UFE, OFE, RSVD, IOE yann@1625: + * bits 4..0 - IX, UF, OF, RSVD, IO yann@1625: + */ yann@1625: + yann@1625: +/* masking of interrupts */ yann@1625: +#define _FPU_MASK_IM (1 << 5) /* invalid operation */ yann@1625: +#define _FPU_MASK_ZM 0 /* divide by zero */ yann@1625: +#define _FPU_MASK_OM (1 << 7) /* overflow */ yann@1625: +#define _FPU_MASK_UM (1 << 8) /* underflow */ yann@1625: +#define _FPU_MASK_PM (1 << 9) /* inexact */ yann@1625: +#define _FPU_MASK_DM 0 /* denormalized operation */ yann@1625: + yann@1625: +#define _FPU_RESERVED 0xfffff000 /* These bits are reserved. */ yann@1625: + yann@1625: +#define _FPU_DEFAULT 0x00b00000 /* Default value. */ yann@1625: +#define _FPU_IEEE 0x00b003a0 /* Default + exceptions enabled. */ yann@1625: + yann@1625: +/* Type of the control word. */ yann@1625: +typedef unsigned int fpu_control_t; yann@1625: + yann@1625: +/* Macros for accessing the hardware control word. */ yann@1625: +#define _FPU_GETCW(cw) ({ \ yann@1625: + register int __t1, __t2; \ yann@1625: + \ yann@1625: + __asm__ volatile ( \ yann@1625: + "cfmvr64l %1, mvdx0\n\t" \ yann@1625: + "cfmvr64h %2, mvdx0\n\t" \ yann@1625: + "cfmv32sc mvdx0, dspsc\n\t" \ yann@1625: + "cfmvr64l %0, mvdx0\n\t" \ yann@1625: + "cfmv64lr mvdx0, %1\n\t" \ yann@1625: + "cfmv64hr mvdx0, %2" \ yann@1625: + : "=r" (cw), "=r" (__t1), "=r" (__t2) \ yann@1625: + ); \ yann@1625: +}) yann@1625: + yann@1625: +#define _FPU_SETCW(cw) ({ \ yann@1625: + register int __t0, __t1, __t2; \ yann@1625: + \ yann@1625: + __asm__ volatile ( \ yann@1625: + "cfmvr64l %1, mvdx0\n\t" \ yann@1625: + "cfmvr64h %2, mvdx0\n\t" \ yann@1625: + "cfmv64lr mvdx0, %0\n\t" \ yann@1625: + "cfmvsc32 dspsc, mvdx0\n\t" \ yann@1625: + "cfmv64lr mvdx0, %1\n\t" \ yann@1625: + "cfmv64hr mvdx0, %2" \ yann@1625: + : "=r" (__t0), "=r" (__t1), "=r" (__t2) \ yann@1625: + : "0" (cw) \ yann@1625: + ); \ yann@1625: +}) yann@1625: + yann@1625: +/* Default control word set at startup. */ yann@1625: +extern fpu_control_t __fpu_control; yann@1625: + yann@1625: +#else /* FPA */ yann@1625: + yann@1625: /* We have a slight terminology confusion here. On the ARM, the register yann@1625: * we're interested in is actually the FPU status word - the FPU control yann@1625: * word is something different (which is implementation-defined and only yann@1625: @@ -99,4 +173,6 @@ yann@1625: /* Default control word set at startup. */ yann@1625: extern fpu_control_t __fpu_control; yann@1625: yann@1625: +#endif yann@1625: + yann@1625: #endif /* _FPU_CONTROL_H */ yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/jmpbuf-offsets.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/jmpbuf-offsets.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/jmpbuf-offsets.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/jmpbuf-offsets.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -17,4 +17,8 @@ yann@1625: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA yann@1625: 02111-1307 USA. */ yann@1625: yann@1625: +#ifdef __MAVERICK__ yann@1625: +#define __JMP_BUF_SP 32 yann@1625: +#else yann@1625: #define __JMP_BUF_SP 20 yann@1625: +#endif yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/setjmp.S glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/setjmp.S yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/fpu/setjmp.S 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/fpu/setjmp.S 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -24,11 +24,41 @@ yann@1625: yann@1625: ENTRY (__sigsetjmp) yann@1625: /* Save registers */ yann@1625: +#ifdef __MAVERICK__ yann@1625: + cfstrd mvd4, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd5, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd6, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd7, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd8, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd9, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd10, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd11, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd12, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd13, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd14, [r0], #8 yann@1625: + nop yann@1625: + cfstrd mvd15, [r0], #8 yann@1625: +#else yann@1625: sfmea f4, 4, [r0]! yann@1625: +#endif yann@1625: stmia r0, {v1-v6, sl, fp, sp, lr} yann@1625: yann@1625: /* Restore pointer to jmp_buf */ yann@1625: +#ifdef __MAVERICK__ yann@1625: + sub r0, r0, #96 yann@1625: +#else yann@1625: sub r0, r0, #48 yann@1625: +#endif yann@1625: yann@1625: /* Make a tail call to __sigjmp_save; it takes the same args. */ yann@1625: B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/gccframe.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/gccframe.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/gccframe.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/gccframe.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -17,6 +17,10 @@ yann@1625: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA yann@1625: 02111-1307 USA. */ yann@1625: yann@1625: +#ifdef __MAVERICK__ yann@1625: +#define FIRST_PSEUDO_REGISTER 43 yann@1625: +#else yann@1625: #define FIRST_PSEUDO_REGISTER 27 yann@1625: +#endif yann@1625: yann@1625: #include yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/gmp-mparam.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/gmp-mparam.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/arm/gmp-mparam.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/arm/gmp-mparam.h 2009-11-13 00:51:22.000000000 +0100 yann@1625: @@ -29,7 +29,7 @@ yann@1625: #if defined(__ARMEB__) yann@1625: # define IEEE_DOUBLE_MIXED_ENDIAN 0 yann@1625: # define IEEE_DOUBLE_BIG_ENDIAN 1 yann@1625: -#elif defined(__VFP_FP__) yann@1625: +#elif defined(__VFP_FP__) || defined(__MAVERICK__) yann@1625: # define IEEE_DOUBLE_MIXED_ENDIAN 0 yann@1625: # define IEEE_DOUBLE_BIG_ENDIAN 0 yann@1625: #else yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/bits/endian.h glibc-2.10.1/ports/sysdeps/arm/bits/endian.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/__longjmp.S glibc-2.10.1/ports/sysdeps/arm/fpu/__longjmp.S yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/bits/fenv.h glibc-2.10.1/ports/sysdeps/arm/fpu/bits/fenv.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/bits/setjmp.h glibc-2.10.1/ports/sysdeps/arm/fpu/bits/setjmp.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/fegetround.c glibc-2.10.1/ports/sysdeps/arm/fpu/fegetround.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/fesetround.c glibc-2.10.1/ports/sysdeps/arm/fpu/fesetround.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/fpu_control.h glibc-2.10.1/ports/sysdeps/arm/fpu/fpu_control.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/jmpbuf-offsets.h glibc-2.10.1/ports/sysdeps/arm/fpu/jmpbuf-offsets.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/fpu/setjmp.S glibc-2.10.1/ports/sysdeps/arm/fpu/setjmp.S yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/gccframe.h glibc-2.10.1/ports/sysdeps/arm/gccframe.h yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/arm/gmp-mparam.h glibc-2.10.1/ports/sysdeps/arm/gmp-mparam.h