|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] x86emul: vendor specific near indirect branch behavior in 64-bit mode
commit a965d9fab2719753f8699d6ce9062e842c315c30
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu Mar 26 12:34:16 2020 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Mar 26 12:34:16 2020 +0100
x86emul: vendor specific near indirect branch behavior in 64-bit mode
Intel CPUs ignore operand size overrides here, while AMD ones don't.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
tools/tests/x86_emulator/test_x86_emulator.c | 11 +++++++++++
xen/arch/x86/x86_emulate/x86_emulate.c | 9 +++++++--
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/tools/tests/x86_emulator/test_x86_emulator.c
b/tools/tests/x86_emulator/test_x86_emulator.c
index 2d39bd05db..63191dfd09 100644
--- a/tools/tests/x86_emulator/test_x86_emulator.c
+++ b/tools/tests/x86_emulator/test_x86_emulator.c
@@ -813,6 +813,17 @@ static const struct {
.opcode = { 0x66, 0x67, 0xe3, 0x10 },
.opc_len = { 4, 4 },
.disp = { 4 + 16 - MMAP_ADDR, 4 + 16 },
+ }, {
+ .descr = "jmpw *(%rsp)",
+ .opcode = { 0x66, 0xff, 0x24, 0x24 },
+ .opc_len = { 4, 4 },
+ .disp = { STKVAL_DISP - MMAP_ADDR, STKVAL_DISP },
+ }, {
+ .descr = "callw *(%rsp)",
+ .opcode = { 0x66, 0xff, 0x14, 0x24 },
+ .opc_len = { 4, 4 },
+ .stkoff = { -2, -8 },
+ .disp = { STKVAL_DISP - MMAP_ADDR, STKVAL_DISP },
},
};
#endif
diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c
b/xen/arch/x86/x86_emulate/x86_emulate.c
index 49c21585c2..1ecdf5315a 100644
--- a/xen/arch/x86/x86_emulate/x86_emulate.c
+++ b/xen/arch/x86/x86_emulate/x86_emulate.c
@@ -2523,8 +2523,7 @@ x86_decode_onebyte(
{
case 2: /* call (near) */
case 4: /* jmp (near) */
- case 6: /* push */
- if ( mode_64bit() && op_bytes == 4 )
+ if ( mode_64bit() && (op_bytes == 4 || !amd_like(ctxt)) )
op_bytes = 8;
state->desc = DstNone | SrcMem | Mov;
break;
@@ -2536,6 +2535,12 @@ x86_decode_onebyte(
op_bytes = 4;
state->desc = DstNone | SrcMem | Mov;
break;
+
+ case 6: /* push */
+ if ( mode_64bit() && op_bytes == 4 )
+ op_bytes = 8;
+ state->desc = DstNone | SrcMem | Mov;
+ break;
}
break;
}
--
generated by git-patchbot for /home/xen/git/xen.git#staging
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |