diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kvm/emulate.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index adc98675cda0..6e4722c3dcdb 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -407,23 +407,6 @@ struct gprefix { | |||
407 | } \ | 407 | } \ |
408 | } while (0) | 408 | } while (0) |
409 | 409 | ||
410 | /* Fetch next part of the instruction being emulated. */ | ||
411 | #define insn_fetch(_type, _size, _eip) \ | ||
412 | ({ unsigned long _x; \ | ||
413 | rc = do_insn_fetch(ctxt, ops, (_eip), &_x, (_size)); \ | ||
414 | if (rc != X86EMUL_CONTINUE) \ | ||
415 | goto done; \ | ||
416 | (_eip) += (_size); \ | ||
417 | (_type)_x; \ | ||
418 | }) | ||
419 | |||
420 | #define insn_fetch_arr(_arr, _size, _eip) \ | ||
421 | ({ rc = do_insn_fetch(ctxt, ops, (_eip), _arr, (_size)); \ | ||
422 | if (rc != X86EMUL_CONTINUE) \ | ||
423 | goto done; \ | ||
424 | (_eip) += (_size); \ | ||
425 | }) | ||
426 | |||
427 | static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt, | 410 | static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt, |
428 | enum x86_intercept intercept, | 411 | enum x86_intercept intercept, |
429 | enum x86_intercept_stage stage) | 412 | enum x86_intercept_stage stage) |
@@ -671,7 +654,7 @@ static int segmented_read_std(struct x86_emulate_ctxt *ctxt, | |||
671 | return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception); | 654 | return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception); |
672 | } | 655 | } |
673 | 656 | ||
674 | static int do_fetch_insn_byte(struct x86_emulate_ctxt *ctxt, | 657 | static int do_insn_fetch_byte(struct x86_emulate_ctxt *ctxt, |
675 | struct x86_emulate_ops *ops, | 658 | struct x86_emulate_ops *ops, |
676 | unsigned long eip, u8 *dest) | 659 | unsigned long eip, u8 *dest) |
677 | { | 660 | { |
@@ -707,13 +690,30 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt, | |||
707 | if (eip + size - ctxt->eip > 15) | 690 | if (eip + size - ctxt->eip > 15) |
708 | return X86EMUL_UNHANDLEABLE; | 691 | return X86EMUL_UNHANDLEABLE; |
709 | while (size--) { | 692 | while (size--) { |
710 | rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++); | 693 | rc = do_insn_fetch_byte(ctxt, ops, eip++, dest++); |
711 | if (rc != X86EMUL_CONTINUE) | 694 | if (rc != X86EMUL_CONTINUE) |
712 | return rc; | 695 | return rc; |
713 | } | 696 | } |
714 | return X86EMUL_CONTINUE; | 697 | return X86EMUL_CONTINUE; |
715 | } | 698 | } |
716 | 699 | ||
700 | /* Fetch next part of the instruction being emulated. */ | ||
701 | #define insn_fetch(_type, _size, _eip) \ | ||
702 | ({ unsigned long _x; \ | ||
703 | rc = do_insn_fetch(ctxt, ops, (_eip), &_x, (_size)); \ | ||
704 | if (rc != X86EMUL_CONTINUE) \ | ||
705 | goto done; \ | ||
706 | (_eip) += (_size); \ | ||
707 | (_type)_x; \ | ||
708 | }) | ||
709 | |||
710 | #define insn_fetch_arr(_arr, _size, _eip) \ | ||
711 | ({ rc = do_insn_fetch(ctxt, ops, (_eip), _arr, (_size)); \ | ||
712 | if (rc != X86EMUL_CONTINUE) \ | ||
713 | goto done; \ | ||
714 | (_eip) += (_size); \ | ||
715 | }) | ||
716 | |||
717 | /* | 717 | /* |
718 | * Given the 'reg' portion of a ModRM byte, and a register block, return a | 718 | * Given the 'reg' portion of a ModRM byte, and a register block, return a |
719 | * pointer into the block that addresses the relevant register. | 719 | * pointer into the block that addresses the relevant register. |