yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
34b321
From b05eb2cc7decc07ed044484861587b3490144d02 Mon Sep 17 00:00:00 2001
34b321
From: Paolo Bonzini <pbonzini@redhat.com>
34b321
Date: Wed, 8 Jun 2016 13:04:21 +0200
34b321
Subject: [PATCH 2/3] target-i386: fix pcmpxstrx equal-ordered (strstr) mode
34b321
34b321
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
34b321
Message-id: <1465391061-17748-1-git-send-email-pbonzini@redhat.com>
34b321
Patchwork-id: 70570
34b321
O-Subject: [RHEL7.3/7.2.z qemu-kvm PATCH] target-i386: fix pcmpxstrx equal-ordered (strstr) mode
34b321
Bugzilla: 1340971
34b321
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
34b321
RH-Acked-by: Thomas Huth <thuth@redhat.com>
34b321
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
34b321
34b321
Kindly requested by the Openstack folks, who sometimes uses TCG
34b321
instead of nested virt.
34b321
34b321
In this mode, referring an invalid element of the source forces the
34b321
result to false (table 4-7, last column) but referring an invalid
34b321
element of the destination forces the result to true, so the outer
34b321
loop should still be run even if some elements of the destination
34b321
will be invalid.  They will be avoided in the inner loop, which
34b321
correctly bounds "i" to validd, but they will still contribute to a
34b321
positive outcome of the search.
34b321
34b321
This fixes tst_strstr in glibc 2.17.
34b321
34b321
Reported-by: Florian Weimer <fweimer@redhat.com>
34b321
Cc: Richard Henderson <rth@twiddle.net>
34b321
Cc: Eduardo Habkost <ehabkost@redhat.com>
34b321
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
34b321
(cherry picked from commit 54c54f8b56047d3c2420e1ae06a6a8890c220ac4)
34b321
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
34b321
---
34b321
 target-i386/ops_sse.h | 4 ++--
34b321
 1 file changed, 2 insertions(+), 2 deletions(-)
34b321
34b321
diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h
34b321
index eb24b5f..5145d9e 100644
34b321
--- a/target-i386/ops_sse.h
34b321
+++ b/target-i386/ops_sse.h
34b321
@@ -2034,10 +2034,10 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s,
34b321
         }
34b321
         break;
34b321
     case 3:
34b321
-        for (j = valids - validd; j >= 0; j--) {
34b321
+        for (j = valids; j >= 0; j--) {
34b321
             res <<= 1;
34b321
             v = 1;
34b321
-            for (i = MIN(upper - j, validd); i >= 0; i--) {
34b321
+            for (i = MIN(valids - j, validd); i >= 0; i--) {
34b321
                 v &= (pcmp_val(s, ctrl, i + j) == pcmp_val(d, ctrl, i));
34b321
             }
34b321
             res |= v;
34b321
-- 
34b321
1.8.3.1
34b321