about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-11-21 20:26:56 +0000
committerJoseph Myers <joseph@codesourcery.com>2012-11-21 20:26:56 +0000
commitad35f2dd750ed3e3f483409ef50b38ea19745002 (patch)
tree64d4f4be507055e344438505aee94c81c7ef3f81
parent09e958ed423b99f97f5fd4b101964dfc9e3b32c0 (diff)
downloadglibc-ad35f2dd750ed3e3f483409ef50b38ea19745002.tar.gz
glibc-ad35f2dd750ed3e3f483409ef50b38ea19745002.tar.xz
glibc-ad35f2dd750ed3e3f483409ef50b38ea19745002.zip
Make ARM fesetenv (FE_NOMASK_ENV) detect failure (bug 14866).
-rw-r--r--NEWS2
-rw-r--r--ports/ChangeLog.arm6
-rw-r--r--ports/sysdeps/arm/fesetenv.c10
3 files changed, 17 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index f78758a903..9eb0a10ab6 100644
--- a/NEWS
+++ b/NEWS
@@ -21,7 +21,7 @@ Version 2.17
   14638, 14645, 14648, 14652, 14660, 14661, 14669, 14672, 14683, 14694,
   14716, 14719, 14743, 14767, 14783, 14784, 14785, 14793, 14796, 14797,
   14801, 14805, 14807, 14809, 14811, 14815, 14821, 14824, 14828, 14831,
-  14835, 14838, 14856.
+  14835, 14838, 14856, 14866.
 
 * Port to ARM AArch64 contributed by Linaro.
 
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm
index d060121311..2a56a9f643 100644
--- a/ports/ChangeLog.arm
+++ b/ports/ChangeLog.arm
@@ -1,3 +1,9 @@
+2012-11-21  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #14866]
+	* sysdeps/arm/fesetenv.c (__fesetenv): Test whether bits for
+	trapping exceptions were successfully set for FE_NOMASK_ENV.
+
 2012-11-14  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
 
 	* sysdeps/unix/sysv/linux/arm/Makefile (libcrypt-sysdep_routines): Add
diff --git a/ports/sysdeps/arm/fesetenv.c b/ports/sysdeps/arm/fesetenv.c
index 2fad61da1a..e92f9f5ac8 100644
--- a/ports/sysdeps/arm/fesetenv.c
+++ b/ports/sysdeps/arm/fesetenv.c
@@ -40,6 +40,16 @@ __fesetenv (const fenv_t *envp)
 
       _FPU_SETCW (temp);
 
+      if (envp == FE_NOMASK_ENV)
+	{
+	  /* VFPv3 and VFPv4 do not support trapping exceptions, so
+	     test whether the relevant bits were set and fail if
+	     not.  */
+	  _FPU_GETCW (temp);
+	  if ((temp & _FPU_IEEE) != _FPU_IEEE)
+	    return 1;
+	}
+
       /* Success.  */
       return 0;
     }