[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] 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#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |