|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86emul: simplify DstBitBase handling code
commit 0af1b466c4489fca6640de4c49cc9efaad51538e
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Nov 23 15:27:17 2016 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Nov 23 15:27:17 2016 +0100
x86emul: simplify DstBitBase handling code
..., at once making it more obvious that even in the negative bit
offset case the resulting bit offset to be used by the inlined
instructions will always be constrained to the operand size of the
original instruction.
Also add a test case which would have failed without the XSA-195 fix.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
tools/tests/x86_emulator/test_x86_emulator.c | 16 ++++++++++++++++
xen/arch/x86/x86_emulate/x86_emulate.c | 11 ++---------
2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/tools/tests/x86_emulator/test_x86_emulator.c
b/tools/tests/x86_emulator/test_x86_emulator.c
index 6f6d70f..948ee8d 100644
--- a/tools/tests/x86_emulator/test_x86_emulator.c
+++ b/tools/tests/x86_emulator/test_x86_emulator.c
@@ -431,6 +431,22 @@ int main(int argc, char **argv)
goto fail;
printf("okay\n");
+#ifdef __x86_64__
+ printf("%-40s", "Testing btcq %r8,(%r11)...");
+ instr[0] = 0x4d; instr[1] = 0x0f; instr[2] = 0xbb; instr[3] = 0x03;
+ regs.eflags = 0x200;
+ regs.rip = (unsigned long)&instr[0];
+ regs.r8 = (-1L << 40) + 1;
+ regs.r11 = (unsigned long)(res + (1L << 35));
+ rc = x86_emulate(&ctxt, &emulops);
+ if ( (rc != X86EMUL_OKAY) ||
+ (*res != 0x2233445C) ||
+ (regs.eflags != 0x201) ||
+ (regs.rip != (unsigned long)&instr[4]) )
+ goto fail;
+ printf("okay\n");
+#endif
+
res[0] = 0x12345678;
res[1] = 0x87654321;
diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c
b/xen/arch/x86/x86_emulate/x86_emulate.c
index 2cf819b..a85f45e 100644
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -2560,18 +2560,11 @@ x86_emulate(
else if ( op_bytes == 4 )
src.val = (int32_t)src.val;
if ( (long)src.val < 0 )
- {
- unsigned long byte_offset =
+ ea.mem.off -=
op_bytes + (((-src.val - 1) >> 3) & ~(op_bytes - 1L));
-
- ea.mem.off -= byte_offset;
- src.val = (byte_offset << 3) + src.val;
- }
else
- {
ea.mem.off += (src.val >> 3) & ~(op_bytes - 1L);
- src.val &= (op_bytes << 3) - 1;
- }
+ src.val &= (op_bytes << 3) - 1;
}
/* Becomes a normal DstMem operation from here on. */
d = (d & ~DstMask) | DstMem;
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |