* sysdeps/unix/sysv/linux/arm/dl-procinfo.c (_dl_arm_cap_flags):
authorDaniel Jacobowitz <dan@codesourcery.com>
Thu, 21 Sep 2006 18:39:51 +0000 (18:39 +0000)
committerDaniel Jacobowitz <dan@codesourcery.com>
Thu, 21 Sep 2006 18:39:51 +0000 (18:39 +0000)
Add "java" and "iwmmxt".
* sysdeps/unix/sysv/linux/arm/dl-procinfo.h: Use <sysdep.h> for
HWCAP values.
(_DL_HWCAP_COUNT): Increase to 10.
* sysdeps/unix/sysv/linux/arm/sysdep.h (HWCAP_ARM_SWP,
HWCAP_ARM_HALF, HWCAP_ARM_THUMB, HWCAP_ARM_26BIT,
HWCAP_ARM_FAST_MULT, HWCAP_ARM_FPA, HWCAP_ARM_VFP, HWCAP_ARM_EDSP,
HWCAP_ARM_JAVA, HWCAP_ARM_IWMMXT): Define.
* sysdeps/arm/eabi/setjmp.S (__sigsetjmp): Save iWMMXt registers
if HWCAP_ARM_IWMMXT set.  Don't include <asm/procinfo.h>.  Use
HWCAP_ARM_VFP instead of HWCAP_VFP.
* sysdeps/arm/eabi/__longjmp.S (__longjmp): Restore iWMMXt
registers if HWCAP_ARM_IWMMXT set.  Don't include
<asm/procinfo.h>.  Use HWCAP_ARM_VFP instead of HWCAP_VFP.

ChangeLog.arm
sysdeps/arm/eabi/__longjmp.S
sysdeps/arm/eabi/setjmp.S
sysdeps/unix/sysv/linux/arm/dl-procinfo.c
sysdeps/unix/sysv/linux/arm/dl-procinfo.h
sysdeps/unix/sysv/linux/arm/sysdep.h

index 3effa9d..45e8a87 100644 (file)
@@ -1,3 +1,21 @@
+2006-09-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/unix/sysv/linux/arm/dl-procinfo.c (_dl_arm_cap_flags):
+       Add "java" and "iwmmxt".
+       * sysdeps/unix/sysv/linux/arm/dl-procinfo.h: Use <sysdep.h> for
+       HWCAP values.
+       (_DL_HWCAP_COUNT): Increase to 10.
+       * sysdeps/unix/sysv/linux/arm/sysdep.h (HWCAP_ARM_SWP,
+       HWCAP_ARM_HALF, HWCAP_ARM_THUMB, HWCAP_ARM_26BIT,
+       HWCAP_ARM_FAST_MULT, HWCAP_ARM_FPA, HWCAP_ARM_VFP, HWCAP_ARM_EDSP,
+       HWCAP_ARM_JAVA, HWCAP_ARM_IWMMXT): Define.
+       * sysdeps/arm/eabi/setjmp.S (__sigsetjmp): Save iWMMXt registers
+       if HWCAP_ARM_IWMMXT set.  Don't include <asm/procinfo.h>.  Use
+       HWCAP_ARM_VFP instead of HWCAP_VFP.
+       * sysdeps/arm/eabi/__longjmp.S (__longjmp): Restore iWMMXt
+       registers if HWCAP_ARM_IWMMXT set.  Don't include
+       <asm/procinfo.h>.  Use HWCAP_ARM_VFP instead of HWCAP_VFP.
+
 2006-09-21  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * sysdeps/arm/dl-machine.h (elf_machine_rel): Handle undefined
index 5677633..fff25cd 100644 (file)
@@ -1,5 +1,5 @@
 /* longjmp for ARM.
-   Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,8 +21,6 @@
 #define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
-#define __ASSEMBLY__
-#include <asm/procinfo.h>
 #include <rtld-global-offsets.h>
 
 /* __longjmp(jmpbuf, val) */
@@ -53,7 +51,7 @@ ENTRY (__longjmp)
 #endif
 #endif
 
-       tst     a2, #HWCAP_VFP
+       tst     a2, #HWCAP_ARM_VFP
        beq     Lno_vfp
 
        /* Restore the VFP registers.  */
@@ -65,6 +63,19 @@ ENTRY (__longjmp)
        mcr     p10, 7, r1, cr1, cr0, 0
 Lno_vfp:
 
+       tst     a2, #HWCAP_ARM_IWMMXT
+       beq     Lno_iwmmxt
+
+       /* Restore the call-preserved iWMMXt registers.  */
+       /* Following instructions are wldrd wr10, [ip], #8 (etc.)  */
+       ldcl    p1, cr10, [r12], #8
+       ldcl    p1, cr11, [r12], #8
+       ldcl    p1, cr12, [r12], #8
+       ldcl    p1, cr13, [r12], #8
+       ldcl    p1, cr14, [r12], #8
+       ldcl    p1, cr15, [r12], #8
+Lno_iwmmxt:
+
        DO_RET(lr)
 
 #ifdef IS_IN_rtld
index d9ad26a..b7d2400 100644 (file)
@@ -1,5 +1,5 @@
 /* setjmp for ARM.
-   Copyright (C) 1997, 1998, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,8 +21,6 @@
 #define _SETJMP_H
 #define _ASM
 #include <bits/setjmp.h>
-#define __ASSEMBLY__
-#include <asm/procinfo.h>
 #include <rtld-global-offsets.h>
 
 ENTRY (__sigsetjmp)
@@ -51,7 +49,7 @@ ENTRY (__sigsetjmp)
 #endif
 #endif
 
-       tst     a3, #HWCAP_VFP
+       tst     a3, #HWCAP_ARM_VFP
        beq     Lno_vfp
 
        /* Store the VFP registers.  */
@@ -63,6 +61,19 @@ ENTRY (__sigsetjmp)
        str     r2, [ip], #4
 Lno_vfp:
 
+       tst     a3, #HWCAP_ARM_IWMMXT
+       beq     Lno_iwmmxt
+
+       /* Save the call-preserved iWMMXt registers.  */
+       /* Following instructions are wstrd wr10, [ip], #8 (etc.)  */
+       stcl    p1, cr10, [r12], #8
+       stcl    p1, cr11, [r12], #8
+       stcl    p1, cr12, [r12], #8
+       stcl    p1, cr13, [r12], #8
+       stcl    p1, cr14, [r12], #8
+       stcl    p1, cr15, [r12], #8
+Lno_iwmmxt:
+
        /* Make a tail call to __sigjmp_save; it takes the same args.  */
        B       PLTJMP(C_SYMBOL_NAME(__sigjmp_save))
 
index 9b87a20..5c913f5 100644 (file)
@@ -1,5 +1,5 @@
 /* Data for Linux/ARM version of processor capability information.
-   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001.
 
 #if !defined PROCINFO_DECL && defined SHARED
   ._dl_arm_cap_flags
 #else
-PROCINFO_CLASS const char _dl_arm_cap_flags[8][10]
+PROCINFO_CLASS const char _dl_arm_cap_flags[10][10]
 #endif
 #ifndef PROCINFO_DECL
 = {
     "swp", "half", "thumb", "26bit", "fast-mult", "fpa", "vfp", "edsp",
+    "java", "iwmmxt",
   }
 #endif
 #if !defined SHARED || defined PROCINFO_DECL
index 35b3334..0c675c6 100644 (file)
@@ -1,5 +1,5 @@
 /* Linux/ARM version of processor capability information handling macros.
-   Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2004, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001.
 
@@ -22,8 +22,9 @@
 #define _DL_PROCINFO_H 1
 
 #include <ldsodefs.h>
+#include <sysdep.h>
 
-#define _DL_HWCAP_COUNT 8
+#define _DL_HWCAP_COUNT 10
 
 /* The kernel provides platform data but it is not interesting.  */
 #define _DL_HWCAP_PLATFORM     0
@@ -53,19 +54,7 @@ _dl_hwcap_string (int idx)
   return GLRO(dl_arm_cap_flags)[idx];
 };
 
-enum
-{
-  HWCAP_ARM_SWP              = 1 << 0,
-  HWCAP_ARM_HALF      = 1 << 1,
-  HWCAP_ARM_THUMB     = 1 << 2,
-  HWCAP_ARM_26BIT     = 1 << 3,
-  HWCAP_ARM_FAST_MULT = 1 << 4,
-  HWCAP_ARM_FPA       = 1 << 5,
-  HWCAP_ARM_VFP       = 1 << 6,
-  HWCAP_ARM_EDSP      = 1 << 7,
-
-  HWCAP_IMPORTANT = (HWCAP_ARM_HALF | HWCAP_ARM_FAST_MULT)
-};
+#define HWCAP_IMPORTANT                (HWCAP_ARM_HALF | HWCAP_ARM_FAST_MULT)
 
 static inline int
 __attribute__ ((unused))
index e40add3..7692c1c 100644 (file)
 #define SYS_ify(syscall_name)  (__NR_##syscall_name)
 
 
+/* The following must match the kernel's <asm/procinfo.h>.  */
+#define HWCAP_ARM_SWP          1
+#define HWCAP_ARM_HALF         2
+#define HWCAP_ARM_THUMB                4
+#define HWCAP_ARM_26BIT                8
+#define HWCAP_ARM_FAST_MULT    16
+#define HWCAP_ARM_FPA          32
+#define HWCAP_ARM_VFP          64
+#define HWCAP_ARM_EDSP         128
+#define HWCAP_ARM_JAVA         256
+#define HWCAP_ARM_IWMMXT       512
+
 #ifdef __ASSEMBLER__
 
 /* Linux uses a negative return value to indicate syscall errors,