]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
S/390: Disable two UTF conversion instructions
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 11 Feb 2010 15:22:58 +0000 (07:22 -0800)
committerUlrich Drepper <drepper@redhat.com>
Thu, 11 Feb 2010 15:22:58 +0000 (07:22 -0800)
ChangeLog
sysdeps/s390/s390-64/utf16-utf32-z9.c
sysdeps/s390/s390-64/utf8-utf16-z9.c

index be8ba294fbdbf1d670b070a817d918112428602e..b13a74ca2fab0747429065fc1f7fb3d63425b9ba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-11  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * sysdeps/s390/s390-64/utf8-utf16-z9.c: Disable hardware
+       instructions cu21 and cu24.  Add well-formedness checking
+       parameter and adjust the software implementation.
+       * sysdeps/s390/s390-64/utf16-utf32-z9.c: Likewise.
+
 2010-02-10  Ulrich Drepper  <drepper@redhat.com>
 
        [BZ #11271]
index 868dea68ca1d974a649177abab7e50998bef61b9..14daf2118fe54b8c26c6daa358a26ac5cf9a031e 100644 (file)
@@ -203,7 +203,10 @@ gconv_end (struct __gconv_step *data)
    swapping).  */
 #define BODY                                                           \
   {                                                                    \
-    if (GLRO (dl_hwcap) & HWCAP_S390_ETF3EH)                           \
+    /* The hardware instruction currently fails to report an error for \
+       isolated low surrogates so we have to disable the instruction   \
+       until this gets resolved.  */                                   \
+    if (0) /* (GLRO (dl_hwcap) & HWCAP_S390_ETF3EH) */                 \
       {                                                                        \
        HARDWARE_CONVERT ("cu24 %0, %1, 1");                            \
        if (inptr != inend)                                             \
@@ -229,6 +232,12 @@ gconv_end (struct __gconv_step *data)
       }                                                                        \
     else                                                               \
       {                                                                        \
+        /* An isolated low-surrogate was found.  This has to be         \
+          considered ill-formed.  */                                   \
+        if (__builtin_expect (u1 >= 0xdc00, 0))                                \
+         {                                                             \
+           STANDARD_FROM_LOOP_ERR_HANDLER (2);                         \
+         }                                                             \
        /* It's a surrogate character.  At least the first word says    \
           it is.  */                                                   \
        if (__builtin_expect (inptr + 4 > inend, 0))                    \
index 531d3ebd4b914f1a8be1114fc0bc227982bcdf93..5f73f3c59e21084dbaca9e89b225bfbc29b4bca1 100644 (file)
@@ -345,9 +345,12 @@ gconv_end (struct __gconv_step *data)
    Operation.  */
 #define BODY                                                           \
   {                                                                    \
-    if (GLRO (dl_hwcap) & HWCAP_S390_ETF3EH)                           \
+    /* The hardware instruction currently fails to report an error for \
+       isolated low surrogates so we have to disable the instruction   \
+       until this gets resolved.  */                                   \
+    if (0) /* (GLRO (dl_hwcap) & HWCAP_S390_ETF3EH) */                 \
       {                                                                        \
-       HARDWARE_CONVERT ("cu21 %0, %1");                               \
+       HARDWARE_CONVERT ("cu21 %0, %1, 1");                            \
        if (inptr != inend)                                             \
          {                                                             \
            /* Check if the third byte is                               \
@@ -388,7 +391,7 @@ gconv_end (struct __gconv_step *data)
                                                                        \
        outptr += 2;                                                    \
       }                                                                        \
-    else if (c >= 0x0800 && c <= 0xd7ff)                               \
+    else if ((c >= 0x0800 && c <= 0xd7ff) || c > 0xdfff)               \
       {                                                                        \
        /* Three byte UTF-8 char.  */                                   \
                                                                        \