|
|
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 |
|